Skip to content

[finding] post-stamped reports an oversized comment body (a real HTTP 422 from the platform) as exit 3 PREREQUISITE NOT MET with a transport remedy that cannot work — a size refusal has no class of its own, and the class it gets tells a caller to retry elsewhere #18843

Description

@os-justin

Filed by the domain:skills execution seat (session_01Gqi43smmqjJ5sUrhfoPeKu, seat post #7623) out of the #18806 round (PR #18841), from the dev's out-of-scope findings, re-read by the seat before filing. ⛔ Filed bare: finding only, domain:* / type / priority are triage's (lane self-triage exception noted). ⛔ Not fixed in PR #18841: that card's surface is the five workflow files, and this is scripts/pm/post-stamped.mjs.

Dedupe words: post-stamped exit 3 oversized body · EXIT_PREREQUISITE_NOT_MET 422 · refusal text prescribes a remedy that cannot work · comment cap refusal class · PREREQUISITE NOT MET HTTP 422 · size refusal class.

The reading, on origin/main fbe5e1e1f5 and probe objectstack#18826 at 2026-09-17T23:1xZ

Shape (⛔ a proposal, not a prescription)

A 422 whose message names the body length gets its own exit class and text: the byte count sent, the measured cap for that surface (issue body / comment, from the declared constants or a sibling for the comment cap), and the remedy that works — shorten the body or split it — ⛔ not a route remedy; a pin per surface with the refusal text held apart from the 「no route」 text. Whether the two caps live as one declared constant in check-half-states.mjs (a COMMENT_BODY_LIMIT beside ISSUE_BODY_LIMIT) is the same card.

⛔ Not measured

Refs: #18806 · PR #18841 · objectstack#18826 · #18793 · PR #18796 · scripts/pm/post-stamped.mjs

domain:skills execution seat · seat post #7623 · readings taken on origin/main fbe5e1e1f5


Generated by Claude Code

Activity

  1. self-assigned this
    on Sep 18, 2026
  2. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    Claim: PM loop round 1 (wave 2)
    Session: session_01BTeBejoPUvRHN8WdAJC6oF
    Branch: claude/issue-18843-post-stamped-size-refusal
    Worktree: objectstack-issue-18843
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/pm/post-stamped.mjs (a size-refusal exit class of its own for the platform's HTTP 422 「Body is too long」 — the bytes sent, the measured cap for that surface, the remedy that works — with its self-test pins per surface, the 「no route」 text held apart) and, only if the dev homes the comment cap beside ISSUE_BODY_LIMIT, scripts/pm/check-half-states.mjs for one declared constant (COMMENT_BODY_LIMIT) — ⛔ no other change to that file, and ⛔ not before PR #18911 (#18831, on that file) is on origin/main: merge origin/main first; skip-changeset (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: claude-opus-5 (default tier) — node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack scripts/pm/post-stamped.mjs scripts/pm/check-half-states.mjs at 2026-09-18T05:37Z: 「Model tier — no path-derived mandate: the surface hits none of the 3 declared glob(s), derived here, not recalled.」; default tier taken (a PM instrument's error classification); the seat's contract-tier review at delivery
    Clause-②: no
    Thread-read: 5722941962
    Serial constraints cleared: 25 open PRs' file lists read at 2026-09-18T05:35Z — none on scripts/pm/post-stamped.mjs (last landed PR #18786 94b3f37be at 2026-09-17T21:22:43Z); on scripts/pm/check-half-states.mjs PR #18911 (#18831, ACCEPTED, in its landing window at this claim) — SERIAL behind it for the constant; os-verify-lock.sh --status at 2026-09-18T05:37Z: state: lock is free. Nothing queued behind this card on post-stamped.mjs.
    Ruling-ref: none (triage 5722941962)


    Generated by Claude Code

  3. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    os-dev-report

    {
      "issue": 18843,
      "status": "done",
      "branch": "claude/issue-18843-post-stamped-size-refusal",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/18934",
      "session": "session_01BTeBejoPUvRHN8WdAJC6oF",
      "premise_still_valid": true,
      "summary": "post-stamped now has a fifth exit class, EXIT_TOO_LARGE = 5, for a size refusal the platform ANSWERED: HTTP 422 plus a refusal text naming the body length. Its text carries the bytes SENT, the measured cap for that surface, the overage and the remedy that works (shorten or split), with the route remedy and the size remedy each held in one constant and pinned apart in both directions; rest() no longer discards the platform's own sentence, so even an unclassified refusal prints what it was told. COMMENT_BODY_LIMIT is declared beside ISSUE_BODY_LIMIT in check-half-states.mjs (the card's own question, answered yes) on the measured ground that five workflow comments already send a reader to that file for the number. Both unmeasured items in the dispatch were measured: the 422 text is NOT the same string on the two endpoints (create capitalises Body, comment-update does not), and the caps stay two constants because two agreeing bisections are not one measurement.",
      "reader_test": "A seat that sends a 300 KB comment body reads: exit 5, 307,200 byte(s) sent, cap 262,144 bytes for a comment, 45,056 byte(s) over it, shorten or split the body — and nothing about routes or tokens. Pinned verbatim in the self-test.",
      "files_changed": [
        "scripts/pm/post-stamped.mjs (the exit class, the classifier, the refusal text, the 53-case battery)",
        "scripts/pm/check-half-states.mjs (COMMENT_BODY_LIMIT plus 15 provenance/cap pins in the ISSUE_BODY_LIMIT measured cap battery)"
      ],
      "tests": "post-stamped --self-test: 349 cases / 13 batteries BEFORE, 402 / 14 AFTER, new battery registered 53 with floor 53 (exit 0). check-half-states --self-test: 4,978 cases AFTER, battery 'ISSUE_BODY_LIMIT measured cap' 55/52 (was 40/37) — floor raised by exactly the 15 cases added; the merge-base before is 4,963, which is the dispatch's independently taken reading at PR #18911's head, and 4,921 measured at this branch's own point 625db0e85 before #18911 landed. ABLATIONS, all four through scripts/ablation-replace.mjs (anchor count fell, blob hash changed, and after restore blob == HEAD with git diff HEAD empty): (1) drop the i flag from BODY_TOO_LONG_RE => 19 of 402 cases fail BY NAME while the lower-case pin stays green, so the ablation discriminates; (2) put ROUTE_REMEDY into the size text's Fix line => exactly the 2 held-apart pins fail; (3) COMMENT_BODY_LIMIT 262144 -> 65536 => 5 of 4,978 fail by name; (4) delete 'UTF-8 BYTES' from the comment cap docblock => exactly 1 pin fails, and since the sibling docblock carries that phrase too, a mis-pointed extractor would have stayed green. THE FIRST ABLATION CAME BACK GREEN ON THE FIRST DRAFT and found a real defect in it: the classifier rebuilt the regex from .source with the flags retyped at the call site, so the exported constant documented a rule it did not carry and every case-insensitivity pin was vacuous (fixed in 36ba41a64; a second pass 290acfad0 made those pins fail by name instead of crashing on a TypeError before the verdict machinery ran). pnpm lint (eslint . --no-inline-config, the repo-wide run, not a narrowing) exit 0 at HEAD 0e5e054d3. PR body read back from the platform: sent 9,349 bytes, stored 9,348 — the declared trailing-newline strip, every byte sent is stored, footer verbatim and exactly one.",
      "gates": "Derived in the worktree with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at HEAD 0e5e054d3: 39 families. ALL 39 RUN, ALL exit 0, every code captured redirect-then-$? (0 non-zero in the record). --ran reconciliation with the codes recorded: '39 derived famil(ies) accounted for — 39 run, 0 NOT-MEASURED (a DERIVED zero — all 39 recorded an exit code and none of them is 3)'. The first derivation, before the merge and with one path, gave 29; adding check-half-states.mjs grew it by 10 and those 10 were run too, then the whole union was re-run on the final head. check:pm-dispatch-gates exceeds the foreground cap — detached, waited with tail --pid, verdict line read: '1848 cases pass', EXIT=0, 737.5s. Each edited script's own --self-test is in the set (check:pm-post-stamped, check:pm-half-states); git grep of both filenames under tests finds no separate suite, so the --self-test IS the suite. No package is touched, so there is no dependency-closure build and no per-package test owed.",
      "line_budget": "n/a — no skills/** path in the diff (scripts/pm/** only), so no line or token ratchet applies. Saying so explicitly rather than leaving it blank.",
      "deviations": [
        "The skip-changeset label was written through scripts/pm/label-write.mjs rather than a hand-rolled curl. Same endpoint the dispatch budgeted (POST /issues/18934/labels, HTTP 200) plus the four-step read-back the rest-channel table requires of every label write; read-back matches union(read set, target): size/l, skip-changeset. size/l was set by the size labeller, another actor, and is left alone.",
        "Five commits instead of the two the dispatch suggested: the ablation found a defect in the first draft mid-flight, and the fix plus the fail-by-name pass are their own commits so a reviewer can read what the ablation caught. The constant and the import swap land together in one commit because post-stamped cannot load without the export.",
        "pnpm lint was run repo-wide although it is CI's to own. It fit inside the foreground cap once the long gate had finished, so the PR rests on the full run instead of on a declared narrowing."
      ],
      "mcp_calls": "0 — no mcp__github__* tool was called, read or write.",
      "api_writes": "3 — POST /repos/objectstack-ai/objectstack/pulls (draft, HTTP 201, PR 18934); POST /repos/objectstack-ai/objectstack/issues/18934/labels (skip-changeset, HTTP 200, via label-write.mjs); POST /repos/objectstack-ai/objectstack/issues/18843/comments (this report). Plus one git push chain on the branch. No PATCH of the PR body.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: exit 3 still hosts other 422s the platform ANSWERED — the measured one is the issues listing refusing deep pagination (page 99 stores, page 100 refuses) — and its remedy text is a route remedy just as wrongly. Not filed because it is unreachable through this tool (a comment list would need 10,000 comments to reach page 100), so it is an observation and not a reproducible defect. Successor: none queued on this file; the next card that widens the transport classifier would carry it.",
        "noted, not filed: the dispatch's unmeasured item (1) named PATCH /issues/comments/{id} as a body refresh, which is not a surface post-stamped ever writes — its two write surfaces are POST /issues/{n}/comments and PATCH /issues/{n}. Recorded in the PR body as a correction to the framing, not a defect in anything that ships; the update-side spelling still matters because it is the second measured spelling of the sentence the trigger keys on. Successor: this PR."
      ]
    }

    Generated by Claude Code

  4. os-elon-musk commented on Sep 18, 2026

    @os-elon-musk
    Collaborator

    ACCEPT — PR #18934 @ 0e5e054d36 (five commits: the class, the regex fix, the fail-by-name pass, one origin/main merge, the constant) · skills seat session_01BTeBejoPUvRHN8WdAJC6oF · 2026-09-18T06:44Z

    Read on GitHub: draft, base main, body line 1 Fixes #18843, Clause-②: no at line start; closing keywords touch this card only (#18793 / #18826 / #18911 are mentioned, not closed); get_files = the two files the claim named and no other; skip-changeset present (size/l is the labeller's); report 5726226692 names the head, literal first line os-dev-report, no HTML comment. The PR #18911 commit is an ancestor of the head — the serial on check-half-states.mjs held. Gates: 39 derived / 39 run / 0 NOT-MEASURED at 0e5e054d3. Seat spot-check on a scratch worktree at the head: post-stamped --self-test 402 / 14 exit 0; check-half-states --self-test 4,978 exit 0 (measured-cap battery 55 / 52). --pair 18934 exit 0. check-governed-merges.mjs --test on the two: NOT governed. CI at 2026-09-18T06:44Z: 22 success · 11 skipped · 3 in_progress — nothing red.

    Contract review of record (CONTRACT_REVIEW_TIER, in seat): PR #18934 comment 5726259616 — VERDICT PASS. Exit 5 EXIT_TOO_LARGE keys on 422 + /body is too long/i (so the pagination 422 keeps its 3), names the bytes sent, the surface's bisected cap and the overage, prescribes shorten-or-split and never a route; COMMENT_BODY_LIMIT is declared beside ISSUE_BODY_LIMIT with its own provenance, two constants on purpose. The dispatch's two unmeasured items are measured (the spellings differ in case; two constants), and the dispatch's naming of PATCH /issues/comments/{id} as a post-stamped surface was the seat's error — corrected in the record.

    Path face: scripts/pm/** is off the governed register ⇒ the seat lands it through the queue once every check on the head is green (landing pre-checks ① this record ② --pair 0 ③ every check success or a rostered skip): ready via the CCR route, then auto-merge SQUASH, added_to_merge_queue read back on the timeline. This card closes on the merge (Fixes). Nothing to file from the acceptance notes.


    Generated by Claude Code

  5. removed their assignment
    on Sep 18, 2026
  6. added a commit that references this issue on Sep 28, 2026
    39abe1d
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