From 9876aa8775e3913180e78d3a77b386a52daff3cc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 13:35:29 +0000 Subject: [PATCH] docs(audits): archive eleven closed 2026-06 liveness audits, with the spec ledger notes that cite them Move the 2026-06 {action,agent,dashboard,field,flow,hook,object,report, skill,tool,view}schema property-liveness audits into docs/audits/archive/2026-06/ and rewrite every citation: the matching packages/spec/liveness/*.json _note paths, the liveness README, the docs/audits README rows and report link, and the fieldschema mention in the record-search audit. The audits README records which closed audits stay in place (ADR-cited or cited from the published spec CHANGELOG). Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_01WGufziKbCZuq2UMoc2FvwP --- .../26257-archive-2026-06-liveness-audits.md | 10 +++++++ docs/audits/2026-06-record-search-liveness.md | 2 +- docs/audits/README.md | 26 ++++++++++--------- .../2026-06-actionschema-property-liveness.md | 0 .../2026-06-agentschema-property-liveness.md | 0 ...26-06-dashboardschema-property-liveness.md | 0 .../2026-06-fieldschema-property-liveness.md | 0 .../2026-06-flowschema-property-liveness.md | 0 .../2026-06-hookschema-property-liveness.md | 0 .../2026-06-objectschema-property-liveness.md | 0 .../2026-06-reportschema-property-liveness.md | 0 .../2026-06-skillschema-property-liveness.md | 0 .../2026-06-toolschema-property-liveness.md | 0 .../2026-06-viewschema-property-liveness.md | 0 packages/spec/liveness/README.md | 3 ++- packages/spec/liveness/action.json | 2 +- packages/spec/liveness/agent.json | 2 +- packages/spec/liveness/dashboard.json | 2 +- packages/spec/liveness/field.json | 2 +- packages/spec/liveness/flow.json | 2 +- packages/spec/liveness/hook.json | 2 +- packages/spec/liveness/object.json | 2 +- packages/spec/liveness/report.json | 2 +- packages/spec/liveness/skill.json | 2 +- packages/spec/liveness/tool.json | 2 +- packages/spec/liveness/view.json | 2 +- 26 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 .changeset/26257-archive-2026-06-liveness-audits.md rename docs/audits/{ => archive/2026-06}/2026-06-actionschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-agentschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-dashboardschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-fieldschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-flowschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-hookschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-objectschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-reportschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-skillschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-toolschema-property-liveness.md (100%) rename docs/audits/{ => archive/2026-06}/2026-06-viewschema-property-liveness.md (100%) diff --git a/.changeset/26257-archive-2026-06-liveness-audits.md b/.changeset/26257-archive-2026-06-liveness-audits.md new file mode 100644 index 00000000000..b20102c2dfb --- /dev/null +++ b/.changeset/26257-archive-2026-06-liveness-audits.md @@ -0,0 +1,10 @@ +--- +'@objectstack/spec': patch +--- + +docs(spec): the liveness ledger's `_note` paths follow eleven closed 2026-06 audits into `docs/audits/archive/2026-06/` + +Clause-②: no +Metadata-protocol: none + +The `_note` of `liveness/{action,agent,dashboard,field,flow,hook,object,report,skill,tool,view}.json` named its seeding audit as `docs/audits/2026-06-schema-property-liveness.md`. Those audits are closed and now live under `docs/audits/archive/2026-06/`, so each note names the new path, and `liveness/README.md` says where the series sits. No status, evidence or accepted shape changes: only the path text inside notes moves. diff --git a/docs/audits/2026-06-record-search-liveness.md b/docs/audits/2026-06-record-search-liveness.md index 62e7ee63df7..2c34e7cf2b0 100644 --- a/docs/audits/2026-06-record-search-liveness.md +++ b/docs/audits/2026-06-record-search-liveness.md @@ -31,7 +31,7 @@ Record search is a **declared-but-unenforced** capability (cf. ADR-0049). `$sear - `object.searchable` boolean (`object.zod.ts:52`) — consumed by metadata-admin UI + the command-palette object gate; **not** the data layer. - `object.search` (`SearchConfigSchema`, `object.zod.ts:113`) — `fields`/`displayFields`/`filters`; **no runtime consumer**. - `view.searchableFields` (`view.zod.ts:522`) — UI input control + ListView; not the data layer. -- field-level `searchable` — **DEAD** (per `2026-06-fieldschema-property-liveness.md`). +- field-level `searchable` — **DEAD** (per `archive/2026-06/2026-06-fieldschema-property-liveness.md`). ## 4. Lookup search (objectui) — sends `$search`, gets a no-op - `LookupField.tsx:311` / `RecordPickerDialog.tsx:451` — bare `$search`. The picker "works" visually only because datasets are tiny; there is **no server filtering**. diff --git a/docs/audits/README.md b/docs/audits/README.md index 47bfbbbbd57..07bd92469e6 100644 --- a/docs/audits/README.md +++ b/docs/audits/README.md @@ -2,6 +2,8 @@ > **Lifecycle of a file in `docs/audits/`:** an audit is *open* while its findings are being worked and *closed* once each one is fixed, ruled out or carried into a tracked ledger or issue; a closed audit moves to `docs/audits/archive/`, and git history keeps every version. +> **Closed but kept in place:** a closed audit that an ADR cites by path stays where it is, because ADRs are append-only and a move would leave a dead link in their text. So does one cited by path from a published `CHANGELOG.md`, which is release-owned. In the 2026-06 series that holds `2026-06-handwritten-docs-accuracy-followups`, `2026-06-metadata-functional-completeness`, `2026-06-react-blocks-conformance`, `2026-06-react-tier-authoring-dogfood`, `2026-06-record-search-liveness` and `2026-06-security-identity-property-liveness` (ADR-cited), and `2026-06-appschema-property-liveness`, `2026-06-dead-surface-disposition-plan` and `2026-06-validationschema-property-liveness` (cited from `packages/spec/CHANGELOG.md`). + A protocol-level audit of **every ObjectStack metadata type**: for each schema property, cross-reference its spec definition against its **actual consumers** (`file:line`) in the runtime and renderers, to answer two questions in order — **(1) does the property take effect?** and **(2) is it necessary / reasonable?** Liveness is judged by **code consumption**, not browser observation (an unreactive UI can't distinguish "dead property" from "data didn't trigger it"). "DEAD" = parsed but read by no non-spec/non-test consumer → a **silent no-op** for authors. @@ -9,20 +11,20 @@ Liveness is judged by **code consumption**, not browser observation (an unreacti ## Per-type reports | Type | Doc | Health | |---|---|---| -| field | `2026-06-fieldschema-property-liveness.md` | ~half dead | -| object | `2026-06-objectschema-property-liveness.md` | ~half dead | -| view | `2026-06-viewschema-property-liveness.md` | list-family healthy; chart/form-variants broken | +| field | `archive/2026-06/2026-06-fieldschema-property-liveness.md` | ~half dead | +| object | `archive/2026-06/2026-06-objectschema-property-liveness.md` | ~half dead | +| view | `archive/2026-06/2026-06-viewschema-property-liveness.md` | list-family healthy; chart/form-variants broken | | app | `2026-06-appschema-property-liveness.md` | nav core healthy; aspirational tail | | page | `archive/2026-06/2026-06-pageschema-property-liveness.md` | drift breaks layouts | -| dashboard | `2026-06-dashboardschema-property-liveness.md` | ADR-0021 half-done | -| report | `2026-06-reportschema-property-liveness.md` | dataset live; chart dead | +| dashboard | `archive/2026-06/2026-06-dashboardschema-property-liveness.md` | ADR-0021 half-done | +| report | `archive/2026-06/2026-06-reportschema-property-liveness.md` | dataset live; chart dead | | dataset | `archive/2026-06/2026-06-datasetschema-property-liveness.md` | live; Studio under-covers | -| action | `2026-06-actionschema-property-liveness.md` | disabled-CEL ignored; form/shortcut dead | -| flow | `2026-06-flowschema-property-liveness.md` | enum out of sync; runAs unenforced | -| agent | `2026-06-agentschema-property-liveness.md` | autonomy + access-control aspirational | -| tool | `2026-06-toolschema-property-liveness.md` | **write-only metadata** | -| skill | `2026-06-skillschema-property-liveness.md` | triggerPhrases display-only | -| hook | `2026-06-hookschema-property-liveness.md` | **healthy** (near-total) | +| action | `archive/2026-06/2026-06-actionschema-property-liveness.md` | disabled-CEL ignored; form/shortcut dead | +| flow | `archive/2026-06/2026-06-flowschema-property-liveness.md` | enum out of sync; runAs unenforced | +| agent | `archive/2026-06/2026-06-agentschema-property-liveness.md` | autonomy + access-control aspirational | +| tool | `archive/2026-06/2026-06-toolschema-property-liveness.md` | **write-only metadata** | +| skill | `archive/2026-06/2026-06-skillschema-property-liveness.md` | triggerPhrases display-only | +| hook | `archive/2026-06/2026-06-hookschema-property-liveness.md` | **healthy** (near-total) | | validation | `2026-06-validationschema-property-liveness.md` | **healthy** (all 6 types enforced) | | security/identity (role, permission, policy, sharing) | `2026-06-security-identity-property-liveness.md` | **policy 100% dead** | | system/integration (email/i18n/theme/job/webhook/portal) | `archive/2026-06/2026-06-system-integration-property-liveness.md` | email + portal dead | @@ -44,7 +46,7 @@ The most serious cluster — properties that imply a security boundary but enfor ### 2. 🔴 ADR-0021 analytics migration debt Spec moved to `dataset`+`values`/`dimensions`, but: the **chart view variant** + **dashboard renderer + Studio WidgetConfigPanel** still read the *removed* legacy `object/valueField/categoryField/aggregate` shape. (Same debt that invalidated the showcase dashboard/report seeds.) -**✅ Report slice resolved (#3463 + 2026-07 close-out).** `report.chart` is **wired** (`DatasetReportRenderer` plots `chart.xAxis`/`yAxis` via `DatasetReportChart`, now dogfooded by the showcase `…_chart` report); `ReportColumn`/`ReportGrouping` (+ objectui `SpecReport*` re-exports) and the unread `chart.groupBy` + dead `aria`/`performance` are **removed**; the legacy `ReportViewer` chart fallback is **retired**. See [`2026-06-reportschema-property-liveness.md`](./2026-06-reportschema-property-liveness.md). The **chart-view / dashboard / WidgetConfigPanel** legacy-shape readers above remain open. +**✅ Report slice resolved (#3463 + 2026-07 close-out).** `report.chart` is **wired** (`DatasetReportRenderer` plots `chart.xAxis`/`yAxis` via `DatasetReportChart`, now dogfooded by the showcase `…_chart` report); `ReportColumn`/`ReportGrouping` (+ objectui `SpecReport*` re-exports) and the unread `chart.groupBy` + dead `aria`/`performance` are **removed**; the legacy `ReportViewer` chart fallback is **retired**. See [`2026-06-reportschema-property-liveness.md`](./archive/2026-06/2026-06-reportschema-property-liveness.md). The **chart-view / dashboard / WidgetConfigPanel** legacy-shape readers above remain open. ### 3. 🟠 Naming drift → silent no-ops (spec key ≠ consumed key) field `maxLength`/`minLength`/`referenceFilters`/`maxRating`; page `type`→`pageType` & `label`→`title` & `visibility`; dashboard `title` vs `label`; app `accentColor`/`badgeVariant`/`separator` (renderer reads, **not in spec**); action `disabled`→`enabled`; flow `http` vs `http_request`; skill `requiredPermissions` vs `permissions`; agent `knowledge.{topics→sources}`; webhook `object`→`object_name`, `isActive`→`active`. diff --git a/docs/audits/2026-06-actionschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-actionschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-actionschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-actionschema-property-liveness.md diff --git a/docs/audits/2026-06-agentschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-agentschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-agentschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-agentschema-property-liveness.md diff --git a/docs/audits/2026-06-dashboardschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-dashboardschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-dashboardschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-dashboardschema-property-liveness.md diff --git a/docs/audits/2026-06-fieldschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-fieldschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-fieldschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-fieldschema-property-liveness.md diff --git a/docs/audits/2026-06-flowschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-flowschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-flowschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-flowschema-property-liveness.md diff --git a/docs/audits/2026-06-hookschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-hookschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-hookschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-hookschema-property-liveness.md diff --git a/docs/audits/2026-06-objectschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-objectschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-objectschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-objectschema-property-liveness.md diff --git a/docs/audits/2026-06-reportschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-reportschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-reportschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-reportschema-property-liveness.md diff --git a/docs/audits/2026-06-skillschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-skillschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-skillschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-skillschema-property-liveness.md diff --git a/docs/audits/2026-06-toolschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-toolschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-toolschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-toolschema-property-liveness.md diff --git a/docs/audits/2026-06-viewschema-property-liveness.md b/docs/audits/archive/2026-06/2026-06-viewschema-property-liveness.md similarity index 100% rename from docs/audits/2026-06-viewschema-property-liveness.md rename to docs/audits/archive/2026-06/2026-06-viewschema-property-liveness.md diff --git a/packages/spec/liveness/README.md b/packages/spec/liveness/README.md index 2e4a15cde77..721c6311ebd 100644 --- a/packages/spec/liveness/README.md +++ b/packages/spec/liveness/README.md @@ -4,7 +4,8 @@ For a metadata-driven platform, **the spec is the product surface**: authors wri metadata against these schemas. A property that is parsed but has no runtime consumer is a silent no-op — and for a *security* property, a silent no-op is **false compliance** (e.g. `forceMfa: true` accepted and ignored). The metadata-liveness audits -(`docs/audits/2026-06-*-property-liveness.md`) found that large swaths of the declared +(`docs/audits/archive/2026-06/2026-06-*-property-liveness.md`, with the three still cited +from an ADR or a changelog left in `docs/audits/`) found that large swaths of the declared surface are DEAD. This ledger makes that classification **explicit and regression-proof**: every property diff --git a/packages/spec/liveness/action.json b/packages/spec/liveness/action.json index a76b4e010e8..2d0e8ba5fff 100644 --- a/packages/spec/liveness/action.json +++ b/packages/spec/liveness/action.json @@ -1,6 +1,6 @@ { "type": "action", - "_note": "ActionSchema. Seeded from docs/audits/2026-06-actionschema-property-liveness.md. Renderers live in objectui (evidence cited as prose, not framework paths); framework-side: service-ai action-tools, runtime body-runner/http-dispatcher. Containers (params/resultDialog/ai/aria) classified at top level — no divergent sub-statuses in the audit. ⚠ EVIDENCE LIVES IN CLOUD/EE: the `cloud @: packages/service-ai/...` paths cited below are the closed `@objectstack/service-ai` runtime in the CLOUD repo, NOT git-tracked framework code. 2026-08-30 (#13272): the previous wording of this sentence was false in BOTH halves. (a) It called the framework's own service-ai tree “a stale build artifact with no src/” — there is no tree at all: `packages/services/` holds every sibling service EXCEPT service-ai, and `git ls-files | grep -ic service-ai` returns 0. Absent, not stale. (b) The citations spelled `packages/services/service-ai/...`, a path present in NEITHER repo; cloud's real layout, measured at cloud@15f55df (commit c19035e97), is `packages/service-ai/...`. Every citation below now carries the explicit `cloud` realm marker, so it is attributed by the marker `scanEvidence` reads rather than riding the `FOREIGN_PATH_PREFIXES` special case that silently exempted the stale spelling from resolution — which is why 22 dead pointers sat green. ✅ RE-VERIFIED 2026-09-15 (#13272): the re-verification half this entry parked is discharged. All three cloud consumers cited below were re-read in a cloud checkout at cloud @cb8ee7ff60c097cc21a584fe9caf8ef4391cc0e8 and all three are CONFIRMED; every row now carries `verifiedAt`, `evidenceScope: cross-repo`, and `#symbol` anchors pinned to the consuming functions instead of a line number — the one cited line (`action-tools.ts:535`) had already drifted to 545 in a 961-line file that is actively edited. The anchors are the load-bearing half, and they are why the DATE matters: `scanEvidence` never collects an anchor while a foreign realm marker is in force, so CI cannot re-derive a single one of the cloud anchors — each rests on that dated reading alone. ⛔ Never re-stamp `verifiedAt` here without re-reading cloud; a bare re-stamp restores exactly the unfalsifiable pointer this entry's history is made of. These props are `live` because that cloud runtime consumes them; the OPEN framework edition does not — see content/docs/ai for the open/cloud boundary. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent.", + "_note": "ActionSchema. Seeded from docs/audits/archive/2026-06/2026-06-actionschema-property-liveness.md. Renderers live in objectui (evidence cited as prose, not framework paths); framework-side: service-ai action-tools, runtime body-runner/http-dispatcher. Containers (params/resultDialog/ai/aria) classified at top level — no divergent sub-statuses in the audit. ⚠ EVIDENCE LIVES IN CLOUD/EE: the `cloud @: packages/service-ai/...` paths cited below are the closed `@objectstack/service-ai` runtime in the CLOUD repo, NOT git-tracked framework code. 2026-08-30 (#13272): the previous wording of this sentence was false in BOTH halves. (a) It called the framework's own service-ai tree “a stale build artifact with no src/” — there is no tree at all: `packages/services/` holds every sibling service EXCEPT service-ai, and `git ls-files | grep -ic service-ai` returns 0. Absent, not stale. (b) The citations spelled `packages/services/service-ai/...`, a path present in NEITHER repo; cloud's real layout, measured at cloud@15f55df (commit c19035e97), is `packages/service-ai/...`. Every citation below now carries the explicit `cloud` realm marker, so it is attributed by the marker `scanEvidence` reads rather than riding the `FOREIGN_PATH_PREFIXES` special case that silently exempted the stale spelling from resolution — which is why 22 dead pointers sat green. ✅ RE-VERIFIED 2026-09-15 (#13272): the re-verification half this entry parked is discharged. All three cloud consumers cited below were re-read in a cloud checkout at cloud @cb8ee7ff60c097cc21a584fe9caf8ef4391cc0e8 and all three are CONFIRMED; every row now carries `verifiedAt`, `evidenceScope: cross-repo`, and `#symbol` anchors pinned to the consuming functions instead of a line number — the one cited line (`action-tools.ts:535`) had already drifted to 545 in a 961-line file that is actively edited. The anchors are the load-bearing half, and they are why the DATE matters: `scanEvidence` never collects an anchor while a foreign realm marker is in force, so CI cannot re-derive a single one of the cloud anchors — each rests on that dated reading alone. ⛔ Never re-stamp `verifiedAt` here without re-reading cloud; a bare re-stamp restores exactly the unfalsifiable pointer this entry's history is made of. These props are `live` because that cloud runtime consumes them; the OPEN framework edition does not — see content/docs/ai for the open/cloud boundary. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/agent.json b/packages/spec/liveness/agent.json index af0e6d0e835..bc72a65c737 100644 --- a/packages/spec/liveness/agent.json +++ b/packages/spec/liveness/agent.json @@ -1,6 +1,6 @@ { "type": "agent", - "_note": "AgentSchema. Seeded from docs/audits/2026-06-agentschema-property-liveness.md. agent-runtime.ts is the PRINCIPAL runtime consumer, not the only one: `routes/agent-routes.ts`, `routes/assistant-routes.ts`, `routes/agent-access.ts` and `eval/eval-runner.ts` each read keys classified here, and `planning` is read in three of those and in agent-runtime.ts NOT AT ALL — the citation this entry carried for it named the wrong file until 2026-09-15 (#13272). AgentPreview is display-only. ⚠ EVIDENCE LIVES IN CLOUD/EE: the `cloud @: packages/service-ai/...` paths cited below are the closed `@objectstack/service-ai` runtime in the CLOUD repo, NOT git-tracked framework code. 2026-08-30 (#13272): the previous wording of this sentence was false in BOTH halves. (a) It called the framework's own service-ai tree “a stale build artifact with no src/” — there is no tree at all: `packages/services/` holds every sibling service EXCEPT service-ai, and `git ls-files | grep -ic service-ai` returns 0. Absent, not stale. (b) The citations spelled `packages/services/service-ai/...`, a path present in NEITHER repo; cloud's real layout, measured at cloud@15f55df (commit c19035e97), is `packages/service-ai/...`. Every citation below now carries the explicit `cloud` realm marker, so it is attributed by the marker `scanEvidence` reads rather than riding the `FOREIGN_PATH_PREFIXES` special case that silently exempted the stale spelling from resolution — which is why 22 dead pointers sat green. ✅ RE-VERIFIED 2026-09-15 (#13272): the re-verification half this entry parked is discharged. Every cloud consumer cited below was re-read in a cloud checkout at cloud @cb8ee7ff60c097cc21a584fe9caf8ef4391cc0e8, and the ten rows the read confirmed now carry `verifiedAt`, `evidenceScope: cross-repo`, and a `#symbol` anchor pinned to the consumer instead of a line number — the two cited line numbers (`agent-runtime.ts:264`, `agent-access.ts:50`) had both drifted onto prose, which is the rot a line citation produces and a symbol does not. The anchors are the load-bearing half, and they are why the DATE matters: `scanEvidence` never collects an anchor while a foreign realm marker is in force, so CI cannot re-derive a single one of the cloud anchors — each rests on that dated reading alone. ⛔ Never re-stamp `verifiedAt` here without re-reading cloud; a bare re-stamp restores exactly the unfalsifiable pointer this entry's history is made of. ⛔ ONE ROW WAS DELIBERATELY NOT STAMPED, AND HAS SINCE BEEN RE-GRADED. `tools` was FALSIFIED by the same read: zero consumers in cloud at that ref, where the only two mentions are comments recording the removal of the branch, while this repo's own AgentSchema already declares the key `retiredKey(...)`. A `verifiedAt` beside `live` would have certified the wrong thing, so #13272 left that row's `status`, `note` and old evidence untouched and handed the liveness re-grade to triage as #18304; triage graded it (b) and the re-grade LANDED 2026-09-18 — `live` -> `dead`, the stale `evidence` pointer deleted, and the cloud reading attributed and dated inside the row's own `note`. Note the shape — that row sat `live` since the 2026-06 audit BECAUSE `FOREIGN_PATH_PREFIXES` exempted its citation from resolution, so the exemption this card was filed about had hidden a dead key, not only a misspelled path. These props are `live` because that cloud runtime consumes them; the OPEN framework edition does not — see content/docs/ai for the open/cloud boundary. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. agent.knowledge (and AIKnowledgeSchema) removed; the topics→sources rename was absorbed into the removal pre-release.", + "_note": "AgentSchema. Seeded from docs/audits/archive/2026-06/2026-06-agentschema-property-liveness.md. agent-runtime.ts is the PRINCIPAL runtime consumer, not the only one: `routes/agent-routes.ts`, `routes/assistant-routes.ts`, `routes/agent-access.ts` and `eval/eval-runner.ts` each read keys classified here, and `planning` is read in three of those and in agent-runtime.ts NOT AT ALL — the citation this entry carried for it named the wrong file until 2026-09-15 (#13272). AgentPreview is display-only. ⚠ EVIDENCE LIVES IN CLOUD/EE: the `cloud @: packages/service-ai/...` paths cited below are the closed `@objectstack/service-ai` runtime in the CLOUD repo, NOT git-tracked framework code. 2026-08-30 (#13272): the previous wording of this sentence was false in BOTH halves. (a) It called the framework's own service-ai tree “a stale build artifact with no src/” — there is no tree at all: `packages/services/` holds every sibling service EXCEPT service-ai, and `git ls-files | grep -ic service-ai` returns 0. Absent, not stale. (b) The citations spelled `packages/services/service-ai/...`, a path present in NEITHER repo; cloud's real layout, measured at cloud@15f55df (commit c19035e97), is `packages/service-ai/...`. Every citation below now carries the explicit `cloud` realm marker, so it is attributed by the marker `scanEvidence` reads rather than riding the `FOREIGN_PATH_PREFIXES` special case that silently exempted the stale spelling from resolution — which is why 22 dead pointers sat green. ✅ RE-VERIFIED 2026-09-15 (#13272): the re-verification half this entry parked is discharged. Every cloud consumer cited below was re-read in a cloud checkout at cloud @cb8ee7ff60c097cc21a584fe9caf8ef4391cc0e8, and the ten rows the read confirmed now carry `verifiedAt`, `evidenceScope: cross-repo`, and a `#symbol` anchor pinned to the consumer instead of a line number — the two cited line numbers (`agent-runtime.ts:264`, `agent-access.ts:50`) had both drifted onto prose, which is the rot a line citation produces and a symbol does not. The anchors are the load-bearing half, and they are why the DATE matters: `scanEvidence` never collects an anchor while a foreign realm marker is in force, so CI cannot re-derive a single one of the cloud anchors — each rests on that dated reading alone. ⛔ Never re-stamp `verifiedAt` here without re-reading cloud; a bare re-stamp restores exactly the unfalsifiable pointer this entry's history is made of. ⛔ ONE ROW WAS DELIBERATELY NOT STAMPED, AND HAS SINCE BEEN RE-GRADED. `tools` was FALSIFIED by the same read: zero consumers in cloud at that ref, where the only two mentions are comments recording the removal of the branch, while this repo's own AgentSchema already declares the key `retiredKey(...)`. A `verifiedAt` beside `live` would have certified the wrong thing, so #13272 left that row's `status`, `note` and old evidence untouched and handed the liveness re-grade to triage as #18304; triage graded it (b) and the re-grade LANDED 2026-09-18 — `live` -> `dead`, the stale `evidence` pointer deleted, and the cloud reading attributed and dated inside the row's own `note`. Note the shape — that row sat `live` since the 2026-06 audit BECAUSE `FOREIGN_PATH_PREFIXES` exempted its citation from resolution, so the exemption this card was filed about had hidden a dead key, not only a misspelled path. These props are `live` because that cloud runtime consumes them; the OPEN framework edition does not — see content/docs/ai for the open/cloud boundary. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. agent.knowledge (and AIKnowledgeSchema) removed; the topics→sources rename was absorbed into the removal pre-release.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/dashboard.json b/packages/spec/liveness/dashboard.json index c7138a73c92..9d686f882b5 100644 --- a/packages/spec/liveness/dashboard.json +++ b/packages/spec/liveness/dashboard.json @@ -1,6 +1,6 @@ { "type": "dashboard", - "_note": "DashboardSchema (UI, ADR-0021 dataset-bound). Live path: objectui DashboardView → DashboardRenderer → DatasetWidget. Seeded from docs/audits/2026-06-dashboardschema-property-liveness.md and re-verified against objectui HEAD — several audit-era findings are superseded: the ADR-0021 widget migration shipped (Studio WidgetConfigPanel + DashboardRenderer on dataset/dimensions/values, framework#3251; DashboardWidgetSchema is now `.strict()`); `globalFilters`/`dateRange` are LIVE (dashboard-level filters, framework#2501); the `title`↔`label` drift is fixed (renderer falls back to `label`, objectui#2806); the undeclared widget props were reconciled (#1894). objectui paths cited as prose in `note` (not `evidence`) on the dashboard-level entries; the widget children added in #4956 use the realm-marked `evidence` form (`objectui @91757a7: …`) that the gate can attribute. Framework provenance/lock fields auto-classify live (ADR-0010). 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. 2026-08-03 (#4876): `widgets[].responsive` REMOVED — tombstoned (retiredKey) and stripped by the protocol-17 `dashboard-widget-responsive-removed` conversion. 2026-08-03 (#4956, landed after #4876): the widget subtree is DRILLED — `widgets.children` classifies all 22 authorable DashboardWidgetSchema keys. This SUPERSEDES two sentences that stood here. The first, for a release: 'Widget-level props are classified in the DashboardWidgetSchema subtree, not drilled here' — FALSE in the only way that mattered, because no such subtree existed in any ledger file, the walk drills one level and only through an explicit `children`, and `widgets` declared none, so all 22 keys sat outside the map while the gate printed green; `widgets[].responsive` survived the #3896 sweep on that gap alone, not on evidence. The second, from #4876 itself: that `responsive` deliberately carries NO row here because one would be an ORPHAN. That was correct only while `widgets` was undrilled — the retiredKey tombstone KEEPS the key in the walked shape, so now that the drill has landed the row is REQUIRED (omitting it reports UNCLASSIFIED), and it is present below with the dead verdict the sweep never got to record. The gate now refuses an undeclared container inheritance outright (scripts/liveness/drill.mts), so this class of claim cannot be re-asserted in prose. 2026-08-04 (#5011): `widgets[].compareTo` CONVERGED — the widget's three-arm vocabulary is replaced by a thin projection of the executor's own `DatasetSelection.compareTo` (`{ kind, dimension? }`), and the `{ offset }` arm retires via the `dashboard-widget-compareto-converged` conversion. Note what did NOT change: the verdict stays `live`. This was never a declared-but-unread key — the consumer existed the whole time; what was missing was agreement about what it consumes, which is a failure class this ledger had no vocabulary for until now and which its own `compareTo` row had to describe in a paragraph of prose. 2026-08-28 (commit 8f10a79f7): the four `path:NNN` citations in this file were re-anchored to their consuming symbols; all four were wrong and all four were IN RANGE.", + "_note": "DashboardSchema (UI, ADR-0021 dataset-bound). Live path: objectui DashboardView → DashboardRenderer → DatasetWidget. Seeded from docs/audits/archive/2026-06/2026-06-dashboardschema-property-liveness.md and re-verified against objectui HEAD — several audit-era findings are superseded: the ADR-0021 widget migration shipped (Studio WidgetConfigPanel + DashboardRenderer on dataset/dimensions/values, framework#3251; DashboardWidgetSchema is now `.strict()`); `globalFilters`/`dateRange` are LIVE (dashboard-level filters, framework#2501); the `title`↔`label` drift is fixed (renderer falls back to `label`, objectui#2806); the undeclared widget props were reconciled (#1894). objectui paths cited as prose in `note` (not `evidence`) on the dashboard-level entries; the widget children added in #4956 use the realm-marked `evidence` form (`objectui @91757a7: …`) that the gate can attribute. Framework provenance/lock fields auto-classify live (ADR-0010). 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. 2026-08-03 (#4876): `widgets[].responsive` REMOVED — tombstoned (retiredKey) and stripped by the protocol-17 `dashboard-widget-responsive-removed` conversion. 2026-08-03 (#4956, landed after #4876): the widget subtree is DRILLED — `widgets.children` classifies all 22 authorable DashboardWidgetSchema keys. This SUPERSEDES two sentences that stood here. The first, for a release: 'Widget-level props are classified in the DashboardWidgetSchema subtree, not drilled here' — FALSE in the only way that mattered, because no such subtree existed in any ledger file, the walk drills one level and only through an explicit `children`, and `widgets` declared none, so all 22 keys sat outside the map while the gate printed green; `widgets[].responsive` survived the #3896 sweep on that gap alone, not on evidence. The second, from #4876 itself: that `responsive` deliberately carries NO row here because one would be an ORPHAN. That was correct only while `widgets` was undrilled — the retiredKey tombstone KEEPS the key in the walked shape, so now that the drill has landed the row is REQUIRED (omitting it reports UNCLASSIFIED), and it is present below with the dead verdict the sweep never got to record. The gate now refuses an undeclared container inheritance outright (scripts/liveness/drill.mts), so this class of claim cannot be re-asserted in prose. 2026-08-04 (#5011): `widgets[].compareTo` CONVERGED — the widget's three-arm vocabulary is replaced by a thin projection of the executor's own `DatasetSelection.compareTo` (`{ kind, dimension? }`), and the `{ offset }` arm retires via the `dashboard-widget-compareto-converged` conversion. Note what did NOT change: the verdict stays `live`. This was never a declared-but-unread key — the consumer existed the whole time; what was missing was agreement about what it consumes, which is a failure class this ledger had no vocabulary for until now and which its own `compareTo` row had to describe in a paragraph of prose. 2026-08-28 (commit 8f10a79f7): the four `path:NNN` citations in this file were re-anchored to their consuming symbols; all four were wrong and all four were IN RANGE.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/field.json b/packages/spec/liveness/field.json index 00541ab00d5..ce6dc5fa886 100644 --- a/packages/spec/liveness/field.json +++ b/packages/spec/liveness/field.json @@ -1,6 +1,6 @@ { "type": "field", - "_note": "FieldSchema (flat — all field-type configs are top-level optional props). Seeded from docs/audits/2026-06-fieldschema-property-liveness.md. The wholly-dead nested config objects (vectorConfig/fileAttachmentConfig/encryptionConfig/maskingRule/cached/dataQuality) were removed (#2377 + earlier pruning); currencyConfig is LIVE via the objectui renderer. Naming-drift props are server-live but client-snake. Framework evidence cited with paths; objectui-renderer evidence as prose. 2026-08-28 (commit 8f10a79f7): seven of this file's eight `path:NNN` citations were re-anchored to their consuming symbols. The eighth — `conditionalRequired` — is deliberately NOT re-anchored and NOT re-stamped: its cited `.transform` lowering was removed in protocol 17 (#3855), the key is now a `retiredKey` tombstone, and the fallback this row's note credits `rule-validator.ts` with keeping is gone too (that module documents this alias as retired and pins the absence with a test). The `live` verdict is therefore falsified, which is an ADR-0049 re-classification with its own card shape — the `action.execute` precedent (commit cae2169cf) — and is reported separately rather than executed here.", + "_note": "FieldSchema (flat — all field-type configs are top-level optional props). Seeded from docs/audits/archive/2026-06/2026-06-fieldschema-property-liveness.md. The wholly-dead nested config objects (vectorConfig/fileAttachmentConfig/encryptionConfig/maskingRule/cached/dataQuality) were removed (#2377 + earlier pruning); currencyConfig is LIVE via the objectui renderer. Naming-drift props are server-live but client-snake. Framework evidence cited with paths; objectui-renderer evidence as prose. 2026-08-28 (commit 8f10a79f7): seven of this file's eight `path:NNN` citations were re-anchored to their consuming symbols. The eighth — `conditionalRequired` — is deliberately NOT re-anchored and NOT re-stamped: its cited `.transform` lowering was removed in protocol 17 (#3855), the key is now a `retiredKey` tombstone, and the fallback this row's note credits `rule-validator.ts` with keeping is gone too (that module documents this alias as retired and pins the absence with a test). The `live` verdict is therefore falsified, which is an ADR-0049 re-classification with its own card shape — the `action.execute` precedent (commit cae2169cf) — and is reported separately rather than executed here.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/flow.json b/packages/spec/liveness/flow.json index 20f40e7912d..1588c75aaa0 100644 --- a/packages/spec/liveness/flow.json +++ b/packages/spec/liveness/flow.json @@ -1,6 +1,6 @@ { "type": "flow", - "_note": "FlowSchema. Seeded from docs/audits/2026-06-flowschema-property-liveness.md. Consumers: service-automation engine + node executors. runAs is marker-driven experimental (spec). CORRECTED 2026-07: the previous note claimed 'status/active gate nothing' — that was true when the audit ran but became FALSE with commit 497bda853 (2026-07-05, 'honor flow status for enable/disable'). `status` now gates binding AND execution; `active` remains a deprecated no-op. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. 2026-08-28 (commit 8f10a79f7): the four `path:NNN` citations in this file were re-anchored to their consuming symbols. All four were wrong, all four IN RANGE, and `status` also carried three bare line suffixes with no path that no check has ever resolved. LIVE RECORD (#25609 declared it, #25573 reads it; ruling 6377731715 on #25496, letter B for #25446, \"default off\"): an approval node's `config.excludeSubmitter` (ApprovalNodeConfigSchema in packages/spec/src/automation/approval.zod.ts), optional and absent when off, removes the request's submitter (`sys_approval_request.submitter_id`, the run's trigger user) from the slate `approvers` resolves to, for every approver type; an emptied slate takes the node's `onEmptyApprovers` route, never a silent pass, and the approval record shows that the exclusion changed the route. Consumer: plugin-approvals (packages/plugins/plugin-approvals/src/approval-service.ts): `openNodeRequest` screens the `approvers`, `fallback` and `admin_rescue` slates through `excludedSubmitterSlots` and writes the `__submitterExclusionNote` route note, and `decideNode`, `reassign` and the SLA `escalateRequest` keep the slot out of the submitter's hands after the open. No row carries it: the walk ends at `nodes.config`, a `z.record(z.string(), z.unknown())` that childShape() does not descend — a `children` map planted there is refused, exit 1, as `flow/nodes.config (declared children but property is not a container)` (measured on #25609's branch) — and the liveness lint reads no deeper than a container's direct children, so no `authorWarn` row can reach this key's authors either. The checkable record is the authorable-surface `automation/ApprovalNodeConfig:excludeSubmitter` row and the key's own describe.", + "_note": "FlowSchema. Seeded from docs/audits/archive/2026-06/2026-06-flowschema-property-liveness.md. Consumers: service-automation engine + node executors. runAs is marker-driven experimental (spec). CORRECTED 2026-07: the previous note claimed 'status/active gate nothing' — that was true when the audit ran but became FALSE with commit 497bda853 (2026-07-05, 'honor flow status for enable/disable'). `status` now gates binding AND execution; `active` remains a deprecated no-op. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. 2026-08-28 (commit 8f10a79f7): the four `path:NNN` citations in this file were re-anchored to their consuming symbols. All four were wrong, all four IN RANGE, and `status` also carried three bare line suffixes with no path that no check has ever resolved. LIVE RECORD (#25609 declared it, #25573 reads it; ruling 6377731715 on #25496, letter B for #25446, \"default off\"): an approval node's `config.excludeSubmitter` (ApprovalNodeConfigSchema in packages/spec/src/automation/approval.zod.ts), optional and absent when off, removes the request's submitter (`sys_approval_request.submitter_id`, the run's trigger user) from the slate `approvers` resolves to, for every approver type; an emptied slate takes the node's `onEmptyApprovers` route, never a silent pass, and the approval record shows that the exclusion changed the route. Consumer: plugin-approvals (packages/plugins/plugin-approvals/src/approval-service.ts): `openNodeRequest` screens the `approvers`, `fallback` and `admin_rescue` slates through `excludedSubmitterSlots` and writes the `__submitterExclusionNote` route note, and `decideNode`, `reassign` and the SLA `escalateRequest` keep the slot out of the submitter's hands after the open. No row carries it: the walk ends at `nodes.config`, a `z.record(z.string(), z.unknown())` that childShape() does not descend — a `children` map planted there is refused, exit 1, as `flow/nodes.config (declared children but property is not a container)` (measured on #25609's branch) — and the liveness lint reads no deeper than a container's direct children, so no `authorWarn` row can reach this key's authors either. The checkable record is the authorable-surface `automation/ApprovalNodeConfig:excludeSubmitter` row and the key's own describe.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/hook.json b/packages/spec/liveness/hook.json index 20d747d6af1..9a9e8609d9d 100644 --- a/packages/spec/liveness/hook.json +++ b/packages/spec/liveness/hook.json @@ -1,6 +1,6 @@ { "type": "hook", - "_note": "HookSchema. Seeded from docs/audits/2026-06-hookschema-property-liveness.md — a model-healthy schema (near-total liveness). Consumers: objectql hook-binder/engine + runtime sandbox. PREVIEW LOOKUP RECORDED 2026-08-10 (#7427): the two `dead` rows here (`label`, `description`) are the docs-shaped precedent the rest of this ledger cites, so the maintainer's 2026-08-10 previews ruling (#7131 — see README, 'Designer previews count as consumers') was applied to them mechanically, and the answer is an ABSENCE. There is NO registered metadata-admin preview for `hook` at objectui @e9ab52f9: packages/app-shell/src/views/metadata-admin/previews/index.ts registers 22 types and `hook` is not among them. Recorded rather than skipped, because 'the type has no registered preview' is the sentence the README asks for and the one `translation.label`'s superseded note was missing. Both verdicts stand unchanged; the ruling gives them nothing to re-litigate. 2026-08-28 (commit 8f10a79f7): all eight `path:NNN` citations in this file were re-anchored. The five `evidence` pointers into `hook-binder.ts` were all wrong and all IN RANGE — two keys even shared one wrong line — while the three `producer` pointers at `:221` were accurate and are a straight grammar migration. The declarative trio's `evidence` was a bare path with no line, which no line bound can falsify; those are anchors now. 2026-09-29 (#20299): `label` and `description` are RE-GRADED dead → live. The 2026-08-10 lookup above still reads true, since `hook` still has no registered preview at the `.objectui-sha` pin dd3f7e1be, but it looked at previews only. The Studio metadata list and the metadata quick-find draw both keys for every hook, and a booted read of `GET /api/v1/meta/hook` serves them; the rows carry the reader, the producer and the measurement. They are still KEPT, docs-shaped and not authorWarn'd.", + "_note": "HookSchema. Seeded from docs/audits/archive/2026-06/2026-06-hookschema-property-liveness.md — a model-healthy schema (near-total liveness). Consumers: objectql hook-binder/engine + runtime sandbox. PREVIEW LOOKUP RECORDED 2026-08-10 (#7427): the two `dead` rows here (`label`, `description`) are the docs-shaped precedent the rest of this ledger cites, so the maintainer's 2026-08-10 previews ruling (#7131 — see README, 'Designer previews count as consumers') was applied to them mechanically, and the answer is an ABSENCE. There is NO registered metadata-admin preview for `hook` at objectui @e9ab52f9: packages/app-shell/src/views/metadata-admin/previews/index.ts registers 22 types and `hook` is not among them. Recorded rather than skipped, because 'the type has no registered preview' is the sentence the README asks for and the one `translation.label`'s superseded note was missing. Both verdicts stand unchanged; the ruling gives them nothing to re-litigate. 2026-08-28 (commit 8f10a79f7): all eight `path:NNN` citations in this file were re-anchored. The five `evidence` pointers into `hook-binder.ts` were all wrong and all IN RANGE — two keys even shared one wrong line — while the three `producer` pointers at `:221` were accurate and are a straight grammar migration. The declarative trio's `evidence` was a bare path with no line, which no line bound can falsify; those are anchors now. 2026-09-29 (#20299): `label` and `description` are RE-GRADED dead → live. The 2026-08-10 lookup above still reads true, since `hook` still has no registered preview at the `.objectui-sha` pin dd3f7e1be, but it looked at previews only. The Studio metadata list and the metadata quick-find draw both keys for every hook, and a booted read of `GET /api/v1/meta/hook` serves them; the rows carry the reader, the producer and the measurement. They are still KEPT, docs-shaped and not authorWarn'd.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/object.json b/packages/spec/liveness/object.json index 4c678acb7c1..cfee23c25d1 100644 --- a/packages/spec/liveness/object.json +++ b/packages/spec/liveness/object.json @@ -1,6 +1,6 @@ { "type": "object", - "_note": "ObjectSchema (top-level). Seeded from docs/audits/2026-06-objectschema-property-liveness.md. Roughly half dead — a large aspirational enterprise-data-management tier with zero runtime. Framework evidence cited with paths; objectui-renderer evidence as prose.", + "_note": "ObjectSchema (top-level). Seeded from docs/audits/archive/2026-06/2026-06-objectschema-property-liveness.md. Roughly half dead — a large aspirational enterprise-data-management tier with zero runtime. Framework evidence cited with paths; objectui-renderer evidence as prose.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/report.json b/packages/spec/liveness/report.json index 4e555bfbcf0..a477ac70ec8 100644 --- a/packages/spec/liveness/report.json +++ b/packages/spec/liveness/report.json @@ -1,6 +1,6 @@ { "type": "report", - "_note": "ReportSchema (analytics report, ADR-0021 single-form). Live path: objectui ReportRenderer → DatasetReportRenderer (dataset-bound). Seeded from docs/audits/2026-06-reportschema-property-liveness.md and re-verified against objectui HEAD — the audit's `chart` = DEAD finding is superseded: DatasetReportRenderer's DatasetReportChart now plots `chart.xAxis`/`yAxis` (dataset dimension/measure) via useDatasetRows (framework#1890/#3441), so `chart` is LIVE (only its `groupBy` sub-key stays experimental, per its own describe marker). objectui paths cited as prose in `note` (not `evidence`, which resolves framework file:line). Framework provenance/lock fields (protection/_lock*) auto-classify live (ADR-0010). 2026-07-30: the aria/performance entries were STALE — the keys had already been removed from the schema in the report-liveness close-out; deleted as ledger hygiene.", + "_note": "ReportSchema (analytics report, ADR-0021 single-form). Live path: objectui ReportRenderer → DatasetReportRenderer (dataset-bound). Seeded from docs/audits/archive/2026-06/2026-06-reportschema-property-liveness.md and re-verified against objectui HEAD — the audit's `chart` = DEAD finding is superseded: DatasetReportRenderer's DatasetReportChart now plots `chart.xAxis`/`yAxis` (dataset dimension/measure) via useDatasetRows (framework#1890/#3441), so `chart` is LIVE (only its `groupBy` sub-key stays experimental, per its own describe marker). objectui paths cited as prose in `note` (not `evidence`, which resolves framework file:line). Framework provenance/lock fields (protection/_lock*) auto-classify live (ADR-0010). 2026-07-30: the aria/performance entries were STALE — the keys had already been removed from the schema in the report-liveness close-out; deleted as ledger hygiene.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/skill.json b/packages/spec/liveness/skill.json index ea8476231e4..6e4069170f7 100644 --- a/packages/spec/liveness/skill.json +++ b/packages/spec/liveness/skill.json @@ -1,6 +1,6 @@ { "type": "skill", - "_note": "SkillSchema. Seeded from docs/audits/2026-06-skillschema-property-liveness.md. skill-registry.ts + agent-runtime.ts are the runtime consumers. ⚠ EVIDENCE LIVES IN CLOUD/EE: the `cloud @: packages/service-ai/...` paths cited below are the closed `@objectstack/service-ai` runtime in the CLOUD repo, NOT git-tracked framework code. 2026-08-30 (#13272): the previous wording of this sentence was false in BOTH halves. (a) It called the framework's own service-ai tree “a stale build artifact with no src/” — there is no tree at all: `packages/services/` holds every sibling service EXCEPT service-ai, and `git ls-files | grep -ic service-ai` returns 0. Absent, not stale. (b) The citations spelled `packages/services/service-ai/...`, a path present in NEITHER repo; cloud's real layout, measured at cloud@15f55df (commit c19035e97), is `packages/service-ai/...`. Every citation below now carries the explicit `cloud` realm marker, so it is attributed by the marker `scanEvidence` reads rather than riding the `FOREIGN_PATH_PREFIXES` special case that silently exempted the stale spelling from resolution — which is why 22 dead pointers sat green. ✅ RE-VERIFIED 2026-09-15 (#13272): the re-verification half this entry parked is discharged. All eight cloud consumers cited below were re-read in a cloud checkout at cloud @cb8ee7ff60c097cc21a584fe9caf8ef4391cc0e8 and all eight are CONFIRMED; every row now carries `verifiedAt`, `evidenceScope: cross-repo`, and a `#symbol` anchor instead of a line number. The `verifiedAt: 2026-08-06` these eight used to carry was worse than no stamp at all — it was taken while the citation still named `packages/services/service-ai/…`, a path present in NEITHER repo, so it was false confidence that the 180-day staleness clock in verification.mts is structurally unable to see: 40 days old, never flagged, resting on nothing. The anchors are the load-bearing half, and they are why the DATE matters: `scanEvidence` never collects an anchor while a foreign realm marker is in force, so CI cannot re-derive a single one of the cloud anchors — each rests on that dated reading alone. ⛔ Never re-stamp `verifiedAt` here without re-reading cloud; a bare re-stamp restores exactly the unfalsifiable pointer this entry's history is made of. The FRAMEWORK half is the one CI can falsify, and it is now written so it does: `packages/mcp/src/skill-prompts.ts#projectSkillPrompt` sits after a `;`, which ends the cloud realm's scope, so the anchor is LOCAL and `checkEvidenceAnchors` resolves it against the file on every run — where the old parenthesised `(projectSkillPrompt)` was prose the gate never read. ⚠ `instructions` used to cite `(skillPromptResult)`, one hop too far downstream: that function consumes the PROJECTED value, while the record's own `instructions` key is read in `projectSkillPrompt`, which is what the anchor now names. 2026-08-06 (#3905): that used to be the WHOLE story — the open framework consumed nothing here. It now consumes the INSTRUCTIONS half: `packages/mcp/src/skill-prompts.ts` projects every active skill carrying `instructions` onto the MCP `prompts` primitive (name/label/description/instructions/active are read there, in-repo and testable). The TOOL-BINDING half (`tools`, `surface`, `triggerConditions`) stays cloud-runtime-only and now says so in the schema's own JSDoc. See content/docs/ai for the open/cloud boundary. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent.", + "_note": "SkillSchema. Seeded from docs/audits/archive/2026-06/2026-06-skillschema-property-liveness.md. skill-registry.ts + agent-runtime.ts are the runtime consumers. ⚠ EVIDENCE LIVES IN CLOUD/EE: the `cloud @: packages/service-ai/...` paths cited below are the closed `@objectstack/service-ai` runtime in the CLOUD repo, NOT git-tracked framework code. 2026-08-30 (#13272): the previous wording of this sentence was false in BOTH halves. (a) It called the framework's own service-ai tree “a stale build artifact with no src/” — there is no tree at all: `packages/services/` holds every sibling service EXCEPT service-ai, and `git ls-files | grep -ic service-ai` returns 0. Absent, not stale. (b) The citations spelled `packages/services/service-ai/...`, a path present in NEITHER repo; cloud's real layout, measured at cloud@15f55df (commit c19035e97), is `packages/service-ai/...`. Every citation below now carries the explicit `cloud` realm marker, so it is attributed by the marker `scanEvidence` reads rather than riding the `FOREIGN_PATH_PREFIXES` special case that silently exempted the stale spelling from resolution — which is why 22 dead pointers sat green. ✅ RE-VERIFIED 2026-09-15 (#13272): the re-verification half this entry parked is discharged. All eight cloud consumers cited below were re-read in a cloud checkout at cloud @cb8ee7ff60c097cc21a584fe9caf8ef4391cc0e8 and all eight are CONFIRMED; every row now carries `verifiedAt`, `evidenceScope: cross-repo`, and a `#symbol` anchor instead of a line number. The `verifiedAt: 2026-08-06` these eight used to carry was worse than no stamp at all — it was taken while the citation still named `packages/services/service-ai/…`, a path present in NEITHER repo, so it was false confidence that the 180-day staleness clock in verification.mts is structurally unable to see: 40 days old, never flagged, resting on nothing. The anchors are the load-bearing half, and they are why the DATE matters: `scanEvidence` never collects an anchor while a foreign realm marker is in force, so CI cannot re-derive a single one of the cloud anchors — each rests on that dated reading alone. ⛔ Never re-stamp `verifiedAt` here without re-reading cloud; a bare re-stamp restores exactly the unfalsifiable pointer this entry's history is made of. The FRAMEWORK half is the one CI can falsify, and it is now written so it does: `packages/mcp/src/skill-prompts.ts#projectSkillPrompt` sits after a `;`, which ends the cloud realm's scope, so the anchor is LOCAL and `checkEvidenceAnchors` resolves it against the file on every run — where the old parenthesised `(projectSkillPrompt)` was prose the gate never read. ⚠ `instructions` used to cite `(skillPromptResult)`, one hop too far downstream: that function consumes the PROJECTED value, while the record's own `instructions` key is read in `projectSkillPrompt`, which is what the anchor now names. 2026-08-06 (#3905): that used to be the WHOLE story — the open framework consumed nothing here. It now consumes the INSTRUCTIONS half: `packages/mcp/src/skill-prompts.ts` projects every active skill carrying `instructions` onto the MCP `prompts` primitive (name/label/description/instructions/active are read there, in-repo and testable). The TOOL-BINDING half (`tools`, `surface`, `triggerConditions`) stays cloud-runtime-only and now says so in the schema's own JSDoc. See content/docs/ai for the open/cloud boundary. 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent.", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/tool.json b/packages/spec/liveness/tool.json index 5d6579c1ee3..7c5ba2a10b3 100644 --- a/packages/spec/liveness/tool.json +++ b/packages/spec/liveness/tool.json @@ -1,6 +1,6 @@ { "type": "tool", - "_note": "ToolSchema. Seeded from docs/audits/2026-06-toolschema-property-liveness.md. Tool metadata is not an execution entry point — the RUNTIME uses a separate AIToolDefinition, and most props here are live via that same-named surface. ⚠ 2026-08-29: the framing this note carried for years, 'WRITE-ONLY … not metadata read-back', is FALSIFIED and was actively harmful — it is why nobody looked at the renderer. objectui's metadata-admin preview IS a registered consumer of persisted `tool` records (objectui @26896c6, `registerMetadataPreview('tool', ToolPreview)`), and ToolPreview reads ALL SIX props off the stored record: name, label, description, objectName, parameters, outputSchema. So there are TWO live bases on this type, and each row says which one it rests on: the AIToolDefinition surface (behavioural) and the metadata read-back (display, the #7131 rule). `objectName` is the row that turns on the difference — it has NO behavioural reader anywhere and is live on the read-back alone. ⚠ EVIDENCE LIVES MOSTLY IN CLOUD: every `cloud`-attributed path below is the closed `@objectstack/service-ai` / `@objectstack/service-ai-studio` runtime in the CLOUD repo, not git-tracked here — see content/docs/ai for the open/cloud boundary. 2026-08-29 RE-CLOSED against cloud `origin/main@15f55df`, the first pass run from a container that actually had a cloud checkout in reach; three things the old note asserted turned out to be false, and each failed in its own way. (a) It said the framework's own service-ai tree 'is a stale build artifact with no src/'. That was stale twice over and is now simply FALSE — the tree is ABSENT: `git ls-files` matches 0 paths containing service-ai, no such directory exists on disk, and `packages/services/` holds 16 members, none of them service-ai. There is no artifact left to be stale. (b) The cited path prefix was wrong for the CLOUD repo too. Cloud's real layout is `packages/service-ai/…` and `packages/service-ai-studio/…`, never `packages/services/service-ai/…`, so the five citations this file used to carry named a path that exists in NEITHER repo — unfalsifiable pointers, which is exactly what the README says a `live` verdict must never rest on. ⚠ MECHANICAL TRAP for anyone repointing a sibling ledger: `scripts/liveness/evidence.mts` hardcodes only `packages/services/service-ai/` in FOREIGN_PATH_PREFIXES, which is why the WRONG spelling sat green for so long; the REAL cloud path is repo-rooted in shape and is NOT in that list, so an unmarked repoint resolves as LOCAL and fails CI. Every citation of it MUST carry the `cloud` realm marker. The stale spelling and this note's sentence (a) both survive in action.json (3 entries), agent.json (11) and skill.json (8) — filed as #13272. (c) 'the OPEN framework edition does not consume them' is FALSE for `name` and `description`: `packages/mcp` bridges each AIToolDefinition onto an MCP server and reads both. Those two entries now carry framework-local ANCHORED evidence, so CI can falsify them from this checkout — the condition this re-close (commit c19035e97) was run to meet. (d) the write-only claim above, corrected in the same pass once an objectui checkout came into reach. Note the pattern across all four: every one of them was a NEGATIVE claim ('no src', 'not framework code', 'the open edition does not', 'not read back') that no gate could falsify, and three of the four were wrong. The realms named in each `evidenceScope` are the realms actually walked — cloud @15f55df and objectui @26896c6 — and never 'everywhere'. 2026-07-30 (#3896 close-out): the four inert authoring keys (category/permissions/active/builtIn) were REMOVED from ToolSchema — permissions promised an invocation gate nothing enforced, active:false withdrew nothing; strict-rejected with prescriptions (TOOL_RETIRED_KEY_GUIDANCE) and stripped by the tool-inert-authoring-keys-removed conversion. Entries deleted per the requiresConfirmation precedent (#3715).", + "_note": "ToolSchema. Seeded from docs/audits/archive/2026-06/2026-06-toolschema-property-liveness.md. Tool metadata is not an execution entry point — the RUNTIME uses a separate AIToolDefinition, and most props here are live via that same-named surface. ⚠ 2026-08-29: the framing this note carried for years, 'WRITE-ONLY … not metadata read-back', is FALSIFIED and was actively harmful — it is why nobody looked at the renderer. objectui's metadata-admin preview IS a registered consumer of persisted `tool` records (objectui @26896c6, `registerMetadataPreview('tool', ToolPreview)`), and ToolPreview reads ALL SIX props off the stored record: name, label, description, objectName, parameters, outputSchema. So there are TWO live bases on this type, and each row says which one it rests on: the AIToolDefinition surface (behavioural) and the metadata read-back (display, the #7131 rule). `objectName` is the row that turns on the difference — it has NO behavioural reader anywhere and is live on the read-back alone. ⚠ EVIDENCE LIVES MOSTLY IN CLOUD: every `cloud`-attributed path below is the closed `@objectstack/service-ai` / `@objectstack/service-ai-studio` runtime in the CLOUD repo, not git-tracked here — see content/docs/ai for the open/cloud boundary. 2026-08-29 RE-CLOSED against cloud `origin/main@15f55df`, the first pass run from a container that actually had a cloud checkout in reach; three things the old note asserted turned out to be false, and each failed in its own way. (a) It said the framework's own service-ai tree 'is a stale build artifact with no src/'. That was stale twice over and is now simply FALSE — the tree is ABSENT: `git ls-files` matches 0 paths containing service-ai, no such directory exists on disk, and `packages/services/` holds 16 members, none of them service-ai. There is no artifact left to be stale. (b) The cited path prefix was wrong for the CLOUD repo too. Cloud's real layout is `packages/service-ai/…` and `packages/service-ai-studio/…`, never `packages/services/service-ai/…`, so the five citations this file used to carry named a path that exists in NEITHER repo — unfalsifiable pointers, which is exactly what the README says a `live` verdict must never rest on. ⚠ MECHANICAL TRAP for anyone repointing a sibling ledger: `scripts/liveness/evidence.mts` hardcodes only `packages/services/service-ai/` in FOREIGN_PATH_PREFIXES, which is why the WRONG spelling sat green for so long; the REAL cloud path is repo-rooted in shape and is NOT in that list, so an unmarked repoint resolves as LOCAL and fails CI. Every citation of it MUST carry the `cloud` realm marker. The stale spelling and this note's sentence (a) both survive in action.json (3 entries), agent.json (11) and skill.json (8) — filed as #13272. (c) 'the OPEN framework edition does not consume them' is FALSE for `name` and `description`: `packages/mcp` bridges each AIToolDefinition onto an MCP server and reads both. Those two entries now carry framework-local ANCHORED evidence, so CI can falsify them from this checkout — the condition this re-close (commit c19035e97) was run to meet. (d) the write-only claim above, corrected in the same pass once an objectui checkout came into reach. Note the pattern across all four: every one of them was a NEGATIVE claim ('no src', 'not framework code', 'the open edition does not', 'not read back') that no gate could falsify, and three of the four were wrong. The realms named in each `evidenceScope` are the realms actually walked — cloud @15f55df and objectui @26896c6 — and never 'everywhere'. 2026-07-30 (#3896 close-out): the four inert authoring keys (category/permissions/active/builtIn) were REMOVED from ToolSchema — permissions promised an invocation gate nothing enforced, active:false withdrew nothing; strict-rejected with prescriptions (TOOL_RETIRED_KEY_GUIDANCE) and stripped by the tool-inert-authoring-keys-removed conversion. Entries deleted per the requiresConfirmation precedent (#3715).", "props": { "name": { "status": "live", diff --git a/packages/spec/liveness/view.json b/packages/spec/liveness/view.json index 41503a0411f..8274acbe32f 100644 --- a/packages/spec/liveness/view.json +++ b/packages/spec/liveness/view.json @@ -1,6 +1,6 @@ { "type": "view", - "_note": "ViewSchema (object view container: list/form/listViews/formViews). Seeded from docs/audits/2026-06-viewschema-property-liveness.md (objectui consumer cross-reference) and re-verified against objectui@fb35e48 (2026-07-16) — several audit-era DEAD findings have since gone LIVE (submitBehavior, sharing.lockedBy, ViewData providers on the list path) and are classified from the current reads, not the stale audit lines. objectui paths cited as 'objectui: ' prose (not resolved against this repo). Sub-sub-key divergences (userActions.buttons, addRecord.mode/formView, tabs[].order) can't be drilled (one level only) — captured in the parent entry's note and tracked in the enforce-or-remove worklist (#2998 Track B / ADR-0049). 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. widget.performance (no ledger file of its own) was verified dead the corrected way — zero readers in either repo; objectui virtual scrolling reads the LIVE top-level virtualScroll — and removed with them. 2026-08-28 (commit 8f10a79f7): all five `path:NNN` citations in this file were re-anchored to their consuming symbols, and all five were wrong. Two pairs shared one wrong line each — `list.name`/`listViews` on a schema declaration, `form.sharing`/`formViews` on a comment about API routes — and `object` was falsified in PROSE as well as position, naming a function that lives in another package.", + "_note": "ViewSchema (object view container: list/form/listViews/formViews). Seeded from docs/audits/archive/2026-06/2026-06-viewschema-property-liveness.md (objectui consumer cross-reference) and re-verified against objectui@fb35e48 (2026-07-16) — several audit-era DEAD findings have since gone LIVE (submitBehavior, sharing.lockedBy, ViewData providers on the list path) and are classified from the current reads, not the stale audit lines. objectui paths cited as 'objectui: ' prose (not resolved against this repo). Sub-sub-key divergences (userActions.buttons, addRecord.mode/formView, tabs[].order) can't be drilled (one level only) — captured in the parent entry's note and tracked in the enforce-or-remove worklist (#2998 Track B / ADR-0049). 2026-07-30 (#3896 close-out sweep): the dead authoring keys were REMOVED — tombstoned at the schema with prescriptions (retiredKey) and stripped by the protocol-17 close-out conversions; entries deleted per the #3715 precedent. widget.performance (no ledger file of its own) was verified dead the corrected way — zero readers in either repo; objectui virtual scrolling reads the LIVE top-level virtualScroll — and removed with them. 2026-08-28 (commit 8f10a79f7): all five `path:NNN` citations in this file were re-anchored to their consuming symbols, and all five were wrong. Two pairs shared one wrong line each — `list.name`/`listViews` on a schema declaration, `form.sharing`/`formViews` on a comment about API routes — and `object` was falsified in PROSE as well as position, naming a function that lives in another package.", "props": { "name": { "status": "dead",