Repository navigation
liveness ledger: action.onSuccess.navigate / openIn and translation.flows.screens are graded planned, but objectui already reads all three at the pinned sha #20296
Description
Activity
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsPath: fleet decision — the liveness ledger tells authors the truth | 缺项 (three rows graded
plannedwith shipped readers) | noneTriage: first grade —
bug·priority:p3·domain:spec·area:devpath·pm:queueTriage: lands in
packages/spec/liveness/action.json(:201,:207) andtranslation.json(:106), plus the regeneratedstate-counts.md⇒domain:spec. Rationale: three rows sayplanned, but objectui reads all three at the pinf8a9d0fb0596(ActionRunner.tsnavigateOnSuccess;FlowRunner.tsx:227). Soos lintwarns authors about keys that work. That is a false alarm with no runtime effect ⇒ p3.Triage seat (objectstack-wide, seat post #6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T20:25Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments), and the #4848 flip note inapp.jsonit names as the precedent shape.Execution notes.
- Re-verify each row to
live, citingobjectui @f8a9d0fb0596with file and symbol, plus the producer leg the ledger's rules require. TheopenInrow's materialized.default('self')is discussed in its note. - Drop the
authorWarnthatplannedcarried. Each note records why it wasplanned(the spec: ListViewSchema(strictObject)没有 map 可视化配置块 —— map 列表视图的 titleField/locationField/相机整体不可声明,showcase 全部 marker 标题为 undefined #9340 / spec: declareviewModeonGanttConfigSchema— the contract half of objectui#5074's ruled both-branches wiring #9463 spec-first convention) and what flipped it. translation.flows.labelstaysplanned; it is family card rank 15, not this card.pnpm check:livenessstays green.
- Re-verify each row to
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingand removed
on Sep 27, 2026 objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 · 2026-09-27T21:15Z
Session:session_01Rjy9MeetSfq34PKn81CRiN
Account:os-zhuang
Branch:claude/issue-20296-understated-planned-rows
Worktree:objectstack-issue-20296
Domain:domain:spec
Seat:domain:spec#1
File surface:packages/spec/liveness/action.json(theonSuccess.navigate/onSuccess.openInrows);packages/spec/liveness/translation.json(theflows.screensrow); the regeneratedstate-counts.md;undrilled-containers.baseline.jsononly if the gate names it;.changeset/. ⛔ Nopackages/spec/src/**edit. ⛔ Nottranslation.flows.label(#20318). (stop on breach; explain in the report)
Container & model:S,mode:subagent,model: default judgment tier(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable).
Clause-②: no
Thread-read: 5859535946
Serial constraints cleared:Read at {{NOW}} on origin/main 4e0f72e8. No pm:dispatched claim names liveness/action.json or liveness/translation.json. No open PR touches them (17 read). #20146 (app.json) has landed as 6ac33a57, and its reviewed citation shape is the precedent.objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20296,
"status": "done",
"branch": "claude/issue-20296-understated-planned-rows",
"pr": "#20328",
"session": "session_01Rjy9MeetSfq34PKn81CRiN",
"premise_still_valid": true,
"summary": "The three rows are graded live: action.onSuccess.navigate, action.onSuccess.openIn and translation.flows.screens. Each cites its reader at the .objectui-sha pin f8a9d0fb by file#symbol, with no line numbers. The onSuccess pair cites ActionRunner handlePostExecution -> readOnSuccessNavigation -> navigateOnSuccess, plus the console navigateHandler. flows.screens cites FlowRunner localizeScreen / activeFlowsBundle, plus the local spec resolver resolveFlowScreenTitle. Each row also cites its producer leg: the renderer forwards of onSuccess for the pair, and the server bundle route -> loadLanguage -> transformSpecTranslations -> I18nProvider for flows.screens. Each row note records why it was planned, what flipped it, and the mount chain, closed by hand from apps/console App.tsx and main.tsx at the pin. All 15 cited reads have the same count at objectui main 256b4c9e. state-counts.md is regenerated: action 44/2 -> 46/0 live/planned, translation 22/2 -> 23/1. Two measured departures from the card text. (1) None of the three rows carries an authorWarn. The only authorWarn involved is on the flows container, which also covers flows.label (stays planned, #20318). Dropping it breaches the claim surface and switches on the CLI i18n demand for the unread flows.FLOW.label, so it is left as is and routed in open_questions. (2) The gate-lead file header says it was derived at 4d7e740 from a STALE seat-ro tree, not at 4e0f72e as the order line says. Re-derived at ba50580: 59 commands, +7 changeset families, 0 dropped.",
"tests": "All readings at HEAD ba50580, with the spec dist rebuilt first (os-verify-lock VERDICT command-exit 0). check:liveness before: exit 0, action 49 (live 44, dead 3, planned 2), translation 24 (live 22, planned 2). After: exit 0, action 49 (live 46, dead 3), translation 24 (live 23, planned 1), ✓ state-counts.md is current. Evidence local 616->617, all resolved; foreign 218->223. Symbol anchors 760->764, all resolving. Key-mention 616->617 asked, 615->616 anchored. Producer-citing live 93->96. Container coverage 109/564 unchanged. Spec local project: pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2, exit 0, Test Files 552 passed (552), Tests 16312 passed | 1 todo. Spec repo-project liveness tests (evidence.test.ts, proof-registry.test.ts): exit 0, 81 passed. Spec typecheck: exit 0. Consumer suites that read the shipped ledger: @objectstack/lint src/lint-liveness-properties.test.ts + src/component-field-specs-liveness.test.ts, exit 0, Tests 91 passed (91). @objectstack/cli --project unit test/i18n-flow-liveness-gate.test.ts + test/i18n-flow-screen-coverage.test.ts: exit 0, Tests 29 passed (29), after building formula, sdui-parser, metadata-core, lint and platform-objects. The first lint attempt got os-verify-lock queue-timeout 99 (never acquired); it was rerun on the same slot and acquired. dispatch-gates --ran: ✓ 59 derived families accounted for, 58 run, 1 NOT-MEASURED (check:dual-build-cjs-loads exit 3, PREREQUISITE NOT MET: 70 packages unbuilt; declared narrowing, and this diff changes no emitted code). ESLint: 0 of the 4 changed paths are in its population (files ts/tsx/mts/cts/js/jsx/mjs/cjs). eslint --no-inline-config --format json gives exit 0, 4 files, 0 errors, 4 File-ignored warnings. There is no parserOptions.project, so the verdict on untouched files cannot move. Reverse verification and ablation: not applicable (no type or code change). The 760->764 anchor delta shows the gate reads the new local anchors.",
"mcp_calls": "0",
"api_writes": "3 — each a relay stroke (POST /repos/objectstack-ai/objectstack/dispatches, event fleet-write) executed as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft, #20328, run 36354639640); (2) label-write assign -> POST /repos//issues/20328/assignees [os-zhuang] (run 36354689152, readback matches); (3) this os-dev-report -> POST /repos//issues/20296/comments via post-stamped. Plus 2 plain git push (the empty-branch write probe, then commit ba50580), which are not REST writes.",
"files_changed": [
{
"path": ".changeset/20296-understated-planned-rows.md",
"added": 12,
"removed": 0
},
{
"path": "packages/spec/liveness/action.json",
"added": 10,
"removed": 6
},
{
"path": "packages/spec/liveness/state-counts.md",
"added": 3,
"removed": 3
},
{
"path": "packages/spec/liveness/translation.json",
"added": 6,
"removed": 3
}
],
"line_budget": {
"changed_lines": 43,
"additions": 31,
"deletions": 12,
"human_merge_threshold": 5000,
"verdict": "under",
"governed_surface_paths": 0
},
"gates": {
"head": "ba505803",
"derived": [
{
"cmd": "node scripts/check-adr-0087-registration.mjs --base origin/main",
"exit": 0
},
{
"cmd": "node scripts/check-adr-0087-registration.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --base origin/main",
"exit": 0
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-ci-filter-parity.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-comment-mask-corpus.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-dev-prereqs.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-empty-changeset.mjs --base origin/main",
"exit": 0
},
{
"cmd": "node scripts/check-empty-changeset.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-registry-log-declared.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-registry-log-declared.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-system-context-census.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-system-context-census.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/docs-audit/check-affected-docs.mjs",
"exit": 0
},
{
"cmd": "node scripts/docs-audit/check-drift-comment.mjs",
"exit": 0
},
{
"cmd": "node scripts/pm/release-rehearsal-clone.mjs --self-test",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:empty-state",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:generated",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:liveness",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:strictness-ledger",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:variant-docs",
"exit": 0
},
{
"cmd": "pnpm check:changeset-gate-self-tests",
"exit": 0
},
{
"cmd": "pnpm check:cross-package-test-inputs",
"exit": 0
},
{
"cmd": "pnpm check:doc-authoring",
"exit": 0
},
{
"cmd": "pnpm check:driver-memory-census",
"exit": 0
},
{
"cmd": "pnpm check:dts-closure",
"exit": 0
},
{
"cmd": "pnpm check:dual-build-cjs-loads",
"exit": 3
},
{
"cmd": "pnpm check:gitlink-declared",
"exit": 0
},
{
"cmd": "pnpm check:issue-citations",
"exit": 0
},
{
"cmd": "pnpm check:lean-entry-closure",
"exit": 0
},
{
"cmd": "pnpm check:merge-driver",
"exit": 0
},
{
"cmd": "pnpm check:nul-bytes",
"exit": 0
},
{
"cmd": "pnpm check:objectui-changeset",
"exit": 0
},
{
"cmd": "pnpm check:org-identifier",
"exit": 0
},
{
"cmd": "pnpm check:page-declaration-shape",
"exit": 0
},
{
"cmd": "pnpm check:platform-checklist",
"exit": 0
},
{
"cmd": "pnpm check:pm-changeset-deadline-census",
"exit": 0
},
{
"cmd": "pnpm check:pm-widening-tells",
"exit": 0
},
{
"cmd": "pnpm check:published-files",
"exit": 0
},
{
"cmd": "pnpm check:refd-timer-probe",
"exit": 0
},
{
"cmd": "pnpm check:slot-lookup",
"exit": 0
},
{
"cmd": "pnpm check:sourcemap-no-sources-content",
"exit": 0
},
{
"cmd": "pnpm check:test-source-alias",
"exit": 0
},
{
"cmd": "pnpm check:tier-file-adoption",
"exit": 0
},
{
"cmd": "pnpm check:watch-hint-literal",
"exit": 0
}
],
"extra": [
{
"cmd": "pnpm --filter @objectstack/spec run check:spec-changes",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm check:authz-resolver",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm check:error-code-casing",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm check:filter-alias-parity",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm --filter @objectstack/spec check:objectui-pin-citations",
"exit": 0,
"note": "before (base 4e0f72e) and after (ba50580): 47 asserting citations match f8a9d0fb0, 50 historical"
},
{
"cmd": "pnpm check:lean-entry-closure (first run, before the objectql build)",
"exit": 3,
"note": "PREREQUISITE NOT MET; the rerun after the build exits 0, which is the value recorded in the derived list"
}
],
"ran_verdict": "✓ dispatch-gates --ran: 59 derived famil(ies) accounted for — 58 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)",
"not_measured": [
"pnpm check:dual-build-cjs-loads — exit 3 PREREQUISITE NOT MET (needs a whole-workspace build); CI builds the workspace and runs it"
],
"ci": "in_progress at report time (32 check runs on ba50580: 10 success, 3 skipped, 19 in_progress, 0 failing)"
},
"deviations": [
"The card text asked to drop any authorWarn the planned status carried. Measured: none of the three rows carries one. The flows container authorWarn was NOT dropped: it is outside the claimed row, dropping it flips the cli and lint pins, and it turns on the CLI demand for the unread flows.FLOW.label. Stopped at the claim surface and routed to open_questions.",
"The gate-lead file header reads "derived from the tree ... at commit 4d7e740 (/home/user/objectstack-seat-ro) ... STALE TREE". That conflicts with the order line "derived at 4e0f72e". Re-derived on the actual paths at ba50580.",
"The objectui main control was read at the local ref 256b4c9e. The checkout is read-only and was not re-fetched; it is shallow, so pin -> main ancestry is not asserted.",
"git push was used twice as plain git push (the rule-1 empty-branch probe and the commit push). There is no with-fleet wrapper, because --via auto resolves to dispatch here and refuses commands."
],
"open_questions": [
{
"question": "The flows translation container still carries status planned + authorWarn + authorHint "No shipped screen-flow runner reads this group yet". That is now false for flows.screens, which the console FlowRunner reads, and still true for flows.label (#20318). The bit has two readers: @objectstack/lint (warns whenever a bundle authors flows) and the CLI i18n coverage gate authorWarnedTranslationGroups (holds back all flows.* demand while it is set). What should happen to it before #20318 lands?",
"options": [
"A. Leave it until #20318 lands the label reader. Then the whole group is live, the bit drops, and the CLI demand turns itself back on as designed. Cost: until then, an author who translates screens gets a false "planned / not read" warning.",
"B. Now, in a one-row follow-up (or by widening this claim to the container row): keep authorWarn but rewrite authorHint to say FlowRunner reads flows.FLOW.screens and only flows.FLOW.label is unread (#20318). No pin flips, no CLI change. Cost: the headline still says "planned" for the group.",
"C. Drop the container authorWarn now. Lint goes quiet, and the CLI demand switches on for all flows.* keys, including the unread label, which is the #11624 premature demand. This flips pins in packages/cli/test/i18n-flow-liveness-gate.test.ts and packages/lint/src/lint-liveness-properties.test.ts. check:i18n-coverage would gain flows.* demands on app-crm, app-showcase and app-todo, which have screen flows and non-en locales (size NOT MEASURED).",
"D. Drop authorWarn and teach the CLI demand side per-child status, so flows.FLOW.label stays held back while its row is planned. The most exact end state, but a packages/cli mechanism change for a state that #20318’s ENFORCE verdict makes transient."
],
"recommendation": "B now, then the flip in A when #20318 lands. Real need: no example or app authors flows translations today (0 hits under examples/), so the false warning has low reach now, but the text should not lie. Long-term: #20318 (ENFORCE) makes the group wholly live, and the CLI was built to follow that flip with no edit, so D buys machinery for a transient state. Anti-AI-error: an honest hint stops an AI from deleting working screen translations, while C would demand an unread key. Startup focus: B is one string in the same ledger file, with no new mechanism and no pin change."
}
],
"out_of_scope_findings": [
"carrier: #20318 (translation.flows.label family card) · noted, not filed. Stale prose that still says the flows group has no runner: packages/spec/src/system/translation.zod.ts flows JSDoc ("no shipped runner reads it yet — see the flows row ... planned"); packages/spec/src/system/i18n-resolver.ts translateFlow docblock ("while its liveness rows are planned"); packages/spec/liveness/README.md translation Notes cell ("flows is the one that is not, and is planned"). All three ship. Dedupe words: flows planned prose, translateFlow docblock, flows authorHint.",
"carrier: 承接者:无 · noted, not filed. The onSuccess JSDoc in packages/spec/src/ui/action.zod.ts still says "The console consumer is not wired yet ... tracked in the liveness ledger at planned strength". It is stale comment prose and ships in src/**/*.zod.ts. Recorded in the PR Acceptance notes only. Dedupe words: onSuccess consumer not wired, action.zod onSuccess JSDoc."
]
}objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsSeat answer to the
flowscontainer question: B, folded into PR #20328, plus every sentence this PR's flip makes false · 2026-09-27T22:20Zdomain:specseat 1 (session_01Rjy9MeetSfq34PKn81CRiN), answering report5860359728on claim5859892326.Why this is the seat's call. It is text correction with no contract or behaviour change, a no-escalation class. The one-word ENFORCE / RETIRE question for
flows.labelstays on #20318.B, now. Keep the
flowscontainer'sauthorWarn, becauseflows.labelis still unread (#20318). Rewrite itsauthorHintso it is true:FlowRunnerreadsflows.FLOW.screens, and onlyflows.FLOW.labelis unread (#20318). There is no CLI demand change and no pin flip. When #20318 lands the label reader, the group becomes wholly live, the bit drops, and the CLI demand returns by design (A, later).Also in this PR: every sentence this PR's own flips make false. The rule is bounded to what the flips contradict, and each item is a text change only:
packages/spec/liveness/README.md, the translation Notes cell (「flows is the one that is not, and is planned」);packages/spec/src/ui/action.zod.ts, theonSuccessJSDoc (「The console consumer is not wired yet … planned strength」);packages/spec/src/system/translation.zod.ts, theflowsJSDoc (「no shipped runner reads it yet」). Restate it: screens are read, the label is not;packages/spec/src/system/i18n-resolver.ts, thetranslateFlowdocblock (「while its liveness rows are planned」).
⛔ No schema, describe or accept-set change. Because the diff now touches
packages/spec/src/**(comments only), it is reviewed atCONTRACT_REVIEW_TIERbefore enqueue, the #20302 precedent.Claim surface, amended here (the claim comment is not edited): the
flowscontainer row'sauthorHintintranslation.json,liveness/README.md, and the three comment sites above.Verification owed:
check:liveness;check:objectui-pin-citations;- the lint and CLI flow-liveness pins, which must NOT move;
- a comment-stripped transpile diff of the three
srcfiles, which must be identical; - the spec typecheck.
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20296,
"status": "done",
"branch": "claude/issue-20296-understated-planned-rows",
"pr": "#20328",
"session": "session_01Rjy9MeetSfq34PKn81CRiN",
"premise_still_valid": true,
"summary": "Round 2, on seat ruling 5860372033 (answer B). Resumed in a fresh worktree from ba50580 and merged origin/main 10ea9eb via os-regen-merge.sh (merge commit 4e8d48d). The flows container keeps planned + authorWarn. Its authorHint now says the console screen-flow runner readsscreens(each screen title, each field label / placeholder) and only the flowlabelis unread, with no tracker number in author-facing text. The container note gains a dated sentence citing #20318. Restated with text only: the liveness README translation cell, the onSuccess JSDoc in ui/action.zod.ts (names ActionRunner handlePostExecution -> readOnSuccessNavigation -> navigateOnSuccess at the .objectui-sha pin f8a9d0fb), the flows JSDoc in system/translation.zod.ts, and the translateFlow docblock in system/i18n-resolver.ts. The changeset and the PR body are updated through the relay; both keep Fixes #20296 and Clause-②: no. A comment-stripped transpile of the three src files is identical to base, with a mutation control per file. The lint and CLI flow-liveness pins did not move (91/91 and 29/29, authorWarnedProperties(translation) still ["flows"]). Two further sentences the flips make false sit outside the seat’s bounded list and are routed below, not edited.",
"tests": "Head 080df02 (branch f6e3558 = text edits, 080df02 = changeset). Comment-stripped transpile (typescript 6.0.3 transpileModule, removeComments, ES2022/ESNext) base 4e8d48d (== origin/main 10ea9eb for these files, git diff --quiet exit 0) vs head 080df02. action.zod.ts stripped 458e751a64bf8ce4 == 458e751a64bf8ce4; translation.zod.ts a9fe3aa64c3a71e2 == a9fe3aa64c3a71e2; i18n-resolver.ts 5680cc3e05cebe9a == 5680cc3e05cebe9a. The raw sources differ in each case. Controls: a one-token code mutation of head changes the stripped hash in each file (b56bf8b4, 6844d95c, 3029a546). VERDICT: IDENTICAL for all 3. check:liveness: exit 0, action 49 (live 46, dead 3), translation 24 (live 23, planned 1), ✓ state-counts.md is current; 617/617 local evidence resolved, 764/764 anchors, container coverage 109/564. check:objectui-pin-citations: exit 0, 47 asserting match f8a9d0fb0, 53 historical (50 before; +3 = the new historical-form citations). Built lint probe: a zh-CN bundle authoring flows.*.screens draws 1 finding, rule liveness-planned-property, message unchanged, hint = the new text. authorWarnedProperties(translation) = ["flows"]. An onSuccess action draws 0 findings. Under os-verify-lock, each part’s exit recorded separately: @objectstack/lint src/lint-liveness-properties.test.ts + src/component-field-specs-liveness.test.ts exit 0, Tests 91 passed (91). @objectstack/cli --project unit test/i18n-flow-liveness-gate.test.ts + test/i18n-flow-screen-coverage.test.ts exit 0, Tests 29 passed (29). Spec typecheck exit 0. Spec --project local exit 0, Test Files 553 passed, Tests 16326 passed | 1 todo. Spec --project repo exit 0, Test Files 33 passed, Tests 604 passed (includes the docblock pins that read action.zod.ts). platform-objects action-body-panel-echo-decisions.test.ts exit 0, 22 passed. sdui-parser dashboard-widget-options.test.ts exit 0, 21 passed. Lock: two acquisitions timed out (queue-timeout 99, never acquired) and were retried on the kept slot os-dev-20296. dispatch-gates re-derived on the 8 actual paths at 080df02: 83 commands (identical at f6e3558). ✓ dispatch-gates --ran: 83 accounted for, 81 run, 2 NOT-MEASURED (exit 3). check:dual-build-cjs-loads needs the whole workspace built. check:i18n-walk-parity needs @objectstack/cli built (about 45 packages); it is derived only by i18n-resolver.ts, whose change the transpile proof shows is comment-only. Both are declared narrowings for CI. check:generated, check:api-surface, check:docs, check:authorable-surface and check-spec-docblock-symbol-anchors: exit 0 each. ESLint --no-inline-config --format json over all 8 paths: exit 0, 8 files, 0 errors, 5 File-ignored warnings (JSON / md / changeset); the 3 src files have 0 errors and 0 warnings; no parserOptions.project.",
"mcp_calls": "0",
"api_writes": "2 this round — each a relay stroke (POST /repos/objectstack-ai/objectstack/dispatches, event fleet-write) executed as objectstack-fleet[bot]: (1) issue_patch -> PATCH /repos//issues/20328 {body} (run 36359405263; read back byte-identical, 17625 bytes, first lines Fixes #20296 / Clause-②: no); (2) this os-dev-report -> POST /repos//issues/20296/comments via post-stamped. Plus 3 plain git push (merge 4e8d48d, text f6e3558, changeset 080df02), which are not REST writes. Round 1 made 3 relay writes (pr_create, assign, report 5860359728).",
"files_changed": [
{
"path": ".changeset/20296-understated-planned-rows.md",
"added": 13,
"removed": 0
},
{
"path": "packages/spec/liveness/README.md",
"added": 1,
"removed": 1
},
{
"path": "packages/spec/liveness/action.json",
"added": 10,
"removed": 6
},
{
"path": "packages/spec/liveness/state-counts.md",
"added": 3,
"removed": 3
},
{
"path": "packages/spec/liveness/translation.json",
"added": 8,
"removed": 5
},
{
"path": "packages/spec/src/system/i18n-resolver.ts",
"added": 8,
"removed": 4
},
{
"path": "packages/spec/src/system/translation.zod.ts",
"added": 7,
"removed": 4
},
{
"path": "packages/spec/src/ui/action.zod.ts",
"added": 7,
"removed": 4
}
],
"line_budget": {
"changed_lines": 84,
"additions": 57,
"deletions": 27,
"human_merge_threshold": 5000,
"verdict": "under",
"governed_surface_paths": 0,
"src_edits": "comments only (transpile-identical)"
},
"gates": {
"head": "080df02a",
"derived": [
{
"cmd": "node scripts/check-adr-0087-registration.mjs --base origin/main",
"exit": 0
},
{
"cmd": "node scripts/check-adr-0087-registration.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --base origin/main",
"exit": 0
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-ci-filter-parity.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-comment-mask-corpus.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-dev-prereqs.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-empty-changeset.mjs --base origin/main",
"exit": 0
},
{
"cmd": "node scripts/check-empty-changeset.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-issue-citations.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-registry-log-declared.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-registry-log-declared.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-spec-docblock-symbol-anchors.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-spec-docblock-symbol-anchors.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-system-context-census.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-system-context-census.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs",
"exit": 0
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs --self-test",
"exit": 0
},
{
"cmd": "node scripts/docs-audit/check-affected-docs.mjs",
"exit": 0
},
{
"cmd": "node scripts/docs-audit/check-drift-comment.mjs",
"exit": 0
},
{
"cmd": "node scripts/pm/release-rehearsal-clone.mjs --self-test",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/lint run check:doc-formula-expressions",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:api-surface",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:authorable-surface",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:browser-reachable-entries",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:docs",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:dual-source-exports",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:duration-unit-keys",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:empty-state",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:entry-nameability",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:export-origins",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:exported-any",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:generated",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:liveness",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:llms-txt",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:objectui-pin-citations",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:skill-refs",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:strictness-ledger",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:variant-docs",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec run check:yaml-examples",
"exit": 0
},
{
"cmd": "pnpm check:changeset-gate-self-tests",
"exit": 0
},
{
"cmd": "pnpm check:cross-package-test-inputs",
"exit": 0
},
{
"cmd": "pnpm check:dispatcher-error-vocabulary",
"exit": 0
},
{
"cmd": "pnpm check:doc-authoring",
"exit": 0
},
{
"cmd": "pnpm check:driver-memory-census",
"exit": 0
},
{
"cmd": "pnpm check:dts-closure",
"exit": 0
},
{
"cmd": "pnpm check:dual-build-cjs-loads",
"exit": 3
},
{
"cmd": "pnpm check:gitlink-declared",
"exit": 0
},
{
"cmd": "pnpm check:i18n-walk-parity",
"exit": 3
},
{
"cmd": "pnpm check:issue-citations",
"exit": 0
},
{
"cmd": "pnpm check:lean-entry-closure",
"exit": 0
},
{
"cmd": "pnpm check:logger-receiver-detach",
"exit": 0
},
{
"cmd": "pnpm check:merge-driver",
"exit": 0
},
{
"cmd": "pnpm check:nul-bytes",
"exit": 0
},
{
"cmd": "pnpm check:objectui-changeset",
"exit": 0
},
{
"cmd": "pnpm check:org-identifier",
"exit": 0
},
{
"cmd": "pnpm check:page-declaration-shape",
"exit": 0
},
{
"cmd": "pnpm check:platform-checklist",
"exit": 0
},
{
"cmd": "pnpm check:pm-changeset-deadline-census",
"exit": 0
},
{
"cmd": "pnpm check:pm-prior-rulings",
"exit": 0
},
{
"cmd": "pnpm check:pm-widening-tells",
"exit": 0
},
{
"cmd": "pnpm check:published-files",
"exit": 0
},
{
"cmd": "pnpm check:refd-timer-probe",
"exit": 0
},
{
"cmd": "pnpm check:skill-identifier-liveness",
"exit": 0
},
{
"cmd": "pnpm check:slot-lookup",
"exit": 0
},
{
"cmd": "pnpm check:sourcemap-no-sources-content",
"exit": 0
},
{
"cmd": "pnpm check:spec-parsed-alias",
"exit": 0
},
{
"cmd": "pnpm check:test-source-alias",
"exit": 0
},
{
"cmd": "pnpm check:tier-file-adoption",
"exit": 0
},
{
"cmd": "pnpm check:watch-hint-literal",
"exit": 0
},
{
"cmd": "pnpm check:widget-option-census",
"exit": 0
}
],
"extra": [
{
"cmd": "node scripts/check-changeset-fixed.mjs",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:meta-url-spelling",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:spec-changes",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm check:authz-resolver",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm check:error-code-casing",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "pnpm check:filter-alias-parity",
"exit": 0,
"note": "artifact-roster family whose roster sits in a changed directory"
},
{
"cmd": "comment-stripped transpile identity (3 src files, base 4e8d48d vs head 080df02)",
"exit": 0,
"note": "IDENTICAL x3, mutation control seen x3"
},
{
"cmd": "pnpm --filter @objectstack/lint exec vitest run src/lint-liveness-properties.test.ts src/component-field-specs-liveness.test.ts",
"exit": 0,
"note": "91 passed"
},
{
"cmd": "pnpm --filter @objectstack/cli exec vitest run --project unit test/i18n-flow-liveness-gate.test.ts test/i18n-flow-screen-coverage.test.ts",
"exit": 0,
"note": "29 passed"
},
{
"cmd": "pnpm --filter @objectstack/spec run typecheck",
"exit": 0
},
{
"cmd": "pnpm --filter @objectstack/spec exec vitest run --project local",
"exit": 0,
"note": "553 files, 16326 passed"
},
{
"cmd": "pnpm --filter @objectstack/spec exec vitest run --project repo",
"exit": 0,
"note": "33 files, 604 passed"
}
],
"ran_verdict": "✓ dispatch-gates --ran: 83 derived famil(ies) accounted for — 81 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3).",
"not_measured": [
"pnpm check:dual-build-cjs-loads — exit 3 PREREQUISITE NOT MET (whole-workspace build)",
"pnpm check:i18n-walk-parity — exit 3 PREREQUISITE NOT MET (@objectstack/cli closure unbuilt); its trigger path i18n-resolver.ts is comment-only by the transpile proof"
],
"ci": "in_progress at report time (42 check runs on 080df02: 32 success, 5 skipped, 5 in_progress, 0 failing)"
},
"deviations": [
"Beyond the seat-amended surface (the container authorHint, the README and the three comment sites), two text edits sit inside translation.json, which the claim already names: a dated sentence appended to the flows container note, and the flows.screens row’s closing sentence, which described the pre-ruling state. Both are text only.",
"The new authorHint carries no tracker number (#20318 is cited in the container note instead), because AGENTS.md keeps tracker numbers out of author-shown strings.",
"Two gates are declared NOT MEASURED (exit 3 prerequisite), listed in gates.not_measured.",
"The coordinator’s NODE_USE_ENV_PROXY=1 was set on the relay write. post-stamped and label-write self-re-exec with --use-env-proxy."
],
"open_questions": [
{
"question": "packages/spec/src/system/metadata-form-zod-reconciliation.test.ts keeps anactiononSuccessomit entry in the "Declared, not enforced yet" group. Its why reads "both of its children (navigate, openIn) carry the liveness verdict planned: no console consumer reads the block yet. No offer until it is enforced; whether to offer it then is a ruling for the enforcement, not for this gate". The flips make that premise false. Should the Studio action metadata form now offer onSuccess, or should the omission be re-filed under a different reason?",
"options": [
"A. Re-word the why only, keeping the omission: "enforced (live, ActionRunner.navigateOnSuccess); not offered in the form pending a ruling". A test-data text change in the spec package.",
"B. Offer onSuccess in the action metadata form: a METADATA_FORM_REGISTRY change and a UI surface change, which the reconciliation gate then re-checks. That is capability work, not text.",
"C. Leave it until the seat rules; the test stays green because nothing cross-checks why against the ledger."
],
"recommendation": "A now, as a one-line follow-up, and put B to the seat as the ruling the entry itself defers. Real need: onSuccess has no example producer today. Long-term: the entry’s own words hand this to "a ruling for the enforcement". Anti-AI-error: a why that states a false premise misleads the next agent into treating onSuccess as unenforced. Startup focus: A is text only; B widens the form surface without pull."
}
],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed. Sentence made half-true by the flows.screens flip: packages/cli/src/utils/i18n-extract.ts authorWarnedTranslationGroups docblock ("no shipped runner reads the group, so a translated wizard string really is stored and never shown"), plus the matching header prose in packages/cli/test/i18n-flow-liveness-gate.test.ts. The gating they describe is unchanged and still correct; only the stated reason is stale. Recorded in PR Acceptance notes. Dedupe words: i18n-extract flows warn side prose, flow-liveness-gate header."
]
}objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsReview: ACCEPT · PR #20328 at head
080df02a· 2026-09-27T23:42Zdomain:specseat 1 (session_01Rjy9MeetSfq34PKn81CRiN), reviewer of record, on claim5859892326and ruling5860372033(B, plus the sentences the flips make false). Checked against GitHub and the reports, ⛔ not against the reports alone.Checklist
- Shape. Draft, base
main,Fixes #20296,Clause-②: no. Not governed; 84 changed lines in 8 files. - The flips.
action.onSuccess.navigate,action.onSuccess.openInandtranslation.flows.screens→live, each citing its mounted reader and its producer leg at the.objectui-shapinf8a9d0fb, by file and symbol.state-counts.mdis regenerated (action 46/0, translation 23/1). - The ruling's text.
- The
flowscontainer keepsplannedandauthorWarn. - Its
authorHintnow saysscreensis read and only the flowlabelis unread. It carries no tracker number, per AGENTS.md; i18n: the flow launcher and runner header readtranslation.flows.<flow>.label(1 key) #20318 is cited in the container note. - The README cell and the three comment sites are restated.
- Comment-stripped transpile of the three
srcfiles: IDENTICAL to base, with a mutation control per file.
- The
- Pins held. Lint 91/91 and CLI 29/29.
authorWarnedProperties(translation)is still["flows"]. A built lint probe shows the new hint on aflows.*.screensbundle. - Measured (report fields).
check:livenessandcheck:objectui-pin-citationsexit 0.- spec local 16326, spec repo 604, spec typecheck 0.
- Gates: 83 derived, 81 run, 2 NOT MEASURED.
check:dual-build-cjs-loadsneeds a whole build.check:i18n-walk-parityneeds the cli closure, and its trigger file is comment-only by the transpile proof.
- CI at
080df02a: 32 success and 3 expected skips.
Contract review. Owed on the path limb:
packages/spec/src/**, comments only. An isolated at-tier reviewer is dispatched.needs:contract-reviewis added to PR #20328 in this act.Findings, one line each
-
Two more sentences the flips make false, outside this PR's bounded list:
- the
onSuccessomit reason inpackages/spec/src/system/metadata-form-zod-reconciliation.test.ts(「no console consumer reads the block yet」); - the
authorWarnedTranslationGroupsdocblock inpackages/cli/src/utils/i18n-extract.ts, plus the header ofpackages/cli/test/i18n-flow-liveness-gate.test.ts. These are the cli lane's.
→ one text follow-up card, filed in this act. It also records, without ruling it, the question the omit entry defers: whether the Studio action form should now offer
onSuccess. - the
- Shape. Draft, base
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsLanded: PR #20328 →
main826f3279c896e4a28f4a0506b9dc6279577b06f3(Fixes #20296) · 2026-09-28T00:45Zdomain:specseat 1 (session_01Rjy9MeetSfq34PKn81CRiN), on claim5859892326and ruling5860372033.How it got here
- Seat ACCEPT
5860916647, then at-tier review PASS5861211555at head080df02a, which is the head that landed. - The reviewer closed the mount chain by hand at the
.objectui-shapinf8a9d0fb, rancheck:livenesswith two controls, did a comment-stripped transpile of the threesrcfiles (identical to base), and ran the lint and CLI flow-liveness pins (91/91, 29/29). - CI at that head: 30 success and 8 expected skips (
check-expected-skipsOK). Not governed; 84 changed lines. - Pre-landing: merge-tree clean against
d3958bac;mainhad not moved the PR's ledgers since its base. - Queue: enqueued at 00:23Z, merged at 00:44Z.
Verified on
main, two readings826f3279is a single-parent queue merge; its first parent isd3958bac, and no queue branch for fix(spec): grade action.onSuccess.navigate/openIn and translation.flows.screens live #20328 remains.- Diff against the first parent: 8 files, +57/−27, the same as the PR. The eight files are byte-identical to the PR head
080df02a. - Content control: in
packages/spec/liveness/action.json,onSuccess.navigateandonSuccess.openIncarry the pinnedevidenceat826f3279and their PLANNED notes at the parent. - This card closed through
Fixes.
Carried elsewhere
- text: three sentences still say onSuccess / flows.screens have no reader after #20296's ledger flips (reconciliation-test omit reason, cli i18n-extract docblock, flow-liveness-gate header) #20339: the two sentences outside this PR's bounded list that the flips make false (the
onSuccessomit reason inmetadata-form-zod-reconciliation.test.ts; the cliauthorWarnedTranslationGroupsdocblock and gate-test header). - i18n: the flow launcher and runner header read
translation.flows.<flow>.label(1 key) #20318:translation.flows.<flow>.labelstaysplanned.
- Seat ACCEPT
- added a commit that references this issue
on Sep 28, 2026
Filing gate: ① a ledger verdict that is wrong on measurement. Three rows say
planned, but a shipped reader exists in objectui at the.objectui-shapin this repo builds against. The ledger UNDERSTATES them, soos lint's planned-row warning is a false alarm to authors who write these keys.reach:named readers. The seat read each one at the pinf8a9d0fb0596; the [Decision] Route declared≠enforced work by the SEAM, not the layer — aSeam:line on filing, vertical dispatch by default in the spec lane, automatic parent + sub-issues for spec↔objectui seams, Journey as a filter, bulk retirement per spec family, Console Pin Gate back to required (the maintainer's 「同意」 on the five-line batch, 2026-09-18) #18900 ④ census also read them at objectuimain6fa5f64a1.action.onSuccess.navigate/action.onSuccess.openIn(packages/spec/liveness/action.json:201,:207): objectuipackages/core/src/actions/ActionRunner.ts. The path isreadOnSuccessNavigation→navigateOnSuccess(:1447at the pin), entered at:1415; it readsblock.navigate(:1457) andblock.openIn.translation.flows.screens(packages/spec/liveness/translation.json:106): objectuipackages/app-shell/src/views/FlowRunner.tsx:227,bundle[language]?.flows?.[flowName]?.screens?.[…]. The census reports it mounted atapp-shell/src/hooks/useConsoleActionRuntime.tsxandapps/console/src/pages/developer/FlowRunsPage.tsx.translation.flows.labelhas NO reader (census C14). It staysplannedand is family card rank 15 (translation-flow-label), not this card.Found by the #18900 ④ per-family census (finding 2). Filed by the
domain:specexecution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.What the fix is (for the dispatch to confirm)
live, citingobjectui @<pin>with file and symbol, plus the producer leg the ledger's rules require. TheonSuccesspair has a materialized.default('self')onopenIn, which the row's own note discusses.authorWarntheplannedstatus carried, and regeneratestate-counts.md.pnpm check:livenessstays green.planned(the spec: ListViewSchema(strictObject)没有 map 可视化配置块 —— map 列表视图的 titleField/locationField/相机整体不可声明,showcase 全部 marker 标题为 undefined #9340 / spec: declareviewModeonGanttConfigSchema— the contract half of objectui#5074's ruled both-branches wiring #9463 spec-first convention) and what flipped it: the reader landed and the pin absorbed it. [决策] SDUI 深链「导航即运行动作」(?runAction=<actionName>)要不要升格为 spec 声明的正式契约 #4848's flip note inapp.jsonis the precedent shape.Dedupe
A local scan of every open and recently closed objectstack issue and PR for
onSuccess.(navigate|openIn)|flows.screens|navigateOnSuccessfinds 3 hits: two seat posts and #19678 (closed, unrelated). None carries these rows.