Skip to content

[Backend][UX] Expose archived board capture and decision history (#1973) - #2031

Closed
Chris0Jeky wants to merge 4 commits into
mainfrom
issue-1973/archive-history-disclosure
Closed

[Backend][UX] Expose archived board capture and decision history (#1973)#2031
Chris0Jeky wants to merge 4 commits into
mainfrom
issue-1973/archive-history-disclosure

Conversation

@Chris0Jeky

@Chris0Jeky Chris0Jeky commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Summary

This is a partial slice for #1973:

  • Archive rows preserve the archived board ID and link to scoped capture history (Inbox) and decision history (Review).
  • Legacy and Paper archive confirmations disclose that captures and decision records are retained, hidden from unfiltered active queues, and available from Workspace > Archive.
  • The synthetic SQLite/API proof archives a board and demonstrates unscoped omission plus scoped retrieval for both a capture and an Applied proposal.
  • Review fix head ecf44ea adds an explicit history=archived mode. Capture history is inspection-only in both skins; settled decision history is fully selectable and inspection-only in both skins.

Verification

  • npx vitest --run --maxWorkers=2 src/tests/views/ArchiveView.spec.ts src/tests/views/InboxView.spec.ts src/tests/views/paper/PaperInboxView.spec.ts src/tests/composables/useReviewProposals.spec.ts src/tests/views/ReviewView.spec.ts src/tests/views/paper/review/PaperReviewView.spec.ts — 6 files, 337 tests passed.
  • npx vitest --run --maxWorkers=2 src/tests/views/ArchiveView.coverage.spec.ts src/tests/components/BoardSettingsModal.spec.ts src/tests/views/paper/PaperBoardManagement.spec.ts — 3 files, 59 tests passed.
  • npx vitest --run --maxWorkers=2 src/tests/i18n/catalogs.spec.ts — 1 file, 16 tests passed.
  • dotnet test backend/tests/Taskdeck.Api.Tests/Taskdeck.Api.Tests.csproj -c Release --filter FullyQualifiedName~ArchivedBoardHistoryApiTests --no-restore — 1 passed, 0 failed, 0 skipped.
  • npm run typecheck — passed.
  • npm run build — passed; 786 modules transformed.
  • npm run lint — 0 errors, 6 pre-existing warnings.
  • git diff --check — passed.
  • Synthetic worker-disabled SQLite/API proof uses only synthetic values: after archive, DELETE returned 204; unscoped capture listing omitted Synthetic archived-board capture, while the board-scoped listing returned exactly one matching capture with its board ID; unscoped proposal listing omitted Synthetic archived-board decision, while the scoped proposal listing returned exactly one Applied proposal with its board ID. The test performs approval/execution and archive calls directly and does not rely on worker execution.

Review disposition

Documentation

Canonical status, masterplan, and testing-guide docs are coordinator-owned and intentionally unchanged for this partial slice.

Tracking

Risk Notes

  • Security impact: none identified.
  • Behavior/regression risk: explicit archived-history mode is query-scoped to a board and is read-only; normal active Inbox and Review behavior is unchanged.
  • Remaining MEDIUM follow-ups on [Backend][UX] Archiving a board makes its captures and applied-proposal ledger vanish from every list with no disclosure #1973:
    1. Archive action rows can wrap or clip at phone widths.
    2. View decisions can remain visible when newAutomation is disabled, then redirect through the route guard.
    3. Unscoped Inbox/Review hash deep links can hydrate an archived capture/proposal directly by ID even though normal unscoped lists omit archived records.

@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: 800a640d96

ℹ️ 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/ArchiveView.vue Outdated
Comment thread frontend/taskdeck-web/src/views/ArchiveView.vue Outdated
Comment thread frontend/taskdeck-web/src/views/ArchiveView.vue
Comment thread frontend/taskdeck-web/src/views/ArchiveView.vue
@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Fresh independent final-head review completed against exact base 5a6c85bc6b8e166e5cf5f6b867fda75cb5f72ca3 and exact head ecf44ea2a37cd4ff48500671f53a95fc2903644e.

No new HIGH/CRITICAL, MEDIUM, or LOW finding. The two original P1 paths are fixed: archived navigation preserves explicit history mode; both Inbox skins suppress mutations; both Review skins expose selectable settled records without mutation controls; reverse links preserve board/history scope; and same-component transitions cancel stale apply/reject dialogs. The tests exercise six settled Paper records (beyond the former four-row cap) and assert Inbox/Review mutation calls remain untouched.

The already-recorded mobile action wrapping and disabled-newAutomation navigation residuals remain MEDIUM on #1973. Exact-head hosted CI is still completing; this review does not replace it.

@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: ecf44ea2a3

ℹ️ 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/ArchiveView.vue
Comment thread frontend/taskdeck-web/src/composables/useReviewProposals.ts
Comment thread frontend/taskdeck-web/src/views/ArchiveView.vue
Comment thread frontend/taskdeck-web/src/views/paper/PaperReviewView.vue
Comment thread frontend/taskdeck-web/src/composables/useReviewProposals.ts
Comment thread frontend/taskdeck-web/src/views/paper/PaperReviewView.vue
Comment thread frontend/taskdeck-web/src/composables/useReviewProposals.ts
@Chris0Jeky

Copy link
Copy Markdown
Owner Author

Parking this PR under the repository's two-round review ceiling.

Exact head ecf44ea2a37cd4ff48500671f53a95fc2903644e is preserved on issue-1973/archive-history-disclosure; the PR is closing unmerged. The single fix round closed the original Inbox-mutation and settled-history P1s, but the late exact-head review confirmed two further HIGH paths: Paper capture history has no full detail surface, and clearing archived scope can preserve a proposal hash that rehydrates an archived proposal into normal mutation-enabled Review.

All seven late threads were triaged, replied to, and resolved. The exact successor scope, green evidence, residuals, and resume procedure are recorded at #1973 (comment). Do not delete or rewrite the branch/worktree lineage and do not infer shipped behavior from this PR's green CI.

@Chris0Jeky Chris0Jeky closed this Aug 24, 2026
@github-project-automation github-project-automation Bot moved this from Review to Done in Taskdeck Execution Aug 24, 2026
Chris0Jeky added a commit that referenced this pull request Aug 24, 2026
PR #2031 was parked at the review ceiling with two confirmed HIGH paths still
open. Both are the same defect seen from two ends: archived history claimed to
be a read-only inspection surface, but one end had nothing to inspect and the
other let the user carry an archived record back into the live queue.

Paper capture history had no detail surface. Stripping the triage controls left
an archived row with a truncated `textExcerpt` and an `open` button wired to a
no-op, so the retained capture was reachable in name only -- which is the
disclosure defect #1973 is about. Opening a row in archived mode now expands a
read-only panel with the full retained text, its triage provenance, and a link
to the decision record it produced. The load goes through `peekDetail`, not
`fetchDetail`, so inspecting history cannot cache into `detailById` or resync a
live list summary. A late payload is discarded if the row was collapsed or
another row was opened meanwhile, and leaving history mode or re-scoping to
another board collapses the panel.

Clearing scope carried the proposal deep link out of archived history. The exit
preserved `route.hash`, which handed the archived board's proposal to the
UNSCOPED queue: the hash watcher refetched it by id, no board filter was left to
reject it, and Apply/Reject reappeared against an archived board. Leaving
archived history now drops the hash with it. An ordinary board clear is not a
trust boundary and keeps its deep link, asserted separately so the fix cannot be
over-applied.

Both regressions were mutation-checked: inverting the archived guard and
restoring the preserved hash each fail the new tests.
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.

1 participant