66. Entry reports a verdict per claim and the evidence behind it
Context
The mandate of 2026-09-15 asked that entering the repository prove whether Majordomus is
actually in force: governance, session context, MCP, the Cockpit, peers, tests, coverage,
documentation and deployment. It proposed a new canonical snapshot, a thin .envrc, and
surfaces on the command line, the API, MCP and the Cockpit.
Measured before anything was built:
.envrcwas already one call tomajordomus env enter(ADR 0043,project.envrc-is-an-adapter), and entry took about 190 ms in a debug build.environment::RepositoryEnvironmentalready was the canonical snapshot of what a checkout is, with provenance per field, served on every surface.- The banner drew
✓beside the Cockpit, docs, Swagger, API, events and MCP while the shared server wasoutdated(0.6.1 serving an executable at 0.7.0). The mark came fromServiceAvailability::Available, a TCP connection. - The evidence to do better already existed and was nowhere on the entry path:
server.status'sstanding_of, the server's ownGET /listing each surface withready,rules.report(137 rules, 0 with a recorded passing run), the evidence ledger (6 executions, none at HEAD),continuity.state's freshness judgement, and thegh-pagescommits, each of which names itssource:commit.
Decision
- A second value, not a wider snapshot.
environment::preflight::Preflightanswers what is proven;RepositoryEnvironmentkeeps answering what the checkout is. Widening the snapshot would have changed its digest and schema and made every banner look like news. - Nine verdicts, not booleans:
verified,active,fresh,stale,degraded,unavailable,failed,unknown,not_applicable. The three that assert force cannot be constructed without evidence (Check::new). - Observe, then derive.
observedoes the reading;deriveis pure. Every verdict is a test over a value. - Reuse, never re-derive. Server standing is
standing_ofover oneGET /(lease::probe_reply, the probe's own decision). Handover freshness is continuity's resolver. Test currency is the evidence module'schanged_since. The rule tally isrules::report. No detector was written twice. - Entry stays inside its budget by what it does not read. The rule tally needs the index,
which entry never builds. So
env preflight --fullcounts it and caches it with the commit it was counted at, and entry reports itstaleat any other commit. The peer board costs about 90 ms because it gathers every checkout, so entry does not ask it and says so.env preflightdoes ask. - The banner no longer marks a service answering unless the server is verified. The
assignments still export
MAJORDOMUS_URLas resolved, because a client may still reach it. - One capability,
environment.preflight, projected to HTTP, MCP tool and resource. The Cockpit overview renders it with each verdict as data. A served request that holds the lease is its own evidence for the server and reads its own board. - What nothing records is said, not hidden. Coverage is
unavailablebecausescripts/rust-coverageleaves no record. Generated documentation isunknownbecause no generation check is recorded. ADR relevance is not claimed because nothing joins an ADR to a task.
Consequences
- The entry line is honest and, in this repository today, mostly not green. That is the point: 0 of 107 rules owing a proof are proven against the tree, and the recorded test runs are about other commits.
- The
.envrcshape the mandate proposed (a separateenv preflight --compactcall) was not adopted. It would be a secondgit statuson everycd, whichproject.envrc-is-an-adapterforbids.env enterdraws the compact preflight from the same snapshot. - Joining coverage evidence and a recorded generation check to the preflight is future work, and each is one observation plus one check when the record exists.
- GitHub Pages is not given runtime state. The deployment verdict is about the local
gh-pagesref as last fetched, andscripts/pages verifyremains the authority on what is served.