os-hourly-full-run-ci — machine-findable marker for this generated card. ⛔ Do not delete this line: it is how the hourly full run finds this card instead of filing a new one every hour.
hourly full run: red on main (CI)
Swept 2026-10-04T15:58:05.599Z · run log · commit ea7ff394b6d802de9ad0448130bef86d4407760d · conclusion failure.
CI runs the FULL battery on main every hour (#16467 ). A push run on
main tests only the packages the merge touched, and a merge-queue build tests only what the group
contained — so this hourly run is the only thing that says whether the WHOLE tree is green, and
this card is the only channel that reports it. Nothing is blocked by it.
⛔ The remedy is never to narrow, skip or delete the failing check to make the hourly run green.
Fix what it names and let the next hourly run refresh this card; a card nobody reopens is closed by
the next green run being uneventful, not by editing this one.
What landed since the last green hourly run
Range: bbe03f4068 (run 36705938370, the last green CI schedule run) .. ea7ff394b6 — compare
Truncated by the compare API; open the compare link for the full list.
135daaa06b feat(spec): agent.guardrails is live, enforced by the cloud AI runtime; tool.outputSchema steers authors to action.ai.outputSchema (feat(spec): agent.guardrails is live, enforced by the cloud AI runtime; tool.outputSchema steers authors to action.ai.outputSchema #21280 )
dabd1c5be7 fix(cli): drop the never-loaded oclif.plugins entries and correct the text that says os plugins works (fix(cli): drop the never-loaded oclif.plugins entries and correct the text that says os plugins works #21306 )
75260587b3 docs(spec): the master-detail detail entry's inlineMode and formFields describes state both renderer paths (spec(ui): an object-master-detail-form detail entry's inlineMode describe says the mode is resolved from the relationship's inlineEdit when omitted; on an entry kept as authored the renderer resolves nothing #21284 ) (docs(spec): the master-detail detail entry's inlineMode and formFields describes state both renderer paths (#21284) #21307 )
1c52a5e557 fix(spec): the strict blueprint nav item's label describe states that null inherits the target's current label (fix(spec): the strict blueprint nav item's label describe states that null inherits the target's current label #21309 )
6091136e92 fix(mcp, email, knowledge, queue, sms, storage, trigger, i18n): runtime strings state each decision in words instead of a tracker number (stage 2) (fix(mcp, email, knowledge, queue, sms, storage, trigger, i18n): runtime strings state each decision in words instead of a tracker number (stage 2) #21311 )
bcd68a29f3 feat(cli,create-objectstack): os generate picklist, the src/picklists starter barrel, and a Picklists count in the metadata summary (feat(cli,create-objectstack): os generate picklist, the src/picklists starter barrel, and a Picklists count in the metadata summary #21167 )
1caa603730 fix(service-analytics)!: refuse an analytics order key that names no member the query selects (fix(service-analytics)!: refuse an analytics order key that names no member the query selects #21314 )
bada8d35d7 fix(pm): fleet-write relay reports created and moved card numbers as check-run annotations; the read-backs read them first (fix(pm): fleet-write relay reports created and moved card numbers as check-run annotations; the read-backs read them first #21312 )
222ecc27f9 feat(spec): ICryptoProvider gains a required keyedDigest member; LocalCryptoProvider implements it (feat(spec): ICryptoProvider gains a required keyedDigest member; LocalCryptoProvider implements it #21292 )
97239c3c8a fix(plugin-security): the RLS write check refuses an operator the read refuses on a declared JSON-stored column (RLS: the write check evaluates a scalar comparison (!=, ==, in) on a declared multi-valued / JSON-stored column that the read refuses 400, so a policy the read cannot run admits writes #21254 ) (fix(plugin-security): the RLS write check refuses an operator the read refuses on a declared JSON-stored column (#21254) #21317 )
1911d7cd1b docs(skills): the platform skill counts the eight generator barrels, picklists included (docs(skills): the platform skill counts the eight generator barrels, picklists included #21337 )
04f0cc4992 fix(objectql): redact a driver fault where it leaves the engine, not only in the engine's log line (fix(objectql): redact a driver fault where it leaves the engine, not only in the engine's log line #21335 )
6c5bef5f4e docs(adr): ADR-0128 §4 dated note — the keyed-digest break did not carry D1, and why (docs(adr): ADR-0128 §4 dated note — the keyed-digest break did not carry D1, and why #21343 )
99e1912afc feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay (feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay #21342 )
57c9fe39bc ci: the core filter starts Build Core for a build-input-only diff, held to turbo.json by check-ci-filter-parity (ci: the core filter starts Build Core for a build-input-only diff, held to turbo.json by check-ci-filter-parity #21338 )
50e1c6554f fix(plugin-audit,platform-objects,plugin-auth,plugin-sharing,plugin-approvals,objectql)!: the audit ledger honours internal, and the credential-class census is declared internal (fix(plugin-audit,platform-objects,plugin-auth,plugin-sharing,plugin-approvals,objectql)!: the audit ledger honours internal, and the credential-class census is declared internal #21301 )
1878ef9798 fix(plugin-security,platform-objects): an org member is not served a colleague's identity Admin-group fields, directly or through activity (plugin-security: an org member reading a colleague's sys_user row is served the Admin-group fields (last_login_ip/at, failed_login_count, locked_until, ban_*, phone_number) — and through sys_activity, their sign-in history #21237 ) (fix(plugin-security,platform-objects): an org member is not served a colleague's identity Admin-group fields, directly or through activity (#21237) #21340 )
f9bcd08bef fix(datasource, approvals): runtime strings state each decision in words instead of a tracker number (stage 3) (fix(datasource, approvals): runtime strings state each decision in words instead of a tracker number (stage 3) #21346 )
96b12b589f ci(lint): run the issue-transfer door self-test in the pm roster (ci(lint): run the issue-transfer door self-test in the pm roster #21348 )
23365eaedf feat(spec)!: the AI runtime's two JSON-Schema slots refuse an untyped subschema that carries a type-scoped keyword, at its path (finding(spec): the two JSON-Schema slots the cloud AI runtime compiles (action.ai.outputSchema, agent.structuredOutput.schema) accept an untyped subschema carrying a type-scoped keyword, which that runtime refuses before it runs #21289 ) (feat(spec)!: the AI runtime's two JSON-Schema slots refuse an untyped subschema that carries a type-scoped keyword, at its path (#21289) #21353 )
16eefc6c0e docs(spec): the master-detail detail entry's sortField and amountField describes state each renderer path (spec(ui): an object-master-detail-form detail entry's sortField describe says it is derived when omitted; on the renderer's fast path nothing derives it #21315 ) (docs(spec): the master-detail detail entry's sortField and amountField describes state each renderer path (#21315) #21355 )
69612451c2 fix(deps): patch tsx 4.23.15 so oclif registers it on every supported Node, re-arming the reroute probe CONTROL leg (fix(deps): patch tsx 4.23.15 so oclif registers it on every supported Node, re-arming the reroute probe CONTROL leg #21356 )
13a24ece2d docs(driver-sql): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 4 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(driver-sql): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 4 of #20595) #21357 )
37a0148666 docs(cli): the README states the global flags and the os plugin group that the built os registers (docs(cli): the README states the global flags and the os plugin group that the built os registers #21354 )
5fd4855a9a docs(qa): re-point eight checklist items the 17.6.0 release-verification run proved stale (docs(qa): re-point eight checklist items the 17.6.0 release-verification run proved stale #21339 )
11d9b5021d fix(release): the GitHub Releases writer converges on a racing writer's 422 already_exists and reports duplicate Releases (fix(release): the GitHub Releases writer converges on a racing writer's 422 already_exists and reports duplicate Releases #21358 )
39119014dc fix(spec): a bound action's translation is read only under its own object, never from globalActions (fix(spec): a bound action's translation is read only under its own object, never from globalActions #21344 )
7aab75920b fix(formula,plugin-security)!: delete formula's whole-day copy of the bare-day bound (lteBound); the RLS seam refuses a non-number on a numeric column (fix(formula,plugin-security)!: delete formula's whole-day copy of the bare-day bound (lteBound); the RLS seam refuses a non-number on a numeric column #21336 )
9360df4138 docs(releases): finalize the 17.6.0 notes after publish (docs(releases): finalize the 17.6.0 notes after publish #21362 )
fbe2debb77 fix(service-analytics): the ObjectQL face applies a query's order, offset and limit, as its echoed sql says (fix(service-analytics): the ObjectQL face applies a query's order, offset and limit, as its echoed sql says #21363 )
f39760864c fix(cli)!: os verify runs the author-time rules first, and a stack they refuse fails verify with the findings os validate reports (fix(cli)!: os verify runs the author-time rules first, and a stack they refuse fails verify with the findings os validate reports #21364 )
3937ad2f32 feat(spec)!: an agent's structuredOutput is JSON-only — retire the regex / grammar / xml formats and the coerce_types step; the block is live, enforced by the cloud AI runtime (feat(spec)!: an agent's structuredOutput is JSON-only — retire the regex / grammar / xml formats and the coerce_types step; the block is live, enforced by the cloud AI runtime #21367 )
d78bd011ea ci: Build Core starts on a diff confined to one of its own guard scripts, held to the job steps by check-ci-filter-parity (ci: Build Core starts on a diff confined to one of its own guard scripts, held to the job steps by check-ci-filter-parity #21368 )
11905a4f8b fix(cli)!: os generate binds declared metadata (--object, --flow), never the item name, and every scaffold passes validate, build and lint (fix(cli)!: os generate binds declared metadata (--object, --flow), never the item name, and every scaffold passes validate, build and lint #21369 )
43e928dd4c feat(gates): check:self-test-wired audits every root alias that declares a --self-test (finding(pm tooling): check:self-test-wired cannot see a declared --self-test alias that no workflow names, so removing the only step that runs one stays green #21351 ) (feat(gates): check:self-test-wired audits every root alias that declares a --self-test (#21351) #21366 )
7b21af80cb ci(release): the release-integrity audit names the changesets a version commit did not consume (ci(release): the release-integrity audit names the changesets a version commit did not consume #21373 )
db0cf2231b docs(driver-memory): re-anchor the dead tracker citations to the commits that decided them (stage 5 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(driver-memory): re-anchor the dead tracker citations to the commits that decided them (stage 5 of #20595) #21375 )
ee75aae1a8 fix(plugin-security): security/explain answers the read's refusal for an operator the read refuses on a declared JSON-stored column (plugin-security: security.explain answers a record visible under a row-level policy that aims a JSON-column-incompatible operator at a declared JSON-stored field, while find refuses the same read with INVALID_FILTER / 400 #21319 ) (fix(plugin-security): security/explain answers the read's refusal for an operator the read refuses on a declared JSON-stored column (#21319) #21371 )
51550933db fix(cli): os verify --json writes exactly one JSON document to stdout; boot diagnostics move to stderr (fix(cli): os verify --json writes exactly one JSON document to stdout; boot diagnostics move to stderr #21381 )
8963dbfac4 chore(objectui): bump the console pin to 89cad75d5570 (carries objectui 0858267e, 8001068b, 3ae91930 and d0fba91aa) (chore(objectui): bump the console pin to 89cad75d5570 (carries objectui 0858267e, 8001068b, 3ae91930 and d0fba91aa) #21380 )
d9569101a4 fix(objectql): the raw-statement door and the lifecycle sweep cut a driver fault by construction ([security] Driver-fault redaction residue after #21274: a raw statement whose leading verb the leak predicate does not list, and the lifecycle archiver's direct cold-store writes, can still carry a statement to a logger #21345 ) (fix(objectql): the raw-statement door and the lifecycle sweep cut a driver fault by construction (#21345) #21384 )
6d487d2094 fix(plugin-approvals): My Pending lists a position-routed request under either address spelling (fix(plugin-approvals): My Pending lists a position-routed request under either address spelling #21378 )
9f13c949b0 fix(objectql)!: a string comparand against a boolean field is narrowed to its boolean, or refused 400, at the engine filter door (fix(objectql)!: a string comparand against a boolean field is narrowed to its boolean, or refused 400, at the engine filter door #21372 )
69a12a0952 fix(plugin-audit): the Audit write FAILED line names the refused table and the row it lost (fix(plugin-audit): the Audit write FAILED line names the refused table and the row it lost #21383 )
c52c49d96e feat(spec)!: FieldSchema refuses a select / radio with neither options nor picklist (feat(spec)!: FieldSchema refuses a select / radio with neither options nor picklist #21390 )
56238d890d test(cli): drive migrate audit-metadata-bodies in the --json stdout-purity family (test(cli): drive migrate audit-metadata-bodies in the --json stdout-purity family #21394 )
3b4efa74b2 fix(cli): os migrate meta --stored and audit-metadata-bodies preview on a read-only boot (fix(cli): os migrate meta --stored and audit-metadata-bodies preview on a read-only boot #21389 )
ecb6ca0258 spec: a flow screen field's help text is translatable — inlineHelpText joins the flows per-field face (spec: a flow screen field cannot express a numeric bound, help text, or a lookup target — three intents that degrade into prose in the reference app #17306 ) (spec: a flow screen field's help text is translatable — inlineHelpText joins the flows per-field face (#17306) #21386 )
85986144c2 docs(metadata): re-anchor the dead tracker citations to the commits that decided them (stage 6 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(metadata): re-anchor the dead tracker citations to the commits that decided them (stage 6 of #20595) #21396 )
ca0dfb658a feat(spec): offer agent.structuredOutput on the agent form and drop its stale not-enforced-yet ledger row (feat(spec): offer agent.structuredOutput on the agent form and drop its stale not-enforced-yet ledger row #21398 )
1d0600bf66 fix(runtime,cloud-connection): an install-local package binds its script-action bodies and body hooks; list_actions lists only what run_action can run (fix(runtime,cloud-connection): an install-local package binds its script-action bodies and body hooks; list_actions lists only what run_action can run #21401 )
a5139404d8 docs(skills): the upgrade skill's v17-canonical Lead declares its select options (docs(skills): the upgrade skill's v17-canonical Lead declares its select options #21402 )
4b20c84748 fix(cli): os environments runs on the os cloud login session through one shared resolver (fix(cli): os environments runs on the os cloud login session through one shared resolver #21400 )
6d67ad5eca fix(analytics)!: a query window outside the non-negative integers is refused at the door, and an offset with no limit runs on SQLite (fix(analytics)!: a query window outside the non-negative integers is refused at the door, and an offset with no limit runs on SQLite #21399 )
45efcfa3d3 fix(spec)!: a number other than 1 / 0, a Date or an array compared against a boolean field is refused like a non-boolean string (A non-string comparand outside the accepted set against a declared boolean field answers a PostgreSQL 500 or an empty 200, and an array $in member splits 200/400 across drivers: the non-string half #21333 left out #21382 ) (fix(spec)!: a number other than 1 / 0, a Date or an array compared against a boolean field is refused like a non-boolean string (#21382) #21404 )
db3fee3dc9 fix(plugin-sharing): a plain member's own share-link list is self-scoped (ADR-0111) (fix(plugin-sharing): a plain member's own share-link list is self-scoped (ADR-0111) #21403 )
96a9719eda feat(automation): a flow's credentials live in a write-only channel on the secret seam, not in its stored definition (security(flows): move a flow's inbound-hook secret out of flow metadata into the write-only secret seam #7799 established — no read, the generic data door included, returns it #20790 ) (feat(automation): a flow's credentials live in a write-only channel on the secret seam, not in its stored definition (#20790) #21377 )
fa7b565212 fix(create-objectstack,cli): starter objects place their fields in a keyed field group (fix(create-objectstack,cli): starter objects place their fields in a keyed field group #21407 )
41a3c8df15 docs: comments outside driver-memory name what replaced the retired reference matcher (#5930 step 4 (domain:engine): the engine-fed faces delete their hand-copied filter meaning (driver-sql, turso remote, memory query, mongodb, formula, having); the memory reference matcher retires (D6) #20822 group 4) (docs: comments outside driver-memory name what replaced the retired reference matcher (#20822 group 4) #21395 )
5e58193338 fix(plugin-approvals): every slot reader takes the caller's acting addresses — can_act, the decision slot test, the already-acted probe and the email-keyed slot (fix(plugin-approvals): every slot reader takes the caller's acting addresses — can_act, the decision slot test, the already-acted probe and the email-keyed slot #21410 )
ceb4a939b4 fix(objectql)!: having and the per-aggregation filter refuse a { $field } against a column with no comparison class, as where does; applyInMemoryAggregation takes the reference rules (fix(objectql)!: having and the per-aggregation filter refuse a { $field } against a column with no comparison class, as where does; applyInMemoryAggregation takes the reference rules #21406 )
22c2d6f4d5 feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live (feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live #21413 )
39a912ea73 fix(lint)!: os validate refuses an analyticsCubes member the analytics door refuses — a dimension over a JSON-stored column, and count_distinct over one (fix(lint)!: os validate refuses an analyticsCubes member the analytics door refuses — a dimension over a JSON-stored column, and count_distinct over one #21416 )
bdd3654f29 fix(spec,lint,metadata-protocol): correct the view container name ledger note; delete the unreachable list-view tabs walks (fix(spec,lint,metadata-protocol): correct the view container name ledger note; delete the unreachable list-view tabs walks #21423 )
68c5ab7eba fix(spec): the null ordering-comparand refusal names only evaluation faces that exist (fix(spec): the null ordering-comparand refusal names only evaluation faces that exist #21408 )
8b123c0aec fix(plugin-security,service-analytics): a boolean comparand is judged by the spec verdict at the RLS compile seam and in the NativeSQL strategy (fix(plugin-security,service-analytics): a boolean comparand is judged by the spec verdict at the RLS compile seam and in the NativeSQL strategy #21424 )
520f66f39f fix(plugin-security): PermissionDeniedError carries status beside statusCode, so a share-link permission refusal answers 403 at both doors (fix(plugin-security): PermissionDeniedError carries status beside statusCode, so a share-link permission refusal answers 403 at both doors #21429 )
32d5769080 feat(spec)!: a pie / donut / funnel / treemap / sankey widget takes one measure with a dimension too — refuse two or more at values, and rename the check to checkDashboardWidgetChartMeasureArity (spec(ui): refuse two or more measures on a dimensioned pie / donut / funnel / treemap / sankey widget too — the single-series types bind one measure whatever the dimension (extends #20958) #21293 ) (feat(spec)!: a pie / donut / funnel / treemap / sankey widget takes one measure with a dimension too — refuse two or more at values, and rename the check to checkDashboardWidgetChartMeasureArity (#21293) #21425 )
3bddd4a6b5 fix(plugin-audit): an update activity row whose every recorded change is withheld from the reader is withheld as a row, on every listing face (security(plugin-audit): an activity row whose every recorded change is withheld from the reader is still served (empty change, summary, actor, timestamp), so an org peer reads WHEN a colleague's identity row was stamped — each sign-in time #21388 ) (fix(plugin-audit): an update activity row whose every recorded change is withheld from the reader is withheld as a row, on every listing face (#21388) #21427 )
3a6d92f78b fix(spec): record:activity's props row names items / loading as the host feed slot (fix(spec): record:activity's props row names items / loading as the host feed slot #21422 )
6d728b850f fix(driver-sql): the five refusal log lines take the shared driver-fault cut, moved to core (fix(driver-sql): the five refusal log lines take the shared driver-fault cut, moved to core #21414 )
c2c21f357c test(spec): the gate-spawning beforeAll in check-liveness.test.ts runs under the case budget (Flaky on Test Core (1/6): the tombstone describe of packages/spec check-liveness.test.ts times out in its beforeAll at 10000ms — the hook spawns the whole liveness gate under vitest's default hookTimeout, which the spec config cannot raise #21421 ) (test(spec): the gate-spawning beforeAll in check-liveness.test.ts runs under the case budget (#21421) #21433 )
d70353f8aa fix(lint)!: os validate refuses an analyticsCubes sum / avg / min / max measure over a column the cube door refuses — every cube measure is judged by the aggregate × field-type table (fix(lint)!: os validate refuses an analyticsCubes sum / avg / min / max measure over a column the cube door refuses — every cube measure is judged by the aggregate × field-type table #21435 )
b206403bea fix(cli,runtime): one-shot CLI boots run no seed loader and arm no lifecycle sweep; every no-write mode boots read-only (fix(cli,runtime): one-shot CLI boots run no seed loader and arm no lifecycle sweep; every no-write mode boots read-only #21432 )
d7d5b4f96a fix(service-analytics): the ObjectQL face echoes an offset with no limit as a statement the dialect runs (fix(service-analytics): the ObjectQL face echoes an offset with no limit as a statement the dialect runs #21440 )
535d1d25ab fix(metadata-protocol): a bare-list view container on another package's object expands under its own name (fix(metadata-protocol): a bare-list view container on another package's object expands under its own name #21430 )
b79301000c feat(spec)!: the analytics row wildcard '*' is admitted only where a count consumes it (analytics: '*' runs only under count, but a cube measure's or dimension's sql and a dataset measure's field admit it under any aggregate — a summed '*' answers 500 at the dataset door (split from #21000) #21409 ) (feat(spec)!: the analytics row wildcard '*' is admitted only where a count consumes it (#21409) #21431 )
53fd35e3e3 docs(spec): cli-extension TSDoc step 2 "Discover" says what loads an oclif plugin into os (docs(spec): cli-extension TSDoc step 2 "Discover" says what loads an oclif plugin into os #21443 )
086ad0aa68 fix(service-analytics): native SQL judges a comparand against a declared number column by the spec's verdict, as the comparand walk's second arm (fix(service-analytics): native SQL judges a comparand against a declared number column by the spec's verdict, as the comparand walk's second arm #21446 )
b94a2a7277 spec(data): field-scale.ts states that a server sum / avg over a no-fixed-width number does not yet carry its width, and the ruled end-state (spec(data): field-scale.ts states that a server sum / avg over a no-fixed-width number does not yet carry its width, and the ruled end-state — ruling A (deferred) on objectui#11254 #21183 ) (spec(data): field-scale.ts states that a server sum / avg over a no-fixed-width number does not yet carry its width, and the ruled end-state (#21183) #21449 )
9b7a0ef3fa docs(spec): the liveness README's author-warning section states the verdict model the lint ships (docs(spec): the liveness README's author-warning section states the verdict model the lint ships #21450 )
57cc695062 feat(spec,service-settings): CryptoContext gains a required scope discriminant, bound into a delimiter-safe, versioned AAD (ADR-0128 D1-D3, stage 1) (feat(spec,service-settings): CryptoContext gains a required scope discriminant, bound into a delimiter-safe, versioned AAD (ADR-0128 D1-D3, stage 1) #21453 )
94a8761a87 docs(kernel): lifecycle page states plugin install is not implemented, drops phantom plugin commands (docs(kernel): lifecycle page states plugin install is not implemented, drops phantom plugin commands #21456 )
1fd56645af fix(metadata-protocol): a refused sys_packages delete fails the uninstall before anything is removed (fix(metadata-protocol): a refused sys_packages delete fails the uninstall before anything is removed #21438 )
99589f91a7 feat(spec,service-analytics)!: retire the cube metric types number / string / boolean, refused in both analytics strategies in the spec's words (spec+service-analytics: retire the cube metric types number / string / boolean — they existed to carry a SQL expression, which #20943 retired from a member's sql #21000 ) (feat(spec,service-analytics)!: retire the cube metric types number / string / boolean, refused in both analytics strategies in the spec's words (#21000) #21452 )
cfa4d740b7 fix(spec,lint): page requires is live — refused at save, reported at load (fix(spec,lint): page requires is live — refused at save, reported at load #21451 )
713b0fa76d fix(metadata-protocol)!: a metadata body's stored content hash is served and compared only in keyed form, never copied, never evaluated ([security] Stored-metadata-body family: two exits #21120 did not reach. An engine-only door serves an administrator credential material in cleartext, and the data door serves a content hash computed over the withheld credentials #21207 ) (fix(metadata-protocol)!: a metadata body's stored content hash is served and compared only in keyed form, never copied, never evaluated (#21207) #21436 )
6210f8870a fix(lint): field-no-consumers credits every field an analytics member's column path reads (finding(lint): field-no-consumers calls a field "inert" when an analytics member reads it through a relationship path (account.revenue in a cube measure's sql or a dataset measure's field) — the family's next position after #21091 #21439 ) (fix(lint): field-no-consumers credits every field an analytics member's column path reads (#21439) #21460 )
4c8363f421 fix(plugin-sharing): the record owner and an explicit Modify-All holder may mint a share link without visibility (ADR-0111 D8 rule 1, ruling A′) (fix(plugin-sharing): the record owner and an explicit Modify-All holder may mint a share link without visibility (ADR-0111 D8 rule 1, ruling A′) #21447 )
7e7e64b13d fix(lint): flow, hook, action and expression rule findings state each decision in words instead of a tracker number (stage 1) (fix(lint): flow, hook, action and expression rule findings state each decision in words instead of a tracker number (stage 1) #21462 )
49524f6906 fix(rest): withdrawing a public form takes effect on every anonymous intake door (fix(rest): withdrawing a public form takes effect on every anonymous intake door #21420 )
aa4632235b feat(spec)!: an object-grid page block types the seven members the grid reads, and resizableColumns retires for resizable (finding(spec): ComponentPropsMap['object-grid'] keeps resizableColumns as a live alias of resizable, and types six members ObjectGrid reads with fixed shapes as z.unknown() (rowHeight: 42 passes every door) #21445 ) (feat(spec)!: an object-grid page block types the seven members the grid reads, and resizableColumns retires for resizable (#21445) #21463 )
6e33b67912 feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (spec(ai): retire agent.lifecycle — phase-scoped instructions and tools are skills with triggerConditions, process orchestration is Flow (ruled on cloud#2569) #21320 ) (feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (#21320) #21461 )
0b8239111f fix(service-analytics)!: a caller-named measure whose source names no field is refused at the mint, INVALID_FIELD / 400 (analytics query: a caller-named measure with an empty prefix (_sum, _avg, …) mints the row wildcard under a non-count aggregate and answers 500 DATABASE_ERROR — the runtime position of #21409's family #21437 ) (fix(service-analytics)!: a caller-named measure whose source names no field is refused at the mint, INVALID_FIELD / 400 (#21437) #21474 )
0557c2f674 feat(cli,service-settings): os secret rewrap, the at-rest re-wrap of version-1 sys_secret ciphertext under each holder's producer scope (ADR-0128 §4.2, stage 2) (feat(cli,service-settings): os secret rewrap, the at-rest re-wrap of version-1 sys_secret ciphertext under each holder's producer scope (ADR-0128 §4.2, stage 2) #21469 )
cc0786223b fix(automation, audit): runtime strings state each decision in words instead of a tracker number (stage 4) (fix(automation, audit): runtime strings state each decision in words instead of a tracker number (stage 4) #21472 )
7097859633 test: load package barrels at module top so the collect phase pays for them (test: load package barrels at module top so the collect phase pays for them #21480 )
72217cd6ff feat(spec): ApprovalActionRow declares acted_as, the slot an approval action was taken as (feat(spec): ApprovalActionRow declares acted_as, the slot an approval action was taken as #21479 )
cba4297176 test(rest): give the import-template parity case a measured per-shape budget (test(rest): give the import-template parity case a measured per-shape budget #21481 )
48fa7a381c docs(platform-objects): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 7 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(platform-objects): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 7 of #20595) #21477 )
100c394f6f fix(spec)!: a list at a scalar operator is refused at the shared comparand-shape face, whatever the column type (analytics: a list comparand at a scalar operator ({ amount: { $gt: [10, 99] } }) answers 200 bound to its first member on the engine-aggregate face (and on both faces for a text column), where the spec's verdict refuses the list form #21448 ) (fix(spec)!: a list at a scalar operator is refused at the shared comparand-shape face, whatever the column type (#21448) #21484 )
ab52182b4a fix(cloud-connection,plugin-security): a hot install fires the package record-change flows and projects its permission sets without a restart (fix(cloud-connection,plugin-security): a hot install fires the package record-change flows and projects its permission sets without a restart #21488 )
5555047117 fix(metadata-protocol,metadata): the runtime save door refuses a view container whose name disagrees with its save name, through the one judge every door calls (finding(metadata-protocol): the runtime save door accepts a view container whose body name contradicts its row name and registers it under both keys; the two source registrars refuse the same document #21412 ) (fix(metadata-protocol,metadata): the runtime save door refuses a view container whose name disagrees with its save name, through the one judge every door calls (#21412) #21483 )
fd96a8473d fix(spec-docs): one shared def renders one optionality face on every reference page (fix(spec-docs): one shared def renders one optionality face on every reference page #21478 )
9ff74285f1 ci(test-core): retire the CLI's file-level slicing by the partitioner's own slice-count derivation (ci(test-core): retire the CLI's file-level slicing by the partitioner's own slice-count derivation #21487 )
6f17d1d364 fix(approvals): actor_id records the person who decided, acted_as the slot it was taken as; stored slot literals move out at boot (fix(approvals): actor_id records the person who decided, acted_as the slot it was taken as; stored slot literals move out at boot #21493 )
15b29d37af fix(lint): data-model, filter, predicate, search, sort, security and registry findings state each decision in words instead of a tracker number (stage 2) (fix(lint): data-model, filter, predicate, search, sort, security and registry findings state each decision in words instead of a tracker number (stage 2) #21491 )
85e29b8858 fix(types): operatorFacingErrorText answers through the one driver-fault cut (fix(types): operatorFacingErrorText answers through the one driver-fault cut #21482 )
2ee8383f4e fix(cli): os migrate recorded-by, resume, account-issuer and apply rethrow oclif's exit signal, so a completed --json run prints one document and exits 0 (fix(cli): os migrate recorded-by, resume, account-issuer and apply rethrow oclif's exit signal, so a completed --json run prints one document and exits 0 #21495 )
25797a16e1 fix(cli): a one-shot command never mints a data key in the key home (finding(cli): os secret orphans, a report that "writes nothing", composes the settings service with its default crypto provider, which mints a key file in the key home in a development posture with no key #21471 ) (fix(cli): a one-shot command never mints a data key in the key home (#21471) #21497 )
f9a8eb889e fix(plugin-security): run the seed-ownership claim whenever a seed settles, on every boot (fix(plugin-security): run the seed-ownership claim whenever a seed settles, on every boot #21503 )
529d9711fb feat(spec)!: object-map, object-gantt and object-tree type navigation by reference, and one pin enumerates every z.unknown() member of ComponentPropsMap (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 , stage 1) (feat(spec)!: object-map, object-gantt and object-tree type navigation by reference, and one pin enumerates every z.unknown() member of ComponentPropsMap (#21464, stage 1) #21502 )
c205b6c350 docs(core): re-anchor the dead tracker citations to the commits and ADRs that decided them (stage 8 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(core): re-anchor the dead tracker citations to the commits and ADRs that decided them (stage 8 of #20595) #21506 )
2df621af39 fix(verify): os verify never creates key material in the key home; the harness seals under an in-process data key (fix(verify): os verify never creates key material in the key home; the harness seals under an in-process data key #21507 )
e9dec3dabd fix(metadata-protocol): a view a stored container expands answers by name what the object door lists, on every kernel and container scope (metadata-protocol: a view that a runtime view container expands is listed by GET /meta/view?object= but answers nothing by name on an environment-scoped kernel or for an org-scoped container — the by-name read expands no container #21442 ) (fix(metadata-protocol): a view a stored container expands answers by name what the object door lists, on every kernel and container scope (#21442) #21508 )
88fb5e85a0 fix(approvals): every sys_user lookup approvals writes holds an id or null — machine actors record none, notify forwards only a person, reassign parties are slot addresses (ADR-0118 D1) (fix(approvals): every sys_user lookup approvals writes holds an id or null — machine actors record none, notify forwards only a person, reassign parties are slot addresses (ADR-0118 D1) #21514 )
abe8f289e8 fix(runtime): a sandboxed body or an action handler reading the stored-metadata tables is served the data door's form ([finding] [security] An action/automation body's object API and an action handler's engine handle read the stored-metadata family outside its body projection and keyed serve (reach NOT MEASURED) #21454 ) (fix(runtime): a sandboxed body or an action handler reading the stored-metadata tables is served the data door's form (#21454) #21513 )
e3ad4922ed fix(security): runtime strings state each decision in words instead of a tracker number (stage 5) (fix(security): runtime strings state each decision in words instead of a tracker number (stage 5) #21518 )
ad7c351898 fix(spec): author-visible refusals and prescriptions state each decision in words instead of a tracker number (stage 3) (fix(spec): author-visible refusals and prescriptions state each decision in words instead of a tracker number (stage 3) #21521 )
5895119c35 fix(cli): package install, package publish and plugin sign print one error line per refusal; the exit-signal pin covers every command (fix(cli): package install, package publish and plugin sign print one error line per refusal; the exit-signal pin covers every command #21522 )
bee8d1c62c fix(verify): derive a multi-valued select as a list compared as a set, by the spec's isMultiValueField (fix(verify): derive a multi-valued select as a list compared as a set, by the spec's isMultiValueField #21526 )
c98a72d69e docs(metadata-core): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 9 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(metadata-core): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 9 of #20595) #21525 )
550f4cc2fd fix(cli,metadata-protocol): os migrate resume completes an interrupted recorded-by run, and os serve reports interrupted migration runs at boot (fix(cli,metadata-protocol): os migrate resume completes an interrupted recorded-by run, and os serve reports interrupted migration runs at boot #21527 )
31d2255f5c feat(mcp): server.json for the official MCP registry — one remote entry on the user's own deployment, no npm entry (mcp distribution: a server.json for the official MCP registry, in this repo, from the shipped surface (the dev half of #20791) #21494 ) (feat(mcp): server.json for the official MCP registry — one remote entry on the user's own deployment, no npm entry (#21494) #21530 )
48eb9c193f feat(spec)!: ai:chat_window is retired — refused by name at the schema door, the floating chat overlay is the AI chat entry point (finding(spec): ai:chat_window is a declared page component type with no renderer — the console answers a page that uses it with "Unknown component type", and no app authors it #21504 ) (feat(spec)!: ai:chat_window is retired — refused by name at the schema door, the floating chat overlay is the AI chat entry point (#21504) #21531 )
49161683fb fix(plugin-sharing, plugin-audit): runtime strings state each decision in words instead of a tracker number (stage 6) (fix(plugin-sharing, plugin-audit): runtime strings state each decision in words instead of a tracker number (stage 6) #21533 )
1ac7308d7a fix(core)!: the plugin artifact signature contract refuses any key that is not Ed25519 (fix(core)!: the plugin artifact signature contract refuses any key that is not Ed25519 #21534 )
41b13331cd fix(spec): a view container's form is its default form — never collapsed into a named form, and no named form is promoted (fix(spec): a view container's form is its default form — never collapsed into a named form, and no named form is promoted #21535 )
f1e4ae56ad spec(system): JobSchema gains a sandboxed L2 body and deprecates handler; a body job has one time limit (spec(system): JobSchema gains a sandboxed L2 body and deprecates handler; a body job has one time limit #21538 )
44defd4c94 fix(metadata-protocol,metadata): every runtime write door refuses a body whose name disagrees with its row name, for every type, through the one judge (finding(metadata-protocol): the runtime save door accepts any metadata body whose name differs from its row name, and registers it under the body name (the every-type half of #21412) #21470 ) (fix(metadata-protocol,metadata): every runtime write door refuses a body whose name disagrees with its row name, for every type, through the one judge (#21470) #21536 )
24dc7c1134 fix(cli): os init prints its in-try refusals once; the exit-signal pin is seeded with this.error (fix(cli): os init prints its in-try refusals once; the exit-signal pin is seeded with this.error #21541 )
fd5a1cd597 docs(driver-turso): re-anchor the dead tracker citations to the commits that decided them (stage 10 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(driver-turso): re-anchor the dead tracker citations to the commits that decided them (stage 10 of #20595) #21546 )
72af58c621 feat(spec)!: page requires only on the compiled kinds — refused at parse on react, full and slotted pages ([Decision] page requires on the page kinds whose source is never compiled at save (react, full, slotted): refuse it at parse, or keep admitting a key nothing derives? #21459 ) (feat(spec)!: page requires only on the compiled kinds — refused at parse on react, full and slotted pages (#21459) #21547 )
6cf1154a65 fix(mcp): serverInfo.version defaults to the package version, not a literal 1.0.0 (fix(mcp): serverInfo.version defaults to the package version, not a literal 1.0.0 #21548 )
aa0d4b969c fix(cli,runtime): os migrate resume, recorded-by and value-shapes answer a project with no database yet with empty work (fix(cli,runtime): os migrate resume, recorded-by and value-shapes answer a project with no database yet with empty work #21550 )
81e69cab30 fix(service-analytics)!: the read scope, the where tree and the draft preview take the shared lowering's bound and NULL guards; their own copies are deleted (fix(service-analytics)!: the read scope, the where tree and the draft preview take the shared lowering's bound and NULL guards; their own copies are deleted #21553 )
e901c27449 fix(spec): the protocol 16 → 17 conversion summaries and three descriptions state each decision in words instead of a tracker number (stage 4) (fix(spec): the protocol 16 → 17 conversion summaries and three descriptions state each decision in words instead of a tracker number (stage 4) #21555 )
2f837a5695 fix(runtime)!: refuse the stored-metadata family evaluate shapes and serve write returns at the reader-context seams (fix(runtime)!: refuse the stored-metadata family evaluate shapes and serve write returns at the reader-context seams #21539 )
ce532184d1 fix(metadata-protocol): refuse an org-scoped public form withdrawal a walled posture cannot honour (fix(metadata-protocol): refuse an org-scoped public form withdrawal a walled posture cannot honour #21473 )
10454b3afa fix(core): os migrate resume completes a recorded-by run that committed a chunk or used a non-default --chunk-size ([finding] os migrate resume lists an interrupted recorded-by run as resumable: true, then refuses it PLAN_CHANGED when the run had committed a chunk or used a non-default --chunk-size #21528 ) (fix(core): os migrate resume completes a recorded-by run that committed a chunk or used a non-default --chunk-size (#21528) #21554 )
f83d0669d7 docs(approvals): reassign TSDoc holds slot addresses; ADR-0042 §2 superseded in part by ADR-0118 D1; SLA checklist expects no actor (docs(approvals): reassign TSDoc holds slot addresses; ADR-0042 §2 superseded in part by ADR-0118 D1; SLA checklist expects no actor #21556 )
5dbcee8a6d fix(metadata-protocol): the object door never lets a container's expansion displace a stored row of the same name (finding(metadata-protocol): a stored view row named exactly like a container expansion is shadowed in the object door by the expansion, while the by-name read answers the stored row #21510 ) (fix(metadata-protocol): the object door never lets a container's expansion displace a stored row of the same name (#21510) #21557 )
f9f9f911f5 fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 7) (fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 7) #21561 )
bf36edd0a1 fix(cli): os init and os compile render each refusal once, not once on stdout and again as oclif's Error block ([finding] os init and os compile print a refusal twice across two streams: a printError line on stdout, then this.error re-renders the same sentence as oclif's Error block on stderr #21542 ) (fix(cli): os init and os compile render each refusal once, not once on stdout and again as oclif's Error block (#21542) #21560 )
1ca1eb0972 fix(service-analytics)!: the read scope and the draft preview compare a temporal comparand in the column storage form (ADR-0053 D-A1 / D-A2) (fix(service-analytics)!: the read scope and the draft preview compare a temporal comparand in the column storage form (ADR-0053 D-A1 / D-A2) #21562 )
bd70706713 fix(runtime)!: an app-authored body may not bind a hook to, or write, the stored-metadata tables ([Decision] security(runtime): may an app-authored body touch the stored-metadata family's tables at all — a hook bound to them, or an elevated body writing them directly (#21454 items 3 and 4) #21520 ) (fix(runtime)!: an app-authored body may not bind a hook to, or write, the stored-metadata tables (#21520) #21563 )
7d674dfc96 feat(spec)!: eight list members of object-grid, object-kanban and object-calendar take the shape each block reads; object-grid columns held (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 , stage 2) (feat(spec)!: eight list members of object-grid, object-kanban and object-calendar take the shape each block reads; object-grid columns held (#21464, stage 2) #21559 )
e909aa0a23 fix(cli): os dev -a and os start --artifact serve the named artifact beside a cwd objectstack.config.ts — one artifact precedence for start, dev and the serve child (fix(cli): os dev -a and os start --artifact serve the named artifact beside a cwd objectstack.config.ts — one artifact precedence for start, dev and the serve child #21549 )
a3873542ca fix(spec): the protocol 17 → 18 conversion summaries state each decision in words instead of a tracker number (stage 5) (fix(spec): the protocol 17 → 18 conversion summaries state each decision in words instead of a tracker number (stage 5) #21568 )
6dd99b82c3 fix(rest): one anonymous-intake rule honours every declared public-form withdrawal (fix(rest): one anonymous-intake rule honours every declared public-form withdrawal #21566 )
44072fc2b9 fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 8) (fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 8) #21569 )
74281a8e4a fix(cloud-connection): an install-local uninstall runs the protocol's registered uninstall cleanups (fix(cloud-connection): an install-local uninstall runs the protocol's registered uninstall cleanups #21512 )
1777a9bd45 fix(cli): the rest of the read-only data doors answer a project with no database yet with empty work ([finding] The rest of the read-only data-command family exits 1 on a project with no database yet: migrate account-issuer, audit-metadata-bodies, meta --stored, secret orphans and rewrap, storage orphans read tables their boot deferred #21552 ) (fix(cli): the rest of the read-only data doors answer a project with no database yet with empty work (#21552) #21570 )
0bddffd55b docs(spec): nine migration-step rationale passages and two registry comments drop their deleted tracker numbers (stage 11) (docs(spec): nine migration-step rationale passages and two registry comments drop their deleted tracker numbers (stage 11) #21578 )
cc645f2385 docs: adopt the 'ontology is the software' positioning (README, landing page, glossary, concepts) (docs: adopt the 'ontology is the software' positioning (README, landing page, glossary, concepts) #21579 )
a7ab047cf6 fix(rest): a public form that cannot take intake on a walled posture is not offered; the admin read says why (fix(rest): a public form that cannot take intake on a walled posture is not offered; the admin read says why #21580 )
901e7cf13a fix(cloud-connection): an install-local uninstall withdraws the package from the running kernel (fix(cloud-connection): an install-local uninstall withdraws the package from the running kernel #21581 )
958cfe29be feat(spec)!: four object-form members take the shape the form reads; fields, sections held (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 , stage 3) (feat(spec)!: four object-form members take the shape the form reads; fields, sections held (#21464, stage 3) #21590 )
d2e687fdff docs: positioning follow-up: home title, cover re-render, README on the four promises, Business Ontology page (docs: positioning follow-up: home title, cover re-render, README on the four promises, Business Ontology page #21591 )
35dfb8142f fix(service-analytics): the ObjectQL face echoes a date bucket in the driver's own expression, so SQLite runs it (fix(service-analytics): the ObjectQL face echoes a date bucket in the driver's own expression, so SQLite runs it #21587 )
eb9ef791bd fix(objectql): an in-process engine verb refuses an object name the registry does not resolve ([finding] [security] An in-process engine verb passes an object name the registry does not resolve to the driver as a raw table name, so a sandboxed body reads a protected table by a name the data door refuses #21516 ) (fix(objectql): an in-process engine verb refuses an object name the registry does not resolve (#21516) #21545 )
6c5697dffb fix(runtime,cloud-connection)!: a job's sandboxed body is scheduled on every door, and install-local refuses an enabled job with no body ([Decision] install-local: a package's declared jobs are never scheduled — refuse the install, name them in the install answer, or make job handlers declarable bodies (the jobs half of #21322) #21489 ) (fix(runtime,cloud-connection)!: a job's sandboxed body is scheduled on every door, and install-local refuses an enabled job with no body (#21489) #21584 )
f6b7520839 fix(spec): conformance-case notes and names state each decision in words instead of a tracker number (stage 6) (fix(spec): conformance-case notes and names state each decision in words instead of a tracker number (stage 6) #21593 )
9e9d693468 feat(spec)!: HookSchema refuses a hook body that targets a stored-metadata table, with the runtime's prescription ([finding] The metadata save door accepts a hook whose sandboxed body targets a stored-metadata table, which the runtime then refuses at bind: authoring answers 200 for a hook that never runs #21565 ) (feat(spec)!: HookSchema refuses a hook body that targets a stored-metadata table, with the runtime's prescription (#21565) #21592 )
b610eabf72 docs(design): predicate convergence — T2's measurement under B, and the S5 face table re-read (docs(design): predicate convergence — T2's measurement under B, and the S5 face table re-read #21600 )
9a4182a752 fix(spec,runtime,cli)!: the in-memory engine is no longer a boot store — every boot door refuses it and names SQLite instead (fix(spec,runtime,cli)!: the in-memory engine is no longer a boot store — every boot door refuses it and names SQLite instead #21598 )
ec390ec00d fix(metadata-protocol): a hydrated view expansion carries its container's tenant marker, so an unscoped kernel answers an expanded view as env_local does (finding(metadata-protocol): on an unscoped kernel a stored container's hydrated expansions carry no tenant marker, so an expanded view reads resettable: true and its layered code is the hydrated expansion #21511 ) (fix(metadata-protocol): a hydrated view expansion carries its container's tenant marker, so an unscoped kernel answers an expanded view as env_local does (#21511) #21603 )
37442d4750 fix(release): the Releases backfill skips a version whose publish is in flight in another run (fix(release): the Releases backfill skips a version whose publish is in flight in another run #21605 )
0721848b8c fix(spec): grade permission rowLevelSecurity label/description live — Studio's permission editor shows them (fix(spec): grade permission rowLevelSecurity label/description live — Studio's permission editor shows them #21607 )
54521f08ca qa(checklist): a hook-refused script action shows exactly one error toast carrying its sentence — item, showcase fixture, and one run (qa(checklist): a hook-refused script action shows exactly one error toast carrying its sentence — item, showcase fixture, and one run #21609 )
83b3d32020 fix(metadata-protocol,metadata-core,rest): saving or publishing a public form a walled posture cannot take intake for says why (fix(metadata-protocol,metadata-core,rest): saving or publishing a public form a walled posture cannot take intake for says why #21608 )
440cd329a9 fix(driver-sql): bucket a Field.date as its calendar day on PostgreSQL and MySQL (fix(driver-sql): bucket a Field.date as its calendar day on PostgreSQL and MySQL #21611 )
5c9138b4b6 fix(objectql)!: an unprojected read serves the declared fields, never an orphaned column (fix(objectql)!: an unprojected read serves the declared fields, never an orphaned column #21612 )
36ad3210d4 feat(spec)!: element:text variant refuses heading / subheading by name, and os migrate meta rewrites them to h2 / h3 (spec(ui): release 2 of the objectui#7450 convergence — element:text.variant's heading / subheading become named refusals through the value-level retirement mechanism #21015 ) (feat(spec)!: element:text variant refuses heading / subheading by name, and os migrate meta rewrites them to h2 / h3 (#21015) #21614 )
5d0e4e2793 fix(metadata-protocol)!: one stored-metadata filter collector and search narrowing, owned by the door and called by the reader seam; cross-field and deep family reads refused (fix(metadata-protocol)!: one stored-metadata filter collector and search narrowing, owned by the door and called by the reader seam; cross-field and deep family reads refused #21619 )
f97660cdd6 docs(driver-mongodb): re-anchor the dead tracker citations to the commits that decided them (stage 11 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(driver-mongodb): re-anchor the dead tracker citations to the commits that decided them (stage 11 of #20595) #21617 )
e367002e11 fix(metadata-protocol): the save door refuses a view container saved under a name its own expansion produces (finding(metadata-protocol): the runtime save door accepts a view container saved under one of its own expanded names, and after #21510's rule no door answers a view item for that name #21558 ) (fix(metadata-protocol): the save door refuses a view container saved under a name its own expansion produces (#21558) #21618 )
045b946256 fix(runtime,cloud-connection)!: install-local refuses a hook with no body and a job body that does not bind, and withholds such a hook on rehydrate ([finding] os package install accepts a package whose hook uses only the deprecated function-name handler (no body), answers "installed", and the hook never fires: install-local drops it with a server-side warn only #21585 ) (fix(runtime,cloud-connection)!: install-local refuses a hook with no body and a job body that does not bind, and withholds such a hook on rehydrate (#21585) #21615 )
a4f0cb0a45 fix(service-automation): a flow's get_record node serves the stored-metadata family the way the data door does (security(automation): the flow record-read node serves the stored-metadata family unprojected — consume PR #21513's door exports (#21454 item A4) #21519 ) (fix(service-automation): a flow's get_record node serves the stored-metadata family the way the data door does (#21519) #21621 )
0fc80878f8 fix(lint)!: action-name-undefined resolves record:related_list action ids against the child object (fix(lint)!: action-name-undefined resolves record:related_list action ids against the child object #21626 )
a1ca156da5 fix(objectql): lifecycle tenant scan asks the registry before reading sys_organization (fix(objectql): lifecycle tenant scan asks the registry before reading sys_organization #21628 )
3f1bc816a2 feat(spec)!: object-metric aggregate and trend take the shape the tile reads; drillDown, compareTo held for a ruling (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 , stage 4) (feat(spec)!: object-metric aggregate and trend take the shape the tile reads; drillDown, compareTo held for a ruling (#21464, stage 4) #21622 )
5d095a00ad fix(driver-sql,service-analytics): bucket the ISO week natively on SQLite, and the SQL echo refuses a bucket SQLite cannot run (fix(driver-sql,service-analytics): bucket the ISO week natively on SQLite, and the SQL echo refuses a bucket SQLite cannot run #21629 )
5b5e83f446 fix(objectql)!: a write's returned row and its prior read serve the declared fields, never an orphaned column (fix(objectql)!: a write's returned row and its prior read serve the declared fields, never an orphaned column #21631 )
0a0debbe96 docs(formula): re-anchor the dead tracker citations to the commit that decided them (stage 12 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(formula): re-anchor the dead tracker citations to the commit that decided them (stage 12 of #20595) #21635 )
6946f2f08e fix(runtime): two packages declaring the same job name both run, and uninstalling one stops only its own job (fix(runtime): two packages declaring the same job name both run, and uninstalling one stops only its own job #21633 )
3222c57404 fix(release): the image backfill skips a version whose publishing run has not finished building its image (fix(release): the image backfill skips a version whose publishing run has not finished building its image #21634 )
36e4647520 fix(spec): the error-code waiver reasons and the auth-feature registry notes state each decision in words instead of a tracker number (stage 7) (fix(spec): the error-code waiver reasons and the auth-feature registry notes state each decision in words instead of a tracker number (stage 7) #21636 )
7b07749f05 fix(metadata-protocol): the save door refuses a view container saved under a name another stored container of the same object expands to (The runtime save door accepts a view container saved under a name ANOTHER container expands to; the object door then lists the second container's list in place of the first's default, and no door answers a view item under the saved name #21620 ) (fix(metadata-protocol): the save door refuses a view container saved under a name another stored container of the same object expands to (#21620) #21637 )
1e4ae087a2 docs(metadata-fs): re-anchor the dead tracker citations to the commit that decided them (stage 13 of dead tracker citations in the domain:engine packages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595 ) (docs(metadata-fs): re-anchor the dead tracker citations to the commit that decided them (stage 13 of #20595) #21640 )
96b0e3108a fix(service-automation): the flow get_record node refuses a filter that evaluates the stored-metadata family, with the data door's refusal (security(automation): the flow record-read node evaluates its filter over the stored-metadata family without the door's evaluate refusals (the family's evaluate exit, #21519 residue) #21623 ) (fix(service-automation): the flow get_record node refuses a filter that evaluates the stored-metadata family, with the data door's refusal (#21623) #21641 )
1cbe165bfc chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) (chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) #21625 )
0c50b5dfe7 ci(temporal-conformance): give the non-SQL step the job's live PostgreSQL URL (ci(temporal-conformance): give the non-SQL step the job's live PostgreSQL URL #21577 )
15fe567c9c docs(spec): re-anchor the last six dead tracker citations in packages/spec/src to the commits that decided them (docs(spec): re-anchor the last six dead tracker citations in packages/spec/src to the commits that decided them #21642 )
1968d5e812 fix(service-analytics): the SQL echo refuses a date bucket the engine buckets in memory, on every dialect (analytics on PostgreSQL: a non-UTC timezone still echoes date_trunc(GRANULARITY, col), whose keys fall on the session zone's calendar and group rows differently from the face #21630 ) (fix(service-analytics): the SQL echo refuses a date bucket the engine buckets in memory, on every dialect (#21630) #21645 )
759dbe9ed3 feat(cli): os migrate unmapped-columns reads a retired field's columns, keyed by record id, for conversion before the destructive drop (feat(cli): os migrate unmapped-columns reads a retired field's columns, keyed by record id, for conversion before the destructive drop #21643 )
f40bb3217f fix(service-automation): flow write nodes refuse a stored-metadata family target (security(automation): flow create_record and update_record nodes write the stored-metadata family tables directly, outside the metadata protocol (measured; the unruled neighbour of #21519) #21624 ) (fix(service-automation): flow write nodes refuse a stored-metadata family target (#21624) #21649 )
6ec54f00ba feat(spec)!: retire the object-master-detail-form detail entry sortField — the console derives the line-position field from the child object (spec(ui): retire sortField from the object-master-detail-form detail entry; the pinned console stopped reading it at objectui 0a3e5409f, and the bump that crossed it did not carry the spec half #21589 ) (feat(spec)!: retire the object-master-detail-form detail entry sortField — the console derives the line-position field from the child object (#21589) #21632 )
eea82af677 fix(metadata-protocol): one collision predicate at the save door — a stored view container never takes a name already served from elsewhere (Two stored view containers of one object still displace each other's views: a container bound elsewhere or unbound under a sibling's expanded name, and a second container's bare list taking the first's <object>.default, are accepted with no diagnostic #21639 , The runtime save door accepts a view container saved under the name of a view item a package ships; package-less, the row is attributed to the shipping package and its bare list replaces that package's default view on both doors #21638 ) (fix(metadata-protocol): one collision predicate at the save door — a stored view container never takes a name already served from elsewhere (#21639, #21638) #21648 )
1a230548cf docs(skills): name the complete public-form opt-in the anonymous form endpoints read (docs(skills): name the complete public-form opt-in the anonymous form endpoints read #21650 )
bff5aa2d98 docs(skills): objectstack-ai says agent memory is enforced by the AI runtime, not declared only (docs(skills): objectstack-ai says agent memory is enforced by the AI runtime, not declared only #21652 )
fea67065a3 docs(skills): objectstack-ui puts the create/edit form under form, not a named formViews entry (docs(skills): objectstack-ui puts the create/edit form under form, not a named formViews entry #21651 )
506fb6dac3 docs(skills): objectstack-i18n names the action-entry keys os validate judges (docs(skills): objectstack-i18n names the action-entry keys os validate judges #21656 )
55e6f14f8d fix(pm): git-history hands git the instant its coverage proof reads, so a bare date no longer shrinks the window with the hour (fix(pm): git-history hands git the instant its coverage proof reads, so a bare date no longer shrinks the window with the hour #21657 )
be55fd2934 fix(objectql): a seed row keeps its authored created_at on insert, as the replay already does (fix(objectql): a seed row keeps its authored created_at on insert, as the replay already does #21661 )
98eb3b9b89 fix(objectql,spec)!: a hook's handler name resolves inside the hook's own package only ([Decision] security(objectql): may a hook's handler name bind to a function another package registered (the engine-wide fallback HookSchema.handler declares), or does name resolution stay inside the hook's own package (#21585 option B) #21604 ) (fix(objectql,spec)!: a hook's handler name resolves inside the hook's own package only (#21604) #21653 )
417443eb27 fix(cli): a narrowed os migrate --apply records no deployment flag, and an unknown --object is refused (fix(cli): a narrowed os migrate --apply records no deployment flag, and an unknown --object is refused #21662 )
909229e976 feat(spec,runtime,service-automation): a job pulls a mapping by declaration (pull: { mapping }) and runs as its declared organization (spec(integration): build the connector sync executor that syncConfig and fieldMappings declare (14 keys), once and on the mainstream shape #20281 stage 3) (feat(spec,runtime,service-automation): a job pulls a mapping by declaration (pull: { mapping }) and runs as its declared organization (#20281 stage 3) #21668 )
8ad9694fb7 docs(skills): the html-tier page example spells object-metric's aggregate in the object form (docs(skills): the html-tier page example spells object-metric's aggregate in the object form #21667 )
72f3c74d60 feat(spec)!: object-metric drillDown and compareTo take the shape the tile reads; object-grid columns exits its hold (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 , stage 5) (feat(spec)!: object-metric drillDown and compareTo take the shape the tile reads; object-grid columns exits its hold (#21464, stage 5) #21673 )
31e3e00939 fix(service-analytics): the SQL echo prints a date bucket only in the driver's own expression, on every driver (analytics: on a non-SQL driver (driver-memory, and by code path MongoDB) a UTC or unset timezone still echoes date_trunc for a date bucket the engine groups in memory #21647 ) (fix(service-analytics): the SQL echo prints a date bucket only in the driver's own expression, on every driver (#21647) #21664 )
93a54b87e7 fix(spec): the protocol 16 → 17 upgrade rationale states each cited decision in words instead of a tracker number (stage 8) (fix(spec): the protocol 16 → 17 upgrade rationale states each cited decision in words instead of a tracker number (stage 8) #21674 )
eed2dee481 docs(skills): date-bucket engine sentences name what each arm emits (docs(skills): date-bucket engine sentences name what each arm emits #21677 )
7d0781482d pm-dispatch: a triage fold proposal binds only before any named card has an open PR; a foreseen follow-up is a card (pm-dispatch: a triage fold proposal binds only before any named card has an open PR; a foreseen follow-up is a card #21676 )
a4fd82a8e6 fix(sdui-parser): an html page literal of the wrong type is a compile error, not a warning (fix(sdui-parser): an html page literal of the wrong type is a compile error, not a warning #21678 )
251a7dd4b4 fix(organizations)!: a create naming an organization_id meets the Layer 0 write wall, as the update does ([finding] POST /data on a walled posture silently replaces a platform admin's explicit organization_id with the admin's active organization (201), while the equivalent PATCH refuses loudly #21666 ) (fix(organizations)!: a create naming an organization_id meets the Layer 0 write wall, as the update does (#21666) #21680 )
cef2bd7a90 test(service-analytics): the Turso remote-face echo exception asserts its equivalence (analytics: on a non-SQL driver (driver-memory, and by code path MongoDB) a UTC or unset timezone still echoes date_trunc for a date bucket the engine groups in memory #21647 ) (test(service-analytics): the Turso remote-face echo exception asserts its equivalence (#21647) #21684 )
38bef8cf95 fix(pm): git-history lets a piped answer drain before it exits, and a no-remote refusal names its floor (fix(pm): git-history lets a piped answer drain before it exits, and a no-remote refusal names its floor #21685 )
83e2feeb46 fix(runtime,cloud-connection)!: install-local refuses an enabled job whose pull does not bind (install-local accepts a package whose job pull cannot bind: it answers 200 and the job is never scheduled. Refuse it at the door, as a body job that does not bind is refused #21672 ) (fix(runtime,cloud-connection)!: install-local refuses an enabled job whose pull does not bind (#21672) #21683 )
ced217ca30 fix(metadata-protocol)!: the save door refuses a hook that names a function in handler and carries no body (The metadata save door answers 200 to a hook with a handler name and no body, which the runtime then refuses at bind: a runtime-authored hook holds no functions, so that form can never run #21658 ) (fix(metadata-protocol)!: the save door refuses a hook that names a function in handler and carries no body (#21658) #21686 )
1db5322ba2 fix(pm): check-governed-merges refuses a flag its mode does not read, and a bare --pr beside a PM_SWEEP_REPO naming another repository (fix(pm): check-governed-merges refuses a flag its mode does not read, and a bare --pr beside a PM_SWEEP_REPO naming another repository #21690 )
ff167402cf fix(metadata-protocol): give each organization its own row identity on a per-organization seed replay (fix(metadata-protocol): give each organization its own row identity on a per-organization seed replay #21688 )
8d4fc6356c docs(pm-dispatch): triage closes a report-only instrument fix card not_planned at first grade, citing ruling 208 (docs(pm-dispatch): triage closes a report-only instrument fix card not_planned at first grade, citing ruling 208 #21691 )
234d1d8b7c fix(plugin-security): a cloned permission set is not reported as an unowned declaration on boot ([finding] Every boot warns permission_set_declaration_unowned for each cloned (org-owned) permission set, saying Setup cannot see it, while the row exists and Setup lists and edits it #21669 ) (fix(plugin-security): a cloned permission set is not reported as an unowned declaration on boot (#21669) #21692 )
fe1017287f fix(metadata-protocol): the read envelope's lock / editable / deletable report the write doors' locked-base verdict (fix(metadata-protocol): the read envelope's lock / editable / deletable report the write doors' locked-base verdict #21693 )
a2aadab1c6 feat(spec)!: FlowSchema refuses a create_record, update_record or delete_record node whose static objectName is a stored-metadata table, with the runtime's prescription (spec(automation): FlowSchema refuses a create_record, update_record or delete_record node whose static objectName is a stored-metadata family table (the save-time half of #21624) #21654 ) (feat(spec)!: FlowSchema refuses a create_record, update_record or delete_record node whose static objectName is a stored-metadata table, with the runtime's prescription (#21654) #21687 )
8843505d91 fix(objectql)!: a system write's readonly value is judged for its shape — a seed's malformed readonly datetime is refused, never stored (A system-context write skips value-shape validation for readonly fields: a seed's malformed readonly datetime ('yesterday', an unresolved cel envelope) is stored verbatim, while the same value on a non-readonly field is refused #21663 ) (fix(objectql)!: a system write's readonly value is judged for its shape — a seed's malformed readonly datetime is refused, never stored (#21663) #21695 )
f623e2f712 fix(spec): the protocol 17 → 18 upgrade rationale states each cited decision in words instead of a tracker number (stage 9) (fix(spec): the protocol 17 → 18 upgrade rationale states each cited decision in words instead of a tracker number (stage 9) #21698 )
16d241a6af feat(spec)!: object-gantt markers, object-timeline mapping and both forms' fields take the shape each block reads; five objectui-held contracts reported as forks (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 , S-objectui-held) (feat(spec)!: object-gantt markers, object-timeline mapping and both forms' fields take the shape each block reads; five objectui-held contracts reported as forks (#21464, S-objectui-held) #21699 )
7e0066af7a docs(spec): re-anchor the dead tracker citations in packages/spec/src's test surface to the commits that decided them (docs(spec): re-anchor the dead tracker citations in packages/spec/src's test surface to the commits that decided them #21700 )
7fd2c34de8 fix(metadata-protocol)!: the save door refuses every hook with no body, including one with neither a body nor a handler (The metadata save door answers 200 to a hook with neither body nor handler, which the runtime skips at every re-sync ("unresolved handler"): the bare hook is stored, served by name, and never runs #21689 ) (fix(metadata-protocol)!: the save door refuses every hook with no body, including one with neither a body nor a handler (#21689) #21706 )
5ac2ba17e5 fix(service-automation): flow write-node family refusal ends on the shared prescription sentence (security(automation): flow create_record and update_record nodes write the stored-metadata family tables directly, outside the metadata protocol (measured; the unruled neighbour of #21519) #21624 ) (fix(service-automation): flow write-node family refusal ends on the shared prescription sentence (#21624) #21707 )
5259a35e69 fix(objectql): droppedFields on a create names only keys the caller sent, never a middleware fill ([finding] On a walled posture a create that names no organization_id answers droppedFields [organization_id: readonly], a field the caller never sent (the insert analogue of #8093) #21682 ) (fix(objectql): droppedFields on a create names only keys the caller sent, never a middleware fill (#21682) #21701 )
9d91f583df docs(spec): JobSchema.body's describe says an enabled pull job installs when its pull binds and is refused when it does not (docs(spec): JobSchema.body's describe says an enabled pull job installs when its pull binds and is refused when it does not #21708 )
100f68b77f chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, feat(lint): canonical-envelope page audit gets a shared home; cloud-connection joins the gated population #11574 , [finding] the dispatch protocol has a zero-hit rule but no hazard-claim rule — an unmeasured "this would destroy data" fence in a dispatch order costs more than a false zero #11578 , feat(devx): gate the settings bind window on start()-registered kernel:ready hooks #11581 and fix(tooling): re-tally @objectstack/plugin-auth's TEST_DEBT from tsc #11583 ) (chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, #11574, #11578, #11581 and #11583) #21710 )
ced3e1ae47 feat(spec)!: object-kanban conditionalFormatting takes the list view's own rules, and its hold exits (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 , S-kanban-cf) (feat(spec)!: object-kanban conditionalFormatting takes the list view's own rules, and its hold exits (#21464, S-kanban-cf) #21711 )
ed15448217 feat(spec)!: a joined report refuses a block that binds no dataset, at blocks[i].dataset, naming the block ([finding] spec(report): a type: 'joined' report whose blocks bind no dataset parses and passes objectstack validate, while ReportSchema's own refinement comment and reports.mdx say "each block dataset-bound" #21702 ) (feat(spec)!: a joined report refuses a block that binds no dataset, at blocks[i].dataset, naming the block (#21702) #21712 )
3fa850cf00 test(spec): automation test titles state each cited decision in words instead of a tracker number (stage 10) (test(spec): automation test titles state each cited decision in words instead of a tracker number (stage 10) #21713 )
c43a8ae612 fix(metadata-protocol)!: the ADR-0010 _lock gate refuses on a host-config kernel too, and the diagnostics locked count reads the item envelope derivation (finding(metadata-protocol): two lock reports the #21670 read fix left unaligned — a host-config kernel's _lock gate admits a save the read now calls non-editable, and getMetaDiagnostics().stats[type].locked counts declared _lock only #21694 ) (fix(metadata-protocol)!: the ADR-0010 _lock gate refuses on a host-config kernel too, and the diagnostics locked count reads the item envelope derivation (#21694) #21715 )
a2b7328d57 fix(ci): the Console Pin Gate never counts text objectui's own source carries as the published spec (ci(console): the Console Pin Gate's staleness leg matches objectui's own gantt markers description as "the published spec", so every merge-queue build since #21699 is red #21709 ) (fix(ci): the Console Pin Gate never counts text objectui's own source carries as the published spec (#21709) #21717 )
316be321ef fix(runtime)!: an app-authored body may not read the stored-metadata tables; it reaches them through the metadata API only ([Decision] security(runtime): may an app-authored body still READ the stored-metadata family's tables, served projected, or is that refused too (#21454 option C) #21594 ) (fix(runtime)!: an app-authored body may not read the stored-metadata tables; it reaches them through the metadata API only (#21594) #21660 )
72b6333cd8 test(spec): kernel test titles state each cited decision in words instead of a tracker number (stage 11) (test(spec): kernel test titles state each cited decision in words instead of a tracker number (stage 11) #21736 )
cf60dbc8b3 fix(metadata-protocol)!: the ADR-0010 _lock gate reads the row the read serves for the request's organization ([finding] an env-wide metadata row declaring _lock: full reads locked in an org-scoped read, but an org-scoped save of it is admitted — getEffectiveLock's overlay limb matches organization_id exactly #21716 ) (fix(metadata-protocol)!: the ADR-0010 _lock gate reads the row the read serves for the request's organization (#21716) #21737 )
ff29410ed2 docs(qa): re-point 17 platform-checklist clauses the 17.7 pre-release runs proved stale or mis-asserted (docs(qa): re-point 17 platform-checklist clauses the 17.7 pre-release runs proved stale or mis-asserted #21741 )
6afb1b55a9 fix(cli): os migrate plan/apply compose the requires-supplied provider a connector hard-depends on (fix(cli): os migrate plan/apply compose the requires-supplied provider a connector hard-depends on #21739 )
da40a5f649 fix(driver-sql): connect reads PRAGMA auto_vacuum first and sets it only when the file is not already INCREMENTAL (fix(driver-sql): connect reads PRAGMA auto_vacuum first and sets it only when the file is not already INCREMENTAL #21744 )
309224d34d fix(runtime): a refused flow resume answers its engine's code — INVALID_SCREEN_INPUT, INVALID_SIGNAL, RUN_NOT_FOUND (fix(runtime): a refused flow resume answers its engine's code — INVALID_SCREEN_INPUT, INVALID_SIGNAL, RUN_NOT_FOUND #21740 )
73b224668e fix(service-automation): a flow saved through the metadata API is armed on the running engine at once (fix(service-automation): a flow saved through the metadata API is armed on the running engine at once #21746 )
8cbba54491 docs(qa): record A1 of crud-permission-matrix as a known v18 gap (docs(qa): record A1 of crud-permission-matrix as a known v18 gap #21749 )
ea7ff394b6 chore(ci): refresh the Test Core shard-timings dataset (chore(ci): refresh the Test Core shard-timings dataset #20388 )
Filed by .github/workflows/scheduled-full-run-card.yml. Generated by Claude Code
os-hourly-full-run-ci — machine-findable marker for this generated card. ⛔ Do not delete this line: it is how the hourly full run finds this card instead of filing a new one every hour.
hourly full run: red on main (CI)
Swept 2026-10-04T15:58:05.599Z · run log · commit
ea7ff394b6d802de9ad0448130bef86d4407760d· conclusionfailure.CIruns the FULL battery onmainevery hour (#16467). Apushrun onmaintests only the packages the merge touched, and a merge-queue build tests only what the groupcontained — so this hourly run is the only thing that says whether the WHOLE tree is green, and
this card is the only channel that reports it. Nothing is blocked by it.
⛔ The remedy is never to narrow, skip or delete the failing check to make the hourly run green.
Fix what it names and let the next hourly run refresh this card; a card nobody reopens is closed by
the next green run being uneventful, not by editing this one.
What landed since the last green hourly run
Range:
bbe03f4068(run 36705938370, the last greenCIschedule run) ..ea7ff394b6— compareTruncated by the compare API; open the compare link for the full list.
135daaa06bfeat(spec): agent.guardrails is live, enforced by the cloud AI runtime; tool.outputSchema steers authors to action.ai.outputSchema (feat(spec): agent.guardrails is live, enforced by the cloud AI runtime; tool.outputSchema steers authors to action.ai.outputSchema #21280)dabd1c5be7fix(cli): drop the never-loaded oclif.plugins entries and correct the text that saysos pluginsworks (fix(cli): drop the never-loaded oclif.plugins entries and correct the text that saysos pluginsworks #21306)75260587b3docs(spec): the master-detail detail entry's inlineMode and formFields describes state both renderer paths (spec(ui): an object-master-detail-form detail entry's inlineMode describe says the mode is resolved from the relationship's inlineEdit when omitted; on an entry kept as authored the renderer resolves nothing #21284) (docs(spec): the master-detail detail entry's inlineMode and formFields describes state both renderer paths (#21284) #21307)1c52a5e557fix(spec): the strict blueprint nav item's label describe states that null inherits the target's current label (fix(spec): the strict blueprint nav item's label describe states that null inherits the target's current label #21309)6091136e92fix(mcp, email, knowledge, queue, sms, storage, trigger, i18n): runtime strings state each decision in words instead of a tracker number (stage 2) (fix(mcp, email, knowledge, queue, sms, storage, trigger, i18n): runtime strings state each decision in words instead of a tracker number (stage 2) #21311)bcd68a29f3feat(cli,create-objectstack): os generate picklist, the src/picklists starter barrel, and a Picklists count in the metadata summary (feat(cli,create-objectstack): os generate picklist, the src/picklists starter barrel, and a Picklists count in the metadata summary #21167)1caa603730fix(service-analytics)!: refuse an analytics order key that names no member the query selects (fix(service-analytics)!: refuse an analytics order key that names no member the query selects #21314)bada8d35d7fix(pm): fleet-write relay reports created and moved card numbers as check-run annotations; the read-backs read them first (fix(pm): fleet-write relay reports created and moved card numbers as check-run annotations; the read-backs read them first #21312)222ecc27f9feat(spec): ICryptoProvider gains a required keyedDigest member; LocalCryptoProvider implements it (feat(spec): ICryptoProvider gains a required keyedDigest member; LocalCryptoProvider implements it #21292)97239c3c8afix(plugin-security): the RLS write check refuses an operator the read refuses on a declared JSON-stored column (RLS: the write check evaluates a scalar comparison (!=, ==, in) on a declared multi-valued / JSON-stored column that the read refuses 400, so a policy the read cannot run admits writes #21254) (fix(plugin-security): the RLS write check refuses an operator the read refuses on a declared JSON-stored column (#21254) #21317)1911d7cd1bdocs(skills): the platform skill counts the eight generator barrels, picklists included (docs(skills): the platform skill counts the eight generator barrels, picklists included #21337)04f0cc4992fix(objectql): redact a driver fault where it leaves the engine, not only in the engine's log line (fix(objectql): redact a driver fault where it leaves the engine, not only in the engine's log line #21335)6c5bef5f4edocs(adr): ADR-0128 §4 dated note — the keyed-digest break did not carry D1, and why (docs(adr): ADR-0128 §4 dated note — the keyed-digest break did not carry D1, and why #21343)99e1912afcfeat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay (feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay #21342)57c9fe39bcci: the core filter starts Build Core for a build-input-only diff, held to turbo.json by check-ci-filter-parity (ci: the core filter starts Build Core for a build-input-only diff, held to turbo.json by check-ci-filter-parity #21338)50e1c6554ffix(plugin-audit,platform-objects,plugin-auth,plugin-sharing,plugin-approvals,objectql)!: the audit ledger honours internal, and the credential-class census is declared internal (fix(plugin-audit,platform-objects,plugin-auth,plugin-sharing,plugin-approvals,objectql)!: the audit ledger honours internal, and the credential-class census is declared internal #21301)1878ef9798fix(plugin-security,platform-objects): an org member is not served a colleague's identity Admin-group fields, directly or through activity (plugin-security: an org member reading a colleague's sys_user row is served the Admin-group fields (last_login_ip/at, failed_login_count, locked_until, ban_*, phone_number) — and through sys_activity, their sign-in history #21237) (fix(plugin-security,platform-objects): an org member is not served a colleague's identity Admin-group fields, directly or through activity (#21237) #21340)f9bcd08beffix(datasource, approvals): runtime strings state each decision in words instead of a tracker number (stage 3) (fix(datasource, approvals): runtime strings state each decision in words instead of a tracker number (stage 3) #21346)96b12b589fci(lint): run the issue-transfer door self-test in the pm roster (ci(lint): run the issue-transfer door self-test in the pm roster #21348)23365eaedffeat(spec)!: the AI runtime's two JSON-Schema slots refuse an untyped subschema that carries a type-scoped keyword, at its path (finding(spec): the two JSON-Schema slots the cloud AI runtime compiles (action.ai.outputSchema,agent.structuredOutput.schema) accept an untyped subschema carrying a type-scoped keyword, which that runtime refuses before it runs #21289) (feat(spec)!: the AI runtime's two JSON-Schema slots refuse an untyped subschema that carries a type-scoped keyword, at its path (#21289) #21353)16eefc6c0edocs(spec): the master-detail detail entry's sortField and amountField describes state each renderer path (spec(ui): an object-master-detail-form detail entry's sortField describe says it is derived when omitted; on the renderer's fast path nothing derives it #21315) (docs(spec): the master-detail detail entry's sortField and amountField describes state each renderer path (#21315) #21355)69612451c2fix(deps): patch tsx 4.23.15 so oclif registers it on every supported Node, re-arming the reroute probe CONTROL leg (fix(deps): patch tsx 4.23.15 so oclif registers it on every supported Node, re-arming the reroute probe CONTROL leg #21356)13a24ece2ddocs(driver-sql): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 4 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(driver-sql): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 4 of #20595) #21357)37a0148666docs(cli): the README states the global flags and the os plugin group that the built os registers (docs(cli): the README states the global flags and the os plugin group that the built os registers #21354)5fd4855a9adocs(qa): re-point eight checklist items the 17.6.0 release-verification run proved stale (docs(qa): re-point eight checklist items the 17.6.0 release-verification run proved stale #21339)11d9b5021dfix(release): the GitHub Releases writer converges on a racing writer's 422 already_exists and reports duplicate Releases (fix(release): the GitHub Releases writer converges on a racing writer's 422 already_exists and reports duplicate Releases #21358)39119014dcfix(spec): a bound action's translation is read only under its own object, never from globalActions (fix(spec): a bound action's translation is read only under its own object, never from globalActions #21344)7aab75920bfix(formula,plugin-security)!: delete formula's whole-day copy of the bare-day bound (lteBound); the RLS seam refuses a non-number on a numeric column (fix(formula,plugin-security)!: delete formula's whole-day copy of the bare-day bound (lteBound); the RLS seam refuses a non-number on a numeric column #21336)9360df4138docs(releases): finalize the 17.6.0 notes after publish (docs(releases): finalize the 17.6.0 notes after publish #21362)fbe2debb77fix(service-analytics): the ObjectQL face applies a query's order, offset and limit, as its echoed sql says (fix(service-analytics): the ObjectQL face applies a query's order, offset and limit, as its echoed sql says #21363)f39760864cfix(cli)!: os verify runs the author-time rules first, and a stack they refuse fails verify with the findings os validate reports (fix(cli)!: os verify runs the author-time rules first, and a stack they refuse fails verify with the findings os validate reports #21364)3937ad2f32feat(spec)!: an agent's structuredOutput is JSON-only — retire the regex / grammar / xml formats and the coerce_types step; the block is live, enforced by the cloud AI runtime (feat(spec)!: an agent's structuredOutput is JSON-only — retire the regex / grammar / xml formats and the coerce_types step; the block is live, enforced by the cloud AI runtime #21367)d78bd011eaci: Build Core starts on a diff confined to one of its own guard scripts, held to the job steps by check-ci-filter-parity (ci: Build Core starts on a diff confined to one of its own guard scripts, held to the job steps by check-ci-filter-parity #21368)11905a4f8bfix(cli)!: os generate binds declared metadata (--object, --flow), never the item name, and every scaffold passes validate, build and lint (fix(cli)!: os generate binds declared metadata (--object, --flow), never the item name, and every scaffold passes validate, build and lint #21369)43e928dd4cfeat(gates): check:self-test-wired audits every root alias that declares a --self-test (finding(pm tooling): check:self-test-wired cannot see a declared--self-testalias that no workflow names, so removing the only step that runs one stays green #21351) (feat(gates): check:self-test-wired audits every root alias that declares a --self-test (#21351) #21366)7b21af80cbci(release): the release-integrity audit names the changesets a version commit did not consume (ci(release): the release-integrity audit names the changesets a version commit did not consume #21373)db0cf2231bdocs(driver-memory): re-anchor the dead tracker citations to the commits that decided them (stage 5 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(driver-memory): re-anchor the dead tracker citations to the commits that decided them (stage 5 of #20595) #21375)ee75aae1a8fix(plugin-security): security/explain answers the read's refusal for an operator the read refuses on a declared JSON-stored column (plugin-security: security.explain answers a record visible under a row-level policy that aims a JSON-column-incompatible operator at a declared JSON-stored field, while find refuses the same read with INVALID_FILTER / 400 #21319) (fix(plugin-security): security/explain answers the read's refusal for an operator the read refuses on a declared JSON-stored column (#21319) #21371)51550933dbfix(cli): os verify --json writes exactly one JSON document to stdout; boot diagnostics move to stderr (fix(cli): os verify --json writes exactly one JSON document to stdout; boot diagnostics move to stderr #21381)8963dbfac4chore(objectui): bump the console pin to 89cad75d5570 (carries objectui 0858267e, 8001068b, 3ae91930 and d0fba91aa) (chore(objectui): bump the console pin to 89cad75d5570 (carries objectui 0858267e, 8001068b, 3ae91930 and d0fba91aa) #21380)d9569101a4fix(objectql): the raw-statement door and the lifecycle sweep cut a driver fault by construction ([security] Driver-fault redaction residue after #21274: a raw statement whose leading verb the leak predicate does not list, and the lifecycle archiver's direct cold-store writes, can still carry a statement to a logger #21345) (fix(objectql): the raw-statement door and the lifecycle sweep cut a driver fault by construction (#21345) #21384)6d487d2094fix(plugin-approvals): My Pending lists a position-routed request under either address spelling (fix(plugin-approvals): My Pending lists a position-routed request under either address spelling #21378)9f13c949b0fix(objectql)!: a string comparand against a boolean field is narrowed to its boolean, or refused 400, at the engine filter door (fix(objectql)!: a string comparand against a boolean field is narrowed to its boolean, or refused 400, at the engine filter door #21372)69a12a0952fix(plugin-audit): the Audit write FAILED line names the refused table and the row it lost (fix(plugin-audit): the Audit write FAILED line names the refused table and the row it lost #21383)c52c49d96efeat(spec)!: FieldSchema refuses a select / radio with neither options nor picklist (feat(spec)!: FieldSchema refuses a select / radio with neither options nor picklist #21390)56238d890dtest(cli): drivemigrate audit-metadata-bodiesin the --json stdout-purity family (test(cli): drivemigrate audit-metadata-bodiesin the --json stdout-purity family #21394)3b4efa74b2fix(cli): os migrate meta --stored and audit-metadata-bodies preview on a read-only boot (fix(cli): os migrate meta --stored and audit-metadata-bodies preview on a read-only boot #21389)ecb6ca0258spec: a flow screen field's help text is translatable — inlineHelpText joins the flows per-field face (spec: a flow screen field cannot express a numeric bound, help text, or a lookup target — three intents that degrade into prose in the reference app #17306) (spec: a flow screen field's help text is translatable — inlineHelpText joins the flows per-field face (#17306) #21386)85986144c2docs(metadata): re-anchor the dead tracker citations to the commits that decided them (stage 6 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(metadata): re-anchor the dead tracker citations to the commits that decided them (stage 6 of #20595) #21396)ca0dfb658afeat(spec): offer agent.structuredOutput on the agent form and drop its stale not-enforced-yet ledger row (feat(spec): offer agent.structuredOutput on the agent form and drop its stale not-enforced-yet ledger row #21398)1d0600bf66fix(runtime,cloud-connection): an install-local package binds its script-action bodies and body hooks; list_actions lists only what run_action can run (fix(runtime,cloud-connection): an install-local package binds its script-action bodies and body hooks; list_actions lists only what run_action can run #21401)a5139404d8docs(skills): the upgrade skill's v17-canonical Lead declares its select options (docs(skills): the upgrade skill's v17-canonical Lead declares its select options #21402)4b20c84748fix(cli): os environments runs on the os cloud login session through one shared resolver (fix(cli): os environments runs on the os cloud login session through one shared resolver #21400)6d67ad5ecafix(analytics)!: a query window outside the non-negative integers is refused at the door, and an offset with no limit runs on SQLite (fix(analytics)!: a query window outside the non-negative integers is refused at the door, and an offset with no limit runs on SQLite #21399)45efcfa3d3fix(spec)!: a number other than 1 / 0, a Date or an array compared against a boolean field is refused like a non-boolean string (A non-string comparand outside the accepted set against a declared boolean field answers a PostgreSQL 500 or an empty 200, and an array $in member splits 200/400 across drivers: the non-string half #21333 left out #21382) (fix(spec)!: a number other than 1 / 0, a Date or an array compared against a boolean field is refused like a non-boolean string (#21382) #21404)db3fee3dc9fix(plugin-sharing): a plain member's own share-link list is self-scoped (ADR-0111) (fix(plugin-sharing): a plain member's own share-link list is self-scoped (ADR-0111) #21403)96a9719edafeat(automation): a flow's credentials live in a write-only channel on the secret seam, not in its stored definition (security(flows): move a flow's inbound-hook secret out of flow metadata into the write-only secret seam #7799 established — no read, the generic data door included, returns it #20790) (feat(automation): a flow's credentials live in a write-only channel on the secret seam, not in its stored definition (#20790) #21377)fa7b565212fix(create-objectstack,cli): starter objects place their fields in a keyed field group (fix(create-objectstack,cli): starter objects place their fields in a keyed field group #21407)41a3c8df15docs: comments outside driver-memory name what replaced the retired reference matcher (#5930 step 4 (domain:engine): the engine-fed faces delete their hand-copied filter meaning (driver-sql, turso remote, memory query, mongodb, formula,having); the memory reference matcher retires (D6) #20822 group 4) (docs: comments outside driver-memory name what replaced the retired reference matcher (#20822 group 4) #21395)5e58193338fix(plugin-approvals): every slot reader takes the caller's acting addresses — can_act, the decision slot test, the already-acted probe and the email-keyed slot (fix(plugin-approvals): every slot reader takes the caller's acting addresses — can_act, the decision slot test, the already-acted probe and the email-keyed slot #21410)ceb4a939b4fix(objectql)!: having and the per-aggregation filter refuse a { $field } against a column with no comparison class, as where does; applyInMemoryAggregation takes the reference rules (fix(objectql)!: having and the per-aggregation filter refuse a { $field } against a column with no comparison class, as where does; applyInMemoryAggregation takes the reference rules #21406)22c2d6f4d5feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live (feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live #21413)39a912ea73fix(lint)!: os validate refuses an analyticsCubes member the analytics door refuses — a dimension over a JSON-stored column, and count_distinct over one (fix(lint)!: os validate refuses an analyticsCubes member the analytics door refuses — a dimension over a JSON-stored column, and count_distinct over one #21416)bdd3654f29fix(spec,lint,metadata-protocol): correct the view containernameledger note; delete the unreachable list-viewtabswalks (fix(spec,lint,metadata-protocol): correct the view containernameledger note; delete the unreachable list-viewtabswalks #21423)68c5ab7ebafix(spec): the null ordering-comparand refusal names only evaluation faces that exist (fix(spec): the null ordering-comparand refusal names only evaluation faces that exist #21408)8b123c0aecfix(plugin-security,service-analytics): a boolean comparand is judged by the spec verdict at the RLS compile seam and in the NativeSQL strategy (fix(plugin-security,service-analytics): a boolean comparand is judged by the spec verdict at the RLS compile seam and in the NativeSQL strategy #21424)520f66f39ffix(plugin-security): PermissionDeniedError carries status beside statusCode, so a share-link permission refusal answers 403 at both doors (fix(plugin-security): PermissionDeniedError carries status beside statusCode, so a share-link permission refusal answers 403 at both doors #21429)32d5769080feat(spec)!: a pie / donut / funnel / treemap / sankey widget takes one measure with a dimension too — refuse two or more at values, and rename the check to checkDashboardWidgetChartMeasureArity (spec(ui): refuse two or more measures on a dimensionedpie/donut/funnel/treemap/sankeywidget too — the single-series types bind one measure whatever the dimension (extends #20958) #21293) (feat(spec)!: a pie / donut / funnel / treemap / sankey widget takes one measure with a dimension too — refuse two or more at values, and rename the check to checkDashboardWidgetChartMeasureArity (#21293) #21425)3bddd4a6b5fix(plugin-audit): an update activity row whose every recorded change is withheld from the reader is withheld as a row, on every listing face (security(plugin-audit): an activity row whose every recorded change is withheld from the reader is still served (empty change, summary, actor, timestamp), so an org peer reads WHEN a colleague's identity row was stamped — each sign-in time #21388) (fix(plugin-audit): an update activity row whose every recorded change is withheld from the reader is withheld as a row, on every listing face (#21388) #21427)3a6d92f78bfix(spec):record:activity's props row namesitems/loadingas the host feed slot (fix(spec):record:activity's props row namesitems/loadingas the host feed slot #21422)6d728b850ffix(driver-sql): the five refusal log lines take the shared driver-fault cut, moved to core (fix(driver-sql): the five refusal log lines take the shared driver-fault cut, moved to core #21414)c2c21f357ctest(spec): the gate-spawning beforeAll in check-liveness.test.ts runs under the case budget (Flaky on Test Core (1/6): the tombstone describe of packages/spec check-liveness.test.ts times out in its beforeAll at 10000ms — the hook spawns the whole liveness gate under vitest's default hookTimeout, which the spec config cannot raise #21421) (test(spec): the gate-spawning beforeAll in check-liveness.test.ts runs under the case budget (#21421) #21433)d70353f8aafix(lint)!: os validate refuses an analyticsCubes sum / avg / min / max measure over a column the cube door refuses — every cube measure is judged by the aggregate × field-type table (fix(lint)!: os validate refuses an analyticsCubes sum / avg / min / max measure over a column the cube door refuses — every cube measure is judged by the aggregate × field-type table #21435)b206403beafix(cli,runtime): one-shot CLI boots run no seed loader and arm no lifecycle sweep; every no-write mode boots read-only (fix(cli,runtime): one-shot CLI boots run no seed loader and arm no lifecycle sweep; every no-write mode boots read-only #21432)d7d5b4f96afix(service-analytics): the ObjectQL face echoes an offset with no limit as a statement the dialect runs (fix(service-analytics): the ObjectQL face echoes an offset with no limit as a statement the dialect runs #21440)535d1d25abfix(metadata-protocol): a bare-list view container on another package's object expands under its own name (fix(metadata-protocol): a bare-list view container on another package's object expands under its own name #21430)b79301000cfeat(spec)!: the analytics row wildcard '*' is admitted only where a count consumes it (analytics:'*'runs only undercount, but a cube measure's or dimension'ssqland a dataset measure'sfieldadmit it under any aggregate — a summed'*'answers 500 at the dataset door (split from #21000) #21409) (feat(spec)!: the analytics row wildcard '*' is admitted only where a count consumes it (#21409) #21431)53fd35e3e3docs(spec): cli-extension TSDoc step 2 "Discover" says what loads an oclif plugin intoos(docs(spec): cli-extension TSDoc step 2 "Discover" says what loads an oclif plugin intoos#21443)086ad0aa68fix(service-analytics): native SQL judges a comparand against a declared number column by the spec's verdict, as the comparand walk's second arm (fix(service-analytics): native SQL judges a comparand against a declared number column by the spec's verdict, as the comparand walk's second arm #21446)b94a2a7277spec(data):field-scale.tsstates that a serversum/avgover a no-fixed-widthnumberdoes not yet carry its width, and the ruled end-state (spec(data):field-scale.tsstates that a serversum/avgover a no-fixed-widthnumberdoes not yet carry its width, and the ruled end-state — ruling A (deferred) on objectui#11254 #21183) (spec(data):field-scale.tsstates that a serversum/avgover a no-fixed-widthnumberdoes not yet carry its width, and the ruled end-state (#21183) #21449)9b7a0ef3fadocs(spec): the liveness README's author-warning section states the verdict model the lint ships (docs(spec): the liveness README's author-warning section states the verdict model the lint ships #21450)57cc695062feat(spec,service-settings): CryptoContext gains a required scope discriminant, bound into a delimiter-safe, versioned AAD (ADR-0128 D1-D3, stage 1) (feat(spec,service-settings): CryptoContext gains a required scope discriminant, bound into a delimiter-safe, versioned AAD (ADR-0128 D1-D3, stage 1) #21453)94a8761a87docs(kernel): lifecycle page states plugin install is not implemented, drops phantom plugin commands (docs(kernel): lifecycle page states plugin install is not implemented, drops phantom plugin commands #21456)1fd56645affix(metadata-protocol): a refused sys_packages delete fails the uninstall before anything is removed (fix(metadata-protocol): a refused sys_packages delete fails the uninstall before anything is removed #21438)99589f91a7feat(spec,service-analytics)!: retire the cube metric types number / string / boolean, refused in both analytics strategies in the spec's words (spec+service-analytics: retire the cube metric typesnumber/string/boolean— they existed to carry a SQL expression, which #20943 retired from a member'ssql#21000) (feat(spec,service-analytics)!: retire the cube metric types number / string / boolean, refused in both analytics strategies in the spec's words (#21000) #21452)cfa4d740b7fix(spec,lint): pagerequiresis live — refused at save, reported at load (fix(spec,lint): pagerequiresis live — refused at save, reported at load #21451)713b0fa76dfix(metadata-protocol)!: a metadata body's stored content hash is served and compared only in keyed form, never copied, never evaluated ([security] Stored-metadata-body family: two exits #21120 did not reach. An engine-only door serves an administrator credential material in cleartext, and the data door serves a content hash computed over the withheld credentials #21207) (fix(metadata-protocol)!: a metadata body's stored content hash is served and compared only in keyed form, never copied, never evaluated (#21207) #21436)6210f8870afix(lint): field-no-consumers credits every field an analytics member's column path reads (finding(lint):field-no-consumerscalls a field "inert" when an analytics member reads it through a relationship path (account.revenuein a cube measure'ssqlor a dataset measure'sfield) — the family's next position after #21091 #21439) (fix(lint): field-no-consumers credits every field an analytics member's column path reads (#21439) #21460)4c8363f421fix(plugin-sharing): the record owner and an explicit Modify-All holder may mint a share link without visibility (ADR-0111 D8 rule 1, ruling A′) (fix(plugin-sharing): the record owner and an explicit Modify-All holder may mint a share link without visibility (ADR-0111 D8 rule 1, ruling A′) #21447)7e7e64b13dfix(lint): flow, hook, action and expression rule findings state each decision in words instead of a tracker number (stage 1) (fix(lint): flow, hook, action and expression rule findings state each decision in words instead of a tracker number (stage 1) #21462)49524f6906fix(rest): withdrawing a public form takes effect on every anonymous intake door (fix(rest): withdrawing a public form takes effect on every anonymous intake door #21420)aa4632235bfeat(spec)!: an object-grid page block types the seven members the grid reads, and resizableColumns retires for resizable (finding(spec):ComponentPropsMap['object-grid']keepsresizableColumnsas a live alias ofresizable, and types six membersObjectGridreads with fixed shapes asz.unknown()(rowHeight: 42passes every door) #21445) (feat(spec)!: an object-grid page block types the seven members the grid reads, and resizableColumns retires for resizable (#21445) #21463)6e33b67912feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (spec(ai): retireagent.lifecycle— phase-scoped instructions and tools are skills withtriggerConditions, process orchestration is Flow (ruled on cloud#2569) #21320) (feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (#21320) #21461)0b8239111ffix(service-analytics)!: a caller-named measure whose source names no field is refused at the mint, INVALID_FIELD / 400 (analytics query: a caller-named measure with an empty prefix (_sum,_avg, …) mints the row wildcard under a non-count aggregate and answers 500 DATABASE_ERROR — the runtime position of #21409's family #21437) (fix(service-analytics)!: a caller-named measure whose source names no field is refused at the mint, INVALID_FIELD / 400 (#21437) #21474)0557c2f674feat(cli,service-settings): os secret rewrap, the at-rest re-wrap of version-1 sys_secret ciphertext under each holder's producer scope (ADR-0128 §4.2, stage 2) (feat(cli,service-settings): os secret rewrap, the at-rest re-wrap of version-1 sys_secret ciphertext under each holder's producer scope (ADR-0128 §4.2, stage 2) #21469)cc0786223bfix(automation, audit): runtime strings state each decision in words instead of a tracker number (stage 4) (fix(automation, audit): runtime strings state each decision in words instead of a tracker number (stage 4) #21472)7097859633test: load package barrels at module top so the collect phase pays for them (test: load package barrels at module top so the collect phase pays for them #21480)72217cd6fffeat(spec):ApprovalActionRowdeclaresacted_as, the slot an approval action was taken as (feat(spec):ApprovalActionRowdeclaresacted_as, the slot an approval action was taken as #21479)cba4297176test(rest): give the import-template parity case a measured per-shape budget (test(rest): give the import-template parity case a measured per-shape budget #21481)48fa7a381cdocs(platform-objects): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 7 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(platform-objects): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 7 of #20595) #21477)100c394f6ffix(spec)!: a list at a scalar operator is refused at the shared comparand-shape face, whatever the column type (analytics: a list comparand at a scalar operator ({ amount: { $gt: [10, 99] } }) answers 200 bound to its first member on the engine-aggregate face (and on both faces for a text column), where the spec's verdict refuses the list form #21448) (fix(spec)!: a list at a scalar operator is refused at the shared comparand-shape face, whatever the column type (#21448) #21484)ab52182b4afix(cloud-connection,plugin-security): a hot install fires the package record-change flows and projects its permission sets without a restart (fix(cloud-connection,plugin-security): a hot install fires the package record-change flows and projects its permission sets without a restart #21488)5555047117fix(metadata-protocol,metadata): the runtime save door refuses a view container whose name disagrees with its save name, through the one judge every door calls (finding(metadata-protocol): the runtime save door accepts a view container whose bodynamecontradicts its row name and registers it under both keys; the two source registrars refuse the same document #21412) (fix(metadata-protocol,metadata): the runtime save door refuses a view container whose name disagrees with its save name, through the one judge every door calls (#21412) #21483)fd96a8473dfix(spec-docs): one shared def renders one optionality face on every reference page (fix(spec-docs): one shared def renders one optionality face on every reference page #21478)9ff74285f1ci(test-core): retire the CLI's file-level slicing by the partitioner's own slice-count derivation (ci(test-core): retire the CLI's file-level slicing by the partitioner's own slice-count derivation #21487)6f17d1d364fix(approvals): actor_id records the person who decided, acted_as the slot it was taken as; stored slot literals move out at boot (fix(approvals): actor_id records the person who decided, acted_as the slot it was taken as; stored slot literals move out at boot #21493)15b29d37affix(lint): data-model, filter, predicate, search, sort, security and registry findings state each decision in words instead of a tracker number (stage 2) (fix(lint): data-model, filter, predicate, search, sort, security and registry findings state each decision in words instead of a tracker number (stage 2) #21491)85e29b8858fix(types): operatorFacingErrorText answers through the one driver-fault cut (fix(types): operatorFacingErrorText answers through the one driver-fault cut #21482)2ee8383f4efix(cli): os migrate recorded-by, resume, account-issuer and apply rethrow oclif's exit signal, so a completed --json run prints one document and exits 0 (fix(cli): os migrate recorded-by, resume, account-issuer and apply rethrow oclif's exit signal, so a completed --json run prints one document and exits 0 #21495)25797a16e1fix(cli): a one-shot command never mints a data key in the key home (finding(cli):os secret orphans, a report that "writes nothing", composes the settings service with its default crypto provider, which mints a key file in the key home in a development posture with no key #21471) (fix(cli): a one-shot command never mints a data key in the key home (#21471) #21497)f9a8eb889efix(plugin-security): run the seed-ownership claim whenever a seed settles, on every boot (fix(plugin-security): run the seed-ownership claim whenever a seed settles, on every boot #21503)529d9711fbfeat(spec)!: object-map, object-gantt and object-tree type navigation by reference, and one pin enumerates every z.unknown() member of ComponentPropsMap (spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, stage 1) (feat(spec)!: object-map, object-gantt and object-tree type navigation by reference, and one pin enumerates every z.unknown() member of ComponentPropsMap (#21464, stage 1) #21502)c205b6c350docs(core): re-anchor the dead tracker citations to the commits and ADRs that decided them (stage 8 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(core): re-anchor the dead tracker citations to the commits and ADRs that decided them (stage 8 of #20595) #21506)2df621af39fix(verify): os verify never creates key material in the key home; the harness seals under an in-process data key (fix(verify): os verify never creates key material in the key home; the harness seals under an in-process data key #21507)e9dec3dabdfix(metadata-protocol): a view a stored container expands answers by name what the object door lists, on every kernel and container scope (metadata-protocol: a view that a runtime view container expands is listed by GET /meta/view?object= but answers nothing by name on an environment-scoped kernel or for an org-scoped container — the by-name read expands no container #21442) (fix(metadata-protocol): a view a stored container expands answers by name what the object door lists, on every kernel and container scope (#21442) #21508)88fb5e85a0fix(approvals): every sys_user lookup approvals writes holds an id or null — machine actors record none, notify forwards only a person, reassign parties are slot addresses (ADR-0118 D1) (fix(approvals): every sys_user lookup approvals writes holds an id or null — machine actors record none, notify forwards only a person, reassign parties are slot addresses (ADR-0118 D1) #21514)abe8f289e8fix(runtime): a sandboxed body or an action handler reading the stored-metadata tables is served the data door's form ([finding] [security] An action/automation body's object API and an action handler's engine handle read the stored-metadata family outside its body projection and keyed serve (reach NOT MEASURED) #21454) (fix(runtime): a sandboxed body or an action handler reading the stored-metadata tables is served the data door's form (#21454) #21513)e3ad4922edfix(security): runtime strings state each decision in words instead of a tracker number (stage 5) (fix(security): runtime strings state each decision in words instead of a tracker number (stage 5) #21518)ad7c351898fix(spec): author-visible refusals and prescriptions state each decision in words instead of a tracker number (stage 3) (fix(spec): author-visible refusals and prescriptions state each decision in words instead of a tracker number (stage 3) #21521)5895119c35fix(cli): package install, package publish and plugin sign print one error line per refusal; the exit-signal pin covers every command (fix(cli): package install, package publish and plugin sign print one error line per refusal; the exit-signal pin covers every command #21522)bee8d1c62cfix(verify): derive a multi-valued select as a list compared as a set, by the spec's isMultiValueField (fix(verify): derive a multi-valued select as a list compared as a set, by the spec's isMultiValueField #21526)c98a72d69edocs(metadata-core): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 9 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(metadata-core): re-anchor the dead tracker citations to the commits and ADR that decided them (stage 9 of #20595) #21525)550f4cc2fdfix(cli,metadata-protocol): os migrate resume completes an interrupted recorded-by run, and os serve reports interrupted migration runs at boot (fix(cli,metadata-protocol): os migrate resume completes an interrupted recorded-by run, and os serve reports interrupted migration runs at boot #21527)31d2255f5cfeat(mcp): server.json for the official MCP registry — one remote entry on the user's own deployment, no npm entry (mcp distribution: aserver.jsonfor the official MCP registry, in this repo, from the shipped surface (the dev half of #20791) #21494) (feat(mcp): server.json for the official MCP registry — one remote entry on the user's own deployment, no npm entry (#21494) #21530)48eb9c193ffeat(spec)!: ai:chat_window is retired — refused by name at the schema door, the floating chat overlay is the AI chat entry point (finding(spec):ai:chat_windowis a declared page component type with no renderer — the console answers a page that uses it with "Unknown component type", and no app authors it #21504) (feat(spec)!: ai:chat_window is retired — refused by name at the schema door, the floating chat overlay is the AI chat entry point (#21504) #21531)49161683fbfix(plugin-sharing, plugin-audit): runtime strings state each decision in words instead of a tracker number (stage 6) (fix(plugin-sharing, plugin-audit): runtime strings state each decision in words instead of a tracker number (stage 6) #21533)1ac7308d7afix(core)!: the plugin artifact signature contract refuses any key that is not Ed25519 (fix(core)!: the plugin artifact signature contract refuses any key that is not Ed25519 #21534)41b13331cdfix(spec): a view container'sformis its default form — never collapsed into a named form, and no named form is promoted (fix(spec): a view container'sformis its default form — never collapsed into a named form, and no named form is promoted #21535)f1e4ae56adspec(system): JobSchema gains a sandboxed L2bodyand deprecateshandler; a body job has one time limit (spec(system): JobSchema gains a sandboxed L2bodyand deprecateshandler; a body job has one time limit #21538)44defd4c94fix(metadata-protocol,metadata): every runtime write door refuses a body whose name disagrees with its row name, for every type, through the one judge (finding(metadata-protocol): the runtime save door accepts any metadata body whosenamediffers from its row name, and registers it under the body name (the every-type half of #21412) #21470) (fix(metadata-protocol,metadata): every runtime write door refuses a body whose name disagrees with its row name, for every type, through the one judge (#21470) #21536)24dc7c1134fix(cli): os init prints its in-try refusals once; the exit-signal pin is seeded with this.error (fix(cli): os init prints its in-try refusals once; the exit-signal pin is seeded with this.error #21541)fd5a1cd597docs(driver-turso): re-anchor the dead tracker citations to the commits that decided them (stage 10 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(driver-turso): re-anchor the dead tracker citations to the commits that decided them (stage 10 of #20595) #21546)72af58c621feat(spec)!: pagerequiresonly on the compiled kinds — refused at parse on react, full and slotted pages ([Decision] pagerequireson the page kinds whose source is never compiled at save (react,full,slotted): refuse it at parse, or keep admitting a key nothing derives? #21459) (feat(spec)!: pagerequiresonly on the compiled kinds — refused at parse on react, full and slotted pages (#21459) #21547)6cf1154a65fix(mcp): serverInfo.version defaults to the package version, not a literal 1.0.0 (fix(mcp): serverInfo.version defaults to the package version, not a literal 1.0.0 #21548)aa0d4b969cfix(cli,runtime): os migrate resume, recorded-by and value-shapes answer a project with no database yet with empty work (fix(cli,runtime): os migrate resume, recorded-by and value-shapes answer a project with no database yet with empty work #21550)81e69cab30fix(service-analytics)!: the read scope, the where tree and the draft preview take the shared lowering's bound and NULL guards; their own copies are deleted (fix(service-analytics)!: the read scope, the where tree and the draft preview take the shared lowering's bound and NULL guards; their own copies are deleted #21553)e901c27449fix(spec): the protocol 16 → 17 conversion summaries and three descriptions state each decision in words instead of a tracker number (stage 4) (fix(spec): the protocol 16 → 17 conversion summaries and three descriptions state each decision in words instead of a tracker number (stage 4) #21555)2f837a5695fix(runtime)!: refuse the stored-metadata family evaluate shapes and serve write returns at the reader-context seams (fix(runtime)!: refuse the stored-metadata family evaluate shapes and serve write returns at the reader-context seams #21539)ce532184d1fix(metadata-protocol): refuse an org-scoped public form withdrawal a walled posture cannot honour (fix(metadata-protocol): refuse an org-scoped public form withdrawal a walled posture cannot honour #21473)10454b3afafix(core): os migrate resume completes a recorded-by run that committed a chunk or used a non-default --chunk-size ([finding] os migrate resume lists an interrupted recorded-by run as resumable: true, then refuses it PLAN_CHANGED when the run had committed a chunk or used a non-default --chunk-size #21528) (fix(core): os migrate resume completes a recorded-by run that committed a chunk or used a non-default --chunk-size (#21528) #21554)f83d0669d7docs(approvals): reassign TSDoc holds slot addresses; ADR-0042 §2 superseded in part by ADR-0118 D1; SLA checklist expects no actor (docs(approvals): reassign TSDoc holds slot addresses; ADR-0042 §2 superseded in part by ADR-0118 D1; SLA checklist expects no actor #21556)5dbcee8a6dfix(metadata-protocol): the object door never lets a container's expansion displace a stored row of the same name (finding(metadata-protocol): a stored view row named exactly like a container expansion is shadowed in the object door by the expansion, while the by-name read answers the stored row #21510) (fix(metadata-protocol): the object door never lets a container's expansion displace a stored row of the same name (#21510) #21557)f9f9f911f5fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 7) (fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 7) #21561)bf36edd0a1fix(cli): os init and os compile render each refusal once, not once on stdout and again as oclif's Error block ([finding] os init and os compile print a refusal twice across two streams: a printError line on stdout, then this.error re-renders the same sentence as oclif's Error block on stderr #21542) (fix(cli): os init and os compile render each refusal once, not once on stdout and again as oclif's Error block (#21542) #21560)1ca1eb0972fix(service-analytics)!: the read scope and the draft preview compare a temporal comparand in the column storage form (ADR-0053 D-A1 / D-A2) (fix(service-analytics)!: the read scope and the draft preview compare a temporal comparand in the column storage form (ADR-0053 D-A1 / D-A2) #21562)bd70706713fix(runtime)!: an app-authored body may not bind a hook to, or write, the stored-metadata tables ([Decision] security(runtime): may an app-authored body touch the stored-metadata family's tables at all — a hook bound to them, or an elevated body writing them directly (#21454 items 3 and 4) #21520) (fix(runtime)!: an app-authored body may not bind a hook to, or write, the stored-metadata tables (#21520) #21563)7d674dfc96feat(spec)!: eight list members of object-grid, object-kanban and object-calendar take the shape each block reads; object-grid columns held (spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, stage 2) (feat(spec)!: eight list members of object-grid, object-kanban and object-calendar take the shape each block reads; object-grid columns held (#21464, stage 2) #21559)e909aa0a23fix(cli): os dev -a and os start --artifact serve the named artifact beside a cwd objectstack.config.ts — one artifact precedence for start, dev and the serve child (fix(cli): os dev -a and os start --artifact serve the named artifact beside a cwd objectstack.config.ts — one artifact precedence for start, dev and the serve child #21549)a3873542cafix(spec): the protocol 17 → 18 conversion summaries state each decision in words instead of a tracker number (stage 5) (fix(spec): the protocol 17 → 18 conversion summaries state each decision in words instead of a tracker number (stage 5) #21568)6dd99b82c3fix(rest): one anonymous-intake rule honours every declared public-form withdrawal (fix(rest): one anonymous-intake rule honours every declared public-form withdrawal #21566)44072fc2b9fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 8) (fix(service-analytics): runtime strings state each decision in words instead of a tracker number (stage 8) #21569)74281a8e4afix(cloud-connection): an install-local uninstall runs the protocol's registered uninstall cleanups (fix(cloud-connection): an install-local uninstall runs the protocol's registered uninstall cleanups #21512)1777a9bd45fix(cli): the rest of the read-only data doors answer a project with no database yet with empty work ([finding] The rest of the read-only data-command family exits 1 on a project with no database yet: migrate account-issuer, audit-metadata-bodies, meta --stored, secret orphans and rewrap, storage orphans read tables their boot deferred #21552) (fix(cli): the rest of the read-only data doors answer a project with no database yet with empty work (#21552) #21570)0bddffd55bdocs(spec): nine migration-step rationale passages and two registry comments drop their deleted tracker numbers (stage 11) (docs(spec): nine migration-step rationale passages and two registry comments drop their deleted tracker numbers (stage 11) #21578)cc645f2385docs: adopt the 'ontology is the software' positioning (README, landing page, glossary, concepts) (docs: adopt the 'ontology is the software' positioning (README, landing page, glossary, concepts) #21579)a7ab047cf6fix(rest): a public form that cannot take intake on a walled posture is not offered; the admin read says why (fix(rest): a public form that cannot take intake on a walled posture is not offered; the admin read says why #21580)901e7cf13afix(cloud-connection): an install-local uninstall withdraws the package from the running kernel (fix(cloud-connection): an install-local uninstall withdraws the package from the running kernel #21581)958cfe29befeat(spec)!: four object-form members take the shape the form reads; fields, sections held (spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, stage 3) (feat(spec)!: four object-form members take the shape the form reads; fields, sections held (#21464, stage 3) #21590)d2e687fdffdocs: positioning follow-up: home title, cover re-render, README on the four promises, Business Ontology page (docs: positioning follow-up: home title, cover re-render, README on the four promises, Business Ontology page #21591)35dfb8142ffix(service-analytics): the ObjectQL face echoes a date bucket in the driver's own expression, so SQLite runs it (fix(service-analytics): the ObjectQL face echoes a date bucket in the driver's own expression, so SQLite runs it #21587)eb9ef791bdfix(objectql): an in-process engine verb refuses an object name the registry does not resolve ([finding] [security] An in-process engine verb passes an object name the registry does not resolve to the driver as a raw table name, so a sandboxed body reads a protected table by a name the data door refuses #21516) (fix(objectql): an in-process engine verb refuses an object name the registry does not resolve (#21516) #21545)6c5697dffbfix(runtime,cloud-connection)!: a job's sandboxed body is scheduled on every door, and install-local refuses an enabled job with no body ([Decision] install-local: a package's declared jobs are never scheduled — refuse the install, name them in the install answer, or make job handlers declarable bodies (the jobs half of #21322) #21489) (fix(runtime,cloud-connection)!: a job's sandboxed body is scheduled on every door, and install-local refuses an enabled job with no body (#21489) #21584)f6b7520839fix(spec): conformance-case notes and names state each decision in words instead of a tracker number (stage 6) (fix(spec): conformance-case notes and names state each decision in words instead of a tracker number (stage 6) #21593)9e9d693468feat(spec)!: HookSchema refuses a hook body that targets a stored-metadata table, with the runtime's prescription ([finding] The metadata save door accepts a hook whose sandboxed body targets a stored-metadata table, which the runtime then refuses at bind: authoring answers 200 for a hook that never runs #21565) (feat(spec)!: HookSchema refuses a hook body that targets a stored-metadata table, with the runtime's prescription (#21565) #21592)b610eabf72docs(design): predicate convergence — T2's measurement under B, and the S5 face table re-read (docs(design): predicate convergence — T2's measurement under B, and the S5 face table re-read #21600)9a4182a752fix(spec,runtime,cli)!: the in-memory engine is no longer a boot store — every boot door refuses it and names SQLite instead (fix(spec,runtime,cli)!: the in-memory engine is no longer a boot store — every boot door refuses it and names SQLite instead #21598)ec390ec00dfix(metadata-protocol): a hydrated view expansion carries its container's tenant marker, so an unscoped kernel answers an expanded view as env_local does (finding(metadata-protocol): on an unscoped kernel a stored container's hydrated expansions carry no tenant marker, so an expanded view readsresettable: trueand its layeredcodeis the hydrated expansion #21511) (fix(metadata-protocol): a hydrated view expansion carries its container's tenant marker, so an unscoped kernel answers an expanded view as env_local does (#21511) #21603)37442d4750fix(release): the Releases backfill skips a version whose publish is in flight in another run (fix(release): the Releases backfill skips a version whose publish is in flight in another run #21605)0721848b8cfix(spec): grade permission rowLevelSecurity label/description live — Studio's permission editor shows them (fix(spec): grade permission rowLevelSecurity label/description live — Studio's permission editor shows them #21607)54521f08caqa(checklist): a hook-refused script action shows exactly one error toast carrying its sentence — item, showcase fixture, and one run (qa(checklist): a hook-refused script action shows exactly one error toast carrying its sentence — item, showcase fixture, and one run #21609)83b3d32020fix(metadata-protocol,metadata-core,rest): saving or publishing a public form a walled posture cannot take intake for says why (fix(metadata-protocol,metadata-core,rest): saving or publishing a public form a walled posture cannot take intake for says why #21608)440cd329a9fix(driver-sql): bucket a Field.date as its calendar day on PostgreSQL and MySQL (fix(driver-sql): bucket a Field.date as its calendar day on PostgreSQL and MySQL #21611)5c9138b4b6fix(objectql)!: an unprojected read serves the declared fields, never an orphaned column (fix(objectql)!: an unprojected read serves the declared fields, never an orphaned column #21612)36ad3210d4feat(spec)!: element:text variant refuses heading / subheading by name, and os migrate meta rewrites them to h2 / h3 (spec(ui): release 2 of the objectui#7450 convergence —element:text.variant'sheading/subheadingbecome named refusals through the value-level retirement mechanism #21015) (feat(spec)!: element:text variant refuses heading / subheading by name, and os migrate meta rewrites them to h2 / h3 (#21015) #21614)5d0e4e2793fix(metadata-protocol)!: one stored-metadata filter collector and search narrowing, owned by the door and called by the reader seam; cross-field and deep family reads refused (fix(metadata-protocol)!: one stored-metadata filter collector and search narrowing, owned by the door and called by the reader seam; cross-field and deep family reads refused #21619)f97660cdd6docs(driver-mongodb): re-anchor the dead tracker citations to the commits that decided them (stage 11 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(driver-mongodb): re-anchor the dead tracker citations to the commits that decided them (stage 11 of #20595) #21617)e367002e11fix(metadata-protocol): the save door refuses a view container saved under a name its own expansion produces (finding(metadata-protocol): the runtime save door accepts a view container saved under one of its own expanded names, and after #21510's rule no door answers a view item for that name #21558) (fix(metadata-protocol): the save door refuses a view container saved under a name its own expansion produces (#21558) #21618)045b946256fix(runtime,cloud-connection)!: install-local refuses a hook with no body and a job body that does not bind, and withholds such a hook on rehydrate ([finding] os package install accepts a package whose hook uses only the deprecated function-name handler (no body), answers "installed", and the hook never fires: install-local drops it with a server-side warn only #21585) (fix(runtime,cloud-connection)!: install-local refuses a hook with no body and a job body that does not bind, and withholds such a hook on rehydrate (#21585) #21615)a4f0cb0a45fix(service-automation): a flow's get_record node serves the stored-metadata family the way the data door does (security(automation): the flow record-read node serves the stored-metadata family unprojected — consume PR #21513's door exports (#21454 item A4) #21519) (fix(service-automation): a flow's get_record node serves the stored-metadata family the way the data door does (#21519) #21621)0fc80878f8fix(lint)!: action-name-undefined resolves record:related_list action ids against the child object (fix(lint)!: action-name-undefined resolves record:related_list action ids against the child object #21626)a1ca156da5fix(objectql): lifecycle tenant scan asks the registry before reading sys_organization (fix(objectql): lifecycle tenant scan asks the registry before reading sys_organization #21628)3f1bc816a2feat(spec)!: object-metric aggregate and trend take the shape the tile reads; drillDown, compareTo held for a ruling (spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, stage 4) (feat(spec)!: object-metric aggregate and trend take the shape the tile reads; drillDown, compareTo held for a ruling (#21464, stage 4) #21622)5d095a00adfix(driver-sql,service-analytics): bucket the ISO week natively on SQLite, and the SQL echo refuses a bucket SQLite cannot run (fix(driver-sql,service-analytics): bucket the ISO week natively on SQLite, and the SQL echo refuses a bucket SQLite cannot run #21629)5b5e83f446fix(objectql)!: a write's returned row and its prior read serve the declared fields, never an orphaned column (fix(objectql)!: a write's returned row and its prior read serve the declared fields, never an orphaned column #21631)0a0debbe96docs(formula): re-anchor the dead tracker citations to the commit that decided them (stage 12 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(formula): re-anchor the dead tracker citations to the commit that decided them (stage 12 of #20595) #21635)6946f2f08efix(runtime): two packages declaring the same job name both run, and uninstalling one stops only its own job (fix(runtime): two packages declaring the same job name both run, and uninstalling one stops only its own job #21633)3222c57404fix(release): the image backfill skips a version whose publishing run has not finished building its image (fix(release): the image backfill skips a version whose publishing run has not finished building its image #21634)36e4647520fix(spec): the error-code waiver reasons and the auth-feature registry notes state each decision in words instead of a tracker number (stage 7) (fix(spec): the error-code waiver reasons and the auth-feature registry notes state each decision in words instead of a tracker number (stage 7) #21636)7b07749f05fix(metadata-protocol): the save door refuses a view container saved under a name another stored container of the same object expands to (The runtime save door accepts a view container saved under a name ANOTHER container expands to; the object door then lists the second container's list in place of the first's default, and no door answers a view item under the saved name #21620) (fix(metadata-protocol): the save door refuses a view container saved under a name another stored container of the same object expands to (#21620) #21637)1e4ae087a2docs(metadata-fs): re-anchor the dead tracker citations to the commit that decided them (stage 13 of dead tracker citations in thedomain:enginepackages (645 sites, 160 numbers, 104 files): the ruling C+D stage for this lane (from #20556) #20595) (docs(metadata-fs): re-anchor the dead tracker citations to the commit that decided them (stage 13 of #20595) #21640)96b0e3108afix(service-automation): the flow get_record node refuses a filter that evaluates the stored-metadata family, with the data door's refusal (security(automation): the flow record-read node evaluates its filter over the stored-metadata family without the door's evaluate refusals (the family's evaluate exit, #21519 residue) #21623) (fix(service-automation): the flow get_record node refuses a filter that evaluates the stored-metadata family, with the data door's refusal (#21623) #21641)1cbe165bfcchore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) (chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) #21625)0c50b5dfe7ci(temporal-conformance): give the non-SQL step the job's live PostgreSQL URL (ci(temporal-conformance): give the non-SQL step the job's live PostgreSQL URL #21577)15fe567c9cdocs(spec): re-anchor the last six dead tracker citations in packages/spec/src to the commits that decided them (docs(spec): re-anchor the last six dead tracker citations in packages/spec/src to the commits that decided them #21642)1968d5e812fix(service-analytics): the SQL echo refuses a date bucket the engine buckets in memory, on every dialect (analytics on PostgreSQL: a non-UTCtimezonestill echoesdate_trunc(GRANULARITY, col), whose keys fall on the session zone's calendar and group rows differently from the face #21630) (fix(service-analytics): the SQL echo refuses a date bucket the engine buckets in memory, on every dialect (#21630) #21645)759dbe9ed3feat(cli): os migrate unmapped-columns reads a retired field's columns, keyed by record id, for conversion before the destructive drop (feat(cli): os migrate unmapped-columns reads a retired field's columns, keyed by record id, for conversion before the destructive drop #21643)f40bb3217ffix(service-automation): flow write nodes refuse a stored-metadata family target (security(automation): flow create_record and update_record nodes write the stored-metadata family tables directly, outside the metadata protocol (measured; the unruled neighbour of #21519) #21624) (fix(service-automation): flow write nodes refuse a stored-metadata family target (#21624) #21649)6ec54f00bafeat(spec)!: retire the object-master-detail-form detail entry sortField — the console derives the line-position field from the child object (spec(ui): retiresortFieldfrom theobject-master-detail-formdetail entry; the pinned console stopped reading it at objectui0a3e5409f, and the bump that crossed it did not carry the spec half #21589) (feat(spec)!: retire the object-master-detail-form detail entry sortField — the console derives the line-position field from the child object (#21589) #21632)eea82af677fix(metadata-protocol): one collision predicate at the save door — a stored view container never takes a name already served from elsewhere (Two stored view containers of one object still displace each other's views: a container bound elsewhere or unbound under a sibling's expanded name, and a second container's bare list taking the first's<object>.default, are accepted with no diagnostic #21639, The runtime save door accepts a view container saved under the name of a view item a package ships; package-less, the row is attributed to the shipping package and its bare list replaces that package's default view on both doors #21638) (fix(metadata-protocol): one collision predicate at the save door — a stored view container never takes a name already served from elsewhere (#21639, #21638) #21648)1a230548cfdocs(skills): name the complete public-form opt-in the anonymous form endpoints read (docs(skills): name the complete public-form opt-in the anonymous form endpoints read #21650)bff5aa2d98docs(skills): objectstack-ai says agent memory is enforced by the AI runtime, not declared only (docs(skills): objectstack-ai says agent memory is enforced by the AI runtime, not declared only #21652)fea67065a3docs(skills): objectstack-ui puts the create/edit form underform, not a namedformViewsentry (docs(skills): objectstack-ui puts the create/edit form underform, not a namedformViewsentry #21651)506fb6dac3docs(skills): objectstack-i18n names the action-entry keys os validate judges (docs(skills): objectstack-i18n names the action-entry keys os validate judges #21656)55e6f14f8dfix(pm): git-history hands git the instant its coverage proof reads, so a bare date no longer shrinks the window with the hour (fix(pm): git-history hands git the instant its coverage proof reads, so a bare date no longer shrinks the window with the hour #21657)be55fd2934fix(objectql): a seed row keeps its authored created_at on insert, as the replay already does (fix(objectql): a seed row keeps its authored created_at on insert, as the replay already does #21661)98eb3b9b89fix(objectql,spec)!: a hook's handler name resolves inside the hook's own package only ([Decision] security(objectql): may a hook'shandlername bind to a function another package registered (the engine-wide fallback HookSchema.handler declares), or does name resolution stay inside the hook's own package (#21585 option B) #21604) (fix(objectql,spec)!: a hook's handler name resolves inside the hook's own package only (#21604) #21653)417443eb27fix(cli): a narrowed os migrate --apply records no deployment flag, and an unknown --object is refused (fix(cli): a narrowed os migrate --apply records no deployment flag, and an unknown --object is refused #21662)909229e976feat(spec,runtime,service-automation): a job pulls a mapping by declaration (pull: { mapping }) and runs as its declared organization (spec(integration): build the connector sync executor thatsyncConfigandfieldMappingsdeclare (14 keys), once and on the mainstream shape #20281 stage 3) (feat(spec,runtime,service-automation): a job pulls a mapping by declaration (pull: { mapping }) and runs as its declared organization (#20281 stage 3) #21668)8ad9694fb7docs(skills): the html-tier page example spells object-metric's aggregate in the object form (docs(skills): the html-tier page example spells object-metric's aggregate in the object form #21667)72f3c74d60feat(spec)!: object-metric drillDown and compareTo take the shape the tile reads; object-grid columns exits its hold (spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, stage 5) (feat(spec)!: object-metric drillDown and compareTo take the shape the tile reads; object-grid columns exits its hold (#21464, stage 5) #21673)31e3e00939fix(service-analytics): the SQL echo prints a date bucket only in the driver's own expression, on every driver (analytics: on a non-SQL driver (driver-memory, and by code path MongoDB) a UTC or unset timezone still echoes date_trunc for a date bucket the engine groups in memory #21647) (fix(service-analytics): the SQL echo prints a date bucket only in the driver's own expression, on every driver (#21647) #21664)93a54b87e7fix(spec): the protocol 16 → 17 upgrade rationale states each cited decision in words instead of a tracker number (stage 8) (fix(spec): the protocol 16 → 17 upgrade rationale states each cited decision in words instead of a tracker number (stage 8) #21674)eed2dee481docs(skills): date-bucket engine sentences name what each arm emits (docs(skills): date-bucket engine sentences name what each arm emits #21677)7d0781482dpm-dispatch: a triage fold proposal binds only before any named card has an open PR; a foreseen follow-up is a card (pm-dispatch: a triage fold proposal binds only before any named card has an open PR; a foreseen follow-up is a card #21676)a4fd82a8e6fix(sdui-parser): an html page literal of the wrong type is a compile error, not a warning (fix(sdui-parser): an html page literal of the wrong type is a compile error, not a warning #21678)251a7dd4b4fix(organizations)!: a create naming an organization_id meets the Layer 0 write wall, as the update does ([finding] POST /data on a walled posture silently replaces a platform admin's explicit organization_id with the admin's active organization (201), while the equivalent PATCH refuses loudly #21666) (fix(organizations)!: a create naming an organization_id meets the Layer 0 write wall, as the update does (#21666) #21680)cef2bd7a90test(service-analytics): the Turso remote-face echo exception asserts its equivalence (analytics: on a non-SQL driver (driver-memory, and by code path MongoDB) a UTC or unset timezone still echoes date_trunc for a date bucket the engine groups in memory #21647) (test(service-analytics): the Turso remote-face echo exception asserts its equivalence (#21647) #21684)38bef8cf95fix(pm): git-history lets a piped answer drain before it exits, and a no-remote refusal names its floor (fix(pm): git-history lets a piped answer drain before it exits, and a no-remote refusal names its floor #21685)83e2feeb46fix(runtime,cloud-connection)!: install-local refuses an enabled job whose pull does not bind (install-local accepts a package whose jobpullcannot bind: it answers 200 and the job is never scheduled. Refuse it at the door, as a body job that does not bind is refused #21672) (fix(runtime,cloud-connection)!: install-local refuses an enabled job whose pull does not bind (#21672) #21683)ced217ca30fix(metadata-protocol)!: the save door refuses a hook that names a function inhandlerand carries nobody(The metadata save door answers 200 to a hook with ahandlername and nobody, which the runtime then refuses at bind: a runtime-authored hook holds no functions, so that form can never run #21658) (fix(metadata-protocol)!: the save door refuses a hook that names a function inhandlerand carries nobody(#21658) #21686)1db5322ba2fix(pm): check-governed-merges refuses a flag its mode does not read, and a bare --pr beside a PM_SWEEP_REPO naming another repository (fix(pm): check-governed-merges refuses a flag its mode does not read, and a bare --pr beside a PM_SWEEP_REPO naming another repository #21690)ff167402cffix(metadata-protocol): give each organization its own row identity on a per-organization seed replay (fix(metadata-protocol): give each organization its own row identity on a per-organization seed replay #21688)8d4fc6356cdocs(pm-dispatch): triage closes a report-only instrument fix card not_planned at first grade, citing ruling 208 (docs(pm-dispatch): triage closes a report-only instrument fix card not_planned at first grade, citing ruling 208 #21691)234d1d8b7cfix(plugin-security): a cloned permission set is not reported as an unowned declaration on boot ([finding] Every boot warns permission_set_declaration_unowned for each cloned (org-owned) permission set, saying Setup cannot see it, while the row exists and Setup lists and edits it #21669) (fix(plugin-security): a cloned permission set is not reported as an unowned declaration on boot (#21669) #21692)fe1017287ffix(metadata-protocol): the read envelope's lock / editable / deletable report the write doors' locked-base verdict (fix(metadata-protocol): the read envelope's lock / editable / deletable report the write doors' locked-base verdict #21693)a2aadab1c6feat(spec)!: FlowSchema refuses a create_record, update_record or delete_record node whose static objectName is a stored-metadata table, with the runtime's prescription (spec(automation): FlowSchema refuses a create_record, update_record or delete_record node whose static objectName is a stored-metadata family table (the save-time half of #21624) #21654) (feat(spec)!: FlowSchema refuses a create_record, update_record or delete_record node whose static objectName is a stored-metadata table, with the runtime's prescription (#21654) #21687)8843505d91fix(objectql)!: a system write's readonly value is judged for its shape — a seed's malformed readonly datetime is refused, never stored (A system-context write skips value-shape validation for readonly fields: a seed's malformed readonly datetime ('yesterday', an unresolvedcelenvelope) is stored verbatim, while the same value on a non-readonly field is refused #21663) (fix(objectql)!: a system write's readonly value is judged for its shape — a seed's malformed readonly datetime is refused, never stored (#21663) #21695)f623e2f712fix(spec): the protocol 17 → 18 upgrade rationale states each cited decision in words instead of a tracker number (stage 9) (fix(spec): the protocol 17 → 18 upgrade rationale states each cited decision in words instead of a tracker number (stage 9) #21698)16d241a6affeat(spec)!: object-gantt markers, object-timeline mapping and both forms' fields take the shape each block reads; five objectui-held contracts reported as forks (spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, S-objectui-held) (feat(spec)!: object-gantt markers, object-timeline mapping and both forms' fields take the shape each block reads; five objectui-held contracts reported as forks (#21464, S-objectui-held) #21699)7e0066af7adocs(spec): re-anchor the dead tracker citations in packages/spec/src's test surface to the commits that decided them (docs(spec): re-anchor the dead tracker citations in packages/spec/src's test surface to the commits that decided them #21700)7fd2c34de8fix(metadata-protocol)!: the save door refuses every hook with nobody, including one with neither abodynor ahandler(The metadata save door answers 200 to a hook with neitherbodynorhandler, which the runtime skips at every re-sync ("unresolved handler"): the bare hook is stored, served by name, and never runs #21689) (fix(metadata-protocol)!: the save door refuses every hook with nobody, including one with neither abodynor ahandler(#21689) #21706)5ac2ba17e5fix(service-automation): flow write-node family refusal ends on the shared prescription sentence (security(automation): flow create_record and update_record nodes write the stored-metadata family tables directly, outside the metadata protocol (measured; the unruled neighbour of #21519) #21624) (fix(service-automation): flow write-node family refusal ends on the shared prescription sentence (#21624) #21707)5259a35e69fix(objectql): droppedFields on a create names only keys the caller sent, never a middleware fill ([finding] On a walled posture a create that names no organization_id answers droppedFields [organization_id: readonly], a field the caller never sent (the insert analogue of #8093) #21682) (fix(objectql): droppedFields on a create names only keys the caller sent, never a middleware fill (#21682) #21701)9d91f583dfdocs(spec): JobSchema.body's describe says an enabled pull job installs when its pull binds and is refused when it does not (docs(spec): JobSchema.body's describe says an enabled pull job installs when its pull binds and is refused when it does not #21708)100f68b77fchore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, feat(lint): canonical-envelope page audit gets a shared home; cloud-connection joins the gated population #11574, [finding] the dispatch protocol has a zero-hit rule but no hazard-claim rule — an unmeasured "this would destroy data" fence in a dispatch order costs more than a false zero #11578, feat(devx): gate the settings bind window on start()-registered kernel:ready hooks #11581 and fix(tooling): re-tally @objectstack/plugin-auth's TEST_DEBT from tsc #11583) (chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, #11574, #11578, #11581 and #11583) #21710)ced3e1ae47feat(spec)!: object-kanban conditionalFormatting takes the list view's own rules, and its hold exits (spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, S-kanban-cf) (feat(spec)!: object-kanban conditionalFormatting takes the list view's own rules, and its hold exits (#21464, S-kanban-cf) #21711)ed15448217feat(spec)!: a joined report refuses a block that binds no dataset, at blocks[i].dataset, naming the block ([finding] spec(report): atype: 'joined'report whose blocks bind nodatasetparses and passesobjectstack validate, while ReportSchema's own refinement comment and reports.mdx say "each block dataset-bound" #21702) (feat(spec)!: a joined report refuses a block that binds no dataset, at blocks[i].dataset, naming the block (#21702) #21712)3fa850cf00test(spec): automation test titles state each cited decision in words instead of a tracker number (stage 10) (test(spec): automation test titles state each cited decision in words instead of a tracker number (stage 10) #21713)c43a8ae612fix(metadata-protocol)!: the ADR-0010 _lock gate refuses on a host-config kernel too, and the diagnostics locked count reads the item envelope derivation (finding(metadata-protocol): two lock reports the #21670 read fix left unaligned — a host-config kernel's_lockgate admits a save the read now calls non-editable, andgetMetaDiagnostics().stats[type].lockedcounts declared_lockonly #21694) (fix(metadata-protocol)!: the ADR-0010 _lock gate refuses on a host-config kernel too, and the diagnostics locked count reads the item envelope derivation (#21694) #21715)a2b7328d57fix(ci): the Console Pin Gate never counts text objectui's own source carries as the published spec (ci(console): the Console Pin Gate's staleness leg matches objectui's own ganttmarkersdescription as "the published spec", so every merge-queue build since #21699 is red #21709) (fix(ci): the Console Pin Gate never counts text objectui's own source carries as the published spec (#21709) #21717)316be321effix(runtime)!: an app-authored body may not read the stored-metadata tables; it reaches them through the metadata API only ([Decision] security(runtime): may an app-authored body still READ the stored-metadata family's tables, served projected, or is that refused too (#21454 option C) #21594) (fix(runtime)!: an app-authored body may not read the stored-metadata tables; it reaches them through the metadata API only (#21594) #21660)72b6333cd8test(spec): kernel test titles state each cited decision in words instead of a tracker number (stage 11) (test(spec): kernel test titles state each cited decision in words instead of a tracker number (stage 11) #21736)cf60dbc8b3fix(metadata-protocol)!: the ADR-0010 _lock gate reads the row the read serves for the request's organization ([finding] an env-wide metadata row declaring_lock: fullreads locked in an org-scoped read, but an org-scoped save of it is admitted —getEffectiveLock's overlay limb matchesorganization_idexactly #21716) (fix(metadata-protocol)!: the ADR-0010 _lock gate reads the row the read serves for the request's organization (#21716) #21737)ff29410ed2docs(qa): re-point 17 platform-checklist clauses the 17.7 pre-release runs proved stale or mis-asserted (docs(qa): re-point 17 platform-checklist clauses the 17.7 pre-release runs proved stale or mis-asserted #21741)6afb1b55a9fix(cli): os migrate plan/apply compose the requires-supplied provider a connector hard-depends on (fix(cli): os migrate plan/apply compose the requires-supplied provider a connector hard-depends on #21739)da40a5f649fix(driver-sql): connect reads PRAGMA auto_vacuum first and sets it only when the file is not already INCREMENTAL (fix(driver-sql): connect reads PRAGMA auto_vacuum first and sets it only when the file is not already INCREMENTAL #21744)309224d34dfix(runtime): a refused flow resume answers its engine's code — INVALID_SCREEN_INPUT, INVALID_SIGNAL, RUN_NOT_FOUND (fix(runtime): a refused flow resume answers its engine's code — INVALID_SCREEN_INPUT, INVALID_SIGNAL, RUN_NOT_FOUND #21740)73b224668efix(service-automation): a flow saved through the metadata API is armed on the running engine at once (fix(service-automation): a flow saved through the metadata API is armed on the running engine at once #21746)8cbba54491docs(qa): record A1 of crud-permission-matrix as a known v18 gap (docs(qa): record A1 of crud-permission-matrix as a known v18 gap #21749)ea7ff394b6chore(ci): refresh the Test Core shard-timings dataset (chore(ci): refresh the Test Core shard-timings dataset #20388)Filed by
.github/workflows/scheduled-full-run-card.yml. Generated by Claude Code