diff --git a/docs/STATUS.md b/docs/STATUS.md index a5771d12d3..a7be134e7b 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -310,6 +310,19 @@ Platform lane (beta-platform-integrity, recorded from the lane's own merge packe Corrections to earlier blocks in this file: (1) the thirteenth block's header bounds it at `540bc2abb`, but its platform-lane bullet records PR `#2669`'s merge `140213288`, which landed after that bound (2026-09-05T08:36Z); the bullet is a post-bound packet recorded early, and this block's range starts at `e96523907`, the thirteenth block's own merge, which follows it. (2) The sixth block's `#2425` bullet attributes the helper suite's stop at the `invalid-branch` case on the development box to the pinned Git rejecting the non-ASCII fixture name; re-measured 2026-09-05 by the platform lane on the same commit and the same Git, the cause is the launching host's argv encoding (the suite stops at scenario 19 only from a Git Bash parent, whose child PowerShell host decodes the superscript argv character differently from Git, and passes 29 of 29 from a native PowerShell parent), not the Git binary; a pointer clause is appended to that bullet. +v0.3 integration wave, fifteenth block (2026-09-05, `main` `1d94f1cb3`, the fourteenth block's own merge, to `a2fe24757`; alpha product-trust lane continued, no platform-lane packet in this range; the coordinator's D-12 sweep of the open Codex-session PRs also landed in this range and is left to the coordinator, who adds a coordination-lane subsection to this block after it lands; it is not recorded here). Codex review credits stayed exhausted (SC-9), so every PR below carried one fresh-context independent reviewer subagent, with a second read-only pass scoped to the round-2 fix diff where that diff changed logic (`#2690`); control-plane PRs stay parked under SC-10. + +Review and proposal frontend: +- **The execute and reject receipt recorders carry the decision-locus guard (`#2128`, PR `#2692`, merge `38cfd8d38`; closes `#2128`).** `onConfirmExecute` and `onConfirmReject` in `PaperReviewView.vue` now record their decision receipt only when the current decision locus (`explicitActiveId`, then the active proposal) still equals the proposal the action started on, the guard `onApply` (`#2069`) and `onDefer` (PR `#2629`) already carry; before, a reviewer who selected proposal B while A's execute or reject was in flight was pulled back to A's receipt when the response landed, because `recordDecisionReceipt` also re-pins the selection. Neither sibling touches the deep link, and the Legacy review view records no receipt (the receipt is Paper-only, rendered by `ReviewMain.vue`), so nothing is owed there. Six specs beside the defer pair, four red-first (the pane re-anchored to the left proposal; the receipt rendered while the route hash still named it), the lagging navigation reproduced by aborting the pending route rather than by timing; `PaperReviewView.spec.ts` 183 of 183. Reviewer SHIP, one comment LOW declined. Exact head `7fbcb8eec`. + +Board frontend: +- **The shared board-list read is bounded and aborted on logout, and the filter defaults have one source (`#2685`, PR `#2688`, merge `3d16334b9`; closes `#2685`).** The shared unfiltered board-list read from PR `#2681` now carries the bound the detail read already had (`signal`, `timeout: BOARD_REQUEST_TIMEOUT_MS`, `skipRetry: true`), for filtered reads too: before, the list read had no timeout and the retry layer allowed three waits of up to 60 s each, unbounded on a wedged socket and, under the share, pinning every unfiltered caller on the page together; after, one attempt of 10 s, a bounded failure rejecting every joiner with one `handleApiError` and releasing the share so the next call refetches. `resetForLogout` aborts in-flight list reads after bumping the list generation (no toast, no state write from the aborted read). `initialCardFilters()` in `boardState.ts` is the single source for the three filter-default sites. The generation-to-loading coupling is written beside the finally gate, and the `skipRetry` comment gives the real reason (the share, not the wedged socket). Reviewer SHIP, its recommendation to keep `skipRetry` adopted; the product cost, a one-off 503 no longer self-healing on a boards list that has no Retry control, plus a Metrics catch, translated timeout copy and the error clear on a successful read, tracked as `#2689`. Store suites 154 of 154 at the head; the first CI run's Windows Frontend Unit leg hit the `#2561` launcher signature and re-ran green. Exact head `effdd122b`. +- **The boards list can retry, and a bounded failure is caught, translated and cleared (`#2689` items 1 to 4, PR `#2690`, merge `a2fe24757`; Refs `#2689`, items 5 to 10 stay open).** `BoardsListView`'s error state gains a Retry control (`data-action="retry-board-load"`, `aria-describedby` on the alert paragraph, `role="alert"` moved onto the message so the sentence announces alone and the button stays focusable), with mount and retry sharing one load path and the skeleton shown while a retry is in flight; `MetricsView.loadBoards` catches a rejected list read instead of leaking an unhandled rejection from `onMounted`; at the board store's boundary `handleApiError` maps a client-side timeout (`ECONNABORTED`, `ETIMEDOUT`, or an axios error with no response whose message says timeout) and an axios cancel to translated copy (`boards.error.timeout`, `boards.error.cancelled`) for `state.error` and the toast, through `i18n.global.t` as the review store already does, a cancel mapped rather than silenced so the list cannot fall to the empty state on an aborted read; a current-generation list read that succeeds clears `state.error`, while the detail read is left alone because a background refresh must not clear an alert it does not own. Red-first across four specs (nine failing assertions on the unmodified code); the seven named suites 187 of 187, the whole store and views trees green. Reviewer SHIP; three MEDIUMs on the new control fixed in round 2 (an explicit retry bypasses the 5 s throttle, which had made the button a silent no-op after a mutation failure inside the window; the success clear is guarded to the error a list read itself wrote, so another surface's alert survives; focus returns to the new Retry button after a failed retry), with a verification pass scoped to the round-2 diff, SHIP, with the unconditional focus restore (a hung retry can pull the caret out of the create form) and four LOWs recorded on `#2689` as items 6 to 10 at the two-round ceiling; the unreachable `ETIMEDOUT` arm declined as defensive. Exact head `4b8138444`. + +- **Not shipped reality:** `#2689` stays open on item 5 (the direct `boardsApi.getBoards` callers outside the store, five at this block's assembly: `ArchiveView.vue`, `AutomationQueueView.vue`, `BoardAccessView.vue`, `useAutomationChat.ts`, `useReviewProposals.ts`; the issue's own count of four is corrected there) and on the round-2 verification residuals recorded as items 6 to 10 (an unconditional focus restore after a failed retry, a throttle docblock still narrower than the truth, the collapsed timeout and offline copy making the guarded clear's identical-message collision routine, `BoardListFetchOptions` not re-exported, one spec comment over-claiming); the detail read's success-path error clear needs an intent gate (recorded on `#2689`); `#2682` (route-walk doc precision) stays tracked; `#2214` item 2 (persistent disclosure of repeated non-transient poll failures on both legs, the malformed-link panel copy and the explicit-path toast asymmetry) is the lane's next slice now that PRs `#2629` and `#2654` released the Paper review and inbox files; the ruling-gated items and the non-ruling residuals listed in the fourteenth block (`#2090`, `#1949`, `#2638`, the `#2215` Paper residuals, the two `#1940` residuals, `#1999` item 3) are unchanged. Control-plane PRs stay parked under SC-10; the platform lane's 2026-09-05 12:35Z checkpoint on `#2351` lists its five, and the queue's last full measurement (ten at `1e234a011`, thirteenth block) is re-measured by the coordinator with the sweep record, since the sweep may have merged the older half. + +Corrections to earlier blocks in this file: the thirteenth block's coordination-lane sentence that the Codex session's `#2629` and `#2654` were unowned and "nothing of that session's has been reviewed or merged" is superseded as a present-tense claim: both landed in this range under the coordinator's D-12 sweep (`#2629` as `cf24dec01`, `#2654` as `221ed702d`), which the coordinator records; this block's `#2128` entry depends on the first and its `#2214` next-slice note on both. + v0.3.0-rc.1 SHIPPED (2026-08-30, annotated tag `3fc9f6e8e` peels to `9d2ea3c7c`): - **The public v0.3.0-rc.1 pre-release exists**, cut by the agent under the maintainer's v0.3 RC deck reply q-1 A (2026-08-30; map `map:v1:bec0a8dd…dd9138`; record `#1947`) and the repository's declared authority. The GitHub Release is `prerelease=true`, `draft=false`, published 2026-08-30T02:26:06Z with three assets — `taskdeck-v0.3.0-rc.1-win-x64.zip` (53,916,746 bytes), its `.sha256` sidecar, and `taskdeck-v0.3.0-rc.1-provenance.txt` — and a composed page (download badge first, RC banner, SHA-256, quick-start link, `## Breaking changes` lifted from UPGRADING, `## Highlights` from `docs/releases/notes/v0.3.0-rc.1.md`, grouped `## What's changed`). `/releases/latest` still resolves to `v0.2.0`. - **Tag workflows:** CI Release 33287786328, Release Security 33287786318, Release Container 33287786267, Release Desktop 33287786253 — all four success. **GHCR:** `ghcr.io/chris0jeky/taskdeck:0.3.0-rc.1` published (`sha256:d47bdf2d…2db67`), `latest` and `0.2` both still `sha256:e4915d72…8c752`, and no `0.3` alias exists — the floating `latest` / `0.2` index digest is unchanged from the pre-tag capture (`sha256:e4915d72…8c752`) and no `0.3` alias was created, which is the live proof of `#2217`/PR `#2223` that the threat-model row was waiting for.