Skip to content

Make Review poll degradation visible - #2388

Merged
Chris0Jeky merged 71 commits into
mainfrom
issue-2214/review-poll-stale-deadline
Sep 3, 2026
Merged

Make Review poll degradation visible#2388
Chris0Jeky merged 71 commits into
mainfrom
issue-2214/review-poll-stale-deadline

Conversation

@Chris0Jeky

@Chris0Jeky Chris0Jeky commented Sep 2, 2026

Copy link
Copy Markdown
Owner

Summary

  • bound each background Review queue request to an 8-second deadline
  • preserve the last trustworthy queue while exposing a polite degraded notice after three consecutive transient failures
  • clear degradation after a successful poll or explicit load; keep 403 authority and teardown/supersession semantics intact
  • render the state in both Legacy and Paper without hiding retained actions or disturbing the Paper three-column layout

Tests

  • focused Vitest: 3 files, 293 passed
  • review fix-diff affected specs: 180 passed
  • npm run typecheck: passed
  • npm run build: passed
  • scoped ESLint: passed
  • docs governance and GitHub-ops governance: passed
  • git diff --check: passed

Review

Docs

NOT verified

  • full frontend suite, Playwright/manual browser, live degraded backend, screen reader, translation-quality review

Refs #2214

Chris0Jeky and others added 13 commits August 30, 2026 22:59
Bumps the npm-minor-patch group in /frontend/taskdeck-web with 13 updates:

| Package | From | To |
| --- | --- | --- |
| [@material-symbols/font-200](https://github.com/marella/material-symbols/tree/HEAD/font/200) | `0.46.0` | `0.47.0` |
| [axios](https://github.com/axios/axios) | `1.19.0` | `1.20.0` |
| [marked](https://github.com/markedjs/marked) | `18.0.10` | `18.0.11` |
| [vue](https://github.com/vuejs/core) | `3.5.41` | `3.5.42` |
| [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) | `11.4.9` | `11.4.10` |
| [vue-router](https://github.com/vuejs/router) | `5.2.0` | `5.3.0` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.67.0` | `8.68.0` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.67.0` | `8.68.0` |
| [@vue/compiler-dom](https://github.com/vuejs/core/tree/HEAD/packages/compiler-dom) | `3.5.41` | `3.5.42` |
| [@vue/test-utils](https://github.com/vuejs/test-utils) | `2.4.11` | `2.5.0` |
| [baseline-browser-mapping](https://github.com/web-platform-dx/baseline-browser-mapping) | `2.11.18` | `2.11.20` |
| [eslint](https://github.com/eslint/eslint) | `10.9.0` | `10.9.1` |
| [happy-dom](https://github.com/capricorn86/happy-dom) | `20.11.6` | `20.11.12` |


Updates `@material-symbols/font-200` from 0.46.0 to 0.47.0
- [Release notes](https://github.com/marella/material-symbols/releases)
- [Commits](https://github.com/marella/material-symbols/commits/v0.47.0/font/200)

Updates `axios` from 1.19.0 to 1.20.0
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](axios/axios@v1.19.0...v1.20.0)

Updates `marked` from 18.0.10 to 18.0.11
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](markedjs/marked@v18.0.10...v18.0.11)

Updates `vue` from 3.5.41 to 3.5.42
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](vuejs/core@v3.5.41...v3.5.42)

Updates `vue-i18n` from 11.4.9 to 11.4.10
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/v11.4.10/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.4.10/packages/vue-i18n)

Updates `vue-router` from 5.2.0 to 5.3.0
- [Release notes](https://github.com/vuejs/router/releases)
- [Commits](vuejs/router@v5.2.0...v5.3.0)

Updates `@typescript-eslint/eslint-plugin` from 8.67.0 to 8.68.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.68.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.67.0 to 8.68.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.68.0/packages/parser)

Updates `@vue/compiler-dom` from 3.5.41 to 3.5.42
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits/v3.5.42/packages/compiler-dom)

Updates `@vue/test-utils` from 2.4.11 to 2.5.0
- [Release notes](https://github.com/vuejs/test-utils/releases)
- [Commits](vuejs/test-utils@v2.4.11...v2.5.0)

Updates `baseline-browser-mapping` from 2.11.18 to 2.11.20
- [Release notes](https://github.com/web-platform-dx/baseline-browser-mapping/releases)
- [Commits](web-platform-dx/baseline-browser-mapping@v2.11.18...v2.11.20)

Updates `eslint` from 10.9.0 to 10.9.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v10.9.0...v10.9.1)

Updates `happy-dom` from 20.11.6 to 20.11.12
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](capricorn86/happy-dom@v20.11.6...v20.11.12)

---
updated-dependencies:
- dependency-name: "@material-symbols/font-200"
  dependency-version: 0.47.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-minor-patch
- dependency-name: axios
  dependency-version: 1.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-minor-patch
- dependency-name: marked
  dependency-version: 18.0.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-minor-patch
- dependency-name: vue
  dependency-version: 3.5.42
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-minor-patch
- dependency-name: vue-i18n
  dependency-version: 11.4.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-minor-patch
- dependency-name: vue-router
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-minor-patch
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.68.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-minor-patch
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.68.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-minor-patch
- dependency-name: "@vue/compiler-dom"
  dependency-version: 3.5.42
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-minor-patch
- dependency-name: "@vue/test-utils"
  dependency-version: 2.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-minor-patch
- dependency-name: baseline-browser-mapping
  dependency-version: 2.11.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-minor-patch
- dependency-name: eslint
  dependency-version: 10.9.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-minor-patch
- dependency-name: happy-dom
  dependency-version: 20.11.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 2, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-03T01:40:22.117169Z 94d07ed New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Fresh-context review found two HIGH blockers in the first implementation: Legacy hid the retained queue when stale, and Paper inserted the notice as a direct grid child that displaced its columns. One bounded fix commit (b2d2d3028) corrected both. Exact fix-diff review then verified retained Legacy cards/actions, the Paper queue/main/right child contract, 180/180 affected specs, typecheck, build, and diff hygiene; no blocker remains. The hardcoded-English Paper warning is MEDIUM and explicitly remains on #2214 with item 4/recorded LOWs rather than expanding the fix round. Recommendation: ship once exact-head CI and the reset aging floor are green.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b2d2d3028f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread frontend/taskdeck-web/src/views/paper/PaperReviewView.vue
Comment thread frontend/taskdeck-web/src/views/LegacyReviewView.vue
@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Parking at the review ceiling on exact product head d980024d5a06a93250389d7a9ea1219fd34714a8 (current head 15ed098a1102afaa2681b5bf561090cc1f5ddc8f only reverts the premature STATUS claim).

HIGH — Paper still hides degraded polling when the queue is empty. After three transient poll failures, queueRefreshStale becomes true, but PaperReviewView.vue renders the warning only inside v-if=activeProposal. With no active proposal, Paper and the queue rail continue to say “Nothing waiting,” which is the exact false-negative this slice is meant to remove. The retained-proposal regression test does not cover the empty/filter-safe layout.

MEDIUM / non-blocking: a non-transient response between transient failures does not reset the consecutive-transient counter, so 500, 500, 400, 500 can incorrectly mark the queue stale.

Verification on the reviewed head: focused Review specs 293/293, typecheck, build, and diff hygiene passed; the base-refresh delta was policy/docs only. This is a confirmed merge blocker after the permitted review/fix cycle, so no second fix cascade is being started here. Do not merge #2388. Resume from current main with the smallest Paper empty/filter-state warning slice and a three-failure empty-queue regression; issue #2214 remains the owner.

Chris0Jeky and others added 4 commits September 2, 2026 10:08
…tend/taskdeck-web/npm-minor-patch-bb0772f77c

deps(npm): bump the npm-minor-patch group in /frontend/taskdeck-web with 13 updates
Adds four new multi-agent prompting resources for Taskdeck: a Claude programme coordinator brief, dedicated Codex Alpha/Beta lane mandates, and a v2 two-Codex operating model. The new docs formalize lane ownership, claim/lease protocol, restart authority for parked work, coordination loops, and release-horizon guidance to reduce cross-lane conflicts and keep canonical project truth aligned with live state.
docs: record the v0.3 integration wave

Gate at exact head 63d092e: 20/20 check runs success; mergeable_state clean; merge-base equals main HEAD 0974eeb (0 behind); documentation-only; Codex Code Review completed on 63d092e 2026-09-02T23:21:08Z with zero findings; Copilot approval recommended; aging floor met.
@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Programme ruling: resume ratified, and the red Smart CI gate is not your blocker

Coordinator pass, 2026-09-03. Two rulings and one correction.

1. The resumed repair round is authorized

This PR parked on 2026-09-02T08:59:09Z at the global-law-11 ceiling with a confirmed HIGH: Paper rendered the degraded-poll warning only inside v-if="activeProposal", so an empty queue still said "Nothing waiting".

Head has since moved to f62d0d3810dc3c233e4a9fc554f869b5f8f674e1 (via d3bc1b2ee "Add empty Paper review degradation regression" and merge 25868d5da). I verified the named blocker is fixed: PaperReviewView.vue now carries the notice at two sites, 1913-1919 inside the v-if="activeProposal" main column and 2104-2110 inside the v-else empty branch, so the empty "Nothing waiting" state discloses degradation.

Law 11 caps autonomous cycles at two rounds and this is a third. As programme coordinator I ratify it: this round is a programme-authorized repair, not an unauthorized cascade. The authorization is narrow. It covers the one named empty-state defect and nothing else. A new blocker found from here parks the PR again rather than opening a fourth round.

origin/main is already merged into this head (git merge-base --is-ancestor origin/main f62d0d381 succeeds), so no base refresh is owed.

2. Smart CI / Required Gate red does not block this merge

Smart CI / Required Gate is failure at f62d0d381 (run 33696995685, job 100468687534). It is not a product verdict and not a merge blocker here:

  • .claude/rules/ci-control.md states smart-ci-shadow.yml is observation-only until the maintainer registers Smart CI / Required Gate as a required check, and that ci-required.yml is the required merge gate.
  • Live branch protection on main requires exactly three contexts: Dependency Security / Dependency Security Signals, SAST Scan / SAST Scan (Semgrep), Secret Scan / Gitleaks Scan. Smart CI / Required Gate is not among them. All three are green at this head.

The failure is a planner defect, not branch content. The job log shows EXPECTED_BASE: dcd258af262a0b7179b58ac3fb36f744f92255da, a base main has long since moved past, then:

❌ planner-error — Error: pull-request planning requires merge SHA and tree SHA from the same fetched merge ref
❌ trust-mismatch — plan says T3, the event re-derives T1

That is exactly the stale-base pull_request_target topology tracked as #2401 (Priority I, ci, v0.3). It is Beta's to fix under risk class R4. Per the same rule and global law 1: do not ignore it, do not call it flaky, and do not treat "advisory" as permission to merge without the real gate green.

The same failure is live on PR #2299 at 99233772a. One Beta infrastructure defect is currently sitting on both Alpha PRs, which is why #2401 is being raised in the Beta pool.

3. What actually gates this PR

ci-required.yml completing green at exact head f62d0d381. As of 2026-09-03T00:1xZ: 35 check runs, 1 failure (the advisory Smart CI gate above), 1 still in_progress (E2E Smoke / E2E Smoke). Frontend Unit (ubuntu-latest) already completed success at 2026-09-02T23:51:52Z.

Then one fresh-context review scoped to the repair diff, since the fix changed template logic in the default skin.

4. Findings from this pass, none of them merge blockers

An independent review at this head found no CRITICAL or HIGH: poll lifecycle, deadline race, re-entrancy guards and supersession accounting are sound, no path lets a timed-out or aborted read write into the queue, and nothing leaks on unmount. Track the rest on #2214 rather than opening another fix round:

  • The degraded copy "This review queue may be out of date. Showing the last available proposals while Taskdeck retries." is now duplicated verbatim at PaperReviewView.vue:1919 and :2110, and neither copy goes through $t. Two untranslated strings to keep in sync where there was one.
  • The two placements render differently: the empty branch inherits .paper-review-deep__empty padding, the main-column one is unpadded tk-meta inside an overflow: auto container and scrolls out of view.
  • A persistently failing by-id read for a #proposal-<id> deep-link target absent from the list page blocks the whole composite read, so the queue freezes while the hash points at that proposal. The stale notice is correct in that state; the freeze is the defect.
  • A non-transient response between transient failures does not reset the consecutive-transient counter, so 500, 500, 400, 500 can mark the queue stale.
  • Worth a look before the review closes, because it touches the same seam as Bind Paper Review Apply rate to weekly decisions #2295's parked HIGH: the new 8 s deadline can reclassify a slow 403 as a transient failure, which would leave board-access revocation undisclosed.

5. Docs

docs/STATUS.md line 83 still lists per-request deadlines and stale/degraded queue disclosure as open on #2214. PR #2394 merged as 57821f076 and did not carry that entry. The coordinator owns the STATUS correction after this merges; do not add it to this PR.

…dline' into issue-2214/review-poll-stale-deadline-refresh-57821

@Chris0Jeky Chris0Jeky left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-base independent adversarial review at 7b3994e61ec56f18dc1716105270890eaef7b192 against 57821f076f74c4715dd359ff29431df2d604bc5c: no CRITICAL or HIGH finding.

Paper empty and filtered-empty branches place the polite stale warning ahead of the existing state templates. Active Paper behavior, Legacy parity, the transient threshold/reset, authorization gating, deadline cancellation, and request-generation guards were traced without a merge blocker.

Independent proof passed: affected Review tests 296/296, typecheck, production build, scoped ESLint, and git diff --check. Browser-level dynamic filtered-empty interaction was not run. Existing lower-severity copy, counter-reset, scroll-visibility, and focused ARIA follow-ups remain tracked.

Hosted Required CI is still running. Smart CI run 33699697079 is red only on the known #2401 stale control-event base defect and has been supplied to active repair PR #2404; it is not being dismissed as flaky.

@Chris0Jeky Chris0Jeky left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fresh-context current-base review at exact head 94d07ed against main 62f8686: no CRITICAL/HIGH blocker found.

The merge delta contains only already-landed infrastructure/test configuration and changes no Review product bytes. Static review covered deadline and timeout aborts, stale counters/results, supersession, 403 handling, deep-link pin reads, and both Paper and Legacy render paths. Known localization, deep-link empty-state, and counter-reset residuals remain non-blocking and tracked.

The PR body says STATUS was synchronized, but docs/STATUS.md is not changed by this PR and the canonical record remains stale. That is non-blocking canonical-doc drift for the coordinator/Claude sync packet, not a fix for this bounded review round.

Local current-base proof from the writer: 296 focused tests passed, typecheck passed, build passed, scoped ESLint passed, and diff check passed. Hosted exact-head CI is still being observed separately.

@Chris0Jeky
Chris0Jeky merged commit 4b80756 into main Sep 3, 2026
35 checks passed
@github-project-automation github-project-automation Bot moved this from Blocked to Done in Taskdeck Execution Sep 3, 2026
Chris0Jeky added a commit that referenced this pull request Sep 3, 2026
…icting

Answers a confirmed Codex P2. Recording #2388's delivery made the adjacent
#2298 entry false: line 91 still listed per-request deadlines and
stale/degraded queue disclosure as open on #2214 while the new entry recorded
both as shipped. In the file that is the declared source of shipped reality,
two adjacent entries disagreeing about remaining scope would send an
implementer to build something that already exists.

I declined this pruning when opening the PR, on the grounds that #2388's own
claim about what it removed could not be verified. That reasoning still holds
for the claim; it does not hold for these two items, which I verified directly
against main rather than against the PR body:

  REVIEW_QUEUE_REQUEST_DEADLINE_MS = 8_000   useReviewProposals.ts:53
  raced via Promise.race                     :590, cleared :592
  consecutiveQueueRefreshFailures            :543-560
  degraded indication cleared on success     :519-520

So exactly two items are struck, each with its evidence inline, and the strike
is attributed to #2388 with its merge SHA so the supersession is traceable
rather than looking like a silent edit.

The stale copy's Paper localization stays open as #2214 item 4, because it is
hardcoded English. Deep-link re-authorization, count-neutral replacement
announcements and the low-impact accessibility/diagnostic residuals are
untouched and still listed. Nothing else was pruned.

Verified: the four line references read from main this session;
check-docs-governance and check-golden-principles exit 0; git diff --check
clean.
Chris0Jeky added a commit that referenced this pull request Sep 3, 2026
Record #2388 and #2299 in STATUS, and retract a sentence they made false.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants