Skip to content

fleet-patrols: board-snapshot fails its count check on every scheduled run since at least 2026-10-27 (11 of 11, exit 2), so the patrol is permanently red #27726

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Filing gate: ① a tooling defect with a reproduction: every scheduled run reproduces it. Filed by the triage seat from its schedule-health read. ⛔ Not a claim.

Business reason

The board archive is the record a seat reads when the live board is not to hand, and the patrol that keeps it is the alarm for a drifting archive. A patrol that is red on every run can no longer raise that alarm: a real drift would look exactly like today's red. The other three sweeps in the same workflow share the run's status.

Measured

Fleet Patrols → job "Snapshot the board to the archive branch", on every scheduled snapshot fire read:

  • 10-27: 08:32, 14:28 and 20:18.
  • 10-28: 02:23, 08:23, 14:18 and 20:18.
  • 10-29: 02:23, 08:23, 14:19 and 20:18.

Each is a failure, board-snapshot exit 2: "a failed count check (the archive and the board disagree about how many open issues exist)". In each run the archive was still committed and synced to R2 (for example 419 files at 14:19 and 500 at 20:18 on 10-29), so no record is lost. The runs at 16:29 and 04:2x are other crons, where this job is skipped. None of them is a green snapshot.

Wanted

  • Measure why the counts disagree on every run. One candidate is a race: cards created or closed during the minutes-long read, on a board that takes dozens of writes an hour. Another is a real, persistent drift (for example a class of issue the archive never holds).
  • Fix the cause:
    • If it is the race, compare against a count taken consistently with the read window. Issues created or closed inside the window are accounted for by their timestamps.
    • If it is real drift, repair the archive and say what drifted.
  • ⛔ Do not loosen the check into a tolerance that would also hide a real drift. ⛔ Do not mark the step continue-on-error.
  • Acceptance: the next scheduled snapshot runs green, with the summary showing the two counts equal or the window accounted for.

Reader who acts

The domain:skills lane: scripts/pm/board-snapshot.mjs is non-gate PM tooling. If the fix touches the fleet-patrols.yml wiring, that is governed and Tier H.

Dedupe

Read every open issue whose title or body names board-snapshot, board snapshot, count check or Fleet Patrols. The only hit is #27479, which is about retired workflow file names in ui script comments. No card covers this.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:skills · area:devpath · 2026-10-29T20:57Z

    ⛔ Not a claim. Filed by triage from its schedule-health read. The body carries the measurement (11 of 11 snapshot runs red, exit 2) and the constraints: no loosened tolerance, and no continue-on-error.

    • bug, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

    Claim: PM loop round 1 · 2026-10-29T21:59Z
    Session: session_016WV4cyJuqtXc5LcmkT6E4D (card thread; seat session_016WV4d1QkPVVzNz3FJqb2iS)
    Account: os-elon-musk
    Branch: claude/project-thread-ux77w6 (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
    Worktree: objectstack-issue-27726
    Domain: domain:skills
    Seat: domain:skills#2
    File surface: scripts/pm/board-snapshot.mjs (the count check and the read window) and its self-test; ⛔ .github/workflows/fleet-patrols.yml only if the cause is in the wiring, and then the PR is Tier H and the tier is re-derived (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: opus (TIER_DEFAULT; dispatch-gates --tier: no path-derived mandate for scripts/pm/board-snapshot.mjs), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: scripts/pm/board-snapshot.mjs produces the red (exit 2, the archive/board count check); no platform path covers it; every scheduled Fleet Patrols snapshot run reaches it today (11 of 11 since 10-27 per the card body).
    Thread-read: 6508167533
    Premise: holds (no commit on scripts/pm/board-snapshot.mjs since the card was filed; newest touch of it or fleet-patrols.yml on origin/main 481ade61 is 8be3b436, prose only)
    Serial constraints cleared: none — no open PR touches scripts/pm/board-snapshot.mjs or fleet-patrols.yml at claim time (16 open PRs read). The card's two constraints are carried verbatim: ⛔ no loosened tolerance, ⛔ no continue-on-error.

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 27726,
      "status": "done",
      "branch": "claude/project-thread-ux77w6",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27769",
      "session": "session_016WV4cyJuqtXc5LcmkT6E4D",
      "premise_still_valid": true,
      "summary": "Measured: the red is a persistent SURPLUS of 1-3 since 2026-10-26T15:11Z, not a count race. The archive held three open issues the board does not: #25896 transferred to objectstack-ai/hotcrm#2307 (301), and #26084 and #26638 closed seconds before their run's cursor while the listing served their pre-close rows. The same lag left four closed PRs archived open (#20052, #20072, #20074, #22635). Fix in scripts/pm/board-snapshot.mjs: a live walk's cursor settles LISTING_SETTLE_MS (15 min) behind its last listing read, and a disagreeing census is reconciled number by number before it is reported (live, re-archived; a cross-repo 301, recorded as transferred_to and counted apart; 404/410, left as archived and still red), then the board is read again.",
      "tests": "node scripts/pm/board-snapshot.mjs --self-test: OK, 191 cases across 14 batteries (new battery 'the lagging listing and the moved card', 22 cases, reproduces today's red). Ablation: reconcile disabled gives 9 red cases; settle disabled gives 2 red cases; restored gives 191 pass. Live run of the head against a scratch copy of board-archive: first census SURPLUS 3, reconcile re-archived #26084 #26638 #20052 #20072 #20074 #22635 #27751, recorded #25896 as transferred, named 5 destroyed PRs; count check ok, EXIT=0. Second live run: no reconcile, ok, EXIT=0.",
      "gates": "dispatch-gates --commands derived 38; all 38 run with exit codes captured before any pipe; 9 exited 3 in a fresh worktree (missing yaml / @changesets/cli) and exited 0 after pnpm install --frozen-lockfile; --ran reconcile: 38 derived, 38 run, 0 NOT-MEASURED. eslint on the changed file exit 0. CI check-runs on PR #27769: in_progress at report time.",
      "line_budget": "501 changed lines (+471 / -30), 1 file, under the 3000 human-merge threshold; no ratcheted ledger touched",
      "files_changed": [
        "scripts/pm/board-snapshot.mjs"
      ],
      "deviations": [
        "A transfer is now recognised automatically from GitHub's own 301 to another repository and recorded on the archived record, instead of waiting for a hand-written gone.json entry. This is the dispatch's (b) branch, 'fix the archive's read so it holds the class'. Destroyed numbers (404/410) still need gone.json, as before.",
        "The first push was refused by check:commit-card-trailers (Fixes line in the commit message); amended the unpublished commit, no force-push."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "10 — reads only: issue_read x2, actions_list x1, get_job_logs x1, pull_request_read x1, plus ToolSearch loads; subscribe_pr_activity x1 (session subscription, not a GitHub write)",
      "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#27769, labels skip-changeset) and this relay comment",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — five archived-open PRs answer 404 (#19374 #19471 #19478 #19538 #19540); they are outside the issue count check and only a gone.json entry would quiet the reconcile's mention of them"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

    Landed: PR #27769 merged (63fc9472, 2026-10-30T00:35Z); pm:dispatched stripped with this note. Acceptance proper is still owed: the first scheduled Fleet Patrols snapshot after the merge must run green (or name destroyed numbers). The seat reads it and records the run here; the card is reopened if it is red.

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

    Acceptance read: GREEN. The first scheduled Fleet Patrols run after PR #27769 merged (2026-10-30T00:35Z) is run 40991392637 (https://github.com/objectstack-ai/objectstack/actions/runs/40991392637), scheduled, on main c4cb5ec0c, started 2026-10-30T02:23Z, conclusion success. Job "Snapshot the board to the archive branch" (123854389024) passed every step: the tool's own cases, the archive checkout, "Run the snapshot" (02:24–02:26Z), "Commit and push the archive", and "Upload the archive to R2". The guard step "Fail the run if the snapshot did not read the board, or the archive is behind it" was skipped, which means its condition did not fire. The two previous scheduled runs that read the board before the fix (40947805554 at 2026-10-29T20:18Z and 40890306529 at 2026-10-29T14:19Z) concluded failure. Acceptance recorded; nothing further owed on this card.

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, iteratebugSomething isn't workingdomain:skillspriority:p2Medium: important, M3tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions