Skip to content

pm-dispatch(mailbox): epic seats cannot be rung — mailbox-open refuses epic: seat keys and the fleet roster has no epic rows #28718

Closed

Description

@objectstack-fleet

domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

Carries item ③ of #28675 (epic seats get mailboxes); #28675 keeps items ①②④⑤, landing in PR #28716.
Filing gate: ② an in-scope item of in-flight work #28675 that its PR could not carry within the claim's file surface (dev report 6559765410, open_questions 1). Filed by domain:skills seat 2. ⛔ Not a claim.
Reader: domain:skills, scripts/pm/mailbox-open.mjs (seatKey), scripts/pm/fleet-roster.mjs (seat rows), plus one line in .claude/skills/pm-dispatch/references/project-forms.md 〈信箱 PR〉.
Dedupe (open AND closed): "epic mailbox" → only #28675; "epic seat roster" → none.
reach: every epic PM seat. Measured on 2026-11-01 (#28675 body): epic:#27293#1, epic:#28130#1 and epic:#26676#1 dispatch every pm:epic card, but have no roster row and no mailbox, so no seat can ring them; triage's "take #28591 first" sat on the card instead.

Measured by the #28675 dev

  • mailbox-open.mjs seatKey refuses an epic: seat spelling, so an epic seat cannot open a mailbox.
  • fleet-roster.mjs lists no epic seats, so the roster's mailbox column cannot show one.

Wanted

Blocked-by: #28675

Activity

  1. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:skills · area:devpath · pm:blocked (behind #28675) · 2026-11-01T15:56Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

    State: pm:blocked → pm:queue · 2026-11-01T16:34Z

    Blocker landed: Blocked-by: #28675 is closed completed by PR #28716 (merged db357f6da9). Triage audit on file (6560301001), so the card is a candidate again. finding removed in the same write (graded p2 by triage). ⛔ Not a claim.

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

    Claim: PM loop round 1
    Session: session_017ihL2g7RyXa8ErM6GAkHyc
    Account: marchtian
    Branch: claude/issue-28718-epic-seat-mailbox
    Worktree: objectstack-issue-28718
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: scripts/pm/mailbox-open.mjs, scripts/pm/fleet-roster.mjs (+ scripts/pm/fleet-roster.fixture.json if its battery needs an epic row) and their self-tests, plus one line of .claude/skills/pm-dispatch/references/project-forms.md 〈信箱 PR〉 — triage's one-PR cross-domain exception (6560301001). record-recognisers.mjs only if To: epic:… must read (then named in the report).
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier: no path-derived mandate on this surface; PM per-card judgment), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a protocol gap split from #28675)
    Thread-read: 6560747188
    Premise: holds — on origin/main after PR #28716, mailbox-open.mjs seatKey('epic:#12') still returns null (its self-test pins it) and fleet-roster.mjs names no epic seat.
    Serial constraints cleared: PR #28716 (#28675, the blocker) merged db357f6da9; no open PR touches the surface above (read over every open non-mailbox PR); PR #28739 touches only SKILL.md.

  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

    os-dev-report

    {
      "issue": 28718,
      "status": "done",
      "branch": "claude/issue-28718-epic-seat-mailbox",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28751",
      "head": "27657d802c",
      "session": "session_017ihL2g7RyXa8ErM6GAkHyc",
      "premise_still_valid": true,
      "summary": "seatKey (mailbox-open.mjs) reads the epic lane epic:#N#K (epic:#N = seat 1; slug epic-N-K; domain:epic-... joins the reserved set so slugs stay one-to-one; malformed epic spellings stay refused), so mailbox-open opens an epic seat's mailbox and To: epic:#N#K doorbells read through record-recognisers unchanged. fleet-roster gives each open delegated pm:epic parent (sub-issues AND a session registration, both halves of H45's signals) a row: one per epic seat with an open mailbox (seated by its Mailbox-of login), else seat 1 status unknown; an epic mailbox is no longer flagged as on no seat row. project-forms 〈信箱 PR〉 first line now says an epic seat opens one like any seat, paid in place by dropping the tool-owned branch spelling (54/54 ceiling unchanged).",
      "roster_option": "(a) row per open pm:epic parent naming a session: one new read per repo (GET issues?labels=pm:epic) and no new protocol; (b) needs the same read plus a new Mailbox: line on epic bodies; rows off mailboxes alone (zero reads) rejected because a closed epic's mailbox would read as a live seat",
      "tests": "node scripts/pm/mailbox-open.mjs --self-test: 81 cases in 10 batteries pass (exit 0); node scripts/pm/fleet-roster.mjs --self-test: 88 cases in 8 batteries pass (exit 0); importers green unchanged: record-recognisers --self-test 351 cases, check-owed-reviews --self-test 65, fleet-write/dispatch --self-test 265; live read-only roster on objectstack: 30 rows incl. epic:#26676, epic:#27293, epic:#8345 (seat 1, unknown, no epic mailbox open yet); ablation n/a (scripts are not ablated per os-dev)",
      "gates": "head 27657d802c: dispatch-gates --commands --repo objectstack-ai/objectstack derived 38 families, all exit 0 (captured before any pipe); --ran: 38 derived, 38 run, 0 NOT-MEASURED, 0 UNRUN (exit 0). Named by the order: check:pm-skill-ratchet 0 (project-forms.md 54/54), check:pm-skill-id-lint 0, check:skill-frame-sync 0, check:pm-governed-prose 0 (outside derivation), both --self-test 0. check:pm-dispatch-gates: fast tier 1937 cases pass, exit 0. CI check-runs on 27657d802c at report time: 6 success, 20 skipped, 15 in_progress, 0 failure (not waited for).",
      "line_budget": "roster half +62/-14 = net +48 (fleet-roster.mjs +52/-14, fleet-roster.fixture.json +10/-0), under the ~120 cap; mailbox-open.mjs +46/-28 = net +18; project-forms.md +1/-1 = net 0; total +109/-43 over 4 files",
      "deviations": [
        "first gate pass ran before pnpm install: 9 families exit 3 (no node_modules / @objectstack/formula and @objectstack/lint unbuilt) and check-self-test-workflow-commands exit 1 (release-pending-publish could not import @changesets/cli); after pnpm install --frozen-lockfile and turbo build of formula+lint under os-verify-lock (VERDICT command-exit 0) all re-ran to exit 0",
        "first check:pm-dispatch-gates run was backgrounded without an exit capture; re-run with the exit captured (0) and that reading is the one recorded",
        "the 〈信箱 PR〉 rule is one EDITED line, not an added one: the file is at ceiling 54 (headroom 0) and all lines are near the 120-byte cap, so the epic clause is paid by deleting the branch spelling from the same line (tool-owned, mailbox-open.mjs header)",
        "PR body ends with the order's footer line; the session URL sits in body prose (Session: line) rather than as AGENTS' session-URL footer",
        "PR opened with no assignees (order + os-dev), although AGENTS says the PR assignee mirrors the card's"
      ],
      "files_changed": [
        ".claude/skills/pm-dispatch/references/project-forms.md",
        "scripts/pm/fleet-roster.fixture.json",
        "scripts/pm/fleet-roster.mjs",
        "scripts/pm/mailbox-open.mjs"
      ],
      "record_recognisers": "not edited: To: and key seat fields read through seatKey, so To: epic:#27293#1 reads (measured)",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create stroke: pull #28751 created draft + labels leg skip-changeset, read back 8272/8272 bytes), POST issues/28718/comments via post-stamped (this report); plus 1 git push (not REST)",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — record-recognisers.mjs readSeat docblock still names four lanes in prose; behaviour already follows seatKey (outside the file surface)"
      ],
      "open_questions": [
        {
          "question": "Epic parent bodies state seated/vacant only in free prose (#8345 says vacant), so an epic row with no mailbox reads 'unknown'. Add a uniform seat line to epic parents?",
          "options": [
            "A keep: the open mailbox is the seated signal; unknown means nobody can ring it",
            "B add a machine line to the epic registration (new protocol, more reads of prose)"
          ],
          "recommendation": "A, because it adds no protocol and the gap the card names (unringable) is exactly what unknown shows"
        },
        {
          "question": "Triage named the skill line Tier H; GOVERNED_SURFACES registers .claude/** as Tier S. Which record lands this PR?",
          "options": [
            "A Tier S: a contract-review PASS on the current head, owning seat lands",
            "B Tier H: maintainer approval"
          ],
          "recommendation": "A, because the register is the authority and every path here is .claude/** or scripts/pm/**"
        }
      ]
    }
  5. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

    os-dev-report

    {
      "issue": 28718,
      "status": "done",
      "round": "patch — contract review 6561348241 should-fixes 1-3",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28751",
      "head": "ed0cc244e46a68611333a6d2b1e0e36bcd3d7a5f",
      "session": "session_017ihL2g7RyXa8ErM6GAkHyc",
      "changes": [
        "1: project-forms.md 〈信箱 PR〉 line spells the seat as epic:#N#K with both numbers bracketed as placeholders (117 bytes; 54/54)",
        "2: fleet-roster epicSeatsHeld matches an epic row's seats by seatKey's slug epic-N-K, as the mailbox column does, so a head-only epic mailbox seats its row (seat number from the slug); fixture 25400 on 27293 seat 2",
        "3: isSeatedFreshEpic, a second named condition: a registered pm:epic issue that an open mailbox names is a row with no sub-issue yet; isEpicParent stays equal to H45; fixture 28800 + mailbox 25399 is a seated row and not flagged, 28647 (registration, total 0, no mailbox) stays no row"
      ],
      "tests": "fleet-roster --self-test: 91 cases in 8 batteries pass (fixture battery pin 22 to 25); mailbox-open --self-test: 81 cases in 10 batteries pass",
      "gates": "head ed0cc244e4: dispatch-gates --commands --repo objectstack-ai/objectstack derived the same 38 families, all exit 0 captured before any pipe; --ran: 38 derived, 38 run, 0 NOT-MEASURED, 0 UNRUN (exit 0). check:pm-skill-ratchet 0, check:pm-skill-id-lint 0, check:skill-frame-sync 0, check:pm-governed-prose 0, check:pm-dispatch-gates 0 (fast tier 1937 cases)",
      "line_budget": "this round +49/-17 (fleet-roster.mjs +45/-16, fixture +3/-0, project-forms.md +1/-1); roster half now +94/-14 = net +80 vs main, under the ~120 cap; whole PR +141/-43 over the same 4 files",
      "files_changed": [
        ".claude/skills/pm-dispatch/references/project-forms.md",
        "scripts/pm/fleet-roster.fixture.json",
        "scripts/pm/fleet-roster.mjs"
      ],
      "deviations": [],
      "mcp_calls": "0",
      "api_writes": "1 — POST issues/28718/comments via post-stamped (this report); plus 1 git push (not REST)",
      "out_of_scope_findings": [],
      "open_questions": []
    }
  6. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

    ACCEPT → PR #28751 comment 6561565905 (head ed0cc244e46a68611333a6d2b1e0e36bcd3d7a5f; contract review PASS 6561348241 → patch round 6561503444 → delta PASS 6561551606). The PR is a draft with needs-user-decision, and os-zhuang and hotlong are requested as reviewers. It waits on an authorised approver.

  7. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc

    Landed 2026-11-01T21:06Z: PR #28751 merged as b9b877ccb0 (merge queue; readied and enqueued by os-zhuang). Contract review PASS 6561551606, seat ACCEPT 6561565905.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillspriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions