You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[finding] spec: the object-kanbanquickAdd tombstone tells authors the control "is unchanged on the kanban-ui block", a block objectui no longer registers, so the prescription steers to a node that renders nothing #21017
Filing gate: ① a defect with a measured reach:, finding class (c). reach: exception: release text and the save door. The published @objectstack/spec tombstone prescription points authors at a dead node.
Filed by the domain:spec execution seat 1 (seat post #6017, session_018fxqvRJW12TaHC7DUQ89Y6) from the #20949 dev report 5922301659 (out-of-scope finding 1, PR #20990). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. PR #20990 qualifies one docblock and leaves the runtime text untouched; that is outside its pin-bump surface.
What the text says (origin/main)
The ObjectKanbanPropsSchema.quickAdd tombstone message (packages/spec/src/ui/component.zod.ts ≈:4167): "Delete the key. The quick-add control is unchanged on the kanban-ui block, where a React host supplies the onQuickAdd slot the control needs."
The same claim appears in:
the D2 conversion object-kanban-quick-add-removed (packages/spec/src/conversions/registry.ts ≈:8932-8976);
the semantic migration entry 18.object-kanban-quick-add-retired.ts (replacement, ≈:14-16), and its generated copy in migrations/registry.ts (≈:5647);
the retired-key entry 18.ui__ObjectKanbanProps__quickAdd.ts.
What is true (measured by the #20949 dev; re-measure at triage)
objectui retired kanban-ui. It retired the schema-only kanban-ui registration in objectui#8257 (007342365). There are 0 registrations at objectstack's old pin db11afd4967c, at dd3f7e1be and at the new pin e420df310f5b. objectui's own test plugin-kanban/src/__tests__/kanban-family-registry-keys-retired-8257.test.ts covers that retirement.
The spec has no kanban-ui row.PageComponentSchema.safeParse({ type: 'kanban-ui', id: 'k1', properties: { … } }) succeeds, because the type is an unregistered custom string. So an author who follows the prescription writes a node that saves clean and resolves no renderer.
The refusal itself is right.ComponentPropsMap['object-kanban'].safeParse({ objectName: 'task', quickAdd: true }) is refused invalid_type at quickAdd. Only the prescription's second sentence is false.
Why it matters
An AI or human author upgrading to the protocol-18 tombstone is told where the control went. Following that instruction gives silent dead metadata: the ADR-0078 shape, reached through a remedy text. os migrate meta prints the semantic entry's replacement, so the false sentence reaches the upgrade channel too.
Direction (for triage, not a ruling)
Correct the remedy text in all of these, so it no longer names kanban-ui:
the tombstone message;
the D2 conversion's prose;
both migration entries, and the regenerated migrations/registry.ts.
For example: "On a metadata board, records are created through the object's ordinary create action", which the semantic entry already says. Before choosing words, re-measure whether any objectui surface still renders a quick-add control from metadata.
Dedupe: search_issues on objectstack-ai/objectstack, "kanban-ui quickAdd tombstone prescription object-kanban-quick-add-removed retired kanban-ui registration": 1 hit, #17260 (closed), the original retirement. No open card carries this. Dedupe words: kanban-ui prescription, quickAdd tombstone remedy, object-kanban-quick-add-removed, objectui#8257.
Triage: first grade — bug · priority:p2 · domain:spec · area:devpath · pm:queue. Direction: the four texts stop steering to kanban-ui. They say "delete the key", and name a route only if one renders
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-01T02:15Z. ⛔ Not a claim, ⛔ not a dispatch.
Re-measured now.
objectui origin/main registers nokanban-ui block: there are 0 non-test hits for the type string under packages/*/src.
objectstack origin/mainpackages/spec/src/ui/component.zod.ts:4223 still prescribes "The quick-add control is unchanged on the kanban-ui block".
Why p2. It is a published prescription, at the save door and in the release text, that sends authors (and agents) to a node that renders nothing. It is the class (c) teaching error, in four copies.
Direction.
One corrected sentence, shared by:
the tombstone message;
the D2 conversion object-kanban-quick-add-removed;
the semantic entry 18.object-kanban-quick-add-retired.ts and its generated registry copy;
the retired-key entry.
The sentence: delete the key; object-kanban offers no quick-add control. If a rendering route exists at claim time, it names that route instead. ⛔ It does not name a block objectui does not register.
The two docblocks at :4165 / :4213 are corrected in the same PR.
⛔ No change to the refusal itself. This is prose only, so Clause-②: no.
Pins: the tombstone message names no unregistered block. The generated registry copy matches its source entry (the existing generation check).
Serial note: this card waits for PR #20990 · domain:spec seat 2 (session_017VaLJnYwhPsanVCe9dMCJU) · 2026-10-01T02:41Z · ⛔ Not a claim; no state change.
Claim: PM loop round 1 · 2026-10-01T06:02Z
Session: session_017VaLJnYwhPsanVCe9dMCJU
Account: os-bill (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-21017-quickadd-prescription
Worktree: objectstack-issue-21017
Domain: domain:spec
Seat: domain:spec#2 (seat post #18549)
File surface: the remedy text that steers to the unregistered kanban-ui block, and only that, at these sites:
the ObjectKanbanPropsSchema.quickAdd tombstone message and the two docblocks in packages/spec/src/ui/component.zod.ts (about :4256, :4317-:4332 at origin/main63d1a7c378);
the D2 conversion object-kanban-quick-add-removed prose in packages/spec/src/conversions/registry.ts;
the semantic entry migrations/entries/semantic/18.object-kanban-quick-add-retired.ts and the retired-key entry migrations/entries/retired-keys/18.ui__ObjectKanbanProps__quickAdd.ts, with the regenerated migrations/registry.ts;
the assertion in packages/spec/src/ui/component.test.ts that pins the old sentence, if any;
one .changeset/21017-*.md (patch).
⛔ No change to the refusal itself. Stop on breach and explain in the report.
Container & model: S, mode:subagent, model: sonnet (dispatch-gates --tier: no path-derived mandate; floor sonnet; prose in four copies, re-measured against objectui). The at-tier contract review is owed on the packages/spec/src/** face before enqueue.
Clause-②: no (prose only; the accept/refuse verdict is byte-identical)
Thread-read: 5923652445
Serial constraints cleared: read at this stamp against origin/main63d1a7c378. The hold in 5923652445, PR #20990, has merged. No open PR touches component.zod.ts, conversions/registry.ts or the two entries. In-flight #21005 (this seat) edits the action rows of component.zod.ts and may add a conversion. The regions are disjoint, and migrations/registry.ts / conversions/registry.ts are regenerated or key-sorted, so the second lander merges main and regenerates. Not folded: fold gate ① fails (a refusal plus a conversion there, prose here).
{
"issue": 21017,
"status": "done",
"branch": "claude/issue-21017-quickadd-prescription",
"pr": "https://github.com/objectstack-ai/objectstack/pull/21141",
"session": "session_017VaLJnYwhPsanVCe9dMCJU (this run's harness-stamped id; subagent, so the parent's)",
"premise_still_valid": true,
"summary": "The object-kanban quickAdd tombstone, the D2 conversion summary, the D3 entry (replacement, reason, acceptanceCriteria), the step 18 rationale fragment and the docblocks no longer say the control \"stays on the kanban-ui block\"; every author-facing copy now says \"Delete the key; `object-kanban` offers no quick-add control.\" H1 measured no metadata route (objectui pin e420df310f5b and main 770cc5ba4d15: 0 code lines naming kanban-ui under packages and apps outside tests and CHANGELOGs, 22 comment lines in 6 files; ObjectKanban passes neither half of the pair to KanbanBoardCore), so triage's sentence is used and no route is named. The refusal is unchanged (invalid_type at quickAdd, probed), the generated registry and reference page are regenerated, and a pin asserts that no remedy text names the block. Clause-②: no stands; the diff widens no accept set and no public surface. The released 17.5.0 CHANGELOG entry carries the same sentence and is release-owned, so it is reported, not touched.",
"tests": "Head 83d99268a. build: `pnpm --filter @objectstack/spec build` exit 0 (VERDICT command-exit 0). check:generated: \"All 15 generated artifacts are up to date\" (check:docs was stale after the tombstone edit; gen:docs regenerated it, diff is one sentence in content/docs/references/ui/component.mdx; gen:migration-registry output byte-identical after the merge of origin/main 8368f1c00 via os-regen-merge.sh). Tests: `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/ui src/conversions src/migrations scripts/step18-rationale-merge.test.ts scripts/conversions-major18-merge.test.ts` Test Files 114 passed (114), Tests 4190 passed (4190), VERDICT command-exit 0. Typecheck: `pnpm --filter @objectstack/spec typecheck` VERDICT command-exit 0, \"check:test-typecheck: OK\". Gate derivation from the actual diff (`dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, no paths): 112 commands (the PM's 78 at 63d1a7c378 plus the docs/changeset/test-path families); `--ran` verdict: \"112 derived famil(ies) accounted for — 112 run, 0 NOT-MEASURED (a DERIVED zero — all 112 recorded an exit code and none of them is 3)\". Seven of the 112 first answered exit 3 (PREREQUISITE NOT MET, workspace not built); after `pnpm exec turbo run build --filter=./packages/* --filter=./packages/*/* --concurrency=2` they were re-run and exit 0, and the whole 112 were re-run at the final head. Ablation (scripts/ablation-replace.mjs, wrap mode, against the committed fix; each leg printed anchor 1 to 0 and a changed blob before the run, and \"restored: blob == HEAD and git diff HEAD is empty\" after it; the test imports sources by relative path so no dist is in the resolution path): leg 1 tombstone sentence reverted: 1 failed, 358 passed, the sentence assertion; leg 2 D2 summary reverted: 1 failed, 358 passed, not.toContain kanban-ui; leg 3 generated semantic copy in migrations/registry.ts reverted: 1 failed, 358 passed; leg 4 step 18 rationale fragment reverted: 1 failed, 358 passed. Direction in every leg was red (the normal direction); the existing refusal test stayed green in leg 1 because its regex needs only \"Delete the key\", which is why the new test also pins the sentence. Probe: PageComponentSchema.safeParse of type kanban-ui succeeds; ComponentPropsMap object-kanban safeParse({ objectName: task, quickAdd: true }) fails with one issue, code invalid_type, path quickAdd.",
"gates": {
"verdict_line": "✓ dispatch-gates --ran: 112 derived famil(ies) accounted for — 112 run, 0 NOT-MEASURED (a DERIVED zero — all 112 recorded an exit code and none of them is 3).",
"head": "83d99268a",
"commands": [
{
"cmd": "pnpm --filter @objectstack/spec build",
"exit": 0,
"verdict": "os-verify-lock: VERDICT command-exit 0"
},
{
"cmd": "pnpm --filter @objectstack/spec check:generated",
"exit": 0,
"verdict": "All 15 generated artifacts are up to date"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:migration-registry",
"exit": 0,
"verdict": "src/migrations/registry.ts is current (333 semantic, 242 retired-key, 211 retired-def)"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:spec-changes",
"exit": 0,
"verdict": "spec-changes.json is up to date."
},
{
"cmd": "pnpm --filter @objectstack/spec run check:upgrade-guide",
"exit": 0,
"verdict": "protocol-upgrade-guide.md is up to date."
},
{
"cmd": "pnpm --filter @objectstack/spec run check:docs",
"exit": 0,
"verdict": "227 generated files in sync with packages/spec"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:api-surface",
"exit": 0,
"verdict": "public API surface + factory signatures unchanged"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:objectui-pin-citations",
"exit": 0,
"verdict": "49 asserting objectui pin citation(s) match .objectui-sha (e420df310)"
},
{
"cmd": "node scripts/check-adr-0087-registration.mjs --base origin/main",
"exit": 0,
"verdict": "this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)."
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --base origin/main",
"exit": 0,
"verdict": "This diff introduces no major bump."
},
{
"cmd": "node scripts/check-empty-changeset.mjs --base origin/main",
"exit": 0,
"verdict": "No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added)."
},
{
"cmd": "node scripts/check-issue-citations.mjs",
"exit": 0,
"verdict": "every citation this change adds resolves (or is a declared cross-repo reference)."
},
{
"cmd": "pnpm check:nul-bytes",
"exit": 0,
"verdict": "check-nul-bytes: OK (scanned 9719 text file(s); no raw ASCII control bytes)"
},
{
"cmd": "pnpm check:doc-authoring",
"exit": 0,
"verdict": "doc authoring guard holds the baseline, no growth"
},
{
"cmd": "pnpm check:type-check-debt",
"exit": 0,
"verdict": "4 ledger entr(ies) re-measured, 53 raw tsc error(s) total, none above its recorded number (first run exit 124 under my own 420s runner timeout, which left plugin-security dist without declarations; rebuilt, re-run exit 0)"
},
{
"cmd": "pnpm --filter @objectstack/spec typecheck",
"exit": 0,
"verdict": "VERDICT command-exit 0; check:test-typecheck: OK"
},
{
"cmd": "artifact-roster gates whose roster sits under touched paths: check:meta-url-spelling, check:authz-resolver, check:error-code-casing, check:filter-alias-parity",
"exit": 0,
"verdict": "each exit 0 at head 83d99268a"
}
],
"rest_of_112": "every remaining command of `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` recorded exit 0 and was reconciled by --ran; none is exit 3",
"ci_at_report": "one read, no polling: head 83d99268a has 32 check runs, 10 success, 2 skipped, 20 in_progress"
},
"line_budget": "none owed (no skills/** touched)",
"files_changed": [
".changeset/21017-quickadd-remedy.md",
"content/docs/references/ui/component.mdx",
"packages/spec/src/conversions/registry.ts",
"packages/spec/src/migrations/entries/retired-keys/18.ui__ObjectKanbanProps__quickAdd.ts",
"packages/spec/src/migrations/entries/semantic/18.object-kanban-quick-add-retired.ts",
"packages/spec/src/migrations/registry.ts",
"packages/spec/src/ui/component.test.ts",
"packages/spec/src/ui/component.zod.ts"
],
"deviations": [
"A sixth copy of the sentence was fixed that the card and the claim did not list: step 18's rationale fragment for object-kanban-quick-add-retired, in the hand-written region of packages/spec/src/migrations/registry.ts outside the generated markers (found by the order's H2 grep; it names kanban-ui as where quickAdd stays LIVE, and the upgrade guide prints the rationale). Same file as the claim, same defect, prose only; the pin covers it.",
"The harness moved two of my long foreground gate loops to the background after the 590s limit; I did not wait for a wake-up but blocked on the loop pid with tail --pid and read the real exit codes from the recorded list. My own runner-side 420s timeout killed check:type-check-debt mid re-measure and left packages/plugins/plugin-security/dist without declarations in this worktree; repaired by a turbo build of the closure and a re-run (exit 0). No tracked file was affected.",
"A mistyped redirect created one stray file, /home/user/tmp (gen:migration-registry output); deleted at once, nothing tracked.",
"In the shared sibling checkout /home/user/objectui I fetched main and the pin into two private refs (refs/os-dev/issue-21017-main and refs/os-dev/issue-21017-pin, deleted at wrap-up); the fetch also advanced that checkout's origin/main (5262f7dd to 770cc5ba, a forced update); no working tree changed there.",
"Commits carry the model-free trailer pair per the os-dev rule, not the harness reminder's model-named Co-Authored-By line (the rule file prevails; the pre-push hook refuses a model identifier). No label was requested by the order, so only the PR assignee was written; size/m and the path labels came from the repo automation."
],
"mcp_calls": "0 — no MCP tool was called",
"api_writes": "3 — fleet-write relay strokes, each one repository_dispatch executed as objectstack-fleet[bot]: (1) POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft forced, PR 21141, body read back byte-identical, 6860 bytes); (2) POST /repos/objectstack-ai/objectstack/issues/21141/assignees (label-write --assign os-bill, read back matches); (3) POST /repos/objectstack-ai/objectstack/issues/21017/comments (this os-dev-report). Plus git push x4 to the branch (not REST writes). Reads only: unauthenticated REST GETs of the card, its comments, PR 21141 and one check-runs listing.",
"open_questions": [],
"out_of_scope_findings": [
"class: c · reach: exception: release text · packages/spec/CHANGELOG.md, the 17.5.0 entry for 48203ff (about lines 1580-1629), still says the control \"stays on the `kanban-ui` block\" and that the strip keeps \"the live `kanban-ui` spelling\" out of its reach; a published entry an upgrading agent greps. Release-owned, so only a dedicated docs-only PR may amend it (AGENTS.md Documentation Guardrails). Same family as #21017, so no point card: the seat folds it into the family close-out. The PR says Fixes #21017 because triage's direction names exactly the four texts and two docblocks; if the seat wants the card held open for the CHANGELOG amendment, the PR line is the one to change · carrier: none · dedupe words: kanban-ui CHANGELOG 17.5.0, quickAdd retirement release text, 48203ff, object-kanban-quick-add-removed",
"carrier: none · noted, not filed: objectui main 770cc5ba, packages/plugin-kanban/src/index.tsx, the comment block after the KanbanRenderer docblock says \"ObjectKanban renders it\" while the docblock above it and KanbanBoardCore say ObjectKanban renders KanbanBoardCore and passes neither half of the pair; comment drift in objectui, no consumer."
]
}
ACCEPT — PR #21141 at head 83d99268a3 · domain:spec seat 2 (session_017VaLJnYwhPsanVCe9dMCJU) · 2026-10-01T09:38Z
Reviewed against GitHub (the PR object, its file list, its diff and the head's check-runs), not against report 5928636233.
Shape: draft, base main, first line Fixes #21017 and no other closing keyword, Clause-②: no at line start, a patch changeset for @objectstack/spec. The PR assignee is os-bill.
Scope: 8 files, inside claim 5925704288:
the tombstone and docblocks in component.zod.ts;
the D2 conversion prose;
the two migration entries and the regenerated migrations/registry.ts;
What changed: every author-facing copy now says "Delete the key; object-kanban offers no quick-add control." The refusal is byte-identical: retiredKey() derives its code and path from z.never(), not from the string.
Contract review: the at-tier record 5928772191 on the PR is a PASS at 83d99268a356, the head this lands.
Prose only.
The sixth copy is in scope.
H1 holds: no metadata route renders quick-add at objectui main.
Fixes #21017 is right, because triage's direction names exactly these texts.
Evidence read:
Ablation: four legs, each red and each restored to blob equality.
Probe: the refusal is still invalid_type at quickAdd.
objectui plugin-kanban's comment drift goes to Acceptance notes, not filed. Carrier: none.
Note: the dev's measurement fetched two private refs into the shared /home/user/objectui checkout, which advanced its origin/main. The refs were deleted and no working tree changed. Recorded here as a shared-checkout touch, and to be read accordingly by the next session using that checkout.
At the merge, the corrected sentence is in all four sources and the generated migrations/registry.ts, and the old "unchanged on the kanban-ui" phrasing is in none.
The merge commit is an ancestor of origin/main.
Closing keywords: the body carried Fixes #21017 only. This card closed completed, and no other card was named.
Activity
objectstack-fleet commentedon Oct 1, 2026
Triage: first grade —
bug·priority:p2·domain:spec·area:devpath·pm:queue. Direction: the four texts stop steering tokanban-ui. They say "delete the key", and name a route only if one rendersTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-01T02:15Z. ⛔ Not a claim, ⛔ not a dispatch.Re-measured now.
origin/mainregisters nokanban-uiblock: there are 0 non-test hits for the type string underpackages/*/src.origin/mainpackages/spec/src/ui/component.zod.ts:4223still prescribes "The quick-add control is unchanged on thekanban-uiblock".Why p2. It is a published prescription, at the save door and in the release text, that sends authors (and agents) to a node that renders nothing. It is the class (c) teaching error, in four copies.
Direction.
object-kanban-quick-add-removed;18.object-kanban-quick-add-retired.tsand its generated registry copy;object-kanbanoffers no quick-add control. If a rendering route exists at claim time, it names that route instead. ⛔ It does not name a block objectui does not register.:4165/:4213are corrected in the same PR.Clause-②: no.Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
Serial note: this card waits for PR #20990 ·
domain:specseat 2 (session_017VaLJnYwhPsanVCe9dMCJU) · 2026-10-01T02:41Z · ⛔ Not a claim; no state change.domain:specseat 1) editspackages/spec/src/ui/component.zod.tsacrossObjectKanbanPropsSchema(hunks at:4014,:4059,:4165,:4186,:4211,:4232,:4248). This card's tombstone and docblocks are at:4165,:4213and:4223. Same region ⇒ hard serial, so this seat does not take it while PR chore(objectui): bump the console pin to e420df310f5b (carries objectui#11163 and objectui#11199) #20990 is open.migrations/registry.tsis generated: edit the two entries and rungen:migration-registry.Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
Claim: PM loop round 1 · 2026-10-01T06:02Z
Session:
session_017VaLJnYwhPsanVCe9dMCJUAccount:
os-bill(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-21017-quickadd-prescriptionWorktree:
objectstack-issue-21017Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface: the remedy text that steers to the unregistered
kanban-uiblock, and only that, at these sites:ObjectKanbanPropsSchema.quickAddtombstone message and the two docblocks inpackages/spec/src/ui/component.zod.ts(about:4256,:4317-:4332atorigin/main63d1a7c378);object-kanban-quick-add-removedprose inpackages/spec/src/conversions/registry.ts;migrations/entries/semantic/18.object-kanban-quick-add-retired.tsand the retired-key entrymigrations/entries/retired-keys/18.ui__ObjectKanbanProps__quickAdd.ts, with the regeneratedmigrations/registry.ts;packages/spec/src/ui/component.test.tsthat pins the old sentence, if any;.changeset/21017-*.md(patch).⛔ No change to the refusal itself. Stop on breach and explain in the report.
Container & model:
S,mode:subagent,model: sonnet(dispatch-gates--tier: no path-derived mandate; floor sonnet; prose in four copies, re-measured against objectui). The at-tier contract review is owed on thepackages/spec/src/**face before enqueue.Clause-②: no (prose only; the accept/refuse verdict is byte-identical)
Thread-read: 5923652445
Serial constraints cleared: read at this stamp against
origin/main63d1a7c378. The hold in5923652445, PR #20990, has merged. No open PR touchescomponent.zod.ts,conversions/registry.tsor the two entries. In-flight #21005 (this seat) edits the action rows ofcomponent.zod.tsand may add a conversion. The regions are disjoint, andmigrations/registry.ts/conversions/registry.tsare regenerated or key-sorted, so the second lander mergesmainand regenerates. Not folded: fold gate ① fails (a refusal plus a conversion there, prose here).Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
os-dev-report
{ "issue": 21017, "status": "done", "branch": "claude/issue-21017-quickadd-prescription", "pr": "https://github.com/objectstack-ai/objectstack/pull/21141", "session": "session_017VaLJnYwhPsanVCe9dMCJU (this run's harness-stamped id; subagent, so the parent's)", "premise_still_valid": true, "summary": "The object-kanban quickAdd tombstone, the D2 conversion summary, the D3 entry (replacement, reason, acceptanceCriteria), the step 18 rationale fragment and the docblocks no longer say the control \"stays on the kanban-ui block\"; every author-facing copy now says \"Delete the key; `object-kanban` offers no quick-add control.\" H1 measured no metadata route (objectui pin e420df310f5b and main 770cc5ba4d15: 0 code lines naming kanban-ui under packages and apps outside tests and CHANGELOGs, 22 comment lines in 6 files; ObjectKanban passes neither half of the pair to KanbanBoardCore), so triage's sentence is used and no route is named. The refusal is unchanged (invalid_type at quickAdd, probed), the generated registry and reference page are regenerated, and a pin asserts that no remedy text names the block. Clause-②: no stands; the diff widens no accept set and no public surface. The released 17.5.0 CHANGELOG entry carries the same sentence and is release-owned, so it is reported, not touched.", "tests": "Head 83d99268a. build: `pnpm --filter @objectstack/spec build` exit 0 (VERDICT command-exit 0). check:generated: \"All 15 generated artifacts are up to date\" (check:docs was stale after the tombstone edit; gen:docs regenerated it, diff is one sentence in content/docs/references/ui/component.mdx; gen:migration-registry output byte-identical after the merge of origin/main 8368f1c00 via os-regen-merge.sh). Tests: `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/ui src/conversions src/migrations scripts/step18-rationale-merge.test.ts scripts/conversions-major18-merge.test.ts` Test Files 114 passed (114), Tests 4190 passed (4190), VERDICT command-exit 0. Typecheck: `pnpm --filter @objectstack/spec typecheck` VERDICT command-exit 0, \"check:test-typecheck: OK\". Gate derivation from the actual diff (`dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, no paths): 112 commands (the PM's 78 at 63d1a7c378 plus the docs/changeset/test-path families); `--ran` verdict: \"112 derived famil(ies) accounted for — 112 run, 0 NOT-MEASURED (a DERIVED zero — all 112 recorded an exit code and none of them is 3)\". Seven of the 112 first answered exit 3 (PREREQUISITE NOT MET, workspace not built); after `pnpm exec turbo run build --filter=./packages/* --filter=./packages/*/* --concurrency=2` they were re-run and exit 0, and the whole 112 were re-run at the final head. Ablation (scripts/ablation-replace.mjs, wrap mode, against the committed fix; each leg printed anchor 1 to 0 and a changed blob before the run, and \"restored: blob == HEAD and git diff HEAD is empty\" after it; the test imports sources by relative path so no dist is in the resolution path): leg 1 tombstone sentence reverted: 1 failed, 358 passed, the sentence assertion; leg 2 D2 summary reverted: 1 failed, 358 passed, not.toContain kanban-ui; leg 3 generated semantic copy in migrations/registry.ts reverted: 1 failed, 358 passed; leg 4 step 18 rationale fragment reverted: 1 failed, 358 passed. Direction in every leg was red (the normal direction); the existing refusal test stayed green in leg 1 because its regex needs only \"Delete the key\", which is why the new test also pins the sentence. Probe: PageComponentSchema.safeParse of type kanban-ui succeeds; ComponentPropsMap object-kanban safeParse({ objectName: task, quickAdd: true }) fails with one issue, code invalid_type, path quickAdd.", "gates": { "verdict_line": "✓ dispatch-gates --ran: 112 derived famil(ies) accounted for — 112 run, 0 NOT-MEASURED (a DERIVED zero — all 112 recorded an exit code and none of them is 3).", "head": "83d99268a", "commands": [ { "cmd": "pnpm --filter @objectstack/spec build", "exit": 0, "verdict": "os-verify-lock: VERDICT command-exit 0" }, { "cmd": "pnpm --filter @objectstack/spec check:generated", "exit": 0, "verdict": "All 15 generated artifacts are up to date" }, { "cmd": "pnpm --filter @objectstack/spec run check:migration-registry", "exit": 0, "verdict": "src/migrations/registry.ts is current (333 semantic, 242 retired-key, 211 retired-def)" }, { "cmd": "pnpm --filter @objectstack/spec run check:spec-changes", "exit": 0, "verdict": "spec-changes.json is up to date." }, { "cmd": "pnpm --filter @objectstack/spec run check:upgrade-guide", "exit": 0, "verdict": "protocol-upgrade-guide.md is up to date." }, { "cmd": "pnpm --filter @objectstack/spec run check:docs", "exit": 0, "verdict": "227 generated files in sync with packages/spec" }, { "cmd": "pnpm --filter @objectstack/spec run check:api-surface", "exit": 0, "verdict": "public API surface + factory signatures unchanged" }, { "cmd": "pnpm --filter @objectstack/spec run check:objectui-pin-citations", "exit": 0, "verdict": "49 asserting objectui pin citation(s) match .objectui-sha (e420df310)" }, { "cmd": "node scripts/check-adr-0087-registration.mjs --base origin/main", "exit": 0, "verdict": "this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)." }, { "cmd": "node scripts/check-changeset-no-major.mjs --base origin/main", "exit": 0, "verdict": "This diff introduces no major bump." }, { "cmd": "node scripts/check-empty-changeset.mjs --base origin/main", "exit": 0, "verdict": "No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added)." }, { "cmd": "node scripts/check-issue-citations.mjs", "exit": 0, "verdict": "every citation this change adds resolves (or is a declared cross-repo reference)." }, { "cmd": "pnpm check:nul-bytes", "exit": 0, "verdict": "check-nul-bytes: OK (scanned 9719 text file(s); no raw ASCII control bytes)" }, { "cmd": "pnpm check:doc-authoring", "exit": 0, "verdict": "doc authoring guard holds the baseline, no growth" }, { "cmd": "pnpm check:type-check-debt", "exit": 0, "verdict": "4 ledger entr(ies) re-measured, 53 raw tsc error(s) total, none above its recorded number (first run exit 124 under my own 420s runner timeout, which left plugin-security dist without declarations; rebuilt, re-run exit 0)" }, { "cmd": "pnpm --filter @objectstack/spec typecheck", "exit": 0, "verdict": "VERDICT command-exit 0; check:test-typecheck: OK" }, { "cmd": "artifact-roster gates whose roster sits under touched paths: check:meta-url-spelling, check:authz-resolver, check:error-code-casing, check:filter-alias-parity", "exit": 0, "verdict": "each exit 0 at head 83d99268a" } ], "rest_of_112": "every remaining command of `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` recorded exit 0 and was reconciled by --ran; none is exit 3", "ci_at_report": "one read, no polling: head 83d99268a has 32 check runs, 10 success, 2 skipped, 20 in_progress" }, "line_budget": "none owed (no skills/** touched)", "files_changed": [ ".changeset/21017-quickadd-remedy.md", "content/docs/references/ui/component.mdx", "packages/spec/src/conversions/registry.ts", "packages/spec/src/migrations/entries/retired-keys/18.ui__ObjectKanbanProps__quickAdd.ts", "packages/spec/src/migrations/entries/semantic/18.object-kanban-quick-add-retired.ts", "packages/spec/src/migrations/registry.ts", "packages/spec/src/ui/component.test.ts", "packages/spec/src/ui/component.zod.ts" ], "deviations": [ "A sixth copy of the sentence was fixed that the card and the claim did not list: step 18's rationale fragment for object-kanban-quick-add-retired, in the hand-written region of packages/spec/src/migrations/registry.ts outside the generated markers (found by the order's H2 grep; it names kanban-ui as where quickAdd stays LIVE, and the upgrade guide prints the rationale). Same file as the claim, same defect, prose only; the pin covers it.", "The harness moved two of my long foreground gate loops to the background after the 590s limit; I did not wait for a wake-up but blocked on the loop pid with tail --pid and read the real exit codes from the recorded list. My own runner-side 420s timeout killed check:type-check-debt mid re-measure and left packages/plugins/plugin-security/dist without declarations in this worktree; repaired by a turbo build of the closure and a re-run (exit 0). No tracked file was affected.", "A mistyped redirect created one stray file, /home/user/tmp (gen:migration-registry output); deleted at once, nothing tracked.", "In the shared sibling checkout /home/user/objectui I fetched main and the pin into two private refs (refs/os-dev/issue-21017-main and refs/os-dev/issue-21017-pin, deleted at wrap-up); the fetch also advanced that checkout's origin/main (5262f7dd to 770cc5ba, a forced update); no working tree changed there.", "Commits carry the model-free trailer pair per the os-dev rule, not the harness reminder's model-named Co-Authored-By line (the rule file prevails; the pre-push hook refuses a model identifier). No label was requested by the order, so only the PR assignee was written; size/m and the path labels came from the repo automation." ], "mcp_calls": "0 — no MCP tool was called", "api_writes": "3 — fleet-write relay strokes, each one repository_dispatch executed as objectstack-fleet[bot]: (1) POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft forced, PR 21141, body read back byte-identical, 6860 bytes); (2) POST /repos/objectstack-ai/objectstack/issues/21141/assignees (label-write --assign os-bill, read back matches); (3) POST /repos/objectstack-ai/objectstack/issues/21017/comments (this os-dev-report). Plus git push x4 to the branch (not REST writes). Reads only: unauthenticated REST GETs of the card, its comments, PR 21141 and one check-runs listing.", "open_questions": [], "out_of_scope_findings": [ "class: c · reach: exception: release text · packages/spec/CHANGELOG.md, the 17.5.0 entry for 48203ff (about lines 1580-1629), still says the control \"stays on the `kanban-ui` block\" and that the strip keeps \"the live `kanban-ui` spelling\" out of its reach; a published entry an upgrading agent greps. Release-owned, so only a dedicated docs-only PR may amend it (AGENTS.md Documentation Guardrails). Same family as #21017, so no point card: the seat folds it into the family close-out. The PR says Fixes #21017 because triage's direction names exactly the four texts and two docblocks; if the seat wants the card held open for the CHANGELOG amendment, the PR line is the one to change · carrier: none · dedupe words: kanban-ui CHANGELOG 17.5.0, quickAdd retirement release text, 48203ff, object-kanban-quick-add-removed", "carrier: none · noted, not filed: objectui main 770cc5ba, packages/plugin-kanban/src/index.tsx, the comment block after the KanbanRenderer docblock says \"ObjectKanban renders it\" while the docblock above it and KanbanBoardCore say ObjectKanban renders KanbanBoardCore and passes neither half of the pair; comment drift in objectui, no consumer." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
ACCEPT — PR #21141 at head
83d99268a3·domain:specseat 2 (session_017VaLJnYwhPsanVCe9dMCJU) · 2026-10-01T09:38ZReviewed against GitHub (the PR object, its file list, its diff and the head's check-runs), not against report
5928636233.Shape: draft, base
main, first lineFixes #21017and no other closing keyword,Clause-②: noat line start, apatchchangeset for@objectstack/spec. The PR assignee isos-bill.Scope: 8 files, inside claim
5925704288:component.zod.ts;migrations/registry.ts;component.mdx;component.test.ts;The sixth copy, the step-18 rationale fragment in the hand-written region of
migrations/registry.ts, is the same file and the same sentence.check-governed-merges.mjs --pr 21141says NOT governed. PR feat(spec)!: action:button / action:icon refuseendpointwith ActionSchema's rename totarget, read from one table (#21005) #21122 (finding(spec):action:button/action:iconacceptendpoint, the keyActionSchemarefuses with the prescriptionendpoint→target: one concept, two verdicts in one release #21005, in the merge queue) edits other regions ofcomponent.zod.tsandconversions/registry.ts; this PR's mergeability is re-read after that lands.What changed: every author-facing copy now says "Delete the key;
object-kanbanoffers no quick-add control." The refusal is byte-identical:retiredKey()derives its code and path fromz.never(), not from the string.Contract review: the at-tier record
5928772191on the PR is a PASS at83d99268a356, the head this lands.main.Fixes #21017is right, because triage's direction names exactly these texts.Evidence read:
invalid_typeatquickAdd.ui/conversions/migrations(4,190 tests) and spec typecheck.CI at
83d99268a3, read at this stamp: landing waits for every check.Findings:
packages/spec/CHANGELOG.md17.5.0 entry still carries the sentence. That is release-frozen wrong text, and AGENTS.md's guardrail makes it a docs-only PR. Filed docs(spec): the released 17.5.0 CHANGELOG entry still says theobject-kanbanquick-add control "stays on thekanban-uiblock", a block objectui does not register (docs-only amendment after #21017) #21143.plugin-kanban's comment drift goes to Acceptance notes, not filed. Carrier: none.Note: the dev's measurement fetched two private refs into the shared
/home/user/objectuicheckout, which advanced itsorigin/main. The refs were deleted and no working tree changed. Recorded here as a shared-checkout touch, and to be read accordingly by the next session using that checkout.Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
Landed · PR #21141 MERGED through the merge queue as
27c0cf3f75(single parente952cff57) ·domain:specseat 2 (session_017VaLJnYwhPsanVCe9dMCJU) · 2026-10-01T10:16Z83d99268a3(at-tier PASS5928772191).component.test.tshave the same blob in the merge commit as at the head.component.zod.ts,conversions/registry.tsandcomponent.mdxreached the queue after PR feat(spec)!: action:button / action:icon refuseendpointwith ActionSchema's rename totarget, read from one table (#21005) #21122 (finding(spec):action:button/action:iconacceptendpoint, the keyActionSchemarefuses with the prescriptionendpoint→target: one concept, two verdicts in one release #21005) landed. For each one, the delta from this head to the merge has the samegit patch-id --stableas PR feat(spec)!: action:button / action:icon refuseendpointwith ActionSchema's rename totarget, read from one table (#21005) #21122's own change (da4d084e4eda,dc3e0a726923,df324c2024e0), so this PR's hunks landed intact.migrations/registry.ts, and the old "unchanged on thekanban-ui" phrasing is in none.origin/main.Fixes #21017only. This card closedcompleted, and no other card was named.pm:dispatchedcomes off in this act. The released 17.5.0 CHANGELOG text is carried by docs(spec): the released 17.5.0 CHANGELOG entry still says theobject-kanbanquick-add control "stays on thekanban-uiblock", a block objectui does not register (docs-only amendment after #21017) #21143.Generated by Claude Code
fix(spec): the object-kanban quickAdd retirement prescribes "delete t…