Skip to content

[finding] two platform readings missing from platform-readings.md: combined status answers pending with zero legacy statuses, and /search/* refuses in a success shape #18733

Description

@hotlong

Two readings the repo:cloud seat took today that references/platform-readings.md does not carry.
Each is a line, not a program. Filed by the landing-repo's seat because the file is a governed
surface (.claude/**) and a PM ⛔ does not write files.

① GET /commits/{sha}/status answers pending on a commit that has NO legacy statuses

Measured three times, on three different heads, all of them fully green:

PR head check-runs combined status
objectstack-ai/cloud#2319 03c170ec 2/2 completed/success (2026-09-16T16:13:44Z) state: "pending", total_count: 0
objectstack-ai/cloud#2320 b4b1c5c4 2/2 completed/success (2026-09-17T15:47:03Z) state: "pending", total_count: 0
objectstack-ai/cloud#2321 23e928b7 2/2 completed/success (2026-09-17T17:14:33Z) state: "pending", total_count: 0

pending here is the API's default for an empty set of legacy statuses, not a verdict about the
gates. In a repo whose gates are all check-runs, that field is pending forever and means nothing.

⚠️ Why it is worth a line: it reads exactly like "gates still running". A seat that waits on it waits
forever; a seat that treats pending as not-yet-red can also read a red PR as merely unfinished.

Proposed line, next to the existing enqueue/gate readings:

  • ⚠️ GET /commits/{sha}/status 在只有 check-runs 的 commit 上恒回 state: "pending" + total_count: 0 —— 那是空 legacy 集合的默认值,⛔ 不是门禁读数;门禁只认 /commits/{sha}/check-runs 的 completed/success。

② /search/* fails SUCCESS-SHAPED, and a naive reader turns it into a zero

The existing entry says /search/* is refused by the egress proxy. What it does not say is the
shape of the refusal. Measured 2026-09-17T17:18Z from this container: the response parses as JSON
and the total_count key is absent. So d.get("total_count") returns None, and a caller that
prints it gets something that reads like 0 — i.e. a dedupe query that silently answers "no
duplicates found".

⭐ I only saw it because my probe asserted on the KEY rather than on the value. A line saying so
would have saved the check.

Proposed addition to the existing /search/* row:

  • ⛔ 它的拒绝是成功形状的:回 JSON 而 total_count 键缺失 ⇒ .get() 读成 None、打印出来像 0。⇒ 断言键在,⛔ 不断言值。

⚠️ Attribution note: the same shape is recorded in the domain:spec @ objectui seat's own patrol
text, so this is a second independent observation rather than a new discovery — which is itself the
argument for putting it in the shared table instead of in two seats' private prompts.

⛔ What is NOT proposed

The queue-branch reading. I started to file it (gh-readonly-queue/* appeared 18 s after
added_to_merge_queue, 2026-09-17T17:16:02Z → 17:16:20Z) and then read the table, which already
covers it more sharply than my framing did: 「队列 ref 答 BUILD 不答成员资格」 and 「⛔ 它的缺席不是任何方向的读数」.
⇒ Nothing to add; my own patrol text was the thing that was wrong, and I fixed that instead.

查重词

combined status pending total_count · commits status legacy statuses empty · search total_count key absent ·
platform-readings check-runs vs status · egress proxy search success-shaped refusal


Generated by Claude Code

Activity

  1. os-justin commented on Sep 17, 2026

    @os-justin
    Collaborator

    Claim: PM loop round 1
    Session: session_01Gqi43smmqjJ5sUrhfoPeKu
    Branch: claude/issue-18733-combined-status-pending-trap
    Worktree: objectstack-issue-18733
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/references/platform-readings.md only (fact layer, 466 / 466 at the ratchet ceiling, rows ≤ 120 B; deliverable = the card's ① as ONE row beside :28 — GET /commits/{sha}/status answers state: "pending" + total_count: 0 on a commit with ZERO legacy statuses, the empty-set default, ⛔ not a gate reading, three cloud heads measured; ⚠️ objectstack carries one legacy status today (the seat's landing pre-checks read success / total_count 1), so the trap is repo-shaped and the row says so — PAID by retiring or merging one row in the same file with the reason in the PR body; the card's ② is, on the seat's reading of main, ALREADY CARRIED at :209–:211 (「会话代理只服务 repo-scoped 路径,/search/* 的 403 体解析成净零」· 「代理回 403 加体 … 合法 JSON」· 「读 total_count 得 None、打印成 total: None …」) and PR #18666 (awaiting the maintainer) sharpens :211 to 「缺键即拒绝,判别式是状态码」 — the dev re-reads and either declares ② carried (no row) in the PR body, naming the three lines, or shows what those lines do not say and proposes ONE row in the search_issues block :192–:201, paid the same way; ⛔ reserved rows this diff must not touch: :10–:12 and :431 (#18469 PR-A), :208–:212 (PR #18666's hunk); ⛔ no prose beyond the rows, ⛔ no restatement of SKILL.md); fact layer ⇒ draft, skip-changeset, the seat's ## Contract review on the PR thread is the review of record, landed by CCR
    Container & model: M(一行事实 + 同文件付费 + ② 查重读数), mode:subagent, model: claude-opus-5 — node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack .claude/skills/pm-dispatch/references/platform-readings.md at 2026-09-17T19:44Z on the fast-forwarded tree (e2050cefc): 「Model tier — no path-derived mandate: the surface hits none of the 3 declared glob(s)」; default tier taken; the seat's contract-tier review at delivery
    Clause-②: no
    Thread-read: 5718973391
    Serial constraints cleared: PR #18741 (#18601) on this file LANDED earlier today; 25 open PRs' file lists read at 2026-09-17T19:45Z — one touches this file, PR #18666 (#18454, governed, awaiting the maintainer), whose only hunk here is :208–:212 and is RESERVED above rather than blocking; os-verify-lock.sh --status at 2026-09-17T19:45Z: free; shared checkout at origin/main 95e174527. Hot-file queue behind this card: #18744 (p2, three 配额 rows). Slot: the one freed by #18709's delivery (PR #18758, ACCEPT 5720183163, in the merge queue since 2026-09-17T19:41:33Z); #18719 and #18661 in flight; PR #18750 (#18702) and PR #18756 (#18680) LANDED this round. Total order at 2026-09-17T19:47Z: p2 by age — #18536 (SKILL.md serial: PRs #18666 / #18679 open on SKILL.md; its machine-side half behind #18719 → #18683) · #18683 (behind #18719) · #18693 (behind PR #18758) · #18699 (behind PR #18725) · this card · #18743 (SKILL.md serial) · #18744 (behind this card); p3 — #18527 · #18622 · #18662 (behind #18661) · #18664 · #18665 · #18686 · #18705 · #18721.
    Ruling-ref: 5718973391


    Generated by Claude Code

  2. os-justin commented on Sep 17, 2026

    @os-justin
    Collaborator

    os-dev-report

    {
      "issue": 18733,
      "status": "done",
      "branch": "claude/issue-18733-combined-status-pending-trap",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/18775",
      "head_sha": "d6bc4775e5fefd6653063f8234e80b2ccfab9f06",
      "files": [
        ".claude/skills/pm-dispatch/references/platform-readings.md"
      ],
      "session": "session_01Gqi43smmqjJ5sUrhfoPeKu",
      "premise_still_valid": false,
      "summary": "Split verdict, which is why the flag is false. The card's premise for FINDING ① holds and ① is delivered as ONE row at :29, beside :28 — the row that today sends a reader to `GET /commits/{sha}/status`. The card's premise for FINDING ② does NOT hold: its sentence 「The existing entry says /search/* is refused by the egress proxy. What it does not say is the shape of the refusal」 is false on `main`, where three consecutive rows state exactly that shape. ⇒ no row for ②, and the `search_issues` block :192–:201 is untouched. ① is also RE-SCOPED against measurement: the card wrote 「在只有 check-runs 的 commit 上」, and the empty-set default is a property of the REPO, not of a commit — objectstack posts a legacy `Vercel` status on every commit and therefore never shows the trap, so the row says 「零 legacy status 的仓」. Net line change 0 at the 466/466 ceiling: the added row is paid by retiring :343, a preamble whose whole content the same block restates at its end, more precisely. No ceiling raised, no ruling spent.",
      "row_added": {
        "line": ":29",
        "bytes": 118,
        "verbatim": "- 零 legacy status 的仓恒答空集默认值 `pending`+`total_count: 0`,⛔ 非门禁读数,门禁读 check-runs。",
        "placement": "directly under :28 「`unstable` 可源自 check-runs 看不见的 commit STATUS(如 `Vercel`)⇒ ③ 另读 `/commits/{sha}/status`」, inheriting its subject — the idiom the block already uses at :30, :63, :65, :67.",
        "against_the_card": "Kept: 「那是空 legacy 集合的默认值」 → 「空集默认值」 (「legacy」 already stands in the first clause); 「⛔ 不是门禁读数」 → 「⛔ 非门禁读数」; 「门禁只认 `/commits/{sha}/check-runs` 的 `completed/success`」 → 「门禁读 check-runs」. Changed on purpose: the scope, from commit-shaped to repo-shaped, on the measurement below. The card's line is ~230 B; the cap is 120 B."
      },
      "row_paid": {
        "line": ":343 (pre-edit)",
        "bytes": 85,
        "verbatim": "- 署名页脚的写侧变异按通道与输入双重定域,⛔ 不是一条定律。",
        "why": "It is a PREAMBLE stating the conclusion its own block states again, at the end, more precisely. Both clauses are held (post-edit numbering): 「按通道与输入双重定域」 by :355 「⇒ 形态随动作与送出体尾部变,改侧还随通道变」 (three loci where the retired row named two) and by :342 「⇒ 失效既依拼写又依载体」 at the point of use; 「⛔ 不是一条定律」 by :355 「⛔ 不由任一条推其余,写后必回读」 and :351 「⛔ 无受控对照… ⛔ 不外推到别的动作」. No fact leaves the corpus; every evidence row :340–:354 is untouched.",
        "checked_against_reservations": "Not one of the three 配额 rows #18744 names (:137, :145, :146); not one of the four PR #18741 landed today (:47–:49, :163); not one of the nine PR #18689 adopted (:28, :86, :249, :277–:278, :291, :347, :357, :393, :410).",
        "ceiling_exception_not_taken": "`scripts/pm/check-skill-line-ratchet.mjs` carries a STANDING one-file exception — 「唯一例外:`platform-readings.md` 增量抬上限到落地行数,免决策卡,记 `ruledRaises` 引常设裁决」 — so this increment need not have been paid at all. It was paid anyway because a zero-loss payment existed: the ceiling stays 466 and no ruling is spent."
      },
      "finding_2_reading": {
        "verdict": "CARRIED — no row",
        "carried_at": [
          ":209 「会话代理只服务 repo-scoped 路径,`/search/*` 的 403 体解析成净零。」 = the card's 「它的拒绝是成功形状的」",
          ":210 「代理回 403 加体 sessions are bound to their configured repositories,而那是合法 JSON。」 = the card's 「回 JSON」",
          ":211 「读 `total_count` 得 None、打印成 total: None,与真空集只差一个字符,而请求根本没跑。」 = the card's 「`total_count` 键缺失 ⇒ `.get()` 读成 `None`、打印出来像 0」, plus a measurement the card does not have"
        ],
        "residual": "Only the card's PRESCRIPTION 「断言键在,⛔ 不断言值」. That is exactly what open PR #18666 (for #18454, governed, awaiting the maintainer) lands on that same line: its one hunk on this file, `@@ -209,7 +209,7 @@`, rewrites :211 to 「读 `total_count` 得 None、打印成 total: None,与空集只差一字符;缺键即拒绝,判别式是状态码。」 — 「缺键即拒绝」 IS the assert-the-key prescription in the file's own voice, and 「判别式是状态码」 is one notch sharper: it names the discriminant rather than the symptom. ⇒ residual zero once #18666 lands, and the line a residual row would have to touch is #18666's own hunk, a reserved line.",
        "corrects_on_the_card": "The card's 「The existing entry says /search/* is refused by the egress proxy. What it does not say is the SHAPE of the refusal」 is false on `main`. The card's own attribution note argues the shape belongs in the shared table rather than in two seats' private prompts; it is already in the shared table — what the card measured is that a reader did not find it there."
      },
      "reserved_rows_verified": {
        ":10-:12 (#18469 PR-A)": "byte-identical before and after; this diff's two hunks are :26–:32 and :341–:347, so these lines are in neither.",
        ":208-:212 (PR #18666)": "Verified against /pulls/18666/files: one hunk on this file, `@@ -209,7 +209,7 @@`, changed line = the `total_count` row. MOVED BY THE INSERTION: on `main` the changed line is :211 and the hunk's full context window is :208–:214; on this head they are :212 and :209–:215. Every byte in the band is unchanged, so #18666 still applies.",
        ":431 (#18469 PR-A)": "NUMBER WAS ALREADY STALE BEFORE THIS DIFF. The row #18469 names — 「harness 按内容拒写:同会话派发 PR 上 PASS 拒为 `[Self-Approval]`」 — reads :432 on `main`, and read :432 at `7636cd9b81^` too, so PR #18741's body carried an off-by-one rather than the row having moved. :431 is a different row (「分支删除被拒有第二形态:代理回 403」). After this diff the `[Self-Approval]` row is STILL :432 — the insertion at :29 and the retirement at :344 cancel across it.",
        "overlap scan": "All 26 open PRs' file lists read at 2026-09-17T19:50Z: PR #18666 is the only one touching this file."
      },
      "measurements": {
        "cloud (card's table, verbatim, not re-measured — repo not reachable from this container)": [
          "objectstack-ai/cloud#2319 head 03c170ec — check-runs 2/2 completed/success; combined status state: \"pending\", total_count: 0",
          "objectstack-ai/cloud#2320 head b4b1c5c4 — check-runs 2/2 completed/success; combined status state: \"pending\", total_count: 0",
          "objectstack-ai/cloud#2321 head 23e928b7 — check-runs 2/2 completed/success; combined status state: \"pending\", total_count: 0"
        ],
        "objectstack (mine, REST proxy, 2026-09-17T19:57Z–19:59Z, raw fields)": [
          "d852dae1 (PR #18750 head) — /status: state \"success\", total_count 1, statuses [Vercel/success]; /check-runs: total_count 40 (29 completed/success + 11 completed/skipped)",
          "702b4241 (PR #18756 head) — /status: state \"success\", total_count 1, statuses [Vercel/success]; /check-runs: total_count 39 (28 + 11)",
          "2f38ee0d (PR #18758 head) — /status: state \"success\", total_count 1, statuses [Vercel/success]; /check-runs: total_count 32 (24 + 8)",
          "95e17452 / e2050cef / bc2ec806 (main commits) — /status: state \"success\", total_count 1, statuses [Vercel/success] on each",
          "CONTROL — 55c8e844 (this branch's own first commit, read at 19:59:48Z, seconds after the push, before any workflow started) — /status: state \"pending\", total_count 1, statuses [Vercel/pending]; /check-runs: total_count 0"
        ],
        "what the control settles": "objectstack answers `pending` TOO — for the opposite reason. Here total_count is 1 with a real `Vercel` status genuinely in flight; in the card's three cloud heads total_count is 0 and there is no status at all. ⇒ `total_count` is the discriminant, `state` is NOT, which is why the row names both fields instead of the word `pending` alone, and why the row is scoped 「零 legacy status 的仓」 rather than 「所有仓」. The trap is live in repos with zero legacy statuses (the card's cloud heads); it is NOT live in objectstack, which posts `Vercel` on every commit."
      },
      "ratchet_before_after": {
        "main 447e2e895a": "✓ platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0). ✓ platform-readings.md is 466 lines (ceiling 466; headroom 0). exit 0",
        "head d6bc4775e5": "✓ platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0). ✓ platform-readings.md is 466 lines (ceiling 466; headroom 0). exit 0",
        "widest line, measured per row in bytes": "120 B at :464 on BOTH sides, unchanged; zero rows over 120 B on either side; the added row is 118 B",
        "git diff --stat": "1 file changed, 1 insertion(+), 1 deletion(-)"
      },
      "tests": "No test surface: the diff is one markdown row in a governed fact table, in no package. DERIVED GATES — `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` from the worktree, no hand-fed path list: 18 families, ALL re-run at the final head d6bc4775e5 with $? captured before any pipe (redirect-then-$?): check-closing-keyword-parity :: 0 | check-closing-keyword-parity --self-test :: 0 | check-comment-mask-corpus :: 0 | pm/check-governed-queue-guard --self-test :: 0 | pm/check-harness-current --self-test :: 0 | @objectstack/lint check:doc-formula-expressions :: 0 | check:agent-test-spelling :: 0 | check:doc-authoring :: 0 | check:driver-memory-census :: 0 | check:nul-bytes :: 0 | check:pm-governed-merges :: 0 | check:pm-half-states :: 0 | check:pm-skill-id-lint :: 0 | check:pm-skill-ratchet :: 0 | check:refd-timer-probe :: 0 | check:required-contexts :: 0 | check:skill-frame-sync :: 0 | check:watch-hint-literal :: 0. RECONCILED — `dispatch-gates.mjs --ran`: 「18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3)」. ONE EXIT-3 ON THE FIRST PASS, resolved, NOT recorded as a failure: check:doc-formula-expressions exited 3 = PREREQUISITE NOT MET, its own text 「Nothing was measured: this gate exited before running a single check」; its two declared prerequisites (@objectstack/formula, @objectstack/lint) were built under `scripts/pm/os-verify-lock.sh` (VERDICT command-exit 0, held 158 s, waited 0 s) and it then exited 0. OUTSIDE THE DERIVED 18: `pnpm check:pm-settings-deny-roster` :: 0 — the derivation flags it 「roster under .claude, which one of your paths is in」, where silence is evidence in neither direction, so it was run rather than assumed. REPO-WIDE: `pnpm lint` (eslint . --no-inline-config) :: exit 0 at d6bc4775e5. BYTE HYGIENE: `grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]'` over the edited file and over the PR body — no match (exit 1) on both; check:nul-bytes green. NO ABLATION: nothing in this diff is a guard that could be made to fail; the claim is a line-count/byte-width ratchet reading and a set of API readings, and both are reported with their instruments.",
      "pr_state": "PR #18775, DRAFT, base main, `Fixes #18733`, `Clause-②: no` in the body AT CREATION. Body written once at creation, never PATCHed. Stored body read back and byte-compared against what was sent: identical except the trailing newline (13033 sent / 13032 stored), exactly ONE footer, session-URL form, zero bare footers appended — consistent with :348/:350 (the sent body's tail was already the rule-plus-footer block, so nothing was appended). LABELS: `skip-changeset` written through the ADDITIVE endpoint POST /issues/18775/labels (HTTP 200), then read back by an independent GET — union(read, target) = {size/xs, skip-changeset}, read-back = {documentation, size/xs, skip-changeset}, STRIPPED: none. `documentation` was added by another actor between the two reads and is left alone. `needs:contract-review`: ABSENT on the PR — reported, ⛔ not attached, ⛔ not removed, ⛔ not waited on. `node scripts/pm/check-clause2-carriers.mjs --pair 18775` :: exit 0 — claim comment 5720262737 DECLARED `no`, PR body DECLARED `no`. (A first invocation at the wrong path, scripts/check-clause2-carriers.mjs, gave MODULE_NOT_FOUND / exit 1; that is a typo, not a gate verdict, and is not recorded as a measurement.) GOVERNED SURFACE: .claude/** ⇒ draft and stopped there. ⛔ Not flipped ready, ⛔ not queued, ⛔ not armed. The seat's `## Contract review` on the PR thread is the review of record and the seat lands it.",
      "mcp_calls": "0 — no `mcp__github__*` tool was called in this run, read or write. Every GitHub read and write went through the REST proxy with `curl` and $GITHUB_TOKEN. Token class measured on the write response, not assumed: user-to-server (`user.login`: os-justin, `user.type`: User).",
      "api_writes": "3 REST writes, all inside budget: POST /repos/objectstack-ai/objectstack/pulls (draft PR #18775, HTTP 201); POST /repos/objectstack-ai/objectstack/issues/18775/labels (skip-changeset, additive, HTTP 200); POST /repos/objectstack-ai/objectstack/issues/18733/comments (this report). Zero PATCH, zero MCP writes, zero writes outside the budget. Plus 3 `git push` on the feature branch (empty-branch route probe, the commit, the merged head).",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: PR #18741's body records the #18469 PR-A reservation as `:431`; the row it names (「harness 按内容拒写… `[Self-Approval]`」) reads :432 on `main` today AND read :432 at 7636cd9b81^, so the number was off by one when written rather than moved since. Not class (a)/(b)/(c): a stale line number in a merged PR body, read by no gate and shipped by no package. Carrier: whoever opens #18469 PR-A touches exactly this row and re-derives the number; this PR's body states the correct one.",
        "noted, not filed: the ratchet's standing one-file exception for platform-readings.md (「唯一例外:`platform-readings.md` 增量抬上限到落地行数,免决策卡…」, conditioned on the seat's ACCEPT carrying per-item verification and the candidate/landed/already-present/refused counts) means a readings increment on this file need not be paid at all. This PR paid anyway because a zero-loss payment existed. Not a defect — the choice between paying and raising is the seat's, per increment. Carrier: the skills seat, at the next increment on this file (#18744 is queued behind this card and is an in-place edit that needs neither).",
        "noted, not filed: the card's ② is a duplicate observation of what :209–:211 already carry, filed by a seat in another repo that could not read this file's current state. Nothing to fix here; the table is correct. Carrier: none — recorded so the PM can close ② as carried rather than as unaddressed."
      ]
    }

    Generated by Claude Code

  3. os-justin commented on Sep 17, 2026

    @os-justin
    Collaborator

    LANDED — PR #18775 (#18733, one platform-readings.md row: the combined-status endpoint on a repo with zero legacy statuses) merged through the queue at 2026-09-17T21:01:48Z (merged_at), squash 6de7a2d6e (single parent e5705a8ea, an ancestor of origin/main; :29 「零 legacy status 的仓恒答空集默认值 pending+total_count: 0,⛔ 非门禁读数,门禁读 check-runs。」 read on main, 466 / 466, old :343 retired as payment); armed by this seat through the CCR route after the seat's ## Contract review 5720918192 on the PR thread — ready 2026-09-17T20:39:26Z, added_to_merge_queue 2026-09-17T20:39:28Z. The card auto-closed completed at 2026-09-17T21:01:50Z on the PR's Fixes; pm:dispatched is stripped in the same act. Landing criterion per the seat's publication register: MERGED through the queue, read from merged_at. ② of this card is CARRIED, not unaddressed: :209–:211 already state the /search/* success-shaped refusal and PR #18666 (awaiting the maintainer) sharpens :211 into the assert-the-key prescription — the card's sentence 「what it does not say is the shape」 was false on main and the review says so. Follow-ups on this file: #18744 (p2; its deliverable burns the shared credential's GraphQL pool — the seat schedules it for a window with no landing pending) → #18686 (p3).


    Generated by Claude Code

  4. added a commit that references this issue on Sep 28, 2026
    6de7a2d
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

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions