Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/missionmatch / docs/evidence/phase2/drift/phase-close-drift.txt |
| Date | Not specified in source |
| Repository | Janady13/missionmatch |
| Revision | 720d47fae476b0d38477ae4401697d372b1ea2bc |
| Branch | feature/opportunity-to-outcome |
| Path or archive member | docs/evidence/phase2/drift/phase-close-drift.txt |
| Original SHA-256 | 71907bc6f85ba34a7667d9ea85ff89e651cbdb3e31078b08e0ea71289d68b1ae |
| Git blob SHA | eda4b68f075a5cde19ca4c636ee2a04f3fb37033 |
| Reading-copy SHA-256 | 71907bc6f85ba34a7667d9ea85ff89e651cbdb3e31078b08e0ea71289d68b1ae |
Recovered source transcript
Download complete source text ↓111 lines · 5.3 KB
GATE D, DRIFT. Phase 2 close, 28 July 2026, evening. Run AFTER the phase's work,
as the counterpart to drift/session-start-drift.txt which was run before any
change. Both are kept, because a drift check that only runs at one end of a
session cannot tell you which end introduced something.
1. FROZEN SCORING ENGINE, diff against the 462eb81 baseline
engine diff lines: 0 (must be 0)
POSITIVE CONTROL, the detector must see a diff that DOES exist:
auth/service.go diff lines: 2 (nonzero proves the check runs)
2. NO PYTHON
.py files in the tree: 0
3. NO DASHES IN AUTHORED PROSE
docs/BUILD_STATE.md 0
docs/ARCHITECTURE.txt 0
docs/IMPROVEMENTS.md 0
docs/evidence/phase2/visual/gate-c-results.txt 0
4. SCHEMA VERSIONS, queried per database, each on the host that owns it
tenant M4 100.94.8.94:5432/missionmatch v80
staging M4 100.94.8.94:5432/missionmatch_staging v81
control plane megamind-agi-wsl 100.77.114.40:5433 v80
UNCHANGED from session start. Staging one ahead at v81 is the intended
staging only state of migration 0081, named in the handoff.
5. SECRETS
key material in the working tree: 0
key material in git history: 0
architecture document secret free: yes
6. BUILD ROUTES DARK IN PRODUCTION, unauthenticated leg
POST requirement-drafts approve : 404
POST opportunities scope : 404
POST opportunities/tracked : 405 (405 is the pre build shape)
production site : 200
7. THE MERGE GATE
make build-test-gates: PASS
8. BOTH NODES CARRY THE SAME BINARY
Bubbles /home/user/missionmatch/mm-api 8f24414531e80a9a
megamind-agi /opt/missionmatch/mm-api 8f24414531e80a9a
The handoff records 8f24414531e80a9a. Matched.
9. CONTROL PLANE ACCOUNTS
accounts 6, with a real last_login 6. Unchanged from session start.
VERDICT: NO DRIFT IN ANYTHING THE PHASE TOUCHED. Three findings that the drift
check surfaced in the environment AROUND the phase, none of them caused by this
session's work, all of them production and therefore recorded and queued rather
than fixed under a phase lock.
FINDING D1, THE ADVERSE IMPACT SNAPSHOT HAS NEVER RUN IN PRODUCTION.
mm-fairness-snapshot.service fails on every daily firing with
set MM_COMPLIANCE_DATABASE_URL (the compliance role DSN, the only path
to the eeo schema)
The unit reads /etc/missionmatch/api.env, and that file does not carry the
variable. Its sibling on the control plane node, /etc/missionmatch/db.env,
does, and that DSN authenticates. So the fix is configuration and not code.
THIS MATTERS MORE THAN A FAILED TIMER USUALLY DOES. The adverse impact
snapshot is the AEDT compliance artifact the product exists to provide, the
selection rates and four fifths ratios a customer needs for an LL144 or OFCCP
audit. The claim that missionMATCH supplies it is currently true of the code
and false of the running system.
NOT FIXED HERE. It is a production environment change and the phase lock
holds. Queued for approval.
FINDING D2, THE FAILURE WAS INVISIBLE, which is the reason D1 survived.
mm-fairness-snapshot.service has no OnFailure hook. Exactly two units on
Bubbles alert on failure, bubbles-cert-check and mm-db-backup, both wired
during Track H item 3.
Track H item 3 fixed the alerting PATH and proved it with a positive control.
It did not sweep every existing unit onto that path, so a failing unit outside
the two that were wired is silent. This is the same shape as the decorative
alerting already found once: the mechanism works and the coverage is partial,
which is harder to notice than a mechanism that is broken.
Queued with D1, since one deploy fixes both.
FINDING D3, THE CONTROL PLANE CANNOT MIGRATE ITSELF WITH ITS RECORDED CREDENTIAL.
Of the four DSNs in /etc/missionmatch/db.env on the control plane node, three
authenticate cleanly, missionmatch_app, missionmatch_compliance, and
missionmatch_aioe. The fourth is refused:
FATAL: password authentication failed for user "missionmatch_migrator"
The role exists and rolcanlogin is true, so the stored password and the role's
password disagree.
Consequence: a migration run from that node with the recorded DSN fails, and
the operator has to find another path under time pressure. That is the exact
condition that produced the twelve version divergence earlier in this build.
Isolated rather than assumed: three of four roles from the same file, the same
parser, and the same host authenticate, so it is the credential and not the
quoting.
Queued for approval, because resetting a production role's password is a
production change.
CORRECTION TO THE ENVIRONMENT SECTION OF THE HANDOFF, and it cost time today.
The handoff records the control plane as "megamind-agi:5433". megamind-agi has
TWO tailnet identities: the Windows host at 100.69.120.61, and the WSL2
instance at 100.77.114.40, which runs its own tailscaled. Postgres 5433 binds
inside WSL2, so it answers on 100.77.114.40 and a connection to
100.69.120.61:5433 times out with no useful error. There is no sshd inside
WSL2 either, so the only route in is ssh to the Windows host and then wsl.
Recorded in BUILD_STATE so the next person does not rediscover it.