Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-001.3.1--23b0c6ee18b7.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-001.3.1--23b0c6ee18b7",
"requirementId": "REQ-001.3.1",
"hash": "23b0c6ee18b7",
"verdict": "pass",
"summary": "Tests exercise the real PromptAttachmentAssembler.prepare and PiRPCClient.promptFields, asserting mimeType and base64EncodedString() data for two distinct image types plus RPC field wiring; a raw-bytes or missing-mimeType violation would fail these assertions.",
"timestamp": "2026-09-09T18:54:31.582Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.3.1--6b150fe4d08a.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.3.1--6b150fe4d08a",
"requirementId": "REQ-003.3.1",
"hash": "6b150fe4d08a",
"verdict": "pass",
"summary": "Unit tests (archived-newer, pinned-only, loaded-from-disk) and UI test (multi-project, pinned/archived/older exclusions via XCTAssertNotEqual) both verify each conjunct: newest, visible (not archived), unpinned, and scoped to the selected project; no tautologies or over-mocking found.",
"timestamp": "2026-09-09T18:54:32.783Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.3.2--b4d0a25be6ad.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.3.2--b4d0a25be6ad",
"requirementId": "REQ-003.3.2",
"hash": "b4d0a25be6ad",
"verdict": "pass",
"summary": "Unit tests verify archived-only/mixed project rows never select archived session (nil or newestVisible), and UI test performs real clicks across row offsets confirming archived chat title never becomes selected; genuine behavioral coverage of the MUST NOT.",
"timestamp": "2026-09-09T18:54:35.665Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.3.3--b2a7d666fb0c.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.3.3--b2a7d666fb0c",
"requirementId": "REQ-003.3.3",
"hash": "b2a7d666fb0c",
"verdict": "pass",
"summary": "Unit test rejects selecting pinned/archived-only project (stays nil) and UI test rejects clicking project row selecting the pinned chat when an unpinned visible chat exists, both meaningful negative-space checks.",
"timestamp": "2026-09-09T18:54:26.970Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.4.7--5e70640a7941.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.4.7--5e70640a7941",
"requirementId": "REQ-003.4.7",
"hash": "5e70640a7941",
"verdict": "pass",
"summary": "Tests exercise real select() (no mocking/guards) for both pending-startup and queued-prompt cases, asserting selectedSessionID actually changes to the other chat, which would fail if selection were blocked.",
"timestamp": "2026-09-09T18:55:05.405Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.4.7--903eb8ce6425.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.4.7--903eb8ce6425",
"requirementId": "REQ-003.4.7",
"hash": "903eb8ce6425",
"verdict": "pass",
"summary": "Tests select() away from a chat with pending-startup and queued-prompt work, asserting selectedProjectID/selectedSessionID actually change and the busy chat's working state persists — a genuine, non-tautological check that pending work does not block selecting another chat.",
"timestamp": "2026-09-09T19:38:56.168Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.1--3a45b40c2919.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.1--3a45b40c2919",
"requirementId": "REQ-003.5.1",
"hash": "3a45b40c2919",
"verdict": "pass",
"summary": "Stop (StopButtonTests + ActiveWorkUITests) and mounted Escape (ComposerPromptHistoryMountedTests) both assert isRunning=false, a single 'Stopped.' notice, focus-request change, and real elapsed-time <1s from trigger; idle Escape no-op is tested as negative space, so the requirement's same-state and 1s conjuncts are genuinely covered.",
"timestamp": "2026-09-09T19:08:32.528Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.1--e0b7a96540cd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.1--e0b7a96540cd",
"requirementId": "REQ-003.5.1",
"hash": "e0b7a96540cd",
"verdict": "pass",
"summary": "Stop (UI test, mocked RPC) and Escape (mounted composer unit test) both invoke the shared synchronous interruptActiveTurn(), and each test asserts identical criteria (isRunning false, focus-request change, 'Stopped.' notice, elapsed <1s) plus post-interrupt composer usability; since the underlying mutation is synchronous, the <1s assertions are not coincidental passes.",
"timestamp": "2026-09-09T19:39:18.245Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.2--9aeb2dd320d4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.2--9aeb2dd320d4",
"requirementId": "REQ-003.5.2",
"hash": "9aeb2dd320d4",
"verdict": "pass",
"summary": "Tests exercise real late-arriving RPC output (in-process delay and real subprocess) after interrupt/restart, asserting suppression from transcript and correct new-turn output; genuine, non-tautological coverage of the requirement's boundary.",
"timestamp": "2026-09-09T18:54:55.132Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.2--f3ec9082cc29.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.2--f3ec9082cc29",
"requirementId": "REQ-003.5.2",
"hash": "f3ec9082cc29",
"verdict": "pass",
"summary": "Tests genuinely verify suppression of interrupted-turn output: delayed mock deltas, real RPC subprocess late output, and hydration replay of pre-interruption content are all asserted absent while later legitimate turn output is asserted present; non-tautological, no over-mocking of the assertion path.",
"timestamp": "2026-09-09T19:38:53.453Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.3--92adedc9a747.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.3--92adedc9a747",
"requirementId": "REQ-003.5.3",
"hash": "92adedc9a747",
"verdict": "pass",
"summary": "Genuine coverage: real persistence-backed relaunch, navigation, repeated hydration, and later-turn rendering all confirmed to preserve the Stopped. indicator, with late-output rejection as negative space; no mocking bypasses the fence logic.",
"timestamp": "2026-09-09T19:39:38.014Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.3--c8d1e2978b8a.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.3--c8d1e2978b8a",
"requirementId": "REQ-003.5.3",
"hash": "c8d1e2978b8a",
"verdict": "pass",
"summary": "Tests cover hydration/resync fence dedup, navigation-away-and-back + AppModel relaunch persistence of Stopped. notice, and rendering updates across later turns; genuine behavioral checks, not tautological.",
"timestamp": "2026-09-09T18:55:02.786Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.4--2914c78ad137.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.4--2914c78ad137",
"requirementId": "REQ-003.5.4",
"hash": "2914c78ad137",
"verdict": "pass",
"summary": "Test starts two chats running, interrupts the selected one, and asserts the non-selected chat's running state and transcript items remain unchanged (with a follow-up event proving it still functions) — genuinely rejects the plausible cross-chat interruption bug; not mocked, not tautological.",
"timestamp": "2026-09-09T18:56:50.713Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.4--c389b7ef313a.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.4--c389b7ef313a",
"requirementId": "REQ-003.5.4",
"hash": "c389b7ef313a",
"verdict": "pass",
"summary": "Test genuinely verifies isolation: interrupting selected (second) chat stops only that runtime while first chat's running state, item transcript, and ability to keep processing later events are all unaffected; interruptSelectedConversation exercises real production runtime code, not mocked.",
"timestamp": "2026-09-09T19:39:20.030Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-003.5.5--cc8c912774cd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-003.5.5--cc8c912774cd",
"requirementId": "REQ-003.5.5",
"hash": "cc8c912774cd",
"verdict": "pass",
"summary": "Idle-escape assertions (items/composerFocusRequest/isRunning unchanged after second Escape) genuinely reject a spurious no-op interrupt causing extra Stopped. notice or focus churn; test is not tautological.",
"timestamp": "2026-09-09T19:08:37.515Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-008.1.2--b8e233ae1065.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-008.1.2--b8e233ae1065",
"requirementId": "REQ-008.1.2",
"hash": "b8e233ae1065",
"verdict": "pass",
"summary": "Tests genuinely verify at-most-once generation gated on full settlement: agent_end doesn't trigger (count=0), agent_settled does (count=1), second turns/teardown-recreation/restoration/failure/interruption paths all confirm no re-attempt (count stays 1 or 0); call-count assertions are behavioral, not tautological or over-mocked.",
"timestamp": "2026-09-09T18:56:40.668Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-009.3.3--01f6497894f2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-009.3.3--01f6497894f2",
"requirementId": "REQ-009.3.3",
"hash": "01f6497894f2",
"verdict": "pass",
"summary": "Tests genuinely verify: after chat switch, first navigateOlder call returns the newly focused chat's most recent user message (not the prior chat's, not an older one), and correctly returns empty when the destination chat has no user messages; uses real PiConversationModel/ComposerPromptHistoryNavigator without mocking the constrained behavior.",
"timestamp": "2026-09-09T18:56:50.713Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-012.1.1--1826f6840eec.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-012.1.1--1826f6840eec",
"requirementId": "REQ-012.1.1",
"hash": "1826f6840eec",
"verdict": "pass",
"summary": "UI test (ProjectUITests) genuinely exercises clicking a project-specific diff pill and asserts the rendered Pending Changes pane shows that project's real git status summary (branch, files, added/deleted), and rejects the cross-project violation by confirming switching projects swaps the displayed status rather than retaining stale data; unit test supplements by verifying correct project routing.",
"timestamp": "2026-09-09T18:58:42.359Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-012.1.2--012fcfcd65a6.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-012.1.2--012fcfcd65a6",
"requirementId": "REQ-012.1.2",
"hash": "012fcfcd65a6",
"verdict": "pass",
"summary": "Test selects a session in one project, then invokes showPendingChanges on a different project and asserts selectedProjectID/selectedSessionID remain unchanged — a genuine, non-mocked check that would fail if opening pending changes altered the selected conversation.",
"timestamp": "2026-09-09T18:58:46.767Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-012.2.1--e52d376c9ca9.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-012.2.1--e52d376c9ca9",
"requirementId": "REQ-012.2.1",
"hash": "e52d376c9ca9",
"verdict": "pass",
"summary": "Real git-repo test (staged/unstaged/untracked mix) verifies branch line, per-file status, and aggregate file/addition/deletion counts against actual git output, not mocked; boundary cases (M vs ?? status, mixed change types) are exercised and asserted.",
"timestamp": "2026-09-09T19:08:26.322Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-012.2.3--e522e2809320.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-012.2.3--e522e2809320",
"requirementId": "REQ-012.2.3",
"hash": "e522e2809320",
"verdict": "pass",
"summary": "Test switches DiffModel to a second real-git project and asserts summary is nil (not the first project's file list) synchronously after refresh() is called, matching the sync clear in DiffModel.refresh; real git repos used, no over-mocking, directly rejects the stale-summary-during-load violation.",
"timestamp": "2026-09-09T18:58:48.655Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-012.3.1--68ce168f5ab8.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-012.3.1--68ce168f5ab8",
"requirementId": "REQ-012.3.1",
"hash": "68ce168f5ab8",
"verdict": "pass",
"summary": "Test refreshes same project path twice after mutating repo state and asserts the second summary (staged.txt removed, tracked.txt additions/deletions changed) replaces the first, genuinely covering the replace-with-new-result requirement.",
"timestamp": "2026-09-09T19:07:28.459Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-013.1.1--9847b5b4e36c.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-013.1.1--9847b5b4e36c",
"requirementId": "REQ-013.1.1",
"hash": "9847b5b4e36c",
"verdict": "pass",
"summary": "testArchivedChatsListAndRestorePreserveSelectionAndMetadata now uses distinct real updatedAt values (30 vs 20) across project/quick sources, and asserts exact merged order plus title/source(projectID+projectName)/messageCount for each — genuinely exercises AppModel.archivedChats' cross-source sort-by-updatedAt, not tautological.",
"timestamp": "2026-09-09T19:11:58.437Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-013.1.2--76dc5ff10310.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-013.1.2--76dc5ff10310",
"requirementId": "REQ-013.1.2",
"hash": "76dc5ff10310",
"verdict": "pass",
"summary": "ArchivedChatsRenderingTests renders the real RightPaneView with an empty AppModel and OCRs the composited bitmap for 'No Archived Chats', genuinely exercising the archivedChats.isEmpty branch in RightPaneView.swift; AppModelConversationTests corroborates the underlying empty-data precondition. No mocking of the render path, no keyword-only matching, and the assertion would fail on a broken/blank empty state.",
"timestamp": "2026-09-09T19:21:53.780Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-013.1.3--510e74159816.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-013.1.3--510e74159816",
"requirementId": "REQ-013.1.3",
"hash": "510e74159816",
"verdict": "pass",
"summary": "Test sets selectedSessionID before openRightPane(.archivedChats) and asserts it is unchanged after, genuinely rejecting a violation where opening archived chats would change/reset selection.",
"timestamp": "2026-09-09T19:11:47.055Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-013.2.1--ee6b97d0a566.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-013.2.1--ee6b97d0a566",
"requirementId": "REQ-013.2.1",
"hash": "ee6b97d0a566",
"verdict": "pass",
"summary": "Tests exercise real unarchiveSession/pinnedSessions/visibleSessionShortcuts logic, verifying removal from archivedChats and correct section placement across pinned/unpinned x project/standalone combinations; no over-mocking or tautology found.",
"timestamp": "2026-09-09T19:04:13.870Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-013.2.2--b788b02f4d51.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-013.2.2--b788b02f4d51",
"requirementId": "REQ-013.2.2",
"hash": "b788b02f4d51",
"verdict": "pass",
"summary": "Test sets selected session distinct from restored chat, asserts selectedSessionID unchanged after unarchiveSession; genuine rejection of the violating case where restore reassigns selection.",
"timestamp": "2026-09-09T19:04:33.941Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-013.3.1--ebcd74a8c8f9.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-013.3.1--ebcd74a8c8f9",
"requirementId": "REQ-013.3.1",
"hash": "ebcd74a8c8f9",
"verdict": "pass",
"summary": "Tests verify identity (id lookup), project/quick association (session moved between projects.sessions and standaloneSessions), filePath, cachedTranscript, and isPinned are all preserved across both archive and restore directions with real state checks, not tautologies.",
"timestamp": "2026-09-09T19:05:14.123Z"
}
8 changes: 8 additions & 0 deletions .2119/verdicts/REQ-013.3.2--88a90fc49ded.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"reviewId": "REQ-013.3.2--88a90fc49ded",
"requirementId": "REQ-013.3.2",
"hash": "88a90fc49ded",
"verdict": "pass",
"summary": "testArchivedAndRestoredChatsPersistAcrossRelaunch genuinely reloads via fresh AppModel() instances backed by real UserDefaults/disk persistence, verifying both archive and restore survive a simulated relaunch for standalone and project sessions.",
"timestamp": "2026-09-09T19:05:11.557Z"
}
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## 2026-09-09

### Fixed

- Unified Stop and Escape interruption so active work stops through one lifecycle, late output stays suppressed, and a persistent bold interruption status survives chat refreshes, navigation, and relaunch. Refined red feedback with a darker light-theme treatment.

## 2026-09-08

### Added
Expand Down
Loading
Loading