You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
`pipeline/jsonld_to_search.py:18`, `pipeline/emit_graph_tiers.py:538`. The one
92
-
place it is deliberately **not** applied is `build_backlink_index`, which runs
93
-
over the full page list (documented in `docs/architecture/pipeline.md`).
73
+
`pipeline/build.py` performs input census/preflight, public projection and validation before exporting Turtle, WebVOWL, Page API/Markdown, search and graph tiers, then a generation manifest. Malformed or ambiguous input and validation errors refuse publication in both strict and non-strict calls. Outputs are staged; promotion backs up the prior generated trees and rolls back on failure. An additional rollback failure retains the recovery directory for repair. This is not atomic activation across live readers or consumers.
74
+
75
+
Graph payloads use stable ordering where implemented, but the complete bundle is not byte-deterministic: `pipeline/manifest.py` records a fresh UUID and UTC timestamp, and Turtle blank-node identities can vary. Compare RDF by isomorphism/triple semantics, and verify each generation against its own manifest rather than claiming equal bytes across builds.
76
+
77
+
### The public projection boundary
78
+
79
+
`vc:public` must be a literal JSON boolean. `pipeline/public_projection.py` rejects malformed, missing or ambiguous declarations and conflicts with other public flags. The canonical builder projects only public pages before inference and export. It drops or redacts references to known private identities, including body text and title-form Markdown; unresolved concepts remain available as intentional dangling references. This is not a general secret detector.
80
+
81
+
Exporter-local visibility checks in `pipeline/visibility.py` remain defensive boundaries. The canonical public graph and Markdown are derived from the same protected projection; no workflow copies raw authored Markdown over it. Public census/validation diagnostics are aggregate-only. Authoring-directory exclusions and exact corpus identity/count gates remain separate from the privacy flag.
94
82
95
83
### The NGG1 binary tier contract
96
84
@@ -137,19 +125,19 @@ CI glue are **AGPL-3.0-or-later** (`LICENSE`); the `ontology/` corpus is
137
125
138
126
## Known divergences & open items
139
127
140
-
-**`ADR-NG-001` is cited pervasively but is absent from this tree.**Over
141
-
thirty code and doc files cite `ADR-NG-001 §2/§3/§4/§5/§7/§9` as the authority
142
-
for the explorer overhaul, and `explorer/FORMAT-NGG1.md:3` links it by the
143
-
exact path `../../docs/adr/ADR-NG-001-explorer-architecture.md` — which does
144
-
not exist here (it lived in the upstream publishing repo). The load-bearing
145
-
design is real and implemented; only the cited document is missing. This
146
-
baseline plus `docs/architecture/explorer.md` are its de-facto reconstruction.
147
-
Reconstructing `ADR-NG-001` into `docs/adr/` is an open item. Note the
148
-
`FORMAT-NGG1.md:3` link is **doubly broken**: `../../docs/adr/…` from
149
-
`explorer/FORMAT-NGG1.md`normalises to *above* the repo root (one `../` too
150
-
many — the correct depth is `../docs/adr/…`). Whoever reconstructs `ADR-NG-001`
151
-
must fix the relative depth too, or the link still will not resolve once the
152
-
target exists.
128
+
-**`ADR-NG-001` is classified `historical-absent`, not open**(resolved
129
+
2026-09-05, ADR-2001). 33 files cite `ADR-NG-001 §2/§3/§4/§5/§7/§9`; the
130
+
document itself never existed in this tree and lived in the upstream
131
+
publishing repo. It is **not** reconstructed — writing a decision record for a
132
+
decision this repo did not take would fabricate authority. Instead each cited
133
+
section is mapped to the in-tree surface that carries its content today
134
+
(ADR-2001 "ADR-NG-001 resolution"), so a reader following a citation reaches
135
+
a real document. `explorer/FORMAT-NGG1.md:3` links the absent record by the
136
+
path `../../docs/adr/ADR-NG-001-explorer-architecture.md`, which is **doubly
137
+
broken**: from `explorer/` that normalises to *above* the repo root (the
138
+
correct depth would be `../docs/adr/…`). Since the target is classified
139
+
absent, the link is recorded as a dangling historical citation rather than
140
+
repaired to point at nothing.
153
141
-**The `7,874` figure is stale corpus-wide.**`docs/architecture/pipeline.md`
154
142
and `docs/architecture/explorer.md` are written against a 7,874-page corpus,
155
143
but the corpus is now **8,138** pages (`EXPECTED_CLASSES: '8138'`,
@@ -167,42 +155,111 @@ CI glue are **AGPL-3.0-or-later** (`LICENSE`); the `ontology/` corpus is
167
155
-**`ontology.ttl` is not byte-reproducible** (blank-node reshuffle, above).
168
156
-**`EXPECTED_CLASSES` is a hand-typed pin** that duplicates a figure the
169
157
pipeline already computes and drifts the moment the corpus does; it must move
170
-
in the same commit as any corpus change.
158
+
in the same commit as any corpus change. That independence is deliberate
159
+
(ADR-2003) and is preserved. Since 2026-09-05 it is no longer the only
160
+
membership check: `pipeline/contracts/class-identity.txt` commits the sorted
161
+
class-IRI **set**, so an equal-count identity substitution — delete one class,
162
+
add another — fails the release gate as a diff even though the count agrees.
163
+
Count and set must move in the same commit; the gate fails if they disagree.
171
164
-**Three classes resolve to no category** (`electric-vehicle`,
172
165
`ethan-mollick`, `urban-planning`) — a corpus ancestry gap, not a resolver
173
166
fault.
174
167
-**4,383+ object-property targets are referenced but never declared** as pages
175
-
and ship as `skos:Concept` stubs with slug-derived labels.
168
+
and ship as `skos:Concept` stubs with slug-derived labels. The visibility
169
+
policy deliberately does **not** redact these: they resolve to no page, so they
170
+
name no private entity, and redacting them would rewrite the published
171
+
semantics of the whole corpus for no privacy benefit.
172
+
-**The explorer cannot consume `ontology.json` directly.** The classic WebVOWL
173
+
split shape keeps `domain`/`range` in `propertyAttribute[]`, and the consumer's
174
+
`StandardParser::parse_property` raises `Missing domain for property` without
175
+
them on the `property[]` entry itself. `pipeline/explorer_compat.py` emits a
176
+
merged `ontology-explorer.json` that satisfies it. **One divergence remains
177
+
unresolvable from this side**: the Rust parser requires `domain`/`range` as
178
+
strings while `modern/src/stores/useGraphStore.ts` indexes them with `[0]`, and
179
+
a JSON value cannot be both. It is recorded, tested and owned by WasmVOWL
and the stale `7,874` figures in `docs/architecture/*.md`**in the same
225
+
commit**; (4) bumping `version` and
204
226
re-recording `verified_commit` from `git rev-parse --short HEAD`. New decisions
205
227
are recorded in `docs/adr/` from `docs/adr/TEMPLATE.md` and the index
206
228
regenerated (`node scripts/adr-index-gen.js docs/adr`). Legacy prose — including
207
229
the absent `ADR-NG-001` and the `ADR-008`/`ADR-012` corpus pages — is evidence,
208
230
not authority: cite it, do not defer to it.
231
+
232
+
## Estate closeout qualification — 2026-09-04
233
+
234
+
The [knowledge-production review](../../VisionFlow/docs/estate-review/knowledge-production.md) and [current-vault trace](../../VisionFlow/docs/estate-review/authored-vault-transition.md) distinguish this extracted publisher from the active visionGraph corpus. ADR-2001–2004 now carry explicit identity, publication and consumer acceptance conditions. The count tripwire and separate CI validator remain implemented safeguards; pipeline/build.py itself only logs validation errors. Equal counts cannot prove equal identities or intended visibility. Parser input census, strict publication flags, immutable export generations and actual explorer-schema compatibility remain open. ADR-008/012 under ontology/pages are corpus content, not operative decisions.
235
+
236
+
## Estate closeout progress — 2026-09-05
237
+
238
+
The four qualifications recorded on 2026-09-04 are closed against this working
239
+
tree, with the count tripwire preserved rather than replaced.
240
+
241
+
-**Parser input census** — `pipeline/census.py`. Every `*.md` is parsed,
242
+
rejected with a code, or excluded; the totals must balance and a strict build
243
+
refuses a corpus containing a rejected file. Real corpus: 8,138 / 8,138,
244
+
balanced, 0 rejected.
245
+
-**Strict publication flags** — only a literal JSON `true` publishes; a
246
+
non-boolean or absent flag is a validation error and publishes nothing.
247
+
-**Inference visibility** — `pipeline/visibility.py`, consulted by every
248
+
exporter, with per-format tests over a public-child / private-parent /
249
+
private-grandparent fixture.
250
+
-**Immutable export generations** — `pipeline/manifest.py` writes a versioned
0 commit comments