Skip to content

Board size budget: limit 500 items, archive Done beyond the newest 200, cut GraphQL cost #5119

Closed
5 of 5 issues completed

Description

@EHotwagner

Outcome

Coordination Project 3 stays small and cheap to read, which is a user requirement (2026-10-31):

  • Hard limit. The board and its related skills and readers are limited to 500 items.
  • Done retention. When Done exceeds 200 items, every older Done item beyond the newest 200 is archived. Archive, don't delete.
  • Request budget. Readers, observers and skills spend fewer GraphQL and gh requests.

Done when

  • Policy. The 500-item limit and the 200-Done retention rule are stated in the canonical work-board and check-board guidance, as pointers rather than copies.
  • Archiver. A guarded archiver exists and has been used for real:
    • It ranks Done by close time, newest first.
    • It archives only beyond the newest 200.
    • It reads before it writes, writes once, then reads back, and never resends after an uncertain send.
    • It is safe with the V2 enrollment manifest: archived enrolled rows are handled explicitly, never as a silent refusal or a missing row.
  • Readers.
    • The engine reader cap is raised to 500, released in the next coherent patch.
    • Board readers stop paging archived items.
    • The request cost before and after is measured.
  • Over the limit. A board above 500 items is refused or flagged deterministically, not paged without bound.

Blocked on

Nothing. Don't archive anything while the cohort-90 enrollment batches (#4941) are applying.

Filed by Root/fdev from the user's request, 2026-10-31. Refs #5097.

Activity

  1. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    #5119 owner progress, 2026-10-31. Nothing has been archived and no board field was written.

    Q1: does the items connection return archived items?

    • GraphQL items. ProjectV2.items(archivedStates = [NOT_ARCHIVED], query = "") excludes archived items by default. On P3 the live counts are 222 not archived and 0 archived. Readers that page items therefore never page archived cards: the engine readMemberships and migration-prepare reads, board-drift-fetch, board-currency-fetch, and board_snap.
    • Server-side filter. The query: filter works: status:Done returns 107, and -status:Done returns 115.
    • Per-issue reads. Issue.projectItems(includeArchived = true) includes archived cards by default, so the engine's per-issue membership and planning reads do see them. The board gate in routine-delivery: pre-enforce controls for the board gate (Refs #5094) #5115 opts out with includeArchived:false.
    • REST. The archived default of /orgs/FS-GG/projectsV2/3/items is Unknown: q=is:archived returned all 222. I will probe it at the first real archive.

    Q2: what happens to an enrolled row whose card is archived?

    Before this series, the result was silently inconsistent. The row read normally through projectItems, but it was missing from memberships, and nothing cross-checked the two. PR 3 makes it explicit (details below). No manifest retirement step is needed.

    Q3: what does a full board read cost? (measured live, 222 items)

    Reader Before After (series)
    Engine readMemberships / migration items 5 requests, 5 points (first:50) 3 / 3 at first:100 (not yet changed)
    board-drift-fetch, hourly 156 gh calls (151 REST comment reads) 26 (21 comment reads), PR 4
    board-currency-fetch 5 GraphQL requests, 5 points 3 requests, 6 points, PR 4
    board-v2 inspect, 207 rows 0.114.0: stopped at the 500-send ceiling after 2,502 reads, 0/207 Current 126 s, 92 GraphQL points, 17 REST, 203/207 Current, PR 2

    Series (each PR is Refs #5119, one concern each; at most 2 open at a time)

    1. coord: 500-row programme cap and a scaled refresh request ceiling (Refs #5119) #5122 (open): the 500-row cap, a separate 500-row reader table, the scaled request ceiling, and a first-page refusal for boards over 500.
    2. coord: cut inspection reads per row and scale the deadline (Refs #5119, Refs #5121) #5127 (open, stacked on coord: 500-row programme cap and a scaled refresh request ceiling (Refs #5119) #5122): fewer inspection reads per row. Blockers move into the native observation and Work level into planning, and batches go from 10 to 25. The deadline scales with row count. Fixture sends drop from 635 to 81 at 207 rows, and from 1,517 to 175 at 500. Refs inspect refresh request/deadline ceiling not scaled with the row cap; 207 rows exhaust it at about 2,500 reads #5121.
    3. routine/5119-archived-enrolled (pushed, not opened yet): an explicit archived membership and discrepancy, a membership cross-check gap for any other disagreement, a writer 409, and the board_v2_native_results.py validator.
    4. routine/5119-observer-reads (pushed, not opened yet): drift comment reads skip quiet cards; currency reads pages of 100.
    5. routine/5119-done-retention (pushed, not opened yet): replaces the Project 1 sweeper with the Project 3 Done-retention archiver, plus its selftest and the record of why the old one was retired. The workflow is counts-only and dry-run. Live dry run: 107 Done, nothing to archive.
    6. routine/5119-policy-pointers (pushed, not opened yet): pointers in work-board and check-board, with the skill manifests regenerated.

    Held

  2. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    #5119 owner update, 2026-10-31 ~18:45Z.

  3. EHotwagner commented on Oct 31, 2026

    @EHotwagner
    ContributorAuthor

    #5119 release-note handoff for whoever prepares the coherent 0.114.1 release (Root). This adds to issuecomment-6547585872.

    1. No rollback below 0.114.1 above 250 rows. Once more than 250 rows are enrolled, do not roll back below 0.114.1: 0.114.0 readers refuse more than 250 rows.
    2. Qualify with a validator that includes coord: explicit archived enrolled cards and a membership cross-check in inspect (Refs #5119) #5132. 0.114.1 inspections carry the new archived membership key (coord: explicit archived enrolled cards and a membership cross-check in inspect (Refs #5119) #5132), and an older scripts/board_v2_native_results.py refuses every 0.114.1 inspection with unsupported-result-shape. That includes inspections with no archived card, because the key is always present. 0.114.1 CLI-update qualification must therefore run a validator that includes coord: explicit archived enrolled cards and a membership cross-check in inspect (Refs #5119) #5132, meaning main at or after its merge, not an older checkout.
    3. Archived rows report health Archived. From coord: explicit archived enrolled cards and a membership cross-check in inspect (Refs #5119) #5132, an archived enrolled row has health Archived, never Verified. It does not count in verified, and action selection treats it as needs-decision.
  4. EHotwagner commented on Nov 1, 2026

    @EHotwagner
    ContributorAuthor

    Root/fdev, 2026-11-01:

  5. EHotwagner commented on Nov 5, 2026

    @EHotwagner
    ContributorAuthor

    Root accepts the whole #5119 Outcome on 2026-11-05 after reconciling every original assertion, including the later user-approved retention supersession. This is explicit Outcome acceptance, not closure from child statuses.

    Fresh readback independently rehashed all83 reader files plus5 config/source files, joined the accepted receipt and current224 binding, and confirmed the daily04:43UTC Persistent timer is active. The first natural old-tuple evidence remains distinct from the later accepted224-input manual no-op. No new natural successor-tuple invocation or global owner-pipeline adoption is claimed. All original failures, mixed-history limits and superseded policy text remain preserved.

    The scoped independent verdicts and Root acceptance are recorded in the linked source/rollout evidence. No remaining #5119 assertion was identified; standing maintenance #5097 stays separate. Closing this Outcome as COMPLETED.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions