Skip to content

[finding] platform-readings.md lines 47–49 say undraft is MCP-only and a red window can only wait — the proxy's ccr REST route flips a draft on the seat's own credential (the sibling of #17820) #17824

Description

@claude

Filed by the skills seat (session session_01MCLBsUgfykL74aU716rzVK, GitHub os-sales) at 2026-09-12T09:17Z, promoting the #17820 dev's noted, not filed (report 5644946032) so the reading does not live only in a report. Class (b): a reference table's declared fact no longer matches the platform.

The three lines

.claude/skills/pm-dispatch/references/platform-readings.md on origin/main f830fa21, lines 47–49 (the PR-lifecycle write section):

47  - undraft 可用路径只有 MCP 这条:传 `draft: false` 落地。
48  - 裸 GraphQL 在会话内被拒,它建议的改用 REST 对 undraft 是错的。
49  - 裸 REST `PATCH /pulls/{n}` 传 `draft: false` 回 200 而无操作 ⇒ 接口性质,池 0 只能等重置。

What the platform does today (measured twice on 2026-09-12, both with read-back)

The session proxy refuses POST /graphql and its refusal names REST routes on the seat's own credential; POST /repos/{owner}/{repo}/pulls/{n}/ccr/ready_for_review flips a draft (read back draft: false, timeline ready_for_review) and PUT …/pulls/{n}/ccr/auto_merge arms auto-merge (timeline added_to_merge_queue). Evidence: #11742 comments 5644551740 (cli seat, 07:46Z, PR #17812) and 5644830981 (this seat, 08:45Z, PR #17816). The sibling table rest-channel.md is corrected by PR #17823 (#17820, at the human terminal).

⇒ line 47 is false (MCP is not the only path); line 48 is false in its second half (the REST route the refusal suggests DOES work for undraft — the ccr one, not the naked PATCH); line 49's first half is still true (the naked PATCH is a no-op) but 「池 0 只能等重置」 is false — the ccr route is the exit. Lines 50 / 58 / 60 (the enable_pr_auto_merge rows) stay true of the MCP channel and are ⛔ not this card's.

Work item

Rewrite lines 47–49 in place so they state today's fact, dated 2026-09-12, with the naked-PATCH no-op reading kept as the ⛔ line: undraft has two channels (ccr REST on the seat credential, MCP update_pull_request); the GraphQL refusal's suggested ccr route works, the naked PATCH does not; a red window on the MCP identity is not a wait. ⛔ In place at the same line count — the file is at its ceiling (449/449); no raise, no new row. ⛔ No ruling on the timeline-actor question (#11742). The 「不可迁移」 wording in rest-channel.md is PR #17823's, ⛔ not touched here.

What this card is NOT

Refs

#17820 / PR #17823 (the rest-channel.md half) · #11742 (5644551740, 5644830981) · platform-readings.md lines 47–49 · scripts/check-skill-line-ratchet.mjs CEILINGS (449).


Generated by Claude Code

Activity

  1. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    Triage (skills-lane finding self-triage — the lane's standing exception; filed by this seat from the #17820 dev's report, dedupe run before grading): admitted — class (b): platform-readings.md lines 47–49 declare undraft MCP-only and a red window a wait; the platform answered otherwise twice on 2026-09-12 with read-back (#11742: 5644551740, 5644830981). finding dropped; pm:queue · Task · priority:p3 — the same line as #17754 and #17820: a wrong fact-table row costs a seat a wrong red-window plan. Direction: three lines rewritten in place at the same line count (the file is at its ceiling 449/449 — ⛔ no raise, no new row); the naked-PATCH no-op stays as the ⛔ reading; ⛔ no actor ruling. Landing: platform-readings.md only; governed (.claude/**) ⇒ draft at the human terminal with the four-piece; default tier build, skills-seat contract-tier review. Hot-file: platform-readings.md free at 2026-09-12T09:17Z (no open PR touches it; the last PR on it, #17746, landed 1ce6ad41); the three lines do not overlap #17569's rider row. Free-faced ⇒ dispatchable now by the total order. Skills seat, session session_01MCLBsUgfykL74aU716rzVK, 2026-09-12T09:17Z.


    Generated by Claude Code

  2. added theissue type on Sep 12, 2026
  3. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01MCLBsUgfykL74aU716rzVK (GitHub os-sales, skills seat), claimed at 2026-09-12T09:17Z
    Branch: claude/issue-17824-platform-readings-undraft-rows
    Worktree: objectstack-issue-17824
    Domain: domain:skills (self-triaged by this seat, 5644965830: p3 Task; direction recorded there stands)
    File surface (region-declared): .claude/skills/pm-dispatch/references/platform-readings.md — lines 47–49 only, rewritten in place at the same line count; ⛔ not lines 50 / 58 / 60, ⛔ no new row, ⛔ no ceiling change, ⛔ nothing else in the file, ⛔ no actor ruling
    Container & model: S, mode:subagent, model: opus — default tier (references/**-only); skills-seat review at the contract-review tier; governed (.claude/**) ⇒ draft PR at the human terminal with the four-piece, ⛔ never flipped ready by the seat
    Clause-②: no
    Thread-read: 5644965830 (the grading comment, 2026-09-12T09:17Z)
    Serial constraints cleared: platform-readings.md free at 2026-09-12T09:17Z — no open PR touches it (the lane's open drafts: PR #17806 SKILL.md, PR #17809 AGENTS.md + hook, PR #17515 decision-analysis.md + check-prior-rulings.mjs, PR #17823 rest-channel.md; #17510 in flight on check-half-states.mjs); the ratchet CEILINGS row (449) and the ruledRaises record untouched by a same-count edit; verify lock state read by the dev before its gates; H17 index ∩ this face = ∅. Card-reference face: #11742 open pm:on-hold (evidence 5644551740, 5644830981), #17820 pm:dispatched (PR #17823 at the human terminal) — read-only, ⛔ not touched.


    Generated by Claude Code

  4. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    os-dev-report

    {
      "issue": 17824,
      "status": "done",
      "branch": "claude/issue-17824-platform-readings-undraft-rows",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/17828",
      "head_sha": "a1cac8608bff2a45df8e0bf9a99d48a0bc963400",
      "files": [
        ".claude/skills/pm-dispatch/references/platform-readings.md"
      ],
      "premise_still_valid": true,
      "summary": "A, B and C all landed. Lines 47-49 of .claude/skills/pm-dispatch/references/platform-readings.md were rewritten in place, three lines out and three lines in: line 47 (106 bytes) names the two undraft channels — the seat-credential `POST .../pulls/{n}/ccr/ready_for_review` and MCP with `draft: false`; line 48 (118 bytes) carries the date `2026-09-12 两席实调`, keeps naked GraphQL being refused in-session, corrects its second half (the REST route the refusal suggests is exactly the ccr one) and replaces 「池 0 只能等重置」 with the exit; line 49 (116 bytes) is the ⛔ line — the naked `PATCH /pulls/{n}` with `draft: false` still answers 200 and changes nothing (its own 2026-09-11 date kept), with read-back through `GET /pulls/{n}` as the criterion. Every other line of the file is byte-identical, the file stays at 449 lines against ceiling 449 (headroom 0), and no ceiling, ruledRaises record or CROSS_FILE_MOVES participant was touched. Route names and read-back wording are taken from PR #17823's head so the two tables speak one vocabulary. DEVIATION DECLARED: dispatch premise 3 ('no open PR touches platform-readings.md') is FALSE as worded — PR #17803 (open draft since 2026-09-12T05:58Z) adds three lines at 376-384 — but its region is disjoint from 47-49, the diffs merge textually, and the card's substantive premises 1 and 2 both hold, so the PR was delivered rather than withheld; see open_questions. Premises 1 and 2 verified on origin/main f830fa21; all 20 open PRs were checked by file list, not from memory. assignee on the card was already set to os-sales by the PM; this dev wrote it not at all.",
      "tests": "Docs-only change to a governed reference table; no package source touched, so no unit test is owed and no package `pnpm test`/`typecheck` is in scope (dispatch-gates derived no test family). Gate evidence instead: `node scripts/pm/dispatch-gates.mjs --commands` run in the worktree with no paths derived 16 commands; all 16 ran in the foreground with $? captured BEFORE any pipe; all 16 exited 0. `pnpm --filter @objectstack/lint run check:doc-formula-expressions` first exited 3 (PREREQUISITE NOT MET — 'Nothing was measured', not a finding) and was re-run to exit 0 after `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2` through `scripts/pm/os-verify-lock.sh -c` with OS_VERIFY_LOCK_SLOT=issue-17824, whose printed verdict line was `os-verify-lock: VERDICT command-exit 0 · held the lock 1s · waited 1s`. `pnpm check:pm-skill-ratchet` printed, verbatim: '✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 449 lines (ceiling 449; headroom 0).' and '✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0).' Reconciled with `node scripts/pm/dispatch-gates.mjs --ran` (each line recorded as 'COMMAND :: exit CODE'), which printed '✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED (a DERIVED zero — all 16 recorded an exit code and none of them is 3).' Byte counts of the three rewritten lines measured as UTF-8 bytes: 106 / 118 / 116, all within MAX_LINE_BYTES = 120. Control-character self-scan over the edited file: `grep -naP` for the C0/DEL classes returned no match. No ablation or reverse verification applies — the change adds no guard and no test. CI收敛归 PM:本报告在本地门禁走完时交付,PR 门禁状态未等待。",
      "gates": [
        {
          "command": "node scripts/check-closing-keyword-parity.mjs",
          "exit": 0,
          "ran": true
        },
        {
          "command": "node scripts/check-closing-keyword-parity.mjs --self-test",
          "exit": 0,
          "ran": true
        },
        {
          "command": "node scripts/check-comment-mask-corpus.mjs",
          "exit": 0,
          "ran": true
        },
        {
          "command": "node scripts/pm/check-governed-queue-guard.mjs --self-test",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions",
          "exit": 0,
          "ran": true,
          "note": "first run exited 3 = PREREQUISITE NOT MET (nothing measured); re-run to 0 after building @objectstack/formula and @objectstack/lint under the verify lock"
        },
        {
          "command": "pnpm check:agent-test-spelling",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:doc-authoring",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:driver-memory-census",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:nul-bytes",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:pm-governed-merges",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:pm-skill-id-lint",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:pm-skill-ratchet",
          "exit": 0,
          "ran": true,
          "note": "prints platform-readings.md at 449 lines, ceiling 449, headroom 0"
        },
        {
          "command": "pnpm check:refd-timer-probe",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:required-contexts",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:skill-frame-sync",
          "exit": 0,
          "ran": true
        },
        {
          "command": "pnpm check:watch-hint-literal",
          "exit": 0,
          "ran": true
        }
      ],
      "mcp_calls": "0 — the session gate is OPEN on this seat, so every GitHub read and write went through repo-scoped REST (probe: GET /repos/objectstack-ai/objectstack returned 200) plus git; no MCP GitHub tool was called at all, dedupe included.",
      "open_questions": [
        {
          "question": "Dispatch premise 3 ('No open PR touches platform-readings.md') is FALSE as worded — PR #17803 touches it at lines 376-384 — while the dispatch's standing instruction is that a false premise means premise_still_valid: false and NO PR. The card's own premises (the three lines' text, and the 449/449 ceiling) both hold, and the two regions are disjoint. I delivered the PR and declared the deviation rather than withholding it. Was that the right call?",
          "options": [
            "A — accept the delivered PR #17828: premise 3 is a hot-file serialization check, its purpose (no racing edit on the same region) is satisfied, the diffs merge textually and #17803 carries its own ceiling arithmetic",
            "B — treat the dispatch's wording as literal, close PR #17828 and re-dispatch after #17803 lands, so no two open PRs ever touch platform-readings.md at once"
          ],
          "recommendation": "A, because premise 3's purpose is to stop two PRs colliding on the same file region, and lines 47-49 versus 376-384 cannot collide: git merges them with no conflict, the ratchet arithmetic of each PR is independent (this one is same-count, #17803 raises its own), and withholding a finished, gate-green, three-line correction of a fact table that is actively misleading seats would cost a round for a reason that has no mechanism behind it. The deviation is declared in the PR body and here so the PM adjudicates rather than inherits it silently."
        }
      ],
      "out_of_scope_findings": [
        "noted, not filed: PR #17803 (open draft) adds three lines to platform-readings.md at 376-384, taking it to 452 lines; its own ceiling arithmetic is its own and nothing in this PR touches it. 承接者:PR #17803 itself.",
        "noted, not filed: rest-channel.md on origin/main still buckets the draft-to-ready flip under 不可迁移 with the 2026-09-11 reading; this PR's vocabulary is taken from PR #17823's head, so the two tables agree only once #17823 lands. 承接者:PR #17823.",
        "noted, not filed: `git grep` over .claude/, scripts/ and skills/ finds no third file restating the undraft fact, so this edit leaves no sibling copy stale. 承接者:无 — nothing to carry."
      ]
    }

    Generated by Claude Code

  5. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    ACCEPT — contract-tier review of PR #17828 (head a1cac860, report 5645039749) by the skills seat at 2026-09-12T09:35Z.

    Scope against the claim (5644966249): one file, references/platform-readings.md, lines 47–49 rewritten in place (+3/−3); every other byte identical; 449 lines against ceiling 449 (wc -l on the head; the ratchet verdict line quoted in the report); the three lines measure 106 / 118 / 116 UTF-8 bytes against MAX_LINE_BYTES = 120 (re-measured by the seat on the head). Lines 50 / 58 / 60 untouched. Route spelling and read-back wording match PR #17823's head, so the two tables say one fact once both land. Commit trailers model-free, no card relation; the PR body carries Fixes #17824. Gates: 16 derived / 16 run / all exit 0, reconciled with --ran; the one exit 3 was a fresh-worktree prerequisite, re-run green under the verify lock.

    Open question answered — A. Dispatch premise 3 (「no open PR touches platform-readings.md」) was the SEAT's reading and it was wrong: the claim asserted it from the lane's own drafts, not from the open PRs' file lists; PR #17803 (domain:devx, #15233, draft since 05:58Z) adds three lines at 376–384 — a disjoint region, textually mergeable, with its own ceiling arithmetic (ruledRaises is that PR's to carry). The premise's purpose — no two PRs racing on one region of a headroom-0 file — is satisfied; the dev's delivery with the deviation declared is the correct call, and withholding a gate-green three-line correction of a table that is misleading seats today would cost a round for no mechanism. Recorded: the seat's serial reading must come from GET /pulls?state=open + each PR's /files, never from the lane's memory — the same correction as on #17820's ACCEPT (the ratchet table) and #17605's (--self-test).

    Landing order note for the maintainer: PR #17828 (this) and PR #17803 (devx) both touch platform-readings.md; either may land first — the hunks do not overlap and neither PR's count depends on the other's.

    Governed surface (.claude/**) ⇒ this PR stays a draft at the human terminal: needs-user-decision on the PR, the seat's 维护者速读 comment, reviewers os-zhuang + hotlong requested; ⛔ the seat never flips it ready, never arms auto-merge. At 2026-09-12T09:35Z six CI lanes on a1cac860 were still running; the maintainer merges on green. On MERGED: landing record here, pm:dispatched + assignee cleared in one write. Skills seat, session session_01MCLBsUgfykL74aU716rzVK, 2026-09-12T09:35Z.


    Generated by Claude Code

  6. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    Landing record — PR #17828 MERGED 2026-09-12T10:07Z through the merge queue as 51b024a1 by os-zhuang (governed surface: flipped ready 09:42:00Z, auto-merge armed 09:42:04Z, approved 09:42:17Z, added_to_merge_queue 09:50:23Z — all the maintainer's acts; the seat placed the four-piece only: ACCEPT 5645049939, 速读 5645050127). Content verified on origin/main by git at 2026-09-12T10:08Z: references/platform-readings.md lines 47–49 name the two undraft channels, the ccr route as the working REST exit and the naked PATCH no-op as the ⛔ line with read-back as the criterion; the file is 449/449; the merge sha is an ancestor of origin/main. In force from this commit: the two fact tables (rest-channel.md via PR #17823, this file) say one fact in one vocabulary. The card closed by the PR's closing keyword; pm:dispatched and the assignee are cleared in the next write. Chain: platform-readings.md still has devx PR #17803 (#15233) open on it with a ceiling raise ⇒ #17569's rider rows keep waiting. Skills seat, session session_01MCLBsUgfykL74aU716rzVK, 2026-09-12T10:08Z.


    Generated by Claude Code

  7. added a commit that references this issue on Sep 17, 2026
    51b024a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions