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
objectql: a composed stack's residual top-level picklist that no object names is neither registered nor refused #28159
Filing gate: ① found by the contract review of PR #28153 (#28093, record 6525505738, should-fix #3) outside that PR's surface. Filed by domain:server seat 4. ⛔ Not a claim. No grade: triage sets the lane and grade.
What the code does (read)
PR #28153 registers a composed stack's residual top-level items (declared only on the stack's top level, beside package bodies) of every registry type in the engine registry, except object (own path) and picklist. Picklists stay metadata-only on purpose. The residual objects rule already judges an object whose field names a residual-only picklist as "listed and not served", and registering residual picklists would move that line.
So a residual picklist that no object references is the one listed type that is neither registered nor refused at boot. Its absence is loud only through an object that names it. #28093's triage says "no type is dropped silently". No security stake: picklist is allowEnvironmentOverlay: false, allowRuntimeCreate: false, so a save over one is refused either way.
Wanted (route is triage's)
Either register a residual picklist the way the body seam does, moving the residual objects rule's line with it, or refuse an unreferenced residual picklist loudly at boot with a prescription.
Dedupe
Read open titles for picklist + residual, top-level picklist: none. New.
Read fresh. A residual top-level picklist that no object names is the one listed type that is neither registered nor refused, so it is dropped silently. There is no security stake, because a save over it is refused either way.
The route is the card's second option: refuse an unreferenced residual picklist loudly at boot, with a prescription. That leaves the residual objects rule's line where it is. If the dev measures that registering it is cleaner, the PR states the moved line and pins both sides.
Claim: PM loop · 2026-10-30T15:35Z · triage first touch 6525964223
Session: session_016WV4d1Np3hU7RQnA13YZcL (seat subagent)
Account: os-elon-musk
Branch: claude/project-thread-kwainq
Worktree: objectstack-issue-28159
Domain: domain:server
Seat: domain:server#4
File surface: packages/objectql/src/plugin.ts (the residual registration in the manifest service: a residual top-level picklist that no object names), its tests (manifest-service-residual-*.test.ts), .changeset/*; ⛔ no packages/spec, no engine.ts, no governed path
Container & model: S, mode:subagent, model: default (TIER_DEFAULT), effort: medium; contract review owed if the diff refuses at boot what booted before (expected: a narrowing face)
Clause-②: yes (narrowing) expected — a residual picklist no object names, silently dropped today, refuses the boot with a prescription (triage's route); the dev confirms the arm from the diff, or states the moved line if registering it measures cleaner
Metadata-protocol: none
Responsibility: a composed stack's residual top-level picklist that no object names is neither registered nor refused, so it is dropped silently; the platform path that covers it is the manifest service's residual registration refusing it loudly at boot with a prescription; reached by every composed stack that declares such a picklist.
Thread-read: 6525964223
Premise: holds (card at origin/main412908cf)
Serial constraints cleared: PR #28153 (#28093, same plugin.ts method) is in the merge queue; work starts from main after it merges.
{
"issue": 28159,
"status": "done",
"branch": "claude/project-thread-kwainq",
"pr": "#28231",
"session": "session_016WV4d1Np3hU7RQnA13YZcL",
"premise_still_valid": true,
"summary": "A composed stack (with packages[]) whose top level declares a picklist that no package body declares and no object field names booted on main, and the list was missing from the engine registry with nothing said. The manifest service now refuses such an artifact before anything of it registers. It uses the existing picklist envelope picklistMetadataError (INVALID_METADATA, 422), and the message names each picklist and the stack and gives the three remedies the triage named. Whether a field names the list is judged off the artifact alone (its top level and every body, objects and objectExtensions, through collectManifestPicklistReferences), never off the registry. A residual picklist that a field names keeps today's behaviour, so the residual objects rule's line does not move. File surface: packages/objectql/src/plugin.ts (residual registration only), manifest-service-residual-objects.test.ts, and one changeset.",
"tests": "Measured on main 35f2055: the unreferenced residual picklist booted (state=running, resolvePicklistOptions undefined, no warning names it); packages:[] with only that picklist also booted; CONTROL: a picklist a residual object field names booted with 1 listed-not-served warning and the list unregistered; CONTROL: a body-declared picklist resolved to [open]. After the fix the first two are refused with INVALID_METADATA and both controls are unchanged. New pins: 9 in a new describe block. On main plugin.ts, 4 red and 5 green; on the branch, 9/9 green. Both residual files 72/72. Ablations, each restored with git restore --source=HEAD: A1 drop the throw: the 4 refusal pins red; A2 treat no list as named: 4 red (both field-named controls, the several-in-one pin, and the existing listed-not-served pin); A3 count top-level references only: 1 red (the body-field audit control); A4 take every top-level picklist, not only the residual: 2 red (the body-declared control and the no-packages[] control); A5 refuse whenever there is a residual: 52 red, the no-residual-picklist control among them. On merge head b4c7653: @objectstack/objectql 499 files / 9732 tests pass; runtime 490 files, 8855 pass and 19 skipped; metadata 64 files / 906 pass; objectql typecheck exit 0.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on b4c7653 (merges main 7811c3f) derived 61 families. All 61 were run with exit codes recorded before any pipe, and all 61 exited 0. --ran: 61 run, 0 NOT-MEASURED (derived zero), 0 UNRUN, exit 0. The first pass on 000e900 recorded check:dual-build-cjs-loads at exit 3 (no dist). After a full build with declarations it exited 0. Outside the 61, NOT MEASURED locally, and CI runs them: 4 families that take a value from the workflow, 5 CI jobs scheduled by these paths, and 5 type-check lanes. pnpm lint: exit 0. PR check-runs: not yet read.",
"dogfood_battery": "b4c76532 · os-verify-lock: VERDICT command-exit 0 · Test Files 359 passed | 3 skipped (362) · Tests 2891 passed | 20 skipped (2911) · no failures",
"mcp_calls": "0",
"api_writes": "2 through the fleet-write relay: pr_create (PR #28231, a draft, assignee os-elon-musk mirroring the card) and this comment through post-stamped. git push x3 (not a REST write).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat · noted, not filed — Clause-② arm: yes (narrowing). A composition that booted now refuses at boot, so the PR title carries the ! marker. Metadata-protocol: none, because no Zod key, value or type changes: the picklist schema accepts what it accepted, and the refusal is a composition-time runtime judgement. The ADR-0087 disposition is not-required (no-migration-prescription).",
"carrier: seat · noted, not filed — A residual picklist that no field names but that a picklistExtensions entry extends is now refused by this refusal at register time. Before, it was refused by the kernel:ready audit as an orphan extension. It is refused either way, and only the message changes. No pin covers this case.",
"carrier: seat · noted, not filed — Instruction conflict: .claude/agents/os-dev.md says the PR carries no assignees, while AGENTS.md says the PR assignee mirrors the card and the executor sets it at pr_create. I followed AGENTS.md, which wins.",
"carrier: seat · noted, not filed — Deviations: the builds, the objectql/runtime/metadata suites and the gate sweeps ran without os-verify-lock (turbo --concurrency=4, vitest --maxWorkers 3-4). Only the dogfood battery ran under the lock. The relay call for pr_create hit my timeout 110 (exit 124) while it waited for the run. The PR was confirmed once by REST read, and its body read back as a strict prefix with the platform newline appended. Nothing was re-sent."
]
}
ACCEPT → PR #28231 comment 6532564085 · head a2fb76a0 · 2026-10-30T20:19Z · landing sent (contract review PASS on the narrowing face, record 6532447134). Follow-up #28248 (author-time door + residual-rule prose).
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 错的必须被响亮拒绝并给处方 | none | P②
Triage: p2 ·
domain:server·area:data·pm:queue· 2026-10-30T15:03Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
Claim: PM loop · 2026-10-30T15:35Z · triage first touch 6525964223
Session:
session_016WV4d1Np3hU7RQnA13YZcL(seat subagent)Account:
os-elon-muskBranch:
claude/project-thread-kwainqWorktree:
objectstack-issue-28159Domain:
domain:serverSeat:
domain:server#4File surface:
packages/objectql/src/plugin.ts(the residual registration in themanifestservice: a residual top-level picklist that no object names), its tests (manifest-service-residual-*.test.ts),.changeset/*; ⛔ nopackages/spec, noengine.ts, no governed pathContainer & model:
S,mode:subagent,model: default (TIER_DEFAULT),effort: medium; contract review owed if the diff refuses at boot what booted before (expected: a narrowing face)Clause-②: yes (narrowing) expected — a residual picklist no object names, silently dropped today, refuses the boot with a prescription (triage's route); the dev confirms the arm from the diff, or states the moved line if registering it measures cleaner
Metadata-protocol: none
Responsibility: a composed stack's residual top-level picklist that no object names is neither registered nor refused, so it is dropped silently; the platform path that covers it is the
manifestservice's residual registration refusing it loudly at boot with a prescription; reached by every composed stack that declares such a picklist.Thread-read: 6525964223
Premise: holds (card at
origin/main412908cf)Serial constraints cleared: PR #28153 (#28093, same
plugin.tsmethod) is in the merge queue; work starts frommainafter it merges.objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
os-dev-report
{
"issue": 28159,
"status": "done",
"branch": "claude/project-thread-kwainq",
"pr": "#28231",
"session": "session_016WV4d1Np3hU7RQnA13YZcL",
"premise_still_valid": true,
"summary": "A composed stack (with packages[]) whose top level declares a picklist that no package body declares and no object field names booted on main, and the list was missing from the engine registry with nothing said. The manifest service now refuses such an artifact before anything of it registers. It uses the existing picklist envelope picklistMetadataError (INVALID_METADATA, 422), and the message names each picklist and the stack and gives the three remedies the triage named. Whether a field names the list is judged off the artifact alone (its top level and every body, objects and objectExtensions, through collectManifestPicklistReferences), never off the registry. A residual picklist that a field names keeps today's behaviour, so the residual objects rule's line does not move. File surface: packages/objectql/src/plugin.ts (residual registration only), manifest-service-residual-objects.test.ts, and one changeset.",
"tests": "Measured on main 35f2055: the unreferenced residual picklist booted (state=running, resolvePicklistOptions undefined, no warning names it); packages:[] with only that picklist also booted; CONTROL: a picklist a residual object field names booted with 1 listed-not-served warning and the list unregistered; CONTROL: a body-declared picklist resolved to [open]. After the fix the first two are refused with INVALID_METADATA and both controls are unchanged. New pins: 9 in a new describe block. On main plugin.ts, 4 red and 5 green; on the branch, 9/9 green. Both residual files 72/72. Ablations, each restored with git restore --source=HEAD: A1 drop the throw: the 4 refusal pins red; A2 treat no list as named: 4 red (both field-named controls, the several-in-one pin, and the existing listed-not-served pin); A3 count top-level references only: 1 red (the body-field audit control); A4 take every top-level picklist, not only the residual: 2 red (the body-declared control and the no-packages[] control); A5 refuse whenever there is a residual: 52 red, the no-residual-picklist control among them. On merge head b4c7653: @objectstack/objectql 499 files / 9732 tests pass; runtime 490 files, 8855 pass and 19 skipped; metadata 64 files / 906 pass; objectql typecheck exit 0.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on b4c7653 (merges main 7811c3f) derived 61 families. All 61 were run with exit codes recorded before any pipe, and all 61 exited 0. --ran: 61 run, 0 NOT-MEASURED (derived zero), 0 UNRUN, exit 0. The first pass on 000e900 recorded check:dual-build-cjs-loads at exit 3 (no dist). After a full build with declarations it exited 0. Outside the 61, NOT MEASURED locally, and CI runs them: 4 families that take a value from the workflow, 5 CI jobs scheduled by these paths, and 5 type-check lanes. pnpm lint: exit 0. PR check-runs: not yet read.",
"dogfood_battery": "b4c76532 · os-verify-lock: VERDICT command-exit 0 · Test Files 359 passed | 3 skipped (362) · Tests 2891 passed | 20 skipped (2911) · no failures",
"mcp_calls": "0",
"api_writes": "2 through the fleet-write relay: pr_create (PR #28231, a draft, assignee os-elon-musk mirroring the card) and this comment through post-stamped. git push x3 (not a REST write).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat · noted, not filed — Clause-② arm: yes (narrowing). A composition that booted now refuses at boot, so the PR title carries the ! marker. Metadata-protocol: none, because no Zod key, value or type changes: the picklist schema accepts what it accepted, and the refusal is a composition-time runtime judgement. The ADR-0087 disposition is not-required (no-migration-prescription).",
"carrier: seat · noted, not filed — A residual picklist that no field names but that a picklistExtensions entry extends is now refused by this refusal at register time. Before, it was refused by the kernel:ready audit as an orphan extension. It is refused either way, and only the message changes. No pin covers this case.",
"carrier: seat · noted, not filed — Instruction conflict: .claude/agents/os-dev.md says the PR carries no assignees, while AGENTS.md says the PR assignee mirrors the card and the executor sets it at pr_create. I followed AGENTS.md, which wins.",
"carrier: seat · noted, not filed — Deviations: the builds, the objectql/runtime/metadata suites and the gate sweeps ran without os-verify-lock (turbo --concurrency=4, vitest --maxWorkers 3-4). Only the dogfood battery ran under the lock. The relay call for pr_create hit my timeout 110 (exit 124) while it waited for the run. The PR was confirmed once by REST read, and its body read back as a strict prefix with the platform newline appended. Nothing was re-sent."
]
}
objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
ACCEPT → PR #28231 comment 6532564085 · head
a2fb76a0· 2026-10-30T20:19Z · landing sent (contract review PASS on the narrowing face, record 6532447134). Follow-up #28248 (author-time door + residual-rule prose).objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
Landed · 2026-10-30T20:44Z
35ffb779(merge queue)completedbyFixes #28159State:
pm:dispatchedremoved in this stroke.