Repository navigation
[P2] Enroll dashboard / webhook / report in the spec liveness GOVERNED set #3462
Description
Activity
- added a commit that references this issue
on Jul 25, 2026 report + dashboard enrolled — merged in #3474 (squash
a41ba5c).packages/spec/liveness/report.json(20 live / 2 dead) anddashboard.json(18 live / 2 dead) authored, each prop classified with an objectui consumer reference.- Both added to
GOVERNEDincheck-liveness.mts;pnpm --filter @objectstack/spec check:livenessgreen (report 22 classified (live 20, dead 2); dashboard 20 classified (live 18, dead 2)). performanceauthorWarn'd on each (the genuinely-misleading dead prop);ariadead but not warned.- Re-verification corrected several stale 2026-06 audit findings against current objectui HEAD: report
chartis live (DatasetReportChart viauseDatasetRows, [P1] Finish ADR-0021 analytics migration (chart view / dashboard+Studio / report) #1890/docs(spec): correct ReportChart xAxis/yAxis semantics; mark dead report surface (#1890) #3441); dashboardglobalFilters/dateRangelive (Dashboard-level filters (date / region) driving multiple charts #2501);title↔labelfixed (objectui#2806); ADR-0021 widget migration shipped ([P2] Finish the dashboard analytics migration: Studio → dataset shape, then enable DashboardWidgetSchema strict validation #3251).
webhook — still deferred. It isn't a registered metadata type, so it can't enter
GOVERNEDwithout registration first, and its schema is disconnected from the runtimesys_webhookdispatcher (specobject/isActivevs runtimeobject_name/active). Its enrollment is coupled to the disconnect decision in #3461; this issue stays open to track that last third.
Generated by Claude Code
- added a commit that references this issue
on Jul 25, 2026 webhook enrolled — all three types now governed. Merged in #3485 (squash `189854c`).
- `packages/spec/liveness/webhook.json` authored: 16 dead + 1 experimental (
authentication), every prop cited. Gate green:webhook 17 classified (dead 16, experimental 1),✓ all governed-type properties are classified. - Both deferral blockers handled:
- Not a registered metadata type → the gate walks it via a
SPEC_ONLY_SCHEMASoverride incheck-liveness.mts(consulted beforegetMetadataTypeSchema), rather than registering it. Registering would have switched on Studio webhook CRUD +saveMetaItemoverlay acceptance + diagnostics sweeping — the wrong move while the surface is still disconnected. Zero runtime blast radius. - Disconnect ([P2] Webhook: the spec
WebhookSchemaauthoring surface is disconnected from thesys_webhookdispatcher #3461) → classified honestly from the author's vantage point: the whole authoring surface is a silent no-op, so all 16 props aredead. Per-prop notes double as the future materializer's mapping table (object→object_name,isActive→active,definition_json-only vs no-sink-anywhere).
- Not a registered metadata type → the gate walks it via a
- authorWarn wired (
@objectstack/cli):os compilenow warns thatwebhooks:is a no-op, once per webhook via the requiredurlcarrier. Contract test red→green.
This was the last third of the three types (
report+dashboardlanded in #3474). Closing — the enrollment ratchet now coversdashboard/webhook/report.Note the enrollment is neutral on #3461's enforce-or-remove decision (build the ingestion bridge vs retire
stack.webhooks); that issue stays open to track it. When it resolves, the mapped props flip toliveor the ledger is removed with the schema.- `packages/spec/liveness/webhook.json` authored: 16 dead + 1 experimental (
Systemic follow-up from the metadata-liveness audit (umbrella #1878).
Why
The spec liveness gate governs only the types in
GOVERNED(packages/spec/scripts/liveness/check-liveness.mts:56):dashboard,webhook, andreportare authorable/round-trippable but NOT in this set, so they have noliveness/<type>.jsonledger and CI never checks them. That gap is the systemic reason several drifts survived undetected until the 2026-06 audit — e.g.:titlevslabel(fixed reactively in fix: read spec-canonical keys for dashboard header title and field length rules objectui#2806);object/isActivevs runtimeobject_name/active([P2] Webhook: the specWebhookSchemaauthoring surface is disconnected from thesys_webhookdispatcher #3461);chart/ReportColumn/ReportGroupingstaleness (fixed reactively in docs(spec): correct ReportChart xAxis/yAxis semantics; mark dead report surface (#1890) #3441).Enrolling these three closes the ratchet so the next such drift is a CI failure, not an audit finding years later.
Scope
For each type, following the
viewprecedent (#2998 Track B):packages/spec/liveness/<type>.jsonclassifying every top-level proplive/experimental/deadwithfile:lineevidence (drill one level viachildrenwhere sub-props diverge).GOVERNEDincheck-liveness.mts(requires it to resolve through the metadata-type registry —report/dashboardare registered;webhookis not yet, so it may need registration first, or a small gate accommodation).pnpm --filter @objectstack/spec check:livenessis green.authorWarnthe genuinely-misleading dead props (per the ledger README rules).Suggested order: report first (its chart/column/grouping split is already characterized in #3441), then webhook (do it with the #3461 decision), then dashboard.
Refs #1878, #1891, #3441, #3461, #2998.