Status: Mapped Layer: projection
§Scope
materializer/**; read-only DB access, page planning and rendering, the typed HTML projection and its independent read-back, manifest dependency hashes, xref resolution, and clean documentation output.
§Start here
materializer/amanuensis_materializer/core.py; materializer/amanuensis_materializer/html_projection.py; materializer/amanuensis_materializer/diagrams.py
§Notes
Derived-artifact correctness boundary and the primary human reading surface. Gained html_projection.py and readback.py since onboarding, and diagrams.py replaced the runtime-boundary placeholder with extraction from registered prose. Finding B04-1 recorded in the 2026-08-27 refresh: staleness_map renders an empty result as an affirmative freshness claim, so the published HTML asserts the conspectus is fresh regardless of drift.
§File ledger
html_projection.py
- Path
materializer/amanuensis_materializer/html_projection.py- Review
- candidate
- Revision
5694080
Why this file is in scope
readback.py
- Path
materializer/amanuensis_materializer/readback.py- Review
- candidate
- Revision
5694080
Why this file is in scope
test-readback.py
- Path
materializer/test-readback.py- Review
- candidate
- Revision
5694080
Why this file is in scope
uv.lock
- Path
materializer/uv.lock- Review
- candidate
- Revision
5694080
Why this file is in scope
.gitignore
- Path
materializer/.gitignore- Review
- examined
- Revision
b8b566f
Why this file is in scope
README.md
- Path
materializer/README.md- Review
- examined
- Revision
b8b566f
Why this file is in scope
init.py
- Path
materializer/amanuensis_materializer/__init__.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
core.py
- Path
materializer/amanuensis_materializer/core.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
db.py
- Path
materializer/amanuensis_materializer/db.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
diagrams.py
- Path
materializer/amanuensis_materializer/diagrams.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
manifest.py
- Path
materializer/amanuensis_materializer/manifest.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
renderers.py
- Path
materializer/amanuensis_materializer/renderers.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
slugs.py
- Path
materializer/amanuensis_materializer/slugs.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
xref.py
- Path
materializer/amanuensis_materializer/xref.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
materialize.py
- Path
materializer/materialize.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
pyproject.toml
- Path
materializer/pyproject.toml- Review
- examined
- Revision
b8b566f
Why this file is in scope
test-materializer.py
- Path
materializer/test-materializer.py- Review
- examined
- Revision
b8b566f
Why this file is in scope
.manifest.json
- Path
docs/.manifest.json- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
.projection-contract.json
- Path
docs/.projection-contract.json- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
architecture.html
- Path
docs/architecture.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
architecture.md
- Path
docs/architecture.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
concern-checklist.html
- Path
docs/concern-checklist.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
concern-checklist.md
- Path
docs/concern-checklist.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
concerns.html
- Path
docs/concerns.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
concerns.md
- Path
docs/concerns.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
contradictions.html
- Path
docs/contradictions.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
contradictions.md
- Path
docs/contradictions.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
diagnosticity.html
- Path
docs/diagnosticity.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
diagnosticity.md
- Path
docs/diagnosticity.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
entry-point.html
- Path
docs/entry-point.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
entry-point.md
- Path
docs/entry-point.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
field-notes.html
- Path
docs/field-notes.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
field-notes.md
- Path
docs/field-notes.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
findings.html
- Path
docs/findings.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
findings.md
- Path
docs/findings.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
how-to-read.html
- Path
docs/how-to-read.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
how-to-read.md
- Path
docs/how-to-read.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
index.html
- Path
docs/index.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
index.md
- Path
docs/index.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
master-plan.html
- Path
docs/master-plan.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
master-plan.md
- Path
docs/master-plan.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
onboarding-report.html
- Path
docs/onboarding-report.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
onboarding-report.md
- Path
docs/onboarding-report.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
open-questions.html
- Path
docs/open-questions.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
open-questions.md
- Path
docs/open-questions.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
seams.html
- Path
docs/seams.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
seams.md
- Path
docs/seams.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b01-survey-methodology-and-agent-contracts.html
- Path
docs/subsystems/b01-survey-methodology-and-agent-contracts.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b01-survey-methodology-and-agent-contracts.md
- Path
docs/subsystems/b01-survey-methodology-and-agent-contracts.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b02-mcp-core-persistence-and-lifecycle.html
- Path
docs/subsystems/b02-mcp-core-persistence-and-lifecycle.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b02-mcp-core-persistence-and-lifecycle.md
- Path
docs/subsystems/b02-mcp-core-persistence-and-lifecycle.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b03-knowledge-tools-and-workflow-api.html
- Path
docs/subsystems/b03-knowledge-tools-and-workflow-api.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b03-knowledge-tools-and-workflow-api.md
- Path
docs/subsystems/b03-knowledge-tools-and-workflow-api.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b04-diff-aware-materializer.html
- Path
docs/subsystems/b04-diff-aware-materializer.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b04-diff-aware-materializer.md
- Path
docs/subsystems/b04-diff-aware-materializer.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b05-packaging-installer-validation-and-product-docs.html
- Path
docs/subsystems/b05-packaging-installer-validation-and-product-docs.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b05-packaging-installer-validation-and-product-docs.md
- Path
docs/subsystems/b05-packaging-installer-validation-and-product-docs.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b06-report-interface-design-and-validation-studies.html
- Path
docs/subsystems/b06-report-interface-design-and-validation-studies.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b06-report-interface-design-and-validation-studies.md
- Path
docs/subsystems/b06-report-interface-design-and-validation-studies.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b07-embedded-research-surveys-and-platform-trials.html
- Path
docs/subsystems/b07-embedded-research-surveys-and-platform-trials.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b07-embedded-research-surveys-and-platform-trials.md
- Path
docs/subsystems/b07-embedded-research-surveys-and-platform-trials.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b08-activation-evidence-and-release-readiness-harness.html
- Path
docs/subsystems/b08-activation-evidence-and-release-readiness-harness.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
b08-activation-evidence-and-release-readiness-harness.md
- Path
docs/subsystems/b08-activation-evidence-and-release-readiness-harness.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
vocabulary.html
- Path
docs/vocabulary.html- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
vocabulary.md
- Path
docs/vocabulary.md- Review
- generated-ignore
- Revision
aba6d04
Why this file is in scope
§Concern review
AT-1
- Verdict
- Competing explanations
- Evidence
- Code verified
- Linchpin dependency
- 🔗
Rationale
AT-2
- Verdict
- Out of scope
- Evidence
- Code verified
Rationale
CC-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
CR-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
EP-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
EP-2
- Verdict
- Out of scope
- Evidence
- Code verified
Rationale
IF-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
RL-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
RL-2
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
SC-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
SC-2
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
SC-3
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
SI-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
SI-2
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
TB-1
- Verdict
- Out of scope
- Evidence
- Code verified
Rationale
TR-1
- Verdict
- Accepted behavior
- Evidence
- Code verified
Rationale
TR-2
- Verdict
- Out of scope
- Evidence
- Code verified
Rationale
VG-1
- Verdict
- Confirmed defect
- Evidence
- Code verified
Rationale
§Findings
§B04-1 · Medium · fixed
Symptom: The published conspectus states 'No stale entries — the conspectus is fresh.' in both the HTML reading surface and its Markdown companion, regardless of how far behind HEAD the survey actually is. Root cause: diagrams.py:staleness_map renders an empty query result as an affirmative freshness claim. Its source, the entries table, is never populated by the server (see B03-2), so the empty branch is the only branch that ever executes — but the deeper defect is that the empty case is reported as positive health rather than as absent data.
Business context: The HTML projection is the primary human reading surface and the product's main deliverable. A reader opening it to judge whether the conspectus can be trusted is told, in the document's own voice, that it is fresh. At 5694080 that sentence was published while the survey sat 23 commits behind HEAD with 47% of tracked files unclassified. Because the claim is generated rather than authored, it carries the authority of the derived-artifact pipeline while resting on no measurement at all. This is the reader-facing endpoint of B03-2 and the reason that defect matters beyond an internal metric.
Primary files:
materializer/amanuensis_materializer/diagrams.py:staleness_map@5694080
§Seams
§Survey notes
- Survey revision:
b8b566f - Status: adversarial pass complete; packaging pending
§Key types
Materializer plans and renders the documentation site, PagePlan binds a page to its sources/renderer, Summary reports the run, and Manifest/PageManifest retain source and content hashes (materializer/amanuensis_materializer/core.py:Materializer@b8b566f; materializer/amanuensis_materializer/manifest.py:Manifest@b8b566f). XrefIndex resolves IDs into relative links after rendering (materializer/amanuensis_materializer/xref.py:XrefIndex@b8b566f).
§State containers
- Read-only SQLite connection: durable survey source, one materialization run (
materializer/amanuensis_materializer/db.py:open_ro@b8b566f). .manifest.json: per-page source hashes, output hash, and render timestamp; persistent projection metadata (materializer/amanuensis_materializer/manifest.py:Manifest.save@b8b566f)..materializer-lock: excludes concurrent writers for the output directory (materializer/amanuensis_materializer/core.py:Materializer@b8b566f).docs/: derived Markdown projection; never the durable survey authority.
§Data flow
The CLI resolves storage/output, opens the database read-only, builds page plans from aggregate and subsystem renderers, compares stable source hashes to the previous manifest, renders affected pages, resolves cross-references, prunes retired pages, saves the new manifest, and prints a JSON summary (materializer/materialize.py:main@b8b566f; materializer/amanuensis_materializer/core.py:Materializer.run@b8b566f).
§Concurrency model
One process owns an output-directory lock. Database access is read-only. File updates and final manifest persistence are sequential; the manifest warns and rebuilds on corrupt JSON (materializer/amanuensis_materializer/manifest.py:Manifest.load@b8b566f).
§Seam contracts
§Concern review
All active concerns are covered. Incremental/full parity is exercised by repeated and forced renders. Corrupt-manifest recovery is visible via warnings. Multi-file projection atomicity remains an unresolved competition: the lock prevents concurrent writers, but a killed process may leave some page files updated before the manifest is saved. It is not promoted to a confirmed defect without a kill-point control.
§Adversarial review
The pass tried to disprove diff-awareness by finding a change source absent from page plans. Tests cover unchanged runs, prose changes, disposition changes, retired pages, and forced full output (materializer/test-materializer.py:main@b8b566f). The baseline A0 clean-export checker adds independent state, coverage, and content read-back. Verdict: incremental contract upheld for the observed source classes; generator correctness still needs independent accept-corpus evidence.