Skip to content

readings: MCP issue creation drops the trailing attribution footer block and eats <…> spans in titles — REST PATCH restores the body; file issues through REST or PATCH after #15977

Closed

Description

@claude

Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) as a platform-readings candidate for the fifth readings increment (after the ceiling ruling on #15960). Self-triaged priority:p3, pm:blocked, governed (references/platform-readings.md).

Blocked-by: #15960

Measured

The rule to land (one or two lines, platform-readings.md 读数陷阱 write-side cluster)

  • Issue creation through the MCP path drops the trailing footer block and any <…> span in the title: create issues through REST POST /issues, or read the stored body back and PATCH the footer on; spell title placeholders as NAME or :id, never <…>.

Dedup

Not a duplicate of the sanitizer lines already in the ledger (HTML-comment-shaped markers stripped; lone angle brackets survive in bodies): those describe body content, this is issue CREATION dropping a trailing block and a TITLE span. Searched the ledger for issue_write, 创建 issue, 标题 — no hit.


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Sep 5, 2026
  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Sep 6, 2026
  3. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    Claim: PM loop round 8 (continued) — flight P, the FIFTH readings increment into references/platform-readings.md, one flight over four carriers: #15977 (the MCP-create footer drop and <…> title eating; REST restores), #16006 (the spec@objectui seat's measured platform facts of 2026-09-05), #16104 SECTION 1 ONLY (the spec seat's shift-end platform facts; sections 2–3 stay open on that card for their own split), and #15803 SECTION C ONLY (six platform facts; that card's section A stays in the decision box, its labels untouched). Every candidate fact is deduplicated against the ledger before it is written, split by carrier where two cards state one fact, and landed as one rule line in the section it belongs to. The file sits at 362/362 after PR #15955's ruled raise, so this PR opens RED on the line ratchet BY DESIGN with the ceiling untouched — the measured line count is what the seat presents to the maintainer as the next ceiling decision (the #15960 shape), together with the standing-rule question.
    Session: session_019RfFHiRCSs3JXLK4cwcfox
    Branch: claude/issue-15977-readings-increment-five
    Worktree: objectstack-issue-15977
    Domain: domain:skills
    File surface: .claude/skills/pm-dispatch/references/platform-readings.md only. ⛔ Not the ratchet map (the ceiling is the maintainer's), not rest-channel.md.
    Container & model: S, mode:subagent, opus — dispatch-gates.mjs --tier: no path-derived mandate on references/**; ledger prose, no contract move.
    Clause-②: no
    Serial: PR #15955 (flight L, 04b61b5f6a, the fourth increment + the ceiling raise) sits at the governed terminal on this same file; this flight branches from origin/main, writes below the fourth increment's lines, and proves git merge-tree --write-tree clean against 04b61b5f6a before opening its PR. GOVERNED (.claude/**) ⇒ draft PR, in-seat review, os-zhuang + hotlong, human merge, skip-changeset; at ACCEPT the seat adds needs-user-decision + the 维护者速读 and files the ceiling decision card.
    The PR carries Fixes #15977.


    Generated by Claude Code

  4. claude commented on Sep 6, 2026

    @claude
    ContributorAuthor

    os-dev-report

    {
    "issue": 15977,
    "status": "done",
    "branch": "claude/issue-15977-readings-increment-five",
    "pr": "#16379",
    "premise_still_valid": true,
    "summary": "The fifth readings increment landed as 26 rule lines in .claude/skills/pm-dispatch/references/platform-readings.md (359 to 385 lines), one line per measured fact, each in the section it belongs to, every line inside the 120-byte per-line budget (widest line still 120 bytes, LC_ALL=C awk). Nothing was deleted and nothing was re-wrapped. 48 candidates were evaluated across the four carriers, deduplicated against the ledger AS PR #15955's head leaves it (04b61b5, 362 lines) rather than against origin/main: 25 rows landed (26 lines, one row landing two), 11 were already PRESENT and are named with the line they live on, 12 were DECLINED with the reason on the row (nine repo-local, two author-side or dispatch-authoring disciplines the ledger's own line 267 and the brief already hold, one sizing tactic already covered by lines 83-84). Draft PR #16379 is RED on the line ratchet BY DESIGN with the ceiling map untouched; the number the PR puts to the maintainer is 385 (388 if PR #15955 lands first, the same +26 either way). All four claim comments were verified to name this branch before any edit; no second claim was posted, and no assignee or label on any of the four cards was touched. The PR is draft, not enqueued, not approved, no auto-merge.",
    "tests": "MERGE-TREE PROOF against PR #15955's head, run twice because this clone HAS merge.os-regen.driver registered: git merge-tree --write-tree HEAD 04b61b5f6a exit 0, 0 CONFLICT lines, tree 73062b4612a878e2039958634f0defdca56b35c9; git -c merge.os-regen.driver=false merge-tree --write-tree HEAD 04b61b5f6a exit 0, 0 CONFLICT lines, identical tree. || The two-leg requirement was itself MEASURED rather than assumed, in a throwaway git repo on this container (git 2.43.0), because ledger lines 26-28 say merge-tree does NOT apply the driver: one path routed to a custom driver via .gitattributes, both sides changed, driver true. Mutation confirmed on disk before each read by cat-ing the routed file and the config (git config --get-regexp '^merge.osprobe' returned both keys). Driver registered: exit 0, no CONFLICT line. -c merge.osprobe.driver=false: exit 1, CONFLICT (content) on that path. So both readings are true and the missing variable is per-clone REGISTRATION; the two landed lines say that, and lines 26-28 are left standing untouched (see open_questions). The probe repo lives outside the worktree and nothing in the repo tree was mutated at any point, so no restore leg was owed. || GATES: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 16 families from the committed change set; all 16 were run and reconciled - ✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED. Every exit was captured BEFORE any pipe: redirect the command's stdout and stderr into a log file first, then read the status variable on the next statement. Green (exit 0): check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, check-governed-queue-guard --self-test, check:agent-test-spelling, check:doc-authoring, check:driver-memory-census, check:nul-bytes, check:pm-governed-merges, check:pm-skill-id-lint, check:refd-timer-probe, check:required-contexts, check:skill-frame-sync, check:watch-hint-literal, check:pm-governed-prose, check:pm-half-states --self-test. check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET - unbuilt @objectstack/formula and @objectstack/lint, so NOTHING was measured); after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint it re-ran green at exit 0, so it is a real reading and not a NOT-MEASURED. check-governed-merges --test on the path exits 3 = GOVERNED, as expected. || RATCHET, the one intended red: pnpm check:pm-skill-ratchet self-test green, live exit 1 with exactly ONE failing assertion in the whole run (grep -c on its own output = 1): ✗ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 385 lines; the ratchet ceiling is 359. Every other ceilinged file green. || WHOLE-REPO LINT through the shared lock, slot issue-15977, acquired on the first attempt with the full 540s budget and never released to retry: os-verify-lock: VERDICT command-exit 0 · held the lock 110s (1m50s) · waited 0s (shared-box seconds, as the lock's own line states). || BYTES: grep -naP for the C0 range plus DEL over the edited file returns nothing; check:nul-bytes green. || ALL RUNS ABOVE ARE AT THE FINAL COMMIT git rev-parse --short HEAD = 57cd638; no commit followed them (the later PR-body PATCH does not move the tree). || CI ON THE HEAD, polled in the FOREGROUND until every run completed (no turn ended on a wait, no background watcher): 29 check runs - 1 failure, 15 success, 13 skipped. The single failure is Lint & Repo Gates, whose failing STEP read by name is number 28, PM skill line ratchet; every step before it green, ESLint included. ⚠️ That job stops there, so its 100-plus later gate steps report skipped, NOT green - which is exactly why the 16 derived families were run locally and reconciled with --ran instead of being read off the PR. || PLATFORM WRITE-BACKS, each read back: PR create via REST POST /pulls stored the body with my sent bytes as a STRICT PREFIX plus a 90-byte leading-rule footer append (ledger line 290-291, reconfirmed); the later REST PATCH kept the session-URL footer verbatim and appended a bare one, delta exactly 58 bytes (ledger line 287, reconfirmed). skip-changeset written through the ADDITIVE endpoint (POST .../labels, http 200) and verified by a comparison read-back: union(read, target) = {size/s, skip-changeset}, read-back = {size/s, skip-changeset}, nothing from the union missing, so no concurrent label was stripped.",
    "mcp_calls": "0 — every GitHub read and write went through the container's REST channel (a repo-scoped probe returned 200 at the start of the run) and through git; zero MCP GitHub tool calls for the whole flight.",
    "open_questions": [
    {
    "question": "The ceiling for .claude/skills/pm-dispatch/references/platform-readings.md. The measured need after dedup is +26 lines; the ratchet map still reads 359 with headroom 0, and this PR does not touch it.",
    "options": [
    "A — rule the ceiling to 385 (388 if PR #15955 lands first): the measured number, one line per fact, nothing deleted and nothing re-wrapped.",
    "B — rule a smaller number and send the increment back to cut: the seat would have to drop landed facts and name which, since no line in the file is spare and the 120-byte budget is already at its cap on the widest lines.",
    "C — pay in place by deleting existing lines: no candidate for deletion was found — every line in the file is a reading still in use, and re-wrapping is not currency under the 2026-08-17 ruling."
    ],
    "recommendation": "A. 实际业务需求: all 26 lines are facts the fleet burned real time on today (the corepack dist-tag drift, the job-name/step-name mismatch, the aged-out Actions log, the verbatim-title search control) — each is consulted, not decorative. 项目长远合理性: the ledger is the fleet's operational table and a ceiling that refuses measured facts pushes them back into per-seat memory, which is the drift the table exists to stop. 防 AI 犯错: every landed line is a tightening (a reading an agent must not assume), never a permission. 创业阶段不扩散: zero new mechanism — one file, one register, no new gate, no new label."
    },
    {
    "question": "Ledger lines 26-28 say git merge-tree answers the default text merge and does NOT apply the .gitattributes driver, and infer a systematic under-report on driver-managed paths. This flight measured the opposite on a registered clone (git 2.43.0). Both are true — the missing variable is per-clone registration — but line 27's inference does not survive, and the new lines 349-350 sit two hundred lines away from it.",
    "options": [
    "A — land only the two new lines (what this PR does), leave 26-28 standing, and file the reconciliation as its own card at ACCEPT.",
    "B — rewrite line 27 inside this PR to state the registered-driver hazard.",
    "C — leave the correction unlanded entirely and keep only the existing 26-28."
    ],
    "recommendation": "A. 实际业务需求: the operational prescription (run the conflict proof twice, once with the driver forced off) is fully carried by lines 349-350, so nothing an agent needs today is missing. 项目长远合理性: correcting a ruled line deserves its own readable diff, not a rider on a 26-line increment whose whole point is a count. 防 AI 犯错: the new pair is strictly TIGHTER than 26-28 (it demands a second run), so a reader following the newer lines cannot be led wrong by the older ones. 创业阶段不扩散: A costs zero new mechanism; C would leave a measured, load-bearing fact unrecorded, which is the failure mode this ledger exists to prevent."
    }
    ],
    "out_of_scope_findings": [
    "noted, not filed (#16351 admission threshold): the Lint & Repo Gates job aborts at its first failing step, so a PR carrying one red gate never displays the rest of the farm's verdicts — 100-plus steps report skipped, not green. Same measurement defect as turbo run without --continue, recorded on #15803's 14:17Z comment, one layer up in a shell job. Not a reproducible product defect, a declared-contract violation, or a metadata-authoring trap, so it rides the PR's 验收备注 rather than becoming a card; the seat files it at ACCEPT if it judges otherwise."
    ]
    }


    Generated by Claude Code

  5. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 7, 2026
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

    documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions