docs/projection-manifest.md
The Projection Manifest
"Not a redesign. Just expose the information already discovered."
src/lib/projection/manifest.ts, tests/manifest.test.ts, wired into
WorldView.
It derives from the audit; it does not restate it
Every scope, warrant and discarded comes from lib/ledger/warrant.ts,
which the audit tests already enforce. A second copy would be the
declared-authority/actual-authority defect this project has now found six
times, committed inside the module built to explain it.
The test asserts the match field by field: if a channel's scope changes upstream, the explanation changes with it, or the gate fails.
It lives in projection, not in World
Building { height } is what the audit found wrong — a projection's output
stored as a world property. Putting the explanation on Building would repeat
it. The manifest takes a building and produces an explanation; the building
carries no part of it.
What a viewer gets
5 marks explained, all traced to the audit
marks that mislead on scope:
height → tall relative to the current population of the world
brightness → as busy as the busiest subject currently observed
position → near, given every other subject
Each entry answers all five questions, and the test enforces that none is empty:
height — 21.92 world units
from code-size = 50000 · logarithmic scale, then normalised against the largest subject present
scope world · warrant evidence
actually claims: tall relative to the current population of the world
discarded (hidden-basis): the measured magnitude itself …
footprint — 3 · decorative
from nothing · a constant per subtype
scope subject · warrant none: no source-side input
discarded (unbound): nothing, because it carries nothing
Ordering is part of the honesty. Claim-changing marks sort first and decorative ones last, so a reader who stops after two entries has seen the marks most likely to mislead — not the footprint. Asserted by a test.
Footprint is now the first explicitly decorative channel. It says from nothing rather than pretending every pixel encodes data.
Standing
| Measurable improvement? | yes — 5 marks explained per building, traced to the audit |
| New authority created? | no — the manifest reads the ledger |
| World changed? | no — no field moved, nothing added to Building |
What is still not established
- The panel is not visually verified. The app is passkey-gated and signing in
is the user's action, so this is wired, typechecked and unit-tested, and
nobody has seen it render. The
renderer consumes the manifesttest is a source-level assertion, not a screenshot. - Condition 3 is unchanged. That a viewer reads the explanation and understands the scope caveat is not something any test here can establish.
- Only buildings are explained. Districts, links and agents have channels in the audit and no manifest entry.
- The
transformstrings are prose written by hand, unlikescopeanddiscardedwhich are read from the ledger. A transform that changed in code would not fail this gate.
265 → 272 tests, 26 DOM, 40 mutations, tsc clean.