You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changed
CI run volume cut ~60 %, and Board Sync no longer triggers itself (#504; PR #512). The sync
workflow listened for assigned while board-sync.sh assigns unassigned issues itself, so its own
write re-triggered it — every new issue cost at least two runs, the second recomputing a state the
first had already reconciled. assigned is gone, and a burst of issue events now collapses onto one
run via concurrency: cancel-in-progress (safe precisely because the sync is a full-state
reconciler, not an incremental writer; the telemetry snapshot deliberately does NOT cancel, since a
half-written run there loses data no later run can rebuild). ci.yml gates on the pull request only — a push to main is always a merge of something those
same jobs already passed, so re-running them after the merge doubled the cost of every change
without ever catching anything new. pr-review and issue-language are grouped per PR / per issue
and cancel superseded runs: addressing gate feedback with three quick commits used to start three
reviews of three diffs, two already obsolete — which protects the Max review quota, not just
Actions minutes. Every job now carries an explicit timeout-minutes (the default is 360, so one
hung job could eat 12 % of the monthly quota), and test-log artifacts drop from 90-day to 7-day
retention.
Fixed
A mature board no longer reports itself empty (#484). Board-Work.ps1 read board items with gh project item-list --limit 200. That call returns exit 0 and exactly 200 items on a bigger
board — oldest-first, so on a mature board the cap fills with Done work and the Backlog falls
off the end. Against the tool's own 291-item board, /board work printed Sin pendientes. Todo el board esta en progreso o terminado. over 37 open Backlog items.
Not a truncation warning — a confident false all-clear, landing precisely on the mature boards
where the stakes are highest, and it silently under-counted the -ListBoards board picker the
same way.
Board reads now go through Get-BoardItems.ps1, which returns { Items; Read; Limit; Truncated }
and treats a read that reached its cap as possibly short. No caller may state an absence off
one. Every board reader was audited, not just the two in the bug report — the caps ranged from 200
to 1000 and six surfaces were asserting things a short read cannot support:
/board work says how many items it actually saw instead of "sin pendientes"; the board picker
renders capped counts as N+ with an explicit TRUNCADO line.
/board completefails closed — a PASS is exactly the absence a short read cannot
support, and CI would read it as ground truth.
/board triage no longer prints "(no hay items pendientes)" over an untriaged board.
/board field apply --merge-conflicts no longer deletes an option on an unproven verification.
The worst of the six: it moves items off a legacy option, checks that none remain, then deletes
it — and its own comment names the stake ("an item silently losing its Status is data loss").
The check read with a bare gh ... --limit 800 and no cap test, so "0 left" could be an
artifact of the cap. A truncated verification now aborts on the same grounds as a found item.
Backup-Board refuses to write a partial snapshot: it is the safety net taken before a
destructive operation, so a partial one is worse than none — it would license the delete it
exists to make reversible.
Export-BoardSnapshot refuses to publish a truncated N of M, and /board update publishes
floors (N+) rather than stating a count and retracting it in a footnote.
Set-BoardField warns before its sweep that the pass is partial, instead of printing a set=N summary that reads like a complete one.
The shared ceiling is 2000 and costs nothing: gh pages the underlying GraphQL 100 at a time, so
request count tracks the items that exist, not the cap — the old 200 bought no savings and cost
the truth. Regression tests assert that no script hardcodes its own item-list cap and that every
board reader pulls in the shared one.
This is the same defect class Invoke-Gh.ps1 was written for (#303): a read consumed as fact. Invoke-Gh made a failed read loud; this makes a short one loud. Neither substitutes for
the other — a truncated read succeeds.