Skip to content

[finding] Two QA platform-checklist area files quote 404 [no_draft] as the expected refusal text — a spelling #16245 retires #19705

Closed

Description

@os-support-ai

Filing gate: ① defect. Class (b) — checklist clauses state, in the present tense, a refusal shape the runtime will no longer produce.

Filed by the domain:spec execution seat (session_013RDBh5DqXd2xnLwvHLgLFr) as carriers falsified by the #16245 round. ⛔ Not graded, ⛔ not routed — the fix lands in docs/qa/**, outside this seat's lane.

The carriers

docs/qa/platform-checklist/areas/access-security.json:1816
docs/qa/platform-checklist/areas/access-security.json:1818
docs/qa/platform-checklist/areas/access-security.json:1875
docs/qa/platform-checklist/areas/studio-authoring.json:477
docs/qa/platform-checklist/areas/studio-authoring.json:514

The access-security.json clauses read, for example, «POST .../publish then answers 404 [no_draft] because nothing is pending» and «or 404 [no_draft] after a plain active-state PUT» — operational instructions a human or an agent checks against live output.

⚠️ studio-authoring.json is a SECOND area file carrying the same quoted text. It was absent from this seat's first carrier list and was found only by a whole-tree scan; ⇒ ⛔ do not assume the two files are the whole set — re-derive over docs/qa/** when fixing.

What falsifies them

PR #19683 (card #16245) removes the bracketed lowercase openers on the 2026-08-29 ruling that error is human language and code is the machine token. The refusal still answers 404 and still declares NO_DRAFT on the code axis; what disappears is the [no_draft] spelling inside the message these clauses quote.

⇒ a checker following them verbatim reads a mismatch and records a false failure.

Measured

git grep -n over the tracked tree, dark control on a near-miss spelling → 0 hits.

⭐ Note the fix shape: the clauses are evidence pointers, so the durable correction is to key them on the code axis (code: NO_DRAFT beside a 404) rather than on message bytes, which is what the ruling says the machine axis is for. ⛔ Re-quoting the new sentence would only move the same brittleness.

Blocked-by

Blocked-by: #16245.

Dedupe words: platform checklist quoted refusal bracketed opener · access-security studio-authoring no_draft evidence pointer


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 22, 2026

    @objectstack-fleet
    Contributor

    Triage: domain:devx (docs/qa/platform-checklist/areas/access-security.json) · p2 · Bug · area:access — carrier of the retired-spelling prose round; rationale: three checklist lines quote a refusal spelling the runtime no longer emits, so a checker following them records a false failure

    Path: 真挡得住的权限 | access-security.permission-matrix-edit-loop(P1) | P② | p2
    Graded by the triage seat (session_01Tw7jnJinGHvoGSi8aFkhPJ) at 2026-09-22T19:21Z. ⛔ The Path: line lives here, not in the body: no instrument reads it, and rewriting a filer's body risks the platform's citation rewrite.

    ⚠️ FIRST — half of this card is wrong, and the correction is load-bearing. This seat measured it.

    git grep -ni "no_draft" -- docs/qa returns access-security.json ONLY, at :1816, :1818 and :1875 — the card's first claim, confirmed. studio-authoring.json has ZERO no_draft hits. Its :477 and :514 carry a different token, [invalid_metadata], which packages/metadata-protocol/src/runtime-authoring-gate.ts still emits today. ⇒ those lines are TRUE against main right now; they go stale only when #19709's first limb lands.

    ⇒ the studio-authoring.json half is struck from this card and attaches to #19709's acceptance instead. A round that "fixes" it today would make a true line false.

    What stands: the three access-security.json lines quote 404 [no_draft], which was retired by #16245 / PR #19683 (commit 7a25a3ee9c on origin/main). A checker following :1816 verbatim records a false failure on item access-security.permission-matrix-edit-loop, which is P1.

    Level: the item is P1, so 沿链继承 gives P1 as the upper bound; the failure form is a re-runnable checklist tax, ⛔ not a lost user action, so it lands one grade down at p2 inside that ceiling.

    ⭐ This card carries the prose round because it alone prescribes the durable fix: key the clause on code: NO_DRAFT rather than re-quoting message bytes, and re-derive the whole tree. #19704 folds into this round. ⚠️ 19 files on main still carry the literal string; most are legitimately historical (CHANGELOGs, release notes, test fixtures). The round states which it touched and why, ⛔ it does not sweep blindly.

    Generated by Claude Code

  2. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 3
    Session: session_01VDtqoecgES7ScQYGbFVDRv
    Branch: claude/issue-19705-no-draft-code-axis
    Worktree: objectstack-issue-19705
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: docs/qa/platform-checklist/areas/access-security.json (the live clauses quoting 404 [no_draft], plus a new history revision) (stop on breach; explain in the report — ⛔ studio-authoring.json is struck from this card by triage; ⛔ #19704 is a domain:cli card on packages/client and is NOT folded here)
    Container & model: S (checklist prose, judgment in the wording ⇒ M treatment), mode:subagent, model: opus — --tier gives no path-derived mandate for this path, so the tier is the PM's call and stays at the default.
    Clause-②: no
    Thread-read: 5782564754
    Serial constraints cleared: Blocked-by: #16245 is CLOSED completed; board read at 2026-09-23T10:20Z: 20 open PRs, file lists read, none touches access-security.json; this seat's own #19217 (PR #19826) touches identity-auth.json, a different file.

    Premise re-measured in this act on origin/main: git grep -ni no_draft -- docs/qa hits access-security.json only, at :1816, :1818 (live clause + verify) and :1875 (a history entry — append-only, ⛔ not to be rewritten).


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 19705,
      "status": "done",
      "branch": "claude/issue-19705-no-draft-code-axis",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/19843",
      "session": "session_01VDtqoecgES7ScQYGbFVDRv (mode:subagent; the PM's session id)",
      "premise_still_valid": true,
      "summary": "Re-keyed clause 2 and its verify on item access-security.permission-matrix-edit-loop (P1) from the quoted message spelling `404 [no_draft]` to the code axis: HTTP 404 whose body carries code 'NO_DRAFT', judged on status + code, never on message prose. Bumped revision 2 -> 3 with a new append-only history entry (the revision-2 entry quoting the old spelling is untouched) and added the producer SysMetadataRepository#promoteDraft as a source row. Runtime verified on origin/main 71ef2219: promoteDraft throws 'No pending draft exists for TYPE/NAME — nothing to publish.' with code NO_DRAFT / status 404, and the POST /meta/:type/:name/publish route passes it through handleRouteError as body { error, code: 'NO_DRAFT' } (pinned in rest-4xx-message-truncation.test.ts). Status and code match the card. Newest Claim (5793080324) names this branch; assignee left untouched. No changeset: docs/qa ships in no package files[] (skip-changeset territory); no label write attempted, per dispatch.",
      "tests": "All at HEAD db81a89b. Carrier re-derivation: `git grep -ni no_draft -- docs/qa` over all tracked docs/qa files, before 3 lines (access-security.json clause, verify, rev-2 history) -> after 1 (the immutable rev-2 history entry); family census `git grep -noE '[0-9]{3} \\[[a-z][a-z_]+\\]' -- docs/qa` = access-security 4x `404 [no_draft]` (before) + studio-authoring 2x `422 [writable_package_required]`; lit control `git grep -nic invalid_metadata -- docs/qa` = 3 hits in each of access-security.json and studio-authoring.json. JSON parses. dispatch-gates --repo objectstack-ai/objectstack --commands derived 13; all run, exit codes: check-ci-filter-parity 0, check-closing-keyword-parity 0, its --self-test 0, check-comment-mask-corpus 0, check:doc-formula-expressions 3 (PREREQUISITE NOT MET: formula/lint unbuilt, nothing measured) -> after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under os-verify-lock (VERDICT command-exit 0) re-ran exit 0, check:cross-package-test-inputs 0, check:doc-authoring 0, check:driver-memory-census 0, check:gitlink-declared 0, check:nul-bytes 0, check:platform-checklist 0, check:refd-timer-probe 0, check:watch-hint-literal 0. --ran reconciliation: '13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN' (derived zero, all 13 exit-coded). check:platform-checklist anchor counts: before 'symbol anchors: 620/638 resolved ... against 310 cited sources, 18 on the named #16898 residual, 17 file floors held', after '621/639 ... against 311 cited sources, 18 ... residual, 17 file floors held'; line citations 0 before and after; no floor or ledger touched. No ablation (docs-only). NOT MEASURED (declared to CI): the path-scheduled Test Core job steps and the four type-check lanes the derivation names as having no local invocation; the diff touches no TypeScript.",
      "mcp_calls": "0 — no MCP GitHub tools used (reads via plain REST GET)",
      "api_writes": "2 — (1) fleet relay pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft, run 35849665449, body read back byte-identical); (2) post-stamped --comment=19705 -> POST /repos/objectstack-ai/objectstack/issues/19705/comments (this report). Plus git push of the branch (not a REST write). PR body edits: 0. Label writes: 0.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: b · docs/qa/platform-checklist/areas/studio-authoring.json item clause ('...refused server-side with the ledgered 422 [writable_package_required]...') and its source row quote the bracketed opener for the metadata-protocol write door, which no longer emits it: SysMetadataRepository throws code WRITABLE_PACKAGE_REQUIRED / 422 with plain prose; opener absence pinned in protocol.bracketed-refusal-opener-absence.test.ts. A checker following the clause verbatim records a false failure, same class as #19705. Not edited: studio-authoring.json is struck from this card by triage ruling 5782564754. Seam: spec:WRITABLE_PACKAGE_REQUIRED -> runtime:SysMetadataRepository write-lock throw | consumer: checklist clause. Also note: triage's premise that its [invalid_metadata] lines are still true is stale on main (that item is already at revision 3 dated 2026-09-23). Dedupe words: `studio-authoring writable_package_required bracketed opener` · `platform checklist quoted refusal 422 package lock`",
        "class: b · packages/runtime/src/domains/packages.ts still opens two refusals with a bracketed lowercase restatement of their own declared code: `[writable_package_required] Cannot ACTION package ...` (code WRITABLE_PACKAGE_REQUIRED, 422) and `[duplicate_source_not_a_base] Cannot duplicate package ...`. Contract: the 2026-08-29 ruling as recorded in protocol.bracketed-refusal-opener-absence.test.ts ('error is HUMAN LANGUAGE, code is the MACHINE TOKEN, and a prefix is removed because the same fact already rides the code axis'); that absence pin scans only metadata-protocol producers. Seam: spec:WRITABLE_PACKAGE_REQUIRED -> runtime:packages.ts package disable/delete/duplicate door | consumer: REST error.message. Dedupe words: `runtime packages bracketed refusal opener` · `writable_package_required duplicate_source_not_a_base prefix`",
        "carrier: 承接者:无 · packages/rest/src/rest-server.ts comment above POST /meta/:type/:name/publish still reads '404 [no_draft] when nothing to publish' — a stale code comment, not a/b/c; noted in PR Acceptance notes only. packages/client JSDoc carrying the same spelling is #19704 (not addressed here)."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    Review: ACCEPT (content) — PR #19843; landing waits on CI and the changeset label

    domain:devx#1 seat, session_01VDtqoecgES7ScQYGbFVDRv, 2026-09-23T10:39Z. Checked against GitHub and origin/main, ⛔ not against the dev report.

    check reading
    shape draft · base main · head db81a89b3 · body line 1 Fixes #19705, line 2 Clause-②: no
    files 1 — areas/access-security.json, +6/-4 · no governed path · ⛔ studio-authoring.json untouched, per triage
    the clause + verify re-keyed on status + code (404, code: 'NO_DRAFT'), never on message bytes — the card's durable form ✅
    history append-only revision 2 → 3; the rev-2 entry is byte-identical apart from the trailing comma JSON needs before the new rev-3 entry (measured: old + , == new) ✅
    producer new source row names SysMetadataRepository#promoteDraft (404 / NO_DRAFT), which matches the runtime ✅

    Out-of-scope readings from the dev: the packages.ts openers and a stale studio-authoring.json:1140 quote belong to #19709 (in flight, same mechanism) and were posted there as evidence, ⛔ no new card; the stale rest-server.ts code comment rides the PR's Acceptance notes; packages/client's JSDoc is #19704's.

    Check Changeset will need the skip-changeset label (docs/QA only); that label is the maintainer's call, as on the other four docs PRs of this seat.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Release: 5793080324 (baozhoutao, session_01VDtqoecgES7ScQYGbFVDRv, seat domain:devx#1), taken over for landing only by domain:spec seat 4, session_019c3Hi6ZMU1p6m6aA6Bz45d. Cause: PR #19843 is delivered, ACCEPTed (5793347388) and carries an at-tier PASS on its current head (5793643990, head db81a89b3a). It has waited only on the skip-changeset label since 2026-09-23, and the maintainer directed this seat to follow unattended PRs older than 12 hours to their merge. Destination: the Claim: below.

    谁的指令: the maintainer
    原话:

    objectstack 12 小时之前的pr,如果没有人在处理,你继续跟进到合并
    在哪说: the chat of session session_019c3Hi6ZMU1p6m6aA6Bz45d, 2026-09-24T14:55Z

    Claim: PM loop — land PR #19843 (takeover, landing only, seat domain:spec#4)
    Session: session_019c3Hi6ZMU1p6m6aA6Bz45d
    Branch: claude/issue-19705-no-draft-code-axis
    Worktree: none — landing only, no dev is dispatched
    Domain: domain:devx
    Seat: domain:spec#4
    File surface: the PR's existing files, unchanged by this act: docs/qa/platform-checklist/areas/access-security.json. If landing needs any change to them, this seat stops and reports on this card; ⛔ no patch round rides this claim
    Container & model: landing only
    Clause-②: no
    Thread-read: 5793347388
    Serial constraints cleared: open-PR census 2026-09-24T14:55Z, 37 PRs: PR #19876 (#19145, taken over in the same act) also edits docs/qa/platform-checklist/areas/access-security.json; git merge-tree of the two heads reads clean.

    The four-part takeover, in one comment

    ① The Release: line above names the holder's claim 5793080324 and its session, with the three provenance fields.
    ② Assignee: baozhoutao → os-litant, written in the same act.
    ③ The Claim: above continues branch claude/issue-19705-no-draft-code-axis at remote db81a89b3a (PR #19843). No new branch and no new commit.
    ④ Handover record: the holder's last pushed sha is db81a89b3a. Status: draft · CI on that head all success or skipped except Check Changeset · at-tier PASS 5793643990 names this exact head.

    The reading behind "nobody is handling it": the newest write on this card and on PR #19843 is from 2026-09-23. The domain:devx seat's newest own output is its ledger refresh on #6023 at 2026-09-23T14:51Z, which lists this PR as waiting only on the label. ⛔ This is a reading and not a liveness verdict on that seat. The maintainer's word is the permission. ⛔ This seat does not take the domain:devx seat, its queue or any card that has not started.

    Landing plan

    • skip-changeset: this seat applies it to PR docs(qa): key the permission-matrix publish refusal on code NO_DRAFT, not a retired message spelling #19843, on its own reading of the diff. The PR changes only docs/qa/platform-checklist/areas/access-security.json. It has no .changeset/*.md row, so route 0 (DELIBERATE CORRECTION) does not apply, and it moves no published package. That is route 2 of Check Changeset. The dev's own label write was refused by its session's permission classifier (ACCEPT 5793347388). review-checklist.md:21 has the seat apply the label itself in that case, with the basis written down, and this paragraph is that basis.
    • When the Check Changeset run fired by the label reads green, and the head is still db81a89b3a with PASS 5793643990 on it: ready → auto-merge through the merge queue. check-governed-merges.mjs --pr 19843 reads 0 governed paths, well under 5000 lines. ⛔ No hand approval and no hand merge.
    • After the merge: the squash is verified on main, pm:dispatched and the assignee come off, and a landing record goes on this card.

    Generated by Claude Code

  6. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Landed — PR #19843 → 615c0856ef, 2026-09-24T16:30Z

    domain:spec seat 4 (session_019c3Hi6ZMU1p6m6aA6Bz45d), landing record for the landing-only takeover above. Authority: the maintainer's 「objectstack 12 小时之前的pr,如果没有人在处理,你继续跟进到合并」, whose provenance the takeover comment carries. Landed through the merge queue only; ⛔ no hand approval, no hand merge.

    • Merged by the queue at 2026-09-24T16:30Z. The card closed completed through Fixes #19705, the PR body's only closing keyword.
    • The squash 615c0856ef has one parent and is an ancestor of origin/main. Content probe: git patch-id --stable of the squash's own diff equals that of the PR's diff from its merge base to the head. That head is the one the at-tier PASS names, unchanged since the takeover.
    • pm:dispatched and the assignee are removed in one label write. The landing-only claim was this seat's, so this is its release. Nothing on this card remains in flight.

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:devxpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions