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
packages: the publish-drafts door publishes with the default note when the whole body is not an object (array, string, number) #28541
Filing gate: ① residual recorded by the CONTRACT_REVIEW_TIER review of PR #28527 (comment 6553704063, ③), carried to its own card by domain:server seat 2. ⛔ Not a claim. No grade: triage sets the lane and grade.
Reach: an API or SDK caller of POST /packages/:id/publish-drafts that sends a body that is not a JSON object (an array, a string or a number).
Reader who acts: domain:server (packages/runtime/src/domains/packages.ts).
A whole body that is not an object has no message to read, so the door still publishes with the default note and answers 200. PublishPackageDraftsRequestSchema would refuse that body as a whole.
The PR body states this residual. The card's ruling named message only, so it was left as it was.
Wanted (route is triage's)
Decide whether the door refuses a body that is not an object with the schema's own refusal (400 VALIDATION_ERROR, in the envelope the sibling package doors use), keeping an absent body as "no body". That would be a narrowing (Clause-②: no (narrowing)) and would owe a contract review.
Dedupe
Searched open issues for publish-drafts body: only #28452 (the message half, landing in PR #28527). New.
Claim: PM loop round 4 · card thread · 2026-11-01T06:06Z
Session: session_0186vfjHHMsRXC9EUT9hTFMo (the seat); the card thread is session_01FEkQ5m1btDPnuG9fbECLtg
Account: os-project-manager (the seat's linked user; the card's assignee)
Branch: claude/project-thread-i4gkt8 (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
Worktree: the card thread's own container checkout
Domain: domain:server
Seat: domain:server#2
Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」. The card is ungraded (filed by this seat from the PR #28527 contract review's residual, 6553704063 ③); it is dispatched under the 11-01 line while the seat's decision card to the maintainer is open. A present body that is not a JSON object is refused 400 VALIDATION_ERROR in the sibling doors' envelope; an absent body stays "no body". ⛔ No actor change (#28414), ⛔ no change to the single backfill refusal.
File surface: packages/runtime/src/domains/packages.ts (the POST /packages/:id/publish-drafts branch), packages/runtime/src/domains/packages-publish-drafts-request-conformance.test.ts, the route-ledger row note if it describes the body, tests, and a changeset.
Container & model: M, mode:thread, model: opus (--tier names no path mandate: PM's call, default), effort: high
Clause-②: no (narrowing — a non-object body answered 200 today is refused 400; a contract review at CONTRACT_REVIEW_TIER is owed before the queue)
Metadata-protocol: none (expected; the dev measures and declares)
Responsibility: the code is the runtime's package publish-drafts door · the platform path is the package history note that door stamps · reached by an API or SDK caller that sends a body that is not a JSON object
Thread-read: none
Premise: holds (read 2026-11-01T06:06Z at origin/main: since PR #28527 the door judges only body?.message, so a non-object body publishes with the default note); the dev re-measures first
Serial constraints cleared: PR #28527 merged; open PR #28512 and #28411's branch may touch packages.ts, and the dev re-reads them and does not edit their hunks
Resume-from: none — fresh from origin/main
State: → pm:dispatched, assigned to os-project-manager, recorded by this claim.
os-dev-report
{
"issue": 28541,
"status": "done",
"branch": "claude/project-thread-i4gkt8",
"pr": "#28593",
"session": "session_01FEkQ5m1btDPnuG9fbECLtg",
"premise_still_valid": true,
"summary": "POST /packages/:id/publish-drafts now refuses a present body that is not a JSON object (array, string, number, boolean) with PublishPackageDraftsRequestSchema's own whole-body issue, 400 VALIDATION_ERROR via deps.error(text, 400) (the envelope #28527 and the install door use), before anything is published. Placed just before #28527's message parse, after the 404; the whole-body parse runs only for a non-object body, so backfill keeps its one protocol refusal and a non-string message keeps #28527's sentence. No body stays a publish with the default note: measured through the real Hono transport, absent / empty bodies arrive as {} and JSON null as null (in-process: undefined), none refused. Pins extended in the request-conformance suite and the real-SQLite change-note integration suite; route-ledger row note updated; runtime patch changeset with BREAKING banner and ADR-0087 not-required marker. PR #28512 landed on packages.ts mid-run, so origin/main was merged in (clean) and every reading is on merged head 5cb5e1b.",
"tests": "Red first: packages.ts from origin/main with the new tests → 2 new cases red ('[]: expected 200 to be 400'), 13 green. Green at the fix: request-conformance + change-note integration + route-ledger tests 23/23. Ablation via scripts/ablation-replace.mjs (object check → 'if (false && ...)'): anchor 1→0, blob 1f8629c8d362→4fe1e2242c0e, both new cases red, 13 controls green, restore blob == HEAD and git diff HEAD empty (runtime tests import the door from src/, no build between). Transport probe (scratch vitest in plugin-hono-server, deleted): no body / no body as JSON / empty JSON body → req.body {}; 'null' → null; '[]','"x"','42' → array, string, number. On head 5cb5e1b: pnpm --filter @objectstack/runtime typecheck exit 0 (check:test-typecheck OK); pnpm --filter @objectstack/runtime test → Test Files 500 passed (500), Tests 8141 passed | 19 skipped (8160).",
"gates": "On head 5cb5e1b after full pnpm build --concurrency=2 (VERDICT command-exit 0, 117/117 tasks). dispatch-gates --commands derived 63 (same list before and after the merge); each run with stdin closed, exit captured before any pipe; --ran: '63 derived famil(ies) accounted for — 63 run, 0 NOT-MEASURED'. First read of check:type-check-debt was exit 3 NOT MEASURED (its re-measure build queued behind this PR's own dogfood on the verify lock, queue-timeout 99); re-run under the lock: exit 0. Hand: check-platform-checklist --changed-from origin/main exit 0; check-commit-card-trailers --range origin/main..HEAD exit 0; eslint packages/runtime --no-inline-config exit 0. PR check-runs: in_progress at report time (seat reads CI).",
"dogfood_battery": "5cb5e1b8 · os-verify-lock: VERDICT command-exit 0 · held the lock 1408s (23m28s) · Test Files 363 passed | 3 skipped (366) · Tests 2932 passed | 28 skipped (2960) · no failures",
"mcp_calls": "7 — read-only: issue_read x3 (get, get_comments x2), pull_request_read x3 (get #28512 x2, get_files #28411 → 404, it is not a PR), list_pull_requests x1; no MCP write",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no labels, no assignees, read-back identical) and this os-dev-report comment (POST /repos//issues/28541/comments); plus git push of the harness branch (not REST)",
"open_questions": [],
"out_of_scope_findings": [],
"deviations": "(1) The fix was committed before the red-first run; red was then measured by checking packages.ts out from origin/main with the new tests in place and restoring from HEAD (restore verified by git diff HEAD empty). (2) Booleans true/false are also refused and pinned: the ruling lists array/string/number as examples of a present non-object body, and the schema refuses booleans the same way. (3) JSON null stays 'no body' per the order even though the schema refuses null. (4) The first push was refused by check:commit-card-trailers (model name in the co-author trailer); the three unpublished commits were reworded to the model-free pair before any push. (5) No spec docblock change: nothing in PublishPackageDraftsRequestSchema's docblock becomes false."
}
Landed (Fixes): merged as d94dd3a6. POST /packages/:id/publish-drafts refuses a present body that is not a JSON object (an array, a string, a number, a boolean) with 400 VALIDATION_ERROR in the sibling package doors' envelope. Nothing is published and no history row is written.
Activity
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Claim: PM loop round 4 · card thread · 2026-11-01T06:06Z
Session:
session_0186vfjHHMsRXC9EUT9hTFMo(the seat); the card thread issession_01FEkQ5m1btDPnuG9fbECLtgAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-i4gkt8(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#2Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」. The card is ungraded (filed by this seat from the PR #28527 contract review's residual,
6553704063③); it is dispatched under the 11-01 line while the seat's decision card to the maintainer is open. A present body that is not a JSON object is refused 400VALIDATION_ERRORin the sibling doors' envelope; an absent body stays "no body". ⛔ Noactorchange (#28414), ⛔ no change to the singlebackfillrefusal.File surface:
packages/runtime/src/domains/packages.ts(thePOST /packages/:id/publish-draftsbranch),packages/runtime/src/domains/packages-publish-drafts-request-conformance.test.ts, the route-ledger row note if it describes the body, tests, and a changeset.Container & model:
M,mode:thread,model: opus(--tiernames no path mandate: PM's call, default),effort: highClause-②: no (narrowing — a non-object body answered 200 today is refused 400; a contract review at
CONTRACT_REVIEW_TIERis owed before the queue)Metadata-protocol: none (expected; the dev measures and declares)
Responsibility: the code is the runtime's package publish-drafts door · the platform path is the package history note that door stamps · reached by an API or SDK caller that sends a body that is not a JSON object
Thread-read: none
Premise: holds (read 2026-11-01T06:06Z at
origin/main: since PR #28527 the door judges onlybody?.message, so a non-object body publishes with the default note); the dev re-measures firstSerial constraints cleared: PR #28527 merged; open PR #28512 and #28411's branch may touch
packages.ts, and the dev re-reads them and does not edit their hunksResume-from: none — fresh from
origin/mainState: →
pm:dispatched, assigned toos-project-manager, recorded by this claim.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
os-dev-report
{
"issue": 28541,
"status": "done",
"branch": "claude/project-thread-i4gkt8",
"pr": "#28593",
"session": "session_01FEkQ5m1btDPnuG9fbECLtg",
"premise_still_valid": true,
"summary": "POST /packages/:id/publish-drafts now refuses a present body that is not a JSON object (array, string, number, boolean) with PublishPackageDraftsRequestSchema's own whole-body issue, 400 VALIDATION_ERROR via deps.error(text, 400) (the envelope #28527 and the install door use), before anything is published. Placed just before #28527's message parse, after the 404; the whole-body parse runs only for a non-object body, so backfill keeps its one protocol refusal and a non-string message keeps #28527's sentence. No body stays a publish with the default note: measured through the real Hono transport, absent / empty bodies arrive as {} and JSON null as null (in-process: undefined), none refused. Pins extended in the request-conformance suite and the real-SQLite change-note integration suite; route-ledger row note updated; runtime patch changeset with BREAKING banner and ADR-0087 not-required marker. PR #28512 landed on packages.ts mid-run, so origin/main was merged in (clean) and every reading is on merged head 5cb5e1b.",
"tests": "Red first: packages.ts from origin/main with the new tests → 2 new cases red ('[]: expected 200 to be 400'), 13 green. Green at the fix: request-conformance + change-note integration + route-ledger tests 23/23. Ablation via scripts/ablation-replace.mjs (object check → 'if (false && ...)'): anchor 1→0, blob 1f8629c8d362→4fe1e2242c0e, both new cases red, 13 controls green, restore blob == HEAD and git diff HEAD empty (runtime tests import the door from src/, no build between). Transport probe (scratch vitest in plugin-hono-server, deleted): no body / no body as JSON / empty JSON body → req.body {}; 'null' → null; '[]','"x"','42' → array, string, number. On head 5cb5e1b: pnpm --filter @objectstack/runtime typecheck exit 0 (check:test-typecheck OK); pnpm --filter @objectstack/runtime test → Test Files 500 passed (500), Tests 8141 passed | 19 skipped (8160).",
"gates": "On head 5cb5e1b after full pnpm build --concurrency=2 (VERDICT command-exit 0, 117/117 tasks). dispatch-gates --commands derived 63 (same list before and after the merge); each run with stdin closed, exit captured before any pipe; --ran: '63 derived famil(ies) accounted for — 63 run, 0 NOT-MEASURED'. First read of check:type-check-debt was exit 3 NOT MEASURED (its re-measure build queued behind this PR's own dogfood on the verify lock, queue-timeout 99); re-run under the lock: exit 0. Hand: check-platform-checklist --changed-from origin/main exit 0; check-commit-card-trailers --range origin/main..HEAD exit 0; eslint packages/runtime --no-inline-config exit 0. PR check-runs: in_progress at report time (seat reads CI).",
"dogfood_battery": "5cb5e1b8 · os-verify-lock: VERDICT command-exit 0 · held the lock 1408s (23m28s) · Test Files 363 passed | 3 skipped (366) · Tests 2932 passed | 28 skipped (2960) · no failures",
"mcp_calls": "7 — read-only: issue_read x3 (get, get_comments x2), pull_request_read x3 (get #28512 x2, get_files #28411 → 404, it is not a PR), list_pull_requests x1; no MCP write",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no labels, no assignees, read-back identical) and this os-dev-report comment (POST /repos//issues/28541/comments); plus git push of the harness branch (not REST)",
"open_questions": [],
"out_of_scope_findings": [],
"deviations": "(1) The fix was committed before the red-first run; red was then measured by checking packages.ts out from origin/main with the new tests in place and restoring from HEAD (restore verified by git diff HEAD empty). (2) Booleans true/false are also refused and pinned: the ruling lists array/string/number as examples of a present non-object body, and the schema refuses booleans the same way. (3) JSON null stays 'no body' per the order even though the schema refuses null. (4) The first push was refused by check:commit-card-trailers (model name in the co-author trailer); the three unpublished commits were reworded to the model-free pair before any push. (5) No spec docblock change: nothing in PublishPackageDraftsRequestSchema's docblock becomes false."
}
Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo
Landing record · #28541 · PR #28593
domain:serverseat 2 ·session_0186vfjHHMsRXC9EUT9hTFMo· 2026-11-01T07:52Zgit ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28593-*'git merge-base --is-ancestor d94dd3a6 origin/maingit grep -c "Array.isArray(body)" origin/main -- packages/runtime/src/domains/packages.tsd94dd3a6.POST /packages/:id/publish-draftsrefuses a present body that is not a JSON object (an array, a string, a number, a boolean) with 400VALIDATION_ERRORin the sibling package doors' envelope. Nothing is published and no history row is written.{}, an absent body, an empty JSON body and JSONnullstill read as "no body".actor, the singlebackfillrefusal and fix(runtime)!: the publish-drafts door refuses a non-string change note 400 VALIDATION_ERROR naming message (#28452) #28527's non-stringmessagerefusal are unchanged.nullis refused by the schema but accepted by the door) predates this PR and is recorded in the reviews of fix(runtime)!: the publish-drafts door refuses a non-string change note 400 VALIDATION_ERROR naming message (#28452) #28527 and fix(runtime)!: the publish-drafts door refuses a body that is not a JSON object 400 VALIDATION_ERROR (#28541) #28593.Release: claim
6554240344(session_0186vfjHHMsRXC9EUT9hTFMo, branchclaude/project-thread-i4gkt8) · landed.pm:dispatchedremoved; assignee cleared; the card closed on merge.Generated by Claude Code