Filed by the domain:spec execution seat (seat 3, session_019srGWGCBBCBHqcDoRZpQRh) out of PR #19138's round on card #16354, where the dev reported it as out of scope. ⛔ Unassigned and ungraded — grading and routing are triage's. Readings below were taken on origin/main at tip a675ad4ef, 2026-09-18 22:56 UTC.
dataset is a registered metadata type that an author may create AT RUNTIME, and no author-time rule reaches it at the runtime publish door — not the new aggregate/field-type refusal PR #19138 adds, and not the existence rules that were already there.
Measured, two independent legs
Leg 1 — the type is runtime-writable. packages/spec/src/kernel/metadata-plugin.zod.ts:854:
{ type: 'dataset', label: 'Dataset', … supportsOverlay: true, allowOrgOverride: false, allowRuntimeCreate: true, supportsVersioning: true, executionPinned: false, loadOrder: 55, domain: 'ui' }
Leg 2 — nothing dispatches on it there. Two spellings, both empty for dataset:
- No lint rule declares it.
git grep -n -A3 "runtimeTypes:" origin/main -- packages/lint/src piped through a dataset filter returns zero. ⭐ Lit control, same grep, same corpus: the declared types it DOES return are flow 13, object 12, view 8, seed 4, permission 4, book 3, dashboard 2, page 1, app 1, position 1 — so the instrument reads this field, and the zero is a reading rather than a miss.
- No stack-key mapping.
TYPE_TO_STACK_KEY in packages/lint/src/runtime-gate.ts holds exactly flow, object, view, action, page, dashboard, agent, hook, seed, permission, book — read in full from git show origin/main:packages/lint/src/runtime-gate.ts, no dataset row.
Why it is worth a card
The gate filters by runtimeTypes BEFORE it consults the mapping table — that ordering is stated in runtime-gate.ts's own #8309 comment — so the two absences are consistent with each other rather than contradictory, and neither is a broken wire. What they add up to is that a dataset write builds no per-write snapshot and dispatches no rule at all. The consequence is specific and already documented elsewhere in the tree: the dataset existence rules' stated failure mode is a chart that renders successfully with empty or wrong numbers. An author working only through Studio or through MCP has no os lint step to fall back on, so for them that door is the only one there is.
This is the ADR-0049 declared-not-enforced shape one surface over: the type declares allowRuntimeCreate: true, and the authoring rules that exist for it are unreachable on that path.
What is NOT claimed
- ⛔ NOT claimed that any rule is mis-wired. The wiring guard (
packages/lint/src/authoring-rule-wiring.test.ts) asks that a DECLARED type has a mapping; a type nothing declares is outside what it asks, so CI is green and correctly so.
- ⛔ NOT measured: whether any real tenant has authored a dataset through the runtime door.
- ⛔ NOT measured, and named only as a lead someone should redo properly: my
-A3 grep's value list also shows app and position, which do NOT appear in TYPE_TO_STACK_KEY. That may be the wired-onto-nothing state the same #8309 comment says the wiring guard refuses, or it may simply be my crude grep catching a quoted string from a neighbouring field. ⚠️ Treat it as unverified until someone re-reads those two rules' entries directly — I did not, and a wrong reading here would point a round at a non-defect.
- ⛔ This card proposes no fix shape. Mapping the type hands the door every rule that reads
stack.datasets at once, which is a rollout decision and not a one-line edit.
Dedupe words
dataset runtime publish gate · TYPE_TO_STACK_KEY dataset · runtimeTypes dataset · allowRuntimeCreate dataset · dataset author-time rules unreachable
Related: #16354 (the rule whose round found this; its PR #19138 declares surfaces: cli with a reason naming this TYPE axis rather than the snapshot's contents) · ADR-0049 (enforce-or-remove) · ADR-0021 (the dataset semantic layer).
Generated by Claude Code in session session_019srGWGCBBCBHqcDoRZpQRh; attribution is written as prose because a footer block is stripped on issue creation.
Generated by Claude Code
Filed by the
domain:specexecution seat (seat 3,session_019srGWGCBBCBHqcDoRZpQRh) out of PR #19138's round on card #16354, where the dev reported it as out of scope. ⛔ Unassigned and ungraded — grading and routing are triage's. Readings below were taken onorigin/mainat tipa675ad4ef, 2026-09-18 22:56 UTC.datasetis a registered metadata type that an author may create AT RUNTIME, and no author-time rule reaches it at the runtime publish door — not the new aggregate/field-type refusal PR #19138 adds, and not the existence rules that were already there.Measured, two independent legs
Leg 1 — the type is runtime-writable.
packages/spec/src/kernel/metadata-plugin.zod.ts:854:Leg 2 — nothing dispatches on it there. Two spellings, both empty for
dataset:git grep -n -A3 "runtimeTypes:" origin/main -- packages/lint/srcpiped through adatasetfilter returns zero. ⭐ Lit control, same grep, same corpus: the declared types it DOES return areflow13,object12,view8,seed4,permission4,book3,dashboard2,page1,app1,position1 — so the instrument reads this field, and the zero is a reading rather than a miss.TYPE_TO_STACK_KEYinpackages/lint/src/runtime-gate.tsholds exactlyflow, object, view, action, page, dashboard, agent, hook, seed, permission, book— read in full fromgit show origin/main:packages/lint/src/runtime-gate.ts, nodatasetrow.Why it is worth a card
The gate filters by
runtimeTypesBEFORE it consults the mapping table — that ordering is stated inruntime-gate.ts's own#8309comment — so the two absences are consistent with each other rather than contradictory, and neither is a broken wire. What they add up to is that a dataset write builds no per-write snapshot and dispatches no rule at all. The consequence is specific and already documented elsewhere in the tree: the dataset existence rules' stated failure mode is a chart that renders successfully with empty or wrong numbers. An author working only through Studio or through MCP has noos lintstep to fall back on, so for them that door is the only one there is.This is the ADR-0049 declared-not-enforced shape one surface over: the type declares
allowRuntimeCreate: true, and the authoring rules that exist for it are unreachable on that path.What is NOT claimed
packages/lint/src/authoring-rule-wiring.test.ts) asks that a DECLARED type has a mapping; a type nothing declares is outside what it asks, so CI is green and correctly so.-A3grep's value list also showsappandposition, which do NOT appear inTYPE_TO_STACK_KEY. That may be the wired-onto-nothing state the same#8309comment says the wiring guard refuses, or it may simply be my crude grep catching a quoted string from a neighbouring field.stack.datasetsat once, which is a rollout decision and not a one-line edit.Dedupe words
dataset runtime publish gate·TYPE_TO_STACK_KEY dataset·runtimeTypes dataset·allowRuntimeCreate dataset·dataset author-time rules unreachableRelated: #16354 (the rule whose round found this; its PR #19138 declares
surfaces: cliwith a reason naming this TYPE axis rather than the snapshot's contents) · ADR-0049 (enforce-or-remove) · ADR-0021 (the dataset semantic layer).Generated by Claude Code in session
session_019srGWGCBBCBHqcDoRZpQRh; attribution is written as prose because a footer block is stripped on issue creation.Generated by Claude Code