Skip to content

os-dev: a bounded in-place exemption to the never-fix-out-of-scope rule — four conditions, or file it #8781

Closed

Description

@hotlong

Filed and dispatched on direct maintainer instruction (2026-08-14, verbatim, untranslated): 「把上面四条豁免固化进 skill」, answering the seat's analysis of why a one-leaf translation fix became a filed card instead of a same-PR change.

The measured instance

A dev repairing the es-ES half of an ADR-0090 rename found the identical stale leaf in the ja-JP bundle — same defect class, adjacent file, one string value, correct form already pinned by the file's own sibling field and by the English source. Current rule said file it, so it was filed with a full repo-wide bounding sweep behind it. Result: a 1-line fix now needs the whole pipeline (triage, claim, worktree, dispatch, gate union, PR, review, merge), and the chance to close the CLASS was lost — the consistency guard added in the es-ES PR deliberately omits a ja-JP rule because the instance was still open, so the two changes could have been one.

What the current rule says, and what it is really protecting

.claude/agents/os-dev.md (the out-of-scope clause, near the top of the role's scope section): out-of-scope findings are filed as unassigned issues and listed in out_of_scope_findings — never fixed in this PR. Absolute by construction.

It protects two real things and must keep protecting both: file-surface serialization between parallel agents (a drive-by edit to a file another claim holds is a collision), and unreviewable scope creep ("while I was here I also…"). What it does not distinguish is a mechanical same-class leaf from a module refactor.

Deliverable — the exemption, in .claude/agents/os-dev.md

Amend the out-of-scope clause so that in-place repair is licensed when all four hold:

  1. the finding is in the same defect class as the card being worked;
  2. the change is mechanical — no semantic judgment, the correct form already pinned by existing evidence (source of truth, sibling declaration, or a landed ruling);
  3. the target file is held by no other claim;
  4. it is covered by the same gate families — no new verification surface.

Obligations when the exemption is taken (part of the rule, not optional): the claim's declared file surface is amended in the same round; the PR body names the extra fix and carries its evidence (a bounding sweep belongs in the PR body, not lost); and where the same PR can extend an existing guard to cover the class rather than the instance, that is the preferred form. Any condition unmet ⇒ the existing behavior is unchanged: file unassigned, list in out_of_scope_findings, do not touch.

Reviewer's half, only if it fits the ceiling: one line in references/review-checklist.md — an in-place adjacent fix is checked against the four conditions plus the amended surface and the named evidence. If the ceiling cannot fund it without cutting a norm, skip it and say so; the dev-side rule is the load-bearing half.

⛔ Ratchet constraint — this is the first card to land under the full-surface ratchet

Every covered file is at headroom 0: os-dev.md 399/399, review-checklist.md 82/82, SKILL.md 686/686 untouched. Additions must be funded line-by-line in the PR body, exactly as SKILL.md edits have been all along. Compression to pay for the new text must follow the rule that landed with the ratchet: verbatim rulings keep, stories compress to one line, ⛔ marks and norms survive. ⛔ Raising a ceiling is not an option here — no maintainer ruling authorizes it, and this card is not one.

Surface is .claude/agents/os-dev.md (+ optionally one references/** line) ⇒ fable-mandatory dispatch, ADR-class merge path (draft PR, human merge, auto-merge never armed). Gate union after the final commit with quoted HEAD.

Activity

  1. self-assigned this
    on Aug 15, 2026
  2. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Aug 15, 2026
  3. added theissue type on Aug 15, 2026
  4. hotlong commented on Aug 15, 2026

    @hotlong
    ContributorAuthor

    Claim: #8781 — bounded in-place exemption (maintainer-pulled)

    • Session: session_018WuTtyckQa1VcXwgd52JpN (single-card special dispatch on direct maintainer instruction; the skills lane seat stays ⏳ vacant — this is not a re-seating)
    • Branch: claude/issue-8781-inplace-fix-exemption
    • Worktree: dev agent creates its own per-task worktree
    • Domain: domain:skills
    • File surface: .claude/agents/os-dev.md (primary) · optionally one line in .claude/skills/pm-dispatch/references/review-checklist.md; ⛔ SKILL.md untouched
    • Container & model: os-dev subagent, claude-fable-5 — checked against the mandatory roots list rather than recalled: the surface touches the agent definition and possibly .claude/skills/pm-dispatch/references/**, both fable-mandatory
    • Serial constraints cleared: the two PRs that held this surface today are MERGED; no other open PR touches either file

    ADR-class merge path: draft PR, human merge, auto-merge never armed. Ratchet posture: both target files at headroom 0, so the diff must be net-zero-or-negative per file and funded line-by-line in the PR body.


    Generated by Claude Code

  5. hotlong commented on Aug 15, 2026

    @hotlong
    ContributorAuthor

    Claim amendment — model downgrade claude-fable-5 → opus under the quota-exhaustion exemption (maintainer 2026-08-13, 「8451 同意」, codified on main).

    • Trigger, measured: the fable-tier dispatch terminated on the tier wall — "You've reached your Fable 5 limit" — before any work landed. State rebuilt from GitHub per the exemption's discipline: no remote branch, no PR, no worktree; the re-dispatch starts clean, not mid-card.
    • Floor honored: opus, the exemption's floor — not a further downgrade.
    • Scope unchanged: same card, same file surface (.claude/agents/os-dev.md + optionally one references/** line), same ADR-class merge path (draft, human merge, auto-merge never armed), same headroom-0 ratchet constraint.
    • Reviewer's note: this review will be at the session's own tier, not fable — recorded here so the tier trail is complete rather than inferred.

    Generated by Claude Code

  6. hotlong commented on Aug 15, 2026

    @hotlong
    ContributorAuthor
    {
      "issue": 8781,
      "status": "done",
      "branch": "claude/issue-8781-inplace-fix-exemption",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/8785",
      "premise_still_valid": true,
      "summary": "Premise re-verified on origin/main before implementing: the out-of-scope clause in .claude/agents/os-dev.md ground rule 3 was still absolute ('never fixed in this PR', no exemption landed), and both ceilings read exactly as stated (os-dev.md 399/399, review-checklist.md 82/82, SKILL.md 686/686 untouched). Amended ground rule 3 with a bounded four-condition exemption (same defect class; mechanical with the correct form already pinned by existing evidence; file held by no other claim; same gate families) plus its three obligations — claim file surface amended the same round, PR body naming the fix with its evidence including the bounding sweep, and extending a guard to close the class preferred over patching the instance. The prohibition stays the default and both things it protects remain legible: file-surface serialization (condition 3 + the amend-the-surface obligation) and unreviewable scope creep (the name-it-with-evidence obligation). The optional reviewer's half WAS funded and landed — one bullet in references/review-checklist.md — without cutting any norm. Diff is net zero per file (56 insertions / 56 deletions across 2 files); no ceiling raised. Observation, not a surprise on the PR: a second worktree at my commit (scratchpad/rev-8781, detached HEAD) exists that I did not create — left untouched.",
      "tests": "Gate union run AFTER the final commit at HEAD 675f7bb7e6 (PR head.sha 675f7bb7e67992116f9b79be92de5452106bb4a5 — matches), working tree clean, heavy phase under flock -E 99 -w 540 /tmp/os-heavy-verify.lock. Families derived from the ACTUAL changed paths via 'node scripts/pm/dispatch-gates.mjs .claude/agents/os-dev.md .claude/skills/pm-dispatch/references/review-checklist.md' — the derivation returned exactly the six the dispatch named PLUS check:doc-formula-expressions, which was run too (the addition named per contract). All green: check:pm-skill-ratchet — '.claude/agents/os-dev.md is 399 lines (ceiling 399; headroom 0)' and '.claude/skills/pm-dispatch/references/review-checklist.md is 82 lines (ceiling 82; headroom 0)'; check:pm-skill-id-lint; check:agent-model-declared — '1 agent definition(s) ... all declare a model, os-dev.md -> opus, 0 justified inherit(s)', 18 self-test cases pass; check:skill-frame-sync — '4 copies of the decision frame are structurally isomorphic across 3 files ... binding sentence present in all 4', 12 self-test cases pass; check:doc-authoring — '377 files clean'; check:nul-bytes — 'scanned 5803 text file(s) ... no raw ASCII control bytes', 75 self-test assertions; check:doc-formula-expressions — '22 record-scoped formula example(s) across 396 files / 1410 TS blocks judged clean', run after 'pnpm --workspace-concurrency=2 --filter @objectstack/formula... build' in the fresh worktree (missing-dist would have been an environmental red). No test suite applies — the change is agent-protocol prose, so the verification that carries the load is the ratchet plus a mechanical norm-survival check: stop marks 11 on main / 11 at head, 'measured' markers 8/8, maintainer rulings unchanged (3 'maintainer ruling' + 1 'maintainer-decided' + 1 'maintainer,'). Checklist reflow proved content-pure: with the new bullet removed the file is character-identical to main modulo whitespace (norm(curMinus) === norm(old) -> true). Also self-scanned for control bytes with grep -naP beyond the gate: clean. Gate status on CI: in_progress at report time (draft-PR-time reporting per contract).",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Accounting is in the PR body as an explicit per-site table: os-dev.md +9 for the exemption, funded by -3 (frontmatter comment reflowed from 78 to the file's 95-col width, zero words removed), -1 worktree-cleanup rule, -1 local-verification item 4, -1 union-after-final-commit paragraph (closing restatement folded into the opening sentence), -1/-1/-1 terminating rules 2/3/4 (one measured story folded to a clause). review-checklist.md +2 funded by two pure reflows. No stop mark dropped, so none needed a surviving home named.

    Labels read back after bots settled: ["size/m","skip-changeset"] — the union, not the bare set. PR is draft; auto-merge never armed (ADR-class).


    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

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seat

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions