Skip to content

Commit f0acd0c

Browse files
os-zhuangclaude
andauthored
fix(spec): cross-repo liveness re-audit — 16 props dead→live (objectui authoring UI) (#1956)
* fix(spec): reclassify 16 cross-repo-verified props dead->live (objectui authoring UI) Cross-repo re-audit (reading the actual consumer code in framework AND objectui) corrects 16 props the audit wrongly marked dead — they are LIVE via objectui's metadata-admin authoring UI (which the 2026-06 audit never checked): - agent.knowledge objectui AgentPreview.tsx:69 - role.parent objectui RolePreview.tsx:30 - permission.isProfile objectui PermissionPreview.tsx:92 - flow.status, flow.active objectui FlowPreview.tsx:105 - flow.nodes.boundaryConfig objectui inspectors/flow-node-config.ts:480 - tool.category/requiresConfirmation/active/builtIn objectui ToolPreview.tsx:99-103 - skill.triggerPhrases/permissions objectui SkillPreview.tsx:44,48 - action.execute/shortcut/bulkEnabled/disabled objectui ActionPreview.tsx:154-169 Each verified by opening the file and seeing the read (not a name match). The remaining ~42 dead props are confirmed dead in BOTH repos (real prune candidates; object-level dominates). Gate green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(audits): flag dead-surface plan as invalidated (objectui-blind); cross-repo correction Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 038ccde commit f0acd0c

9 files changed

Lines changed: 578 additions & 127 deletions

File tree

.changeset/reaudit-crossrepo.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
fix(spec): cross-repo liveness re-audit — reclassify 16 props dead→live (objectui authoring UI) and flag the dead-surface plan as invalidated. The 2026-06 audits missed objectui's metadata-admin authoring layer; verified each correction by reading the consumer code in both repos. Repo-internal tooling/docs; no package impact.

docs/audits/2026-06-dead-surface-disposition-plan.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Dead-surface disposition plan (spec liveness)
22

3+
> ## ⚠️ CORRECTION (2026-06-16) — this plan is substantially invalidated; do NOT prune from it
4+
> The "dead" verdicts were seeded from audits that **only checked the framework runtime + end-user renderers and MISSED objectui's metadata-admin authoring UI** (`../objectui/packages/app-shell/src/views/metadata-admin/`, which renders/edits nearly every authorable prop). A cross-repo re-audit (reading the actual consumer code in BOTH repos) found **~25 props this plan called "dead" are actually objectui-live** — pruning them would break the authoring UI / detail rendering. Reclassified `dead→live` in the ledgers: field `externalId`/`currencyConfig`/`searchable` + the 6 master-detail overrides; tool `category`/`requiresConfirmation`/`active`/`builtIn`; skill `triggerPhrases`/`permissions`; action `execute`/`shortcut`/`bulkEnabled`/`disabled`; flow `status`/`active`/`nodes.boundaryConfig`; agent `knowledge`; role `parent`; permission `isProfile`.
5+
> **Only ~42 props are confirmed dead in BOTH repos** (the genuine prune candidates — dominated by the 24 object-level props, which also hit `NoExcessObjectKeys` TS-strict cross-package coupling). Merged prunes #1945/#1946 were re-verified against objectui and are safe. **Any further pruning MUST verify each prop against framework AND objectui first.** The sections below are kept for history but their per-prop "prune" verdicts are unreliable.
6+
37
**Date**: 2026-06-16 · **Input**: the spec-liveness gate (`packages/spec/liveness/`) over 10 governed metadata types. **Builds on**: [ADR-0049](../adr/0049-no-unenforced-security-properties.md) (security enforce-or-remove). **Purpose**: turn the gate's measurement into an executable decision — for each of the **89 `dead` properties**, recommend **enforce / wire-rename / prune / mark-experimental / defer / objectui** with rationale, cost and risk.
48

59
> The gate already proves these properties have no framework runtime consumer. This document decides what to *do* about each. It makes recommendations; the team owns execution (especially spec removals and runtime enforcement).

packages/spec/liveness/action.json

Lines changed: 135 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,140 @@
22
"type": "action",
33
"_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.",
44
"props": {
5-
"name": { "status": "live", "evidence": "objectui action renderers + runtime dispatcher" },
6-
"label": { "status": "live", "note": "display." },
7-
"objectName": { "status": "live", "evidence": "packages/services/service-ai/src/tools/action-tools.ts:535", "note": "action dispatch + AI bridge." },
8-
"icon": { "status": "live", "note": "objectui renderers." },
9-
"locations": { "status": "live", "note": "objectui — where the action is surfaced." },
10-
"component": { "status": "live", "note": "objectui visual component override." },
11-
"type": { "status": "live", "evidence": "packages/runtime/src/http-dispatcher.ts", "note": "api/script/flow wired; url thinner; modal PARTIAL (maps to serverActionHandler, not a real modal); form DEAD (no consumer)." },
12-
"target": { "status": "live", "evidence": "packages/runtime/src/http-dispatcher.ts", "note": "URL/script/flow/endpoint + ${param}/${ctx} interpolation." },
13-
"body": { "status": "live", "evidence": "packages/runtime/src/http-dispatcher.ts", "note": "server script (L1/L2) via engine.executeAction→body-runner." },
14-
"execute": { "status": "dead", "evidence": "@deprecated — auto-migrated to target" },
15-
"params": { "status": "live", "evidence": "packages/services/service-ai/src/tools/action-tools.ts", "note": "field/objectOverride/defaultFromRow/options/placeholder/helpText/defaultValue/required all consumed." },
16-
"variant": { "status": "live", "note": "objectui button styling." },
17-
"confirmText": { "status": "live", "note": "objectui confirm dialog." },
18-
"successMessage": { "status": "live", "note": "objectui toast." },
19-
"refreshAfter": { "status": "live", "note": "objectui post-action refresh." },
20-
"resultDialog": { "status": "live", "note": "objectui one-shot result reveal {title,description,acknowledge,format,fields}." },
21-
"visible": { "status": "live", "note": "objectui — CEL, fail-closed." },
22-
"disabled": { "status": "dead", "evidence": "primary renderers read a non-spec `enabled` (action-button.tsx:56,116) and invert it; CEL-predicate form has zero consumers; only boolean honored in detail/quick-action toolbars", "note": "ADR-0049-style naming drift — wire the CEL form or rename." },
23-
"shortcut": { "status": "dead", "evidence": "ActionEngine registers it but no keydown listener pumps events — never fires" },
24-
"bulkEnabled": { "status": "dead", "evidence": "engine has executeBulk but no spec-driven view path calls it" },
25-
"ai": { "status": "live", "evidence": "packages/services/service-ai/src/tools/action-tools.ts", "note": "full AI bridge (exposed/description/category/paramHints/outputSchema/requiresConfirmation)." },
26-
"recordIdParam": { "status": "live", "note": "objectui + dispatcher." },
27-
"recordIdField": { "status": "live", "note": "objectui + dispatcher." },
28-
"bodyShape": { "status": "live", "evidence": "packages/runtime/src/http-dispatcher.ts", "note": "{wrap} request shaping." },
29-
"method": { "status": "live", "evidence": "packages/runtime/src/http-dispatcher.ts" },
30-
"bodyExtra": { "status": "live", "evidence": "packages/runtime/src/http-dispatcher.ts" },
31-
"mode": { "status": "live", "note": "PARTIAL — read only by the AI HITL heuristic (action-tools.ts), never by the UI." },
32-
"opensInNewTab": { "status": "live", "note": "objectui." },
33-
"newTabUrl": { "status": "live", "note": "objectui." },
34-
"timeout": { "status": "dead", "evidence": "action-level timeout DEAD — server uses body.timeoutMs; no UI consumer" },
35-
"aria": { "status": "live", "note": "PARTIAL — honored by a few objectui renderers, not the core action buttons/menus." }
5+
"name": {
6+
"status": "live",
7+
"evidence": "objectui action renderers + runtime dispatcher"
8+
},
9+
"label": {
10+
"status": "live",
11+
"note": "display."
12+
},
13+
"objectName": {
14+
"status": "live",
15+
"evidence": "packages/services/service-ai/src/tools/action-tools.ts:535",
16+
"note": "action dispatch + AI bridge."
17+
},
18+
"icon": {
19+
"status": "live",
20+
"note": "objectui renderers."
21+
},
22+
"locations": {
23+
"status": "live",
24+
"note": "objectui — where the action is surfaced."
25+
},
26+
"component": {
27+
"status": "live",
28+
"note": "objectui visual component override."
29+
},
30+
"type": {
31+
"status": "live",
32+
"evidence": "packages/runtime/src/http-dispatcher.ts",
33+
"note": "api/script/flow wired; url thinner; modal PARTIAL (maps to serverActionHandler, not a real modal); form DEAD (no consumer)."
34+
},
35+
"target": {
36+
"status": "live",
37+
"evidence": "packages/runtime/src/http-dispatcher.ts",
38+
"note": "URL/script/flow/endpoint + ${param}/${ctx} interpolation."
39+
},
40+
"body": {
41+
"status": "live",
42+
"evidence": "packages/runtime/src/http-dispatcher.ts",
43+
"note": "server script (L1/L2) via engine.executeAction→body-runner."
44+
},
45+
"execute": {
46+
"status": "live",
47+
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx:154",
48+
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
49+
},
50+
"params": {
51+
"status": "live",
52+
"evidence": "packages/services/service-ai/src/tools/action-tools.ts",
53+
"note": "field/objectOverride/defaultFromRow/options/placeholder/helpText/defaultValue/required all consumed."
54+
},
55+
"variant": {
56+
"status": "live",
57+
"note": "objectui button styling."
58+
},
59+
"confirmText": {
60+
"status": "live",
61+
"note": "objectui confirm dialog."
62+
},
63+
"successMessage": {
64+
"status": "live",
65+
"note": "objectui toast."
66+
},
67+
"refreshAfter": {
68+
"status": "live",
69+
"note": "objectui post-action refresh."
70+
},
71+
"resultDialog": {
72+
"status": "live",
73+
"note": "objectui one-shot result reveal {title,description,acknowledge,format,fields}."
74+
},
75+
"visible": {
76+
"status": "live",
77+
"note": "objectui — CEL, fail-closed."
78+
},
79+
"disabled": {
80+
"status": "live",
81+
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx:169",
82+
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
83+
},
84+
"shortcut": {
85+
"status": "live",
86+
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx:158",
87+
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
88+
},
89+
"bulkEnabled": {
90+
"status": "live",
91+
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx:159",
92+
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
93+
},
94+
"ai": {
95+
"status": "live",
96+
"evidence": "packages/services/service-ai/src/tools/action-tools.ts",
97+
"note": "full AI bridge (exposed/description/category/paramHints/outputSchema/requiresConfirmation)."
98+
},
99+
"recordIdParam": {
100+
"status": "live",
101+
"note": "objectui + dispatcher."
102+
},
103+
"recordIdField": {
104+
"status": "live",
105+
"note": "objectui + dispatcher."
106+
},
107+
"bodyShape": {
108+
"status": "live",
109+
"evidence": "packages/runtime/src/http-dispatcher.ts",
110+
"note": "{wrap} request shaping."
111+
},
112+
"method": {
113+
"status": "live",
114+
"evidence": "packages/runtime/src/http-dispatcher.ts"
115+
},
116+
"bodyExtra": {
117+
"status": "live",
118+
"evidence": "packages/runtime/src/http-dispatcher.ts"
119+
},
120+
"mode": {
121+
"status": "live",
122+
"note": "PARTIAL — read only by the AI HITL heuristic (action-tools.ts), never by the UI."
123+
},
124+
"opensInNewTab": {
125+
"status": "live",
126+
"note": "objectui."
127+
},
128+
"newTabUrl": {
129+
"status": "live",
130+
"note": "objectui."
131+
},
132+
"timeout": {
133+
"status": "dead",
134+
"evidence": "action-level timeout DEAD — server uses body.timeoutMs; no UI consumer"
135+
},
136+
"aria": {
137+
"status": "live",
138+
"note": "PARTIAL — honored by a few objectui renderers, not the core action buttons/menus."
139+
}
36140
}
37141
}

packages/spec/liveness/agent.json

Lines changed: 91 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,96 @@
22
"type": "agent",
33
"_note": "AgentSchema. Seeded from docs/audits/2026-06-agentschema-property-liveness.md. agent-runtime.ts is the runtime consumer; AgentPreview is display-only.",
44
"props": {
5-
"name": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts" },
6-
"label": { "status": "live", "note": "display/core." },
7-
"avatar": { "status": "live", "note": "display." },
8-
"role": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts", "note": "persona → system prompt." },
9-
"instructions": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts", "note": "system prompt." },
10-
"model": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts:264", "note": "PARTIAL — model/temperature/maxTokens applied; model.provider + topP DEAD." },
11-
"skills": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts", "note": "Agent→Skill→Tool." },
12-
"tools": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts", "note": "legacy direct-tool fallback." },
13-
"active": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts", "note": "gates listing + 403 on chat." },
14-
"planning": { "status": "live", "evidence": "packages/services/service-ai/src/agent-runtime.ts", "note": "PARTIAL — only planning.maxIterations live; strategy/allowReplan DEAD." },
15-
"access": { "status": "live", "evidence": "packages/services/service-ai/src/routes/agent-access.ts:50", "note": "evaluateAgentAccess() — allow-list by userId/role; enforced at the chat route (agent-routes.ts:151). #1884 (landed after the 2026-06 audit, which still listed it dead)." },
16-
"permissions": { "status": "live", "evidence": "packages/services/service-ai/src/routes/agent-access.ts:50", "note": "evaluateAgentAccess() — caller must hold ALL required permissions/roles; enforced at the chat route. #1884." },
17-
"visibility": { "status": "experimental", "evidence": "packages/services/service-ai/src/routes/agent-access.ts:41", "note": "intentionally NOT enforced — the chat-access evaluator excludes it and the GET /ai/agents list route does not filter by visibility. Needs owner/org semantics before it can gate listing." },
18-
"tenantId": { "status": "dead", "evidence": "no runtime reader" },
19-
"knowledge": { "status": "dead", "evidence": "no runtime reader; AgentPreview reads knowledge.sources but spec defines {topics,indexes}", "note": "shape drift; RAG via service-knowledge." },
20-
"lifecycle": { "status": "experimental", "evidence": "no runtime reader (StateMachine)", "note": "aspirational autonomy." },
21-
"memory": { "status": "experimental", "evidence": "no runtime reader", "note": "aspirational autonomy." },
22-
"guardrails": { "status": "experimental", "evidence": "no runtime reader", "note": "aspirational — real limits via quota service." },
23-
"structuredOutput": { "status": "experimental", "evidence": "no runtime reader", "note": "aspirational." }
5+
"name": {
6+
"status": "live",
7+
"evidence": "packages/services/service-ai/src/agent-runtime.ts"
8+
},
9+
"label": {
10+
"status": "live",
11+
"note": "display/core."
12+
},
13+
"avatar": {
14+
"status": "live",
15+
"note": "display."
16+
},
17+
"role": {
18+
"status": "live",
19+
"evidence": "packages/services/service-ai/src/agent-runtime.ts",
20+
"note": "persona → system prompt."
21+
},
22+
"instructions": {
23+
"status": "live",
24+
"evidence": "packages/services/service-ai/src/agent-runtime.ts",
25+
"note": "system prompt."
26+
},
27+
"model": {
28+
"status": "live",
29+
"evidence": "packages/services/service-ai/src/agent-runtime.ts:264",
30+
"note": "PARTIAL — model/temperature/maxTokens applied; model.provider + topP DEAD."
31+
},
32+
"skills": {
33+
"status": "live",
34+
"evidence": "packages/services/service-ai/src/agent-runtime.ts",
35+
"note": "Agent→Skill→Tool."
36+
},
37+
"tools": {
38+
"status": "live",
39+
"evidence": "packages/services/service-ai/src/agent-runtime.ts",
40+
"note": "legacy direct-tool fallback."
41+
},
42+
"active": {
43+
"status": "live",
44+
"evidence": "packages/services/service-ai/src/agent-runtime.ts",
45+
"note": "gates listing + 403 on chat."
46+
},
47+
"planning": {
48+
"status": "live",
49+
"evidence": "packages/services/service-ai/src/agent-runtime.ts",
50+
"note": "PARTIAL — only planning.maxIterations live; strategy/allowReplan DEAD."
51+
},
52+
"access": {
53+
"status": "live",
54+
"evidence": "packages/services/service-ai/src/routes/agent-access.ts:50",
55+
"note": "evaluateAgentAccess() — allow-list by userId/role; enforced at the chat route (agent-routes.ts:151). #1884 (landed after the 2026-06 audit, which still listed it dead)."
56+
},
57+
"permissions": {
58+
"status": "live",
59+
"evidence": "packages/services/service-ai/src/routes/agent-access.ts:50",
60+
"note": "evaluateAgentAccess() — caller must hold ALL required permissions/roles; enforced at the chat route. #1884."
61+
},
62+
"visibility": {
63+
"status": "experimental",
64+
"evidence": "packages/services/service-ai/src/routes/agent-access.ts:41",
65+
"note": "intentionally NOT enforced — the chat-access evaluator excludes it and the GET /ai/agents list route does not filter by visibility. Needs owner/org semantics before it can gate listing."
66+
},
67+
"tenantId": {
68+
"status": "dead",
69+
"evidence": "no runtime reader"
70+
},
71+
"knowledge": {
72+
"status": "live",
73+
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/AgentPreview.tsx:69 (d.knowledge; KnowledgeSummary renders sources/indexes)",
74+
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
75+
},
76+
"lifecycle": {
77+
"status": "experimental",
78+
"evidence": "no runtime reader (StateMachine)",
79+
"note": "aspirational autonomy."
80+
},
81+
"memory": {
82+
"status": "experimental",
83+
"evidence": "no runtime reader",
84+
"note": "aspirational autonomy."
85+
},
86+
"guardrails": {
87+
"status": "experimental",
88+
"evidence": "no runtime reader",
89+
"note": "aspirational — real limits via quota service."
90+
},
91+
"structuredOutput": {
92+
"status": "experimental",
93+
"evidence": "no runtime reader",
94+
"note": "aspirational."
95+
}
2496
}
2597
}

0 commit comments

Comments
 (0)