Skip to content

board-snapshot: once the open set completes, every run spends its whole budget on the closed history and never re-reads the live board — cards created or updated since 2026-09-10 are in no snapshot #18045

Description

@os-project-manager

Maintainer direct dispatch — the maintainer (pm@objectstack.ai) in the skills seat's chat session at 2026-09-13T14:58Z: 「现在就派发处理 备份缺口」. Filed and claimed by the skills seat (session session_01DAcomhvR9kKizeYgg89Vo8) under the direct-dispatch channel; the claim comment below carries the pair.

Symptom (manifest of the 2026-09-13T14:22Z scheduled run, board-archive tip b7c5f578)

Contract violated

The workflow's own purpose line: 「the archive answers exactly one question, after a loss: what did the record say?」 On 2026-09-13 a loss happened (an account suspension hid 12 cards and ~30 comments) and the record said nothing, because the walk plan (selectWalkPlan, phases open → history → incremental) only reaches incremental after history completes, and resume.since wins over everything while it is incomplete. Predecessor #17434 made the FIRST walk open-first; it did not cover the steady state after the open set completes.

Fix shape (the dev falsifies each premise first)

  1. Delta first, every run: before the history backfill, walk state=all&sort=updated&direction=asc&since=<previous manifest's generated_at, minus a small skew> and archive every row (open or closed) — bounded to a declared slice of the 800 budget (e.g. up to 300 requests, or until the delta is exhausted), so a busy board cannot starve the backfill entirely and a quiet one costs a page.
  2. History with the remainder: the existing backfill continues from its cursor with whatever budget is left; its cursor semantics unchanged.
  3. Manifest: record both cursors (delta.since / delta.complete and the history cursor); next_since becomes the delta's own high-water mark; board.read_at and the count check read the board's open count each run so count_check stops being pending.
  4. Self-test: the regression pinned — a manifest in history phase plus a card updated after generated_at ⇒ that card is archived on the very next run; the budget split; delta-then-history ordering; resume semantics unchanged for an interrupted history walk.
  5. ⛔ Constraints kept from the file's docblock: no second token, no retry loop, budget stays 800, GITHUB_TOKEN only; ⛔ no .claude/**; the cron and the workflow file stay as they are unless a premise forces a change (declare it if so).

File surface: scripts/pm/board-snapshot.mjs only (its self-test lives in the same file). Acceptance: node scripts/pm/board-snapshot.mjs --self-test green with the regression case; the derived gate families (dispatch-gates --commands) green; the PR body states the budget split and the new manifest keys.

Dedupe keywords: board-snapshot, open set, incremental, since, history backfill, budget, #17434.

Activity

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

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions