From 4519c5f4d35bd505c5c5ec3a2c4dd29984a44d24 Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Fri, 17 Jul 2026 14:10:40 +0200 Subject: [PATCH] docs: correct simplification audit findings Replace stale placements for revised scopes, separate line-level LOC categories, and neutralize superseded implementation guidance. --- docs/non-sync-code-simplification-audit.md | 851 +++++++++--------- ...systematic-simplification-audit-results.md | 58 +- 2 files changed, 450 insertions(+), 459 deletions(-) diff --git a/docs/non-sync-code-simplification-audit.md b/docs/non-sync-code-simplification-audit.md index cf19baa141..c0b1cdc2f9 100644 --- a/docs/non-sync-code-simplification-audit.md +++ b/docs/non-sync-code-simplification-audit.md @@ -6,7 +6,7 @@ - **Status:** Discovery, two-pass review, reconciliation, and global risk/reward ranking complete; first implementation batch verified and stashed locally - **Companion implementation record:** [Audit results and implementation record](plans/2026-07-16-systematic-simplification-audit-results.md) -This is the durable source of truth for the audit. The full-review result under each candidate supersedes its preserved discovery-era record whenever they differ. Estimates remain leads for current-`HEAD` revalidation, not implementation promises. +This is the durable decision record for the audit. The full-review result under each candidate supersedes its preserved discovery-era record whenever they differ. Estimates remain leads for current-`HEAD` revalidation, not implementation promises. Raw manifests and reviewer artifacts remain in the local ignored `.tmp` workspace and are not independently reproducible from this commit. ## Executive summary @@ -15,54 +15,45 @@ This is the durable source of truth for the audit. The full-review result under - 116 vertical scouts and 12 blind cross-cutting lenses produced 349 candidate claims and 606 raw rejected leads. - Seven domain consolidations produced 105 candidate slots. Five whole-candidate duplicates were removed and one overlap was narrowed, leaving **100 unique candidate slots**. - Every candidate then received two independent reviews: one safety/correctness pass and one maintainability/value pass. Conservative reconciliation produced **26 confirmed, 47 narrowed, 12 deferred, and 15 rejected** findings. -- Three independent rankers globally ordered all 100 reconciled results. The actionable backlog is **33 Tier A plus 40 Tier B** findings; ranks 74–85 are deferred Tier C, and ranks 86–100 are rejected. -- The first three implemented findings were verified and stashed at the user's request as commit `11043158b95aee6a44dfcf4e69315abda4b88704` (currently `stash@{0}`, message `codex: verified simplification implementation batch`). +- Three independent rankers globally ordered the original reconciled results. After 27 C06/C07 scopes were materially revised, three fresh reviewers replaced their stale placements against the full final catalog; the other 73 candidates retain their original placements. The actionable backlog is **33 Tier A plus 40 Tier B** findings; ranks 74–85 are deferred Tier C, and ranks 86–100 are rejected. +- The first three implemented findings were verified and stashed at the user's request as stash object `11043158b95aee6a44dfcf4e69315abda4b88704` (message `codex: verified simplification implementation batch`; it was `stash@{0}` at audit time, but stash ordinals are mutable and local). - Cross-model review was offered after the single-model multi-agent pass and skipped. The result is independently reviewed and ranked, but not cross-model corroborated. -The stashed implementation contains 14 files with one insertion and 514 deletions: net 244 production lines, six comments, 155 test lines, 107 test-infrastructure lines, and one separator blank removed. It changes no sync/state code, configuration, dependency, or lockfile. +The stashed implementation contains 14 files with one production-code insertion and 514 deletions: 222 production-code lines, 125 test-code lines, 82 test-infrastructure-code lines, 34 comment-only lines, and 51 blank lines. Its net physical reduction is 513 lines. It changes no sync/state code, configuration, dependency, or lockfile. ## How to use this backlog -- **Tier A:** Actionable simplification with a closed or nearly closed proof and the best current risk/reward profile. -- **Tier B:** Actionable only after the candidate-specific characterization, platform, rebase, security, or scope gate. +- **Tier A:** Higher-confidence, lower-risk actionable simplification; a small recorded verification step may still remain. +- **Tier B:** Actionable simplification with greater risk, effort, or uncertainty; an external gate may or may not remain. - **Tier C:** Deferred; the idea may be valid, but current evidence or value does not justify implementation. - **Reject:** Do not implement as described. A new proposal must address the recorded failure, and C02-012 must remain outside this non-sync audit. - **Implemented and stashed:** A verified patch exists locally but is not present in the worktree. - **Discovery-era record:** Preserved for traceability only. The full-review result, authoritative scope, corrections, and gate control. -- LOC categories remain separate. Production, comments, configuration, tests, test infrastructure, generated code, and moved code must never be combined into one headline number. +- LOC categories remain separate. Production code, test code, test-infrastructure code, comment-only lines, blank lines, configuration, generated code, and moved code must never be combined into one headline number. ## Verification and ranking method -| Stage | Coverage | Independence and decision rule | -| ---------------------------- | -------------: | -------------------------------------------------------------------------------------------------------------------------------------- | -| Discovery and consolidation | 100 candidates | Scouts, cross-cutting lenses, seven domain consolidations, then cross-domain deduplication | -| Safety/correctness review | 100 candidates | Seven domain reviewers checked behavior, boundaries, paths, tests, and sync exclusion | -| Maintainability/value review | 100 candidates | Seven different domain reviewers independently checked KISS/YAGNI, abstraction cost, and real LOC value without seeing safety verdicts | -| Conservative reconciliation | 100 candidates | Material verdict precedence: reject, defer, narrow, confirm; lower validity/reward/confidence and higher risk/effort control | -| Global risk/reward ranking | 3 × 100 ranks | Three independent rankers used only reconciled records; actionable, deferred, and rejected bands could not be mixed | -| Final wording reconciliation | 27 candidates | Three focused reviewers replaced mechanical C06/C07 scope intersections with one controlling scope, LOC statement, and gate | +| Stage | Coverage | Independence and decision rule | +| ------------------------------- | -----------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Discovery and consolidation | 100 candidates | Scouts, cross-cutting lenses, seven domain consolidations, then cross-domain deduplication | +| Safety/correctness review | 100 candidates | Seven domain reviewers checked behavior, boundaries, paths, tests, and sync exclusion | +| Maintainability/value review | 100 candidates | Seven different domain reviewers independently checked KISS/YAGNI, abstraction cost, and real LOC value without seeing safety verdicts | +| Conservative reconciliation | 100 candidates | Material verdict precedence: reject, defer, narrow, confirm; lower validity/reward/confidence and higher risk/effort control | +| Original global ranking | 3 × 100 placements | Three independent rankers used the original reconciled records; those placements still control the 73 materially unchanged candidates | +| Final-scope replacement ranking | 3 × 27 placements | Three fresh reviewers placed each revised C06/C07 scope against the full final catalog; unknown combined test/test-infrastructure envelopes received no direct LOC credit | -The final order is mean rank across R1/R2/R3. Exact ties prefer lower risk, then lower effort, then higher reconciled priority score, then candidate ID. This is a relative implementation order, not a promise that adjacent ranks have equal value. +The final order is mean applicable placement within the actionable, deferred, and rejected bands. For 73 unchanged candidates, the applicable placements are R1/R2/R3; for the 27 revised candidates, F1/F2/F3 replace the stale positions. Exact ties prefer lower risk, then lower effort, then higher reconciled priority, then candidate ID. Production/concept removal receives more credit than tests, test infrastructure, configuration, generated code, or comments. This is a relative implementation order, not a promise that adjacent ranks have equal value. -### Ranking uncertainty +### Placement uncertainty -The table preserves every ranker's position. Eleven actionable candidates have a spread of at least 30 places and should be treated as order-sensitive rather than precisely ranked: +Controlling placements still disagree by at least 30 positions for four actionable candidates. Their bands remain unchanged; treat their exact rank as lower-confidence and follow the recorded gate: -| Final rank | ID | R1/R2/R3 | Spread | Main source of disagreement | -| ---------: | ------- | -------- | -----: | ---------------------------------------------------------------------- | -| 22 | C02-007 | 13/43/18 | 30 | Exact but very small production deletion | -| 23 | C06-004 | 18/9/49 | 40 | Verified deletion, but entirely test infrastructure | -| 27 | C07-005 | 60/12/24 | 48 | Whole shadow implementation versus test-only reward and a missing gate | -| 42 | C07-009 | 61/17/51 | 44 | Test deduplication value versus recurrence-boundary verification cost | -| 45 | C01-010 | 33/64/37 | 31 | Mechanical breadth and list-identity review cost | -| 47 | C07-013 | 62/25/50 | 37 | Large E2E/test-infrastructure deletion versus dynamic reachability | -| 48 | C05-012 | 31/66/40 | 35 | Native shared-service cleanup breadth versus modest concept removal | -| 49 | C03-008 | 30/65/43 | 35 | Mixed UI scaffolding reward versus scope-splitting cost | -| 50 | C06-006 | 58/28/53 | 30 | Retired tooling value versus test-infrastructure-only payoff | -| 51 | C06-009 | 59/27/54 | 32 | Closed dead wrapper versus test-infrastructure-only payoff | -| 53 | C06-015 | 32/70/45 | 38 | Visible stylesheet reduction versus global visual-verification cost | - -These spreads do not change the actionable/deferred/rejected bands. They explain why implementation should follow candidate gates rather than treating the mean as false precision. +| Rank | ID | P1/P2/P3 | Spread | Main source of disagreement | +| ---: | ------- | -------: | -----: | ----------------------------------------------------------- | +| 22 | C02-007 | 13/43/18 | 30 | Exact but very small production deletion | +| 42 | C01-010 | 33/64/37 | 31 | Mechanical breadth and list-identity review cost | +| 44 | C05-012 | 31/66/40 | 35 | Native shared-service breadth versus modest concept removal | +| 45 | C03-008 | 30/65/43 | 35 | Mixed UI scaffolding reward versus scope-splitting cost | ## Recommended next open batch @@ -78,110 +69,110 @@ These are the first five open findings in the final global order and have disjoi ## Final global risk/reward order -All 100 reviewed candidate slots are shown. `R1/R2/R3` records the three independent positions; the mean determines the order within the actionable, deferred, and rejected bands. +All 100 reviewed candidate slots are shown. `P1/P2/P3` are the controlling placements: original R1/R2/R3 for unchanged scopes and focused F1/F2/F3 for revised scopes. `Prior` preserves the stale original positions for revised scopes and shows `same` otherwise. -| Rank | ID | Verdict | Tier | Status | R1/R2/R3 | Mean | Candidate | -| ---: | ------- | ------- | ------ | ------------------- | ----------: | -----: | ---------------------------------------------------------------------------------------- | -| 1 | C01-002 | confirm | A | implemented-stashed | 1/1/1 | 1.00 | Delete obsolete duration pipes and parser-migration wrappers | -| 2 | C04-015 | confirm | A | implemented-stashed | 2/2/2 | 2.00 | Delete the superseded static procrastination-type catalog | -| 3 | C01-005 | narrow | A | open | 3/3/5 | 3.67 | Delete the remaining unbound animation triggers and registrations | -| 4 | C02-005 | confirm | A | open | 4/4/4 | 4.00 | Delete obsolete combined task-change placeholder remnants | -| 5 | C04-001 | confirm | A | open | 6/5/6 | 5.67 | Delete the permanently hidden issue-panel intro component | -| 6 | C01-006 | confirm | B | open | 10/6/3 | 6.33 | Prune orphaned optional capabilities from chip-list-input | -| 7 | C04-007 | narrow | A | open | 5/7/12 | 8.00 | Delete the unused path-based plugin translation loader | -| 8 | C03-009 | confirm | A | open | 9/8/8 | 8.33 | Trim the obsolete MenuTreeService reactive facade | -| 9 | C03-014 | narrow | A | open | 7/14/11 | 10.67 | Delete the orphaned Markdown checklist parser and model | -| 10 | C03-002 | narrow | A | open | 8/15/9 | 10.67 | Remove retired Focus Mode overlay navigation and banner scaffolding | -| 11 | C01-014 | narrow | B | open | 21/10/7 | 12.67 | Delete unused global Sass modules, mixins, placeholders, and theme utilities | -| 12 | C01-004 | narrow | B | open | 20/11/10 | 13.67 | Remove stale tree-DnD preview/state surface and reuse the ancestor utility | -| 13 | C04-011 | confirm | A | open | 11/16/17 | 14.67 | Remove obsolete route and breakpoint subscriptions from plugin side-panel buttons | -| 14 | C02-010 | confirm | A | open | 12/18/16 | 15.33 | Delete the superseded daily-state calculator | -| 15 | C03-007 | narrow | A | open | 16/19/15 | 16.67 | Trim unused Observable/Signal half-pairs from GlobalConfigService | -| 16 | C01-007 | narrow | A | open | 19/13/19 | 17.00 | Remove the two zero-consumer DialogConfirm modes | -| 17 | C03-010 | narrow | A | open | 14/20/20 | 18.00 | Remove dead scaffolding from tag display and quick-menu components | -| 18 | C03-011 | narrow | A | open | 15/21/21 | 19.00 | Prune displaced worklog presentation scaffolding | -| 19 | C04-004 | narrow | B | open | 22/23/13 | 19.33 | Delete the orphaned Jira wonky-cookie authentication path | -| 20 | C04-008 | confirm | A | open | 17/22/23 | 20.67 | Delete the inert custom plugin initializer provider | -| 21 | C02-013 | narrow | B | open | 26/24/14 | 21.33 | Remove abandoned estimate UI from PlanTasksTomorrow | -| 22 | C02-007 | confirm | A | open | 13/43/18 | 24.67 | Remove the unused drag-event time wrapper | -| 23 | C06-004 | confirm | B | implemented-stashed | 18/9/49 | 25.33 | Delete two browser-side Karma hooks that are no longer loaded | -| 24 | C03-015 | confirm | B | open | 29/29/22 | 26.67 | Remove the test-only keyboard-layout compatibility implementation | -| 25 | C04-005 | narrow | B | open | 24/31/25 | 26.67 | Replace Redmine ParamsBuilder with request-local parameter objects | -| 26 | C05-006 | narrow | B | open | 25/33/26 | 28.00 | Delete the orphaned Android process-lifecycle observer and dependency | -| 27 | C07-005 | narrow | B | open | 60/12/24 | 32.00 | Delete the work-context shadow implementation after preserving its unique boundary | -| 28 | C04-013 | narrow | B | open | 23/34/39 | 32.00 | Delete the unreachable Brain Dump line-by-line fallback | -| 29 | C01-008 | narrow | B | open | 27/35/38 | 33.33 | Delete verified dead component-scoped selectors and empty style resources | -| 30 | C01-011 | narrow | B | open | 28/37/36 | 33.67 | Replace manual component subscription plumbing with Angular lifecycle bridges | -| 31 | C03-012 | confirm | A | open | 39/41/27 | 35.67 | Delete the empty NoteEffects class and registration | -| 32 | C03-001 | narrow | B | open | 35/30/42 | 35.67 | Make PanelContentService the single signal-based panel-open authority | -| 33 | C03-004 | narrow | A | open | 40/40/28 | 36.00 | Finish retiring FocusModeService compatibility members | -| 34 | C02-009 | confirm | A | open | 41/42/30 | 37.67 | Delete orphaned repeat configurations-with-start-time selector | -| 35 | C02-002 | confirm | B | open | 37/38/41 | 38.67 | Delete orphaned ScheduleService.hasEventsForDay | -| 36 | C01-009 | narrow | B | open | 34/36/46 | 38.67 | Prune stale state, selectors, and an unreachable branch from the task row | -| 37 | C03-005 | narrow | A | open | 38/50/29 | 39.00 | Prune obsolete WorkContextService members and dormant pipeline sketches | -| 38 | C04-003 | confirm | A | open | 42/45/31 | 39.33 | Delete the unused calendar-provider-by-id selector | -| 39 | C02-003 | confirm | A | open | 43/44/33 | 40.00 | Use the iCal loading promise as the sole module cache | -| 40 | C05-013 | confirm | A | open | 45/46/32 | 41.00 | Remove obsolete StartupService migration-era injections | -| 41 | C03-006 | narrow | A | open | 44/51/34 | 43.00 | Remove WorkContextService's plain isTodayList mirror | -| 42 | C07-009 | narrow | B | open | 61/17/51 | 43.00 | Route next/newest recurrence boundary cases through their existing scenario runners | -| 43 | C05-015 | confirm | A | open | 46/49/35 | 43.33 | Collapse CORS_SKIP_EXTRA_HEADERS identical platform branches | -| 44 | C06-001 | confirm | A | open | 54/26/52 | 44.00 | Delete the superseded commented Snap release pipeline | -| 45 | C01-010 | narrow | B | open | 33/64/37 | 44.67 | Replace legacy @for tracking wrappers with direct identity expressions | -| 46 | C04-010 | narrow | B | open | 36/53/47 | 45.33 | Delete the disconnected eager PluginService loading subsystem | -| 47 | C07-013 | narrow | B | open | 62/25/50 | 45.67 | Delete unused non-sync E2E fixture, page, helper, overlay, and barrel surface | -| 48 | C05-012 | narrow | B | open | 31/66/40 | 45.67 | Trim duplicate predicates and unused surface from CapacitorPlatformService | -| 49 | C03-008 | narrow | B | open | 30/65/43 | 46.00 | Delete obsolete create-project theme and issue-provider scaffolding | -| 50 | C06-006 | narrow | A | open | 58/28/53 | 46.33 | Delete the formatter for retired CI performance-metric uploads | -| 51 | C06-009 | confirm | B | open | 59/27/54 | 46.67 | Delete the never-wired single-test wrapper | -| 52 | C05-008 | narrow | B | open | 50/32/58 | 46.67 | Delete unreferenced legacy Android vectors and empty value resources | -| 53 | C06-015 | narrow | B | open | 32/70/45 | 49.00 | Remove unused palettes and glow presets from the Rainbow theme | -| 54 | C02-001 | confirm | B | open | 52/39/57 | 49.33 | Prune unused mirrored schedule layout constants | -| 55 | C05-001 | narrow | A | open | 56/47/55 | 52.67 | Delete noncompiled Electron updater, Pomodoro/DBus, and pseudo-API remnants | -| 56 | C02-006 | narrow | B | open | 48/72/44 | 54.67 | Use running cursors for sequential schedule entries | -| 57 | C01-015 | narrow | B | open | 49/71/48 | 56.00 | Trim stale custom-Formly/config boilerplate | -| 58 | C06-003 | confirm | A | open | 55/48/71 | 58.00 | Remove superseded desktop and MAS alternatives from electron-builder configuration | -| 59 | C06-002 | confirm | A | open | 53/52/70 | 58.33 | Remove the duplicate Node setup from the web release job | -| 60 | C07-002 | narrow | B | open | 63/54/60 | 59.00 | Replace the copied planner calendar-selector algorithm with real projector coverage | -| 61 | C06-008 | narrow | B | open | 51/68/59 | 59.33 | Prune nine root-only packages with no remaining consumer | -| 62 | C07-004 | narrow | B | open | 64/55/62 | 60.33 | Replace worklog shadow algorithms with focused production calls | -| 63 | C07-011 | narrow | B | open | 66/56/63 | 61.67 | Build simple-counter streak cases from DST-safe offset fixtures | -| 64 | C07-010 | narrow | B | open | 67/57/61 | 61.67 | Centralize iCalendar envelopes while preserving every raw parser case | -| 65 | C05-002 | confirm | A | open | 57/73/56 | 62.00 | Delete the unreachable commented Android WebView OPTIONS implementation | -| 66 | C06-007 | confirm | A | open | 47/67/72 | 62.00 | Remove ineffective options from the solution-style root tsconfig | -| 67 | C07-003 | narrow | B | open | 65/58/64 | 62.33 | Delete reminder-dialog suites that assert only local simulations | -| 68 | C07-008 | narrow | B | open | 68/63/65 | 65.33 | Run shared repeat-config projector cases from one typed matrix | -| 69 | C07-014 | narrow | B | open | 71/59/67 | 65.67 | Collapse route-only planner E2E smokes into behavior-bearing journeys | -| 70 | C07-015 | narrow | B | open | 72/60/66 | 66.00 | Consolidate plugin upload and API-test smokes into explicit lifecycle journeys | -| 71 | C07-001 | narrow | B | open | 69/62/68 | 66.33 | Replace PlannerService's copied tomorrow$ implementation with production-connected cases | -| 72 | C07-006 | narrow | B | open | 70/61/69 | 66.67 | Replace the self-testing task-delete unit spec with three real E2E outcomes | -| 73 | C06-011 | narrow | B | open | 73/69/73 | 71.67 | Make routine bundled-plugin build-and-copy entries declarative | -| 74 | C06-005 | defer | C | deferred | 74/74/74 | 74.00 | Remove the never-enabled custom macOS notarizer and private shell helper | -| 75 | C01-003 | defer | C | deferred | 77/77/75 | 76.33 | Delete the obsolete custom min/max validation layer | -| 76 | C07-007 | defer | C | deferred | 75/75/80 | 76.67 | Delete superseded and non-discovered Add Task Bar timezone artifacts | -| 77 | C01-001 | defer | C | deferred | 76/76/78 | 76.67 | Collapse mentions to its actual text-input contract and one styling owner | -| 78 | C04-009 | defer | C | deferred | 79/78/76 | 77.67 | Remove dormant cached-asset fields from PluginState | -| 79 | C03-013 | defer | C | deferred | 78/79/79 | 78.67 | Remove stale NoteComponent inline-editor and input-lifecycle remnants | -| 80 | C02-008 | defer | C | deferred | 81/80/77 | 79.33 | Delete unmatched schedule-view stylesheet remnants | -| 81 | C05-005 | defer | C | deferred | 80/81/81 | 80.67 | Remove redundant main-window guards after protocol readiness | -| 82 | C05-014 | defer | C | deferred | 82/82/83 | 82.33 | Conditionally register ElectronEffects instead of creating a false effect field | -| 83 | C05-011 | defer | C | deferred | 83/83/82 | 82.67 | Remove five empty UIApplicationDelegate lifecycle stubs | -| 84 | C04-006 | defer | C | deferred | 84/84/84 | 84.00 | Resolve the inert PluginCleanupService registry against the sandbox lifecycle plan | -| 85 | C05-009 | defer | C | deferred | 85/85/85 | 85.00 | Re-evaluate the duplicate Objective-C StoreReview plugin shim after iOS widget work | -| 86 | C02-004 | reject | reject | rejected | 86/86/86 | 86.00 | Remove disabled schedule-placement debug instrumentation | -| 87 | C01-013 | reject | reject | rejected | 88/87/90 | 88.33 | Extract the shared planner projection-item SCSS base | -| 88 | C03-003 | reject | reject | rejected | 87/88/91 | 88.67 | Use one computed signal per Focus Mode main UI state | -| 89 | C02-011 | reject | reject | rejected | 91/90/88 | 89.67 | Consolidate duplicate simple-counter chart selectors | -| 90 | C05-003 | reject | reject | rejected | 89/89/93 | 90.33 | Delete obsolete Electron DBus and shell-command store keys | -| 91 | C04-002 | reject | reject | rejected | 92/91/89 | 90.67 | Centralize duplicated issue-field value resolution | -| 92 | C04-012 | reject | reject | rejected | 93/92/87 | 90.67 | Share the provider build recipe across six issue and two calendar plugins | -| 93 | C02-014 | reject | reject | rejected | 90/93/92 | 91.67 | Trim DailySummary dead state/styles and bind focus metrics once | -| 94 | C04-014 | reject | reject | rejected | 94/94/94 | 94.00 | Delete unreferenced API-test dashboard helpers and write-only sample IDs | -| 95 | C05-010 | reject | reject | rejected | 95/96/95 | 95.33 | Remove only proven-default iOS Capacitor flags; retain the documented keyboard flag | -| 96 | C05-007 | reject | reject | rejected | 96/95/96 | 95.67 | Centralize focus-notification activity PendingIntent construction | -| 97 | C07-012 | reject | reject | rejected | 97/97/98 | 97.33 | Move standalone PluginService and PluginLoader cases into their canonical harnesses | -| 98 | C05-004 | reject | reject | rejected | 98/98/97 | 97.67 | Consolidate duplicated Electron tray message and cache synchronization | -| 99 | C02-012 | reject | reject | rejected | 99/99/99 | 99.00 | Remove the superseded all-state tag cleanup method | -| 100 | C06-010 | reject | reject | rejected | 100/100/100 | 100.00 | Retire the completed hard-coded translation cleanup script | +| Rank | ID | Verdict | Tier | Status | P1/P2/P3 | Mean | Pass | Prior | Candidate | +| ---: | ------- | ------- | ------ | ------------------- | ----------: | -----: | -------- | ----------: | ---------------------------------------------------------------------------------------- | +| 1 | C01-002 | confirm | A | implemented-stashed | 1/1/1 | 1.00 | original | same | Delete obsolete duration pipes and parser-migration wrappers | +| 2 | C04-015 | confirm | A | implemented-stashed | 2/2/2 | 2.00 | original | same | Delete the superseded static procrastination-type catalog | +| 3 | C01-005 | narrow | A | open | 3/3/5 | 3.67 | original | same | Delete the remaining unbound animation triggers and registrations | +| 4 | C02-005 | confirm | A | open | 4/4/4 | 4.00 | original | same | Delete obsolete combined task-change placeholder remnants | +| 5 | C04-001 | confirm | A | open | 6/5/6 | 5.67 | original | same | Delete the permanently hidden issue-panel intro component | +| 6 | C01-006 | confirm | B | open | 10/6/3 | 6.33 | original | same | Prune orphaned optional capabilities from chip-list-input | +| 7 | C04-007 | narrow | A | open | 5/7/12 | 8.00 | original | same | Delete the unused path-based plugin translation loader | +| 8 | C03-009 | confirm | A | open | 9/8/8 | 8.33 | original | same | Trim the obsolete MenuTreeService reactive facade | +| 9 | C03-014 | narrow | A | open | 7/14/11 | 10.67 | original | same | Delete the orphaned Markdown checklist parser and model | +| 10 | C03-002 | narrow | A | open | 8/15/9 | 10.67 | original | same | Remove retired Focus Mode overlay navigation and banner scaffolding | +| 11 | C01-014 | narrow | B | open | 21/10/7 | 12.67 | original | same | Delete unused global Sass modules, mixins, placeholders, and theme utilities | +| 12 | C01-004 | narrow | B | open | 20/11/10 | 13.67 | original | same | Remove stale tree-DnD preview/state surface and reuse the ancestor utility | +| 13 | C04-011 | confirm | A | open | 11/16/17 | 14.67 | original | same | Remove obsolete route and breakpoint subscriptions from plugin side-panel buttons | +| 14 | C02-010 | confirm | A | open | 12/18/16 | 15.33 | original | same | Delete the superseded daily-state calculator | +| 15 | C03-007 | narrow | A | open | 16/19/15 | 16.67 | original | same | Trim unused Observable/Signal half-pairs from GlobalConfigService | +| 16 | C01-007 | narrow | A | open | 19/13/19 | 17.00 | original | same | Remove the two zero-consumer DialogConfirm modes | +| 17 | C03-010 | narrow | A | open | 14/20/20 | 18.00 | original | same | Remove dead scaffolding from tag display and quick-menu components | +| 18 | C03-011 | narrow | A | open | 15/21/21 | 19.00 | original | same | Prune displaced worklog presentation scaffolding | +| 19 | C04-004 | narrow | B | open | 22/23/13 | 19.33 | original | same | Delete the orphaned Jira wonky-cookie authentication path | +| 20 | C04-008 | confirm | A | open | 17/22/23 | 20.67 | original | same | Delete the inert custom plugin initializer provider | +| 21 | C02-013 | narrow | B | open | 26/24/14 | 21.33 | original | same | Remove abandoned estimate UI from PlanTasksTomorrow | +| 22 | C02-007 | confirm | A | open | 13/43/18 | 24.67 | original | same | Remove the unused drag-event time wrapper | +| 23 | C03-015 | confirm | B | open | 29/29/22 | 26.67 | original | same | Remove the test-only keyboard-layout compatibility implementation | +| 24 | C04-005 | narrow | B | open | 24/31/25 | 26.67 | original | same | Replace Redmine ParamsBuilder with request-local parameter objects | +| 25 | C05-006 | narrow | B | open | 25/33/26 | 28.00 | original | same | Delete the orphaned Android process-lifecycle observer and dependency | +| 26 | C04-013 | narrow | B | open | 23/34/39 | 32.00 | original | same | Delete the unreachable Brain Dump line-by-line fallback | +| 27 | C01-008 | narrow | B | open | 27/35/38 | 33.33 | original | same | Delete verified dead component-scoped selectors and empty style resources | +| 28 | C01-011 | narrow | B | open | 28/37/36 | 33.67 | original | same | Replace manual component subscription plumbing with Angular lifecycle bridges | +| 29 | C03-012 | confirm | A | open | 39/41/27 | 35.67 | original | same | Delete the empty NoteEffects class and registration | +| 30 | C03-001 | narrow | B | open | 35/30/42 | 35.67 | original | same | Make PanelContentService the single signal-based panel-open authority | +| 31 | C03-004 | narrow | A | open | 40/40/28 | 36.00 | original | same | Finish retiring FocusModeService compatibility members | +| 32 | C02-009 | confirm | A | open | 41/42/30 | 37.67 | original | same | Delete orphaned repeat configurations-with-start-time selector | +| 33 | C02-002 | confirm | B | open | 37/38/41 | 38.67 | original | same | Delete orphaned ScheduleService.hasEventsForDay | +| 34 | C01-009 | narrow | B | open | 34/36/46 | 38.67 | original | same | Prune stale state, selectors, and an unreachable branch from the task row | +| 35 | C03-005 | narrow | A | open | 38/50/29 | 39.00 | original | same | Prune obsolete WorkContextService members and dormant pipeline sketches | +| 36 | C04-003 | confirm | A | open | 42/45/31 | 39.33 | original | same | Delete the unused calendar-provider-by-id selector | +| 37 | C02-003 | confirm | A | open | 43/44/33 | 40.00 | original | same | Use the iCal loading promise as the sole module cache | +| 38 | C05-013 | confirm | A | open | 45/46/32 | 41.00 | original | same | Remove obsolete StartupService migration-era injections | +| 39 | C06-015 | narrow | B | open | 43/35/48 | 42.00 | focused | 32/70/45 | Remove unused palettes and glow presets from the Rainbow theme | +| 40 | C03-006 | narrow | A | open | 44/51/34 | 43.00 | original | same | Remove WorkContextService's plain isTodayList mirror | +| 41 | C05-015 | confirm | A | open | 46/49/35 | 43.33 | original | same | Collapse CORS_SKIP_EXTRA_HEADERS identical platform branches | +| 42 | C01-010 | narrow | B | open | 33/64/37 | 44.67 | original | same | Replace legacy @for tracking wrappers with direct identity expressions | +| 43 | C04-010 | narrow | B | open | 36/53/47 | 45.33 | original | same | Delete the disconnected eager PluginService loading subsystem | +| 44 | C05-012 | narrow | B | open | 31/66/40 | 45.67 | original | same | Trim duplicate predicates and unused surface from CapacitorPlatformService | +| 45 | C03-008 | narrow | B | open | 30/65/43 | 46.00 | original | same | Delete obsolete create-project theme and issue-provider scaffolding | +| 46 | C05-008 | narrow | B | open | 50/32/58 | 46.67 | original | same | Delete unreferenced legacy Android vectors and empty value resources | +| 47 | C07-005 | narrow | B | open | 51/56/39 | 48.67 | focused | 60/12/24 | Delete the work-context shadow implementation after preserving its unique boundary | +| 48 | C02-001 | confirm | B | open | 52/39/57 | 49.33 | original | same | Prune unused mirrored schedule layout constants | +| 49 | C05-001 | narrow | A | open | 56/47/55 | 52.67 | original | same | Delete noncompiled Electron updater, Pomodoro/DBus, and pseudo-API remnants | +| 50 | C07-013 | narrow | B | open | 52/59/49 | 53.33 | focused | 62/25/50 | Delete unused non-sync E2E fixture, page, helper, overlay, and barrel surface | +| 51 | C02-006 | narrow | B | open | 48/72/44 | 54.67 | original | same | Use running cursors for sequential schedule entries | +| 52 | C06-001 | confirm | A | open | 68/46/54 | 56.00 | focused | 54/26/52 | Delete the superseded commented Snap release pipeline | +| 53 | C01-015 | narrow | B | open | 49/71/48 | 56.00 | original | same | Trim stale custom-Formly/config boilerplate | +| 54 | C07-008 | narrow | B | open | 60/48/61 | 56.33 | focused | 68/63/65 | Run shared repeat-config projector cases from one typed matrix | +| 55 | C06-004 | confirm | B | implemented-stashed | 58/61/51 | 56.67 | focused | 18/9/49 | Delete two browser-side Karma hooks that are no longer loaded | +| 56 | C07-004 | narrow | B | open | 55/60/55 | 56.67 | focused | 64/55/62 | Replace worklog shadow algorithms with focused production calls | +| 57 | C07-002 | narrow | B | open | 54/66/52 | 57.33 | focused | 63/54/60 | Replace the copied planner calendar-selector algorithm with real projector coverage | +| 58 | C07-015 | narrow | B | open | 56/55/66 | 59.00 | focused | 72/60/66 | Consolidate plugin upload and API-test smokes into explicit lifecycle journeys | +| 59 | C07-010 | narrow | B | open | 62/57/59 | 59.33 | focused | 67/57/61 | Centralize iCalendar envelopes while preserving every raw parser case | +| 60 | C06-003 | confirm | A | open | 69/51/62 | 60.67 | focused | 55/48/71 | Remove superseded desktop and MAS alternatives from electron-builder configuration | +| 61 | C07-014 | narrow | B | open | 57/58/67 | 60.67 | focused | 71/59/67 | Delete only strict-prefix planner E2E smokes after preserving isolated behaviors | +| 62 | C07-009 | narrow | B | open | 61/65/58 | 61.33 | focused | 61/17/51 | Route next/newest recurrence boundary cases through their existing scenario runners | +| 63 | C06-009 | confirm | B | open | 65/64/56 | 61.67 | focused | 59/27/54 | Delete the never-wired single-test wrapper | +| 64 | C07-011 | narrow | B | open | 63/62/60 | 61.67 | focused | 66/56/63 | Build simple-counter streak cases from DST-safe offset fixtures | +| 65 | C05-002 | confirm | A | open | 57/73/56 | 62.00 | original | same | Delete the unreachable commented Android WebView OPTIONS implementation | +| 66 | C07-003 | narrow | B | open | 53/71/65 | 63.00 | focused | 65/58/64 | Delete reminder-dialog suites that assert only local simulations | +| 67 | C06-006 | narrow | A | open | 66/67/57 | 63.33 | focused | 58/28/53 | Delete the formatter for retired CI performance-metric uploads | +| 68 | C07-001 | narrow | B | open | 59/68/63 | 63.33 | focused | 69/62/68 | Replace PlannerService's copied tomorrow$ implementation with production-connected cases | +| 69 | C06-011 | narrow | B | open | 70/52/70 | 64.00 | focused | 73/69/73 | Delete unread copyToAssets flags from bundled-plugin metadata | +| 70 | C06-002 | confirm | A | open | 71/54/68 | 64.33 | focused | 53/52/70 | Remove the duplicate Node setup from the web release job | +| 71 | C06-007 | confirm | A | open | 72/63/71 | 68.67 | focused | 47/67/72 | Remove ineffective options from the solution-style root tsconfig | +| 72 | C07-006 | narrow | B | open | 64/73/73 | 70.00 | focused | 70/61/69 | Replace the self-testing task-delete unit spec with three real E2E outcomes | +| 73 | C06-008 | narrow | B | open | 67/72/72 | 70.33 | focused | 51/68/59 | Remove the unused direct file-saver dependency pair | +| 74 | C01-003 | defer | C | deferred | 77/77/75 | 76.33 | original | same | Delete the obsolete custom min/max validation layer | +| 75 | C01-001 | defer | C | deferred | 76/76/78 | 76.67 | original | same | Collapse mentions to its actual text-input contract and one styling owner | +| 76 | C04-009 | defer | C | deferred | 79/78/76 | 77.67 | original | same | Remove dormant cached-asset fields from PluginState | +| 77 | C03-013 | defer | C | deferred | 78/79/79 | 78.67 | original | same | Remove stale NoteComponent inline-editor and input-lifecycle remnants | +| 78 | C07-007 | defer | C | deferred | 83/78/76 | 79.00 | focused | 75/75/80 | Delete superseded and non-discovered Add Task Bar timezone artifacts | +| 79 | C02-008 | defer | C | deferred | 81/80/77 | 79.33 | original | same | Delete unmatched schedule-view stylesheet remnants | +| 80 | C05-005 | defer | C | deferred | 80/81/81 | 80.67 | original | same | Remove redundant main-window guards after protocol readiness | +| 81 | C05-014 | defer | C | deferred | 82/82/83 | 82.33 | original | same | Conditionally register ElectronEffects instead of creating a false effect field | +| 82 | C05-011 | defer | C | deferred | 83/83/82 | 82.67 | original | same | Remove five empty UIApplicationDelegate lifecycle stubs | +| 83 | C06-005 | defer | C | deferred | 85/84/83 | 84.00 | focused | 74/74/74 | Remove the never-enabled custom macOS notarizer and private shell helper | +| 84 | C04-006 | defer | C | deferred | 84/84/84 | 84.00 | original | same | Resolve the inert PluginCleanupService registry against the sandbox lifecycle plan | +| 85 | C05-009 | defer | C | deferred | 85/85/85 | 85.00 | original | same | Re-evaluate the duplicate Objective-C StoreReview plugin shim after iOS widget work | +| 86 | C02-004 | reject | reject | rejected | 86/86/86 | 86.00 | original | same | Remove disabled schedule-placement debug instrumentation | +| 87 | C01-013 | reject | reject | rejected | 88/87/90 | 88.33 | original | same | Extract the shared planner projection-item SCSS base | +| 88 | C03-003 | reject | reject | rejected | 87/88/91 | 88.67 | original | same | Use one computed signal per Focus Mode main UI state | +| 89 | C02-011 | reject | reject | rejected | 91/90/88 | 89.67 | original | same | Consolidate duplicate simple-counter chart selectors | +| 90 | C05-003 | reject | reject | rejected | 89/89/93 | 90.33 | original | same | Delete obsolete Electron DBus and shell-command store keys | +| 91 | C04-002 | reject | reject | rejected | 92/91/89 | 90.67 | original | same | Centralize duplicated issue-field value resolution | +| 92 | C04-012 | reject | reject | rejected | 93/92/87 | 90.67 | original | same | Share the provider build recipe across six issue and two calendar plugins | +| 93 | C02-014 | reject | reject | rejected | 90/93/92 | 91.67 | original | same | Trim DailySummary dead state/styles and bind focus metrics once | +| 94 | C07-012 | reject | reject | rejected | 92/91/93 | 92.00 | focused | 97/97/98 | Keep standalone PluginService and PluginLoader cases in their focused harnesses | +| 95 | C04-014 | reject | reject | rejected | 94/94/94 | 94.00 | original | same | Delete unreferenced API-test dashboard helpers and write-only sample IDs | +| 96 | C05-010 | reject | reject | rejected | 95/96/95 | 95.33 | original | same | Remove only proven-default iOS Capacitor flags; retain the documented keyboard flag | +| 97 | C05-007 | reject | reject | rejected | 96/95/96 | 95.67 | original | same | Centralize focus-notification activity PendingIntent construction | +| 98 | C05-004 | reject | reject | rejected | 98/98/97 | 97.67 | original | same | Consolidate duplicated Electron tray message and cache synchronization | +| 99 | C02-012 | reject | reject | rejected | 99/99/99 | 99.00 | original | same | Remove the superseded all-state tag cleanup method | +| 100 | C06-010 | reject | reject | rejected | 100/100/100 | 100.00 | focused | 100/100/100 | Do not retire the still-active hard-coded translation cleanup script | ## Complete canonical candidate catalog @@ -193,7 +184,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-001 — Collapse mentions to its actual text-input contract and one styling owner -- **Full-review result:** Rank 77/100; reviewer ranks 76/76/78. Safety: defer; maintainability: narrow; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 75/100; controlling original placements 76/76/78. Safety: defer; maintainability: narrow; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Defer the interaction rewrite. If revived, isolate a textarea-only contract for both live consumers, prove each non-input/config branch unreachable, and keep style ownership as a separate change. - **Corrected LOC:** production re-estimate after characterization and scope split; comments re-estimate; tests added re-estimate after the textarea behavior matrix is defined; moved exclude the style move from this candidate - **Material corrections:** There are two live textarea consumers, not one.; Static reachability does not establish caret, focus, IME, input-event, or popup-position equivalence.; The style consolidation is a separate root cause. @@ -212,9 +203,9 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-002 — Delete obsolete duration pipes and parser-migration wrappers -- **Full-review result:** Rank 1/100; reviewer ranks 1/1/1. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** implemented-stashed. +- **Full-review result:** Rank 1/100; controlling original placements 1/1/1. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** implemented-stashed. - **Authoritative scope:** Use the verified stashed scope: delete the two obsolete duration pipes and specs plus only the unused StringToMs Angular wrapper, injection, helper, and previousMsValue parameter; retain stringToMs, its path, parser tests, and directive duplicate suppression. -- **Corrected LOC:** production net removed 154; tests deleted 155 +- **Corrected LOC:** Production code: 132 lines deleted and 1 line added, for a net reduction of 131. Test code: 125 lines deleted. Comment-only lines: 20 deleted. Blank lines: 33 deleted. Total physical diff for this candidate: 1 insertion and 310 deletions. - **Material corrections:** The live plain stringToMs parser is explicitly outside the deletion.; Do not apply unrelated paths from any broader stash. - **Primary gate:** None. - **Required verification:** Repeat class, pipe-name, template, provider, and path searches.; Re-run focused duration/parser tests, changed-file checks, and the production frontend build. @@ -225,14 +216,14 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Preserve:** Live duration parsing, formatting, seconds support, duplicate suppression, templates, Formly registration, and persisted duration values remain unchanged. - **Evidence:** Exact class, pipe-name, path, DI, template, registration, build, native, IPC, and plugin searches found no consumers of the deleted pipes; private migration fields are declaration-only. - **Estimated net change:** production 148–151; tests 126–133 -- **Stashed actual and completed verification:** 155 production lines deleted and one formatting line added (net 154), plus 155 obsolete/self-only test lines deleted. All modified TypeScript files passed `checkFile`; 342 focused duration/parser Karma tests and the production frontend build passed. +- **Stashed actual and completed verification:** 132 production-code lines, 125 test-code lines, 20 comment-only lines, and 33 blank lines were deleted; one production-code formatting line was added. All modified TypeScript files passed `checkFile`; 342 focused duration/parser Karma tests and the production frontend build passed. - **Gates and overlaps:** parser-contract. - **Verify:** Re-run symbol, pipe-name, template, and registration searches; Run duration directive/function specs and checkFile on modified TypeScript files; Compile the frontend. - **Source findings:** F02-01-C01; F02-01-C03. ### C01-003 — Delete the obsolete custom min/max validation layer -- **Full-review result:** Rank 75/100; reviewer ranks 77/77/75. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 74/100; controlling original placements 77/77/75. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Do not delete the active directives until a pre-change host/Formly test proves selector activation, error keys/messages, coercion, zero-bound, and dynamic-bound equivalence. - **Corrected LOC:** production 131; configuration 11; comments 2; tests added 30-45 - **Material corrections:** Module-only usage does not make an Angular directive dead.; The custom validators differ from built-ins for zero bounds and error-object shape. @@ -251,7 +242,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-004 — Remove stale tree-DnD preview/state surface and reuse the ancestor utility -- **Full-review result:** Rank 12/100; reviewer ranks 20/11/10. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 12/100; controlling original placements 20/11/10. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Split the stale preview/types/state-style deletion from ancestor delegation. Include nav-list-tree.component.ts and tree.utils.spec.ts, and preserve equal-ID false semantics with an explicit guard. - **Corrected LOC:** production 165-170 across both atomic slices; comments 1; tests added 0-2; tests deleted 1 - **Material corrections:** The canonical file list omitted a production component and utility spec.; Shared isAncestor returns true for identical IDs, unlike the private descendant check.; The two historical roots should land independently. @@ -270,7 +261,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-005 — Delete the remaining unbound animation triggers and registrations -- **Full-review result:** Rank 3/100; reviewer ranks 3/3/5. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 3/100; controlling original placements 3/3/5. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete swirlAnimation, slideInFromTopAni, expandFastAnimation, expandAnimationAllowOverflow, and only their imports and registrations, using the actual current symbol names. - **Corrected LOC:** production 72; tests 0 - **Material corrections:** Two canonical symbol names were stale.; Merged neighboring animation cleanup does not overlap these symbols. @@ -289,7 +280,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-006 — Prune orphaned optional capabilities from chip-list-input -- **Full-review result:** Rank 6/100; reviewer ranks 10/6/3. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 6/100; controlling original placements 10/6/3. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. - **Authoritative scope:** Remove the unused additional-action UI, Ctrl+Enter output branch, and host-autofocus timer while retaining the keydown handler and all Cyrillic separator behavior. - **Corrected LOC:** production 70-78; comments 0-4; tests added 35-55 - **Material corrections:** The key handler is live for Cyrillic separator variants and cannot be deleted wholesale.; The shared component lacks focused characterization. @@ -308,7 +299,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-007 — Remove the two zero-consumer DialogConfirm modes -- **Full-review result:** Rank 16/100; reviewer ranks 19/13/19. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 16/100; controlling original placements 19/13/19. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** After auditing all 45 untyped dialog callers, delete only the unused mode keys, checkbox/forms imports and state, template branches, and mode-only tests; retain the default primitive result/focus contract. - **Corrected LOC:** production 18-22; tests deleted 135-141 - **Material corrections:** Current HEAD has 45 call sites, not 30.; Untyped MAT_DIALOG_DATA makes the exhaustive caller audit part of the safety proof. @@ -327,7 +318,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-008 — Delete verified dead component-scoped selectors and empty style resources -- **Full-review result:** Rank 29/100; reviewer ranks 27/35/38. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 27/100; controlling original placements 27/35/38. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Keep this record only for the 62-line main-header encapsulation/extraction cleanup. Split every other component/page into its own candidate and defer file-imex behind PR #8456. - **Corrected LOC:** production 62; comments 0; tests 0 - **Material corrections:** The catalog batch combines unrelated CSS histories and rollback surfaces.; PR #8456 invalidates the file-imex slice until rebase and re-audit.; The omitted plugin-config comment-only stylesheet, if retained, needs its own candidate. @@ -346,7 +337,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-009 — Prune stale state, selectors, and an unreachable branch from the task row -- **Full-review result:** Rank 36/100; reviewer ranks 34/36/46. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 34/100; controlling original placements 34/36/46. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Retain only the unused task-row computed and exact dead component-scoped selector members. Review the independently evolved hover-icon branch separately and preserve live time-badge/global theme rules. - **Corrected LOC:** production re-estimate for the stale-state/style-only slice; comments re-estimate; reviewer counts differ because their corrected scopes differ; tests added re-estimate after the hot-path slice is isolated - **Material corrections:** The state/styles and hover branch have different root causes.; Only the repeat-date-badge selector member is dead inside a grouped live rule.; Task-row large-list performance review is mandatory. @@ -365,7 +356,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-010 — Replace legacy @for tracking wrappers with direct identity expressions -- **Full-review result:** Rank 45/100; reviewer ranks 33/64/37. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 42/100; controlling original placements 33/64/37. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete orphan wrappers first, then convert live wrappers in small owning-component batches using exact identity expressions; review task.component alone and keep icon-input/select-project ownership here. - **Corrected LOC:** production 69-93 aggregate; re-estimate each implementation batch; comments 0-1; tests re-estimate by batch because one reviewer found deletion and the other required additions - **Material corrections:** The reconciled inventory is 23 wrappers across 22 units.; A focus-mode spec directly tests one wrapper.; The task-row wrapper requires separate hot-path verification.; A repository-wide mechanical batch is not the smallest clean change. @@ -406,7 +397,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-011 — Replace manual component subscription plumbing with Angular lifecycle bridges -- **Full-review result:** Rank 30/100; reviewer ranks 28/37/36. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 28/100; controlling original placements 28/37/36. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Limit this record to teardown-only conversions in DialogUnsplash, DialogTrackTime, SelectTaskMinimal, FormlyTranslated, and SnackCustom. Exclude PluginPanelContainer, PlayButton, and intentionally non-lifecycle subscriptions. - **Corrected LOC:** production 25-40; comments 0; tests added 0-30 for the retained slice; re-estimate per component - **Material corrections:** The catalog combines teardown substitution, plugin store-to-signal mirroring, and derived-state conversion.; PluginPanelContainer crosses a plugin boundary and PlayButton changes update ordering.; The Unsplash download subscription is intentional and remains. @@ -425,26 +416,26 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-013 — Extract the shared planner projection-item SCSS base -- **Full-review result:** Rank 87/100; reviewer ranks 88/87/90. Safety: confirm; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 87/100; controlling original placements 88/87/90. Safety: confirm; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change. Leave the two component-local copies and reconsider only if a third projection component needs the same styling contract. - **Corrected LOC:** accepted production 0; accepted moved 0; proposed production net removed 38-47; proposed moved 45-49; tests 0 - **Material corrections:** This is duplication extraction, not removal of an obsolete concept.; It adds a new partial/mixin and moves live styles for only two consumers.; C02-015 remains a superseded duplicate and contributes no LOC. - **Primary gate:** None. -- **Required verification:** No implementation verification is recommended for the rejected proposal. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/planner/planner-deadline-task/planner-deadline-task.component.scss` — host/item/title base rules; `src/app/features/planner/planner-repeat-projection/planner-repeat-projection.component.scss` — host/item/title base rules; `src/app/features/planner/_planner-projection-item.scss` — proposed narrowly scoped projection-item mixin. - **Why it exists:** Deadline and repeat projection components independently carry the same 49-line encapsulated style prefix. -- **Smallest change:** Move the exact common rules into one planner-local mixin/partial, include it from both components, and leave the repeat-only trailing rule local. -- **Preserve:** Compiled selectors, encapsulation, cascade order, tokens, breakpoint, hover behavior, typography, icon sizing, overflow, and the repeat-only time rule remain byte-equivalent in effect. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** The complete first 49 lines are textually identical; the styling guide and local shared-SCSS patterns support a component-local mixin rather than a global override. -- **Estimated net change:** production 38–47; moved 45–49 +- **Rejected historical estimate:** Zero LOC is authorized. production 38–47; moved 45–49 - **Gates and overlaps:** visual-regression; scss-encapsulation; C02-015 is superseded by this candidate and its speculative calendar-row extension is excluded. -- **Verify:** Compare compiled CSS selectors/declarations before and after; Run checkFile on both component files and the partial; Visually check deadline/repeat rows in narrow/wide, hover, light, and dark modes. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** L08-C01. ### C01-014 — Delete unused global Sass modules, mixins, placeholders, and theme utilities -- **Full-review result:** Rank 11/100; reviewer ranks 21/10/7. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 11/100; controlling original placements 21/10/7. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Land five exact Sass-graph deletions separately. Retain src/\_common.scss and src/styles/mixins/\_mixins.scss, removing only the named use/forward lines, and keep runtime utility selectors in a separately browser-verified slice. - **Corrected LOC:** production 171; configuration replaced 1; comments re-estimate; reviewers count 1 versus 28 under different category boundaries; tests 0; moved 0 - **Material corrections:** Two live Sass facade files must remain.; The catalog combines five risk-distinct graphs.; C06-013 and C06-014 are superseded subsets and must not be double-counted. @@ -463,7 +454,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C01-015 — Trim stale custom-Formly/config boilerplate -- **Full-review result:** Rank 57/100; reviewer ranks 49/71/48. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 53/100; controlling original placements 49/71/48. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** After PRs #9092 and #6748 are rebased, retain only proven-dead Formly getters, the empty constructor, and obsolete comments. Exclude callback/options extraction, tracking wrappers, and GlobalConfigService. - **Corrected LOC:** production 12; comments 23-27; configuration 0; tests added re-estimate after rebase; current reviewer range is 0-30 - **Material corrections:** Open PRs make the bundled sound/repeat/icon slices stale.; Shared validator and patch-option constants add low-value indirection and are excluded.; C01-010 owns tracking wrappers and C03-007 owns GlobalConfigService.; The aggregate LOC estimate is no longer valid. @@ -484,7 +475,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-001 — Prune unused mirrored schedule layout constants -- **Full-review result:** Rank 54/100; reviewer ranks 52/39/57. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 48/100; controlling original placements 52/39/57. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete only the unused TypeScript layout keys, three unused Sass breakpoint declarations, and comments made obsolete by those declarations, including the false keep-in-sync instruction. - **Corrected LOC:** configuration 14; comments 16; production 0; tests 0 - **Material corrections:** The catalog misclassified declarations and omitted 16 comment lines.; Responsive manual verification remains required.; The recorded PR #9058 gate was not revalidated. @@ -503,7 +494,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-002 — Delete orphaned ScheduleService.hasEventsForDay -- **Full-review result:** Rank 35/100; reviewer ranks 37/38/41. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 33/100; controlling original placements 37/38/41. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete the service method, its dedicated describe block, and the two spy-name/default pairs; retain getEventDayStr and getEventsForDay. - **Corrected LOC:** production 9; tests 39 - **Material corrections:** All three modified specs, including the locale spec, must be checked.; The stale spy names and return values must be removed together.; The recorded PR #8927 gate was not revalidated. @@ -522,7 +513,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-003 — Use the iCal loading promise as the sole module cache -- **Full-review result:** Rank 39/100; reviewer ranks 43/44/33. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 37/100; controlling original placements 43/44/33. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Keep loadingPromise as the sole module state and return the identically normalized module directly from its never-cleared import callback. - **Corrected LOC:** production 4-5; tests 0; comments 0 - **Material corrections:** Preserve ESM/CommonJS normalization and sticky rejection.; Verification includes two live CalDAV consumers, not only calendar integration.; The paired LOC counts differ by one line; the conservative range is retained. @@ -541,26 +532,26 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-004 — Remove disabled schedule-placement debug instrumentation -- **Full-review result:** Rank 86/100; reviewer ranks 86/86/86. Safety: reject; maintainability: confirm; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 86/100; controlling original placements 86/86/86. Safety: reject; maintainability: confirm; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No behavior-preserving deletion is accepted. Reformulate as an intentional performance/error-semantics change for valid plain schedule DTOs, or explicitly preserve eager argument evaluation before deleting the disabled sink. - **Corrected LOC:** accepted production 0; accepted comments 0; proposed production re-estimate after deciding whether eager evaluation remains; proposed comments 1 - **Material corrections:** No-op call arguments are eagerly evaluated and can throw or invoke getters/toJSON.; Deleting them changes unexpected-input failure and side-effect behavior.; The catalog cites a nonexistent focused spec.; Real schedule mapping and timezone suites are required. - **Primary gate:** Obtain explicit acceptance of the intentional error-semantics change and restate the candidate contract. -- **Required verification:** Characterize or explicitly exclude cyclic, BigInt, getter-backed, and proxied invalid inputs.; Run the real map-to-schedule-days, extended mapping, and create-schedule-days suites plus changed-file checks. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Final B. **Classification:** net-new. Rank 7; challenges: refuter narrowed, maintainer confirmed. - **Scope:** `src/app/features/schedule/map-schedule-data/insert-blocked-blocks-view-entries-for-schedule.ts` — debug, insertBlockedBlocksViewEntriesForSchedule, moveAllEntriesAfterTime, moveEntries - **Why it exists:** A permanently disabled local debug function remained wired through many schedule-placement paths, forcing string construction and cloned diagnostic data with no output. -- **Smallest change:** Delete the no-op debug declaration, its calls and arguments, debug-only import/parameter, and the adjacent commented log. -- **Preserve:** Entry insertion, collision movement, ordering, time arithmetic, and output arrays remain byte-for-byte behaviorally equivalent. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** The local sink always returns undefined and has no side effects; every targeted caller exists only to feed it. -- **Estimated net change:** production 57–67; comments 1 +- **Rejected historical estimate:** Zero LOC is authorized. production 57–67; comments 1 - **Gates and overlaps:** schedule-placement algorithm; timezone-sensitive tests; PR #8927 changes a sibling schedule helper but not the target file, so revalidate the exact file and timezone suite after any rebase. -- **Verify:** npm run checkFile src/app/features/schedule/map-schedule-data/insert-blocked-blocks-view-entries-for-schedule.ts; npm run test:file src/app/features/schedule/map-schedule-data/insert-blocked-blocks-view-entries-for-schedule.spec.ts +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** P12-01-C1 ### C02-005 — Delete obsolete combined task-change placeholder remnants -- **Full-review result:** Rank 4/100; reviewer ranks 4/4/4. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 4/100; controlling original placements 4/4/4. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only onTaskChange and the nested task-type-indicator style block; leave live selection/text handlers, state signals, and the template untouched. - **Corrected LOC:** production 56; comments 2; tests 0 - **Material corrections:** The catalog cites a nonexistent component spec.; Comment lines must not be double-counted as production.; The focused proof is build/static search plus manual interaction because no component harness exists. @@ -579,7 +570,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-006 — Use running cursors for sequential schedule entries -- **Full-review result:** Rank 56/100; reviewer ranks 48/72/44. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 51/100; controlling original placements 48/72/44. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Limit the cursor rewrite to createScheduleViewEntriesForNormalTasks. Defer the repeat-projection loop until its startTime=0 behavior is explicitly preserved or intentionally changed. - **Corrected LOC:** production 10-15; comments 0; tests added re-estimate after edge-case characterization - **Material corrections:** The repeat loop is not equivalent for startTime=0 because its current truthy guard keeps later entries at zero.; The catalog cites a nonexistent spec and omits the direct normal-task test.; Computing each duration once must retain current pure helper semantics. @@ -598,7 +589,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-007 — Remove the unused drag-event time wrapper -- **Full-review result:** Rank 22/100; reviewer ranks 13/43/18. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 22/100; controlling original placements 13/43/18. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only calculateDropTimeFromEvent and its exclusive documentation/comments; retain calculateTimeFromYPosition byte-for-byte. - **Corrected LOC:** production 12; comments 9; tests 0 - **Material corrections:** The catalog cites a nonexistent schedule-utils spec; the live drag path is covered by ScheduleWeekDragService.; The reviewers count executable lines differently; the smaller defensible production count is used. @@ -617,7 +608,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-008 — Delete unmatched schedule-view stylesheet remnants -- **Full-review result:** Rank 80/100; reviewer ranks 81/80/77. Safety: defer; maintainability: narrow; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 79/100; controlling original placements 81/80/77. Safety: defer; maintainability: narrow; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** After schedule presentation branches are resolved, retain only the 32-line parent ScheduleComponent pre-split header block here; review drop-label, drag-preview, and month pseudo-element slices independently. - **Corrected LOC:** production 32; comments 0; tests 0 - **Material corrections:** The original three-component style batch has multiple roots.; Dynamic drag classes and the data-more-events producer require fresh runtime searches.; PRs #9058 and #7813 were not revalidated. @@ -636,7 +627,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-009 — Delete orphaned repeat configurations-with-start-time selector -- **Full-review result:** Rank 34/100; reviewer ranks 41/42/30. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 32/100; controlling original placements 41/42/30. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete exactly selectTaskRepeatCfgsWithStartTime, its spec import, and dedicated describe block; retain the WithAndWithout selector and every shared state/op-log export. - **Corrected LOC:** production 6; tests 19; comments 0 - **Material corrections:** The shared selector file also exports live reducer/op-log symbols and must not be reorganized.; ScheduleService tests join the selector spec as the live replacement boundary. @@ -655,7 +646,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-010 — Delete the superseded daily-state calculator -- **Full-review result:** Rank 14/100; reviewer ranks 12/18/16. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 14/100; controlling original placements 12/18/16. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete DailyState, calculateDailyState, and their documentation; retain DAILY_STATE.THRESHOLD, getDailyStateInfo, and unrelated translation keys. - **Corrected LOC:** production 19; comments 14; tests 0 - **Material corrections:** Broad DAILY_STATE searches include unrelated translation noise.; The live threshold constant must remain.; The smaller 19-line production count is used. @@ -674,45 +665,45 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-011 — Consolidate duplicate simple-counter chart selectors -- **Full-review result:** Rank 89/100; reviewer ranks 91/90/88. Safety: confirm; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 89/100; controlling original placements 91/90/88. Safety: confirm; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change. Keep the two explicit side-by-side selectors and reconsider only if a third chart variant or independently complex shared policy appears. - **Corrected LOC:** accepted production 0; proposed production net removed 16-26; proposed rewritten or added 31-37; tests 0; comments 0 - **Material corrections:** Net LOC hides a substantial mapper/helper rewrite.; The selectors differ at visible policy points and encode non-obvious zero/NaN/empty-placeholder behavior.; Two uses do not justify the added abstraction under KISS/YAGNI. - **Primary gate:** None. -- **Required verification:** No implementation verification is recommended for the rejected proposal. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/metric/store/metric.selectors.ts` — selectSimpleCounterClickCounterLineChartData, selectSimpleCounterStopWatchLineChartData - **Why it exists:** Click and stopwatch chart selectors were copied together and have received parallel fixes for five years; only type filtering and numeric conversion differ. -- **Smallest change:** Extract one file-local chart builder parameterized by counter type and value mapping while preserving both exported selectors. -- **Preserve:** Selector names, props, ordering, labels, empty placeholder datasets, date slicing, click values, rounded stopwatch minutes, and missing-value behavior remain identical. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Both selectors share filtering, date collection/sort, placeholder construction, slicing, and dataset assembly; their history shows fixes applied in parallel. -- **Estimated net change:** production 16–26 +- **Rejected historical estimate:** Zero LOC is authorized. production 16–26 - **Gates and overlaps:** NgRx selectors; chart dataset identity; habit metrics; PR #8191 changes simple-counter behavior but not these metric selectors. -- **Verify:** npm run checkFile src/app/features/metric/store/metric.selectors.ts; npm run test:file src/app/features/metric/store/metric.selectors.spec.ts +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** P17-C2 ### C02-012 — Remove the superseded all-state tag cleanup method -- **Full-review result:** Rank 99/100; reviewer ranks 99/99/99. Safety: reject; maintainability: confirm; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 99/100; controlling original placements 99/99/99. Safety: reject; maintainability: confirm; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** Remove this candidate from the non-sync C02 campaign. Any deletion must be reconsidered in a dedicated sync/op-log review covering local and remote tag deletion, the shared meta-reducer, ArchiveOperationHandler, locks, and replay. - **Corrected LOC:** eligible production 0; eligible comments 0; sync review estimate re-estimate in the authorized sync domain - **Material corrections:** The method imports op-log locking and dispatches whole time-tracking state.; Its replacement proof crosses one-intent/one-op, archive persistence, and remote replay.; Non-sync unit/manual verification cannot establish the required contract. - **Primary gate:** Route to an authorized sync/op-log review; it is excluded from this domain. -- **Required verification:** A future sync review must cover tag shared-meta-reducer, ArchiveOperationHandler local/remote paths, archive locks, state validity, and tag-delete sync E2E. +- **Required verification:** No implementation verification is authorized in this non-sync audit. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/time-tracking/time-tracking.service.ts` — cleanupDataEverywhereForTag - **Why it exists:** Atomic current-state tag cleanup moved into a shared reducer, but the deprecated service method that duplicated current and archive cleanup remained with zero callers. -- **Smallest change:** Delete cleanupDataEverywhereForTag and its deprecation comment; retain cleanupArchiveDataForTag and all lock/persistence behavior. -- **Preserve:** The live tag-deletion path still performs atomic current-state cleanup plus locked young/old archive cleanup with identical action shapes and ordering. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Consumer search finds no caller, and the retained replacement split is documented and exercised by the live deletion path. -- **Estimated net change:** production 27–31; comments 4 +- **Rejected historical estimate:** Zero LOC is authorized. production 27–31; comments 4 - **Gates and overlaps:** archive persistence; tag deletion; sync-adjacent state cleanup -- **Verify:** npm run checkFile src/app/features/time-tracking/time-tracking.service.ts; npm run test:file src/app/features/time-tracking/time-tracking.service.spec.ts; Manual tag deletion with current and archived tracked time +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** P21-C1 ### C02-013 — Remove abandoned estimate UI from PlanTasksTomorrow -- **Full-review result:** Rank 21/100; reviewer ranks 26/24/14. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 21/100; controlling original placements 26/24/14. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete only the estimate markup/comments, estimate-total SCSS, WorkContextService injection/import, and expandAnimation registration. Leave TaskService and the separate add-scheduled comment out of this root. - **Corrected LOC:** production 24; comments 15; tests 0 - **Material corrections:** The full catalog scope overbundled unrelated TaskService and comment residue.; Unused DI can affect instantiation timing; current AppComponent coverage is an explicit dependency.; No focused PlanTasksTomorrow spec exists.; PR #8038 was not revalidated. @@ -731,28 +722,28 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C02-014 — Trim DailySummary dead state/styles and bind focus metrics once -- **Full-review result:** Rank 93/100; reviewer ranks 90/93/92. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 93/100; controlling original placements 90/93/92. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** Reject the bundle. If desired, propose the two-line dead Action/actionsToExecuteBeforeFinishDay field deletion separately; review focus subscription changes, styles, HTML comments, and other dead fields as independent candidates. - **Corrected LOC:** accepted production 0; smallest separate dead field production 2; catalog production 15-26; catalog comments 29-36; catalog tests added 8-16 - **Material corrections:** The bundle combines multiple unrelated histories and a behaviorally observable subscription-count change.; A one-binding rewrite must retain zero-count suppression.; The current spec does not instantiate the component or cover focus rendering.; PRs #7808 and #8038 were not revalidated. - **Primary gate:** None. -- **Required verification:** No bundled implementation is recommended; each future split must have its own changed-file and focused behavior/visual gate. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/pages/daily-summary/daily-summary.component.ts` — Action, hasTasksForToday$, focusSessionCount$, focusSessionDuration$, actionsToExecuteBeforeFinishDay; `src/app/pages/daily-summary/daily-summary.component.html` — focus session bindings, commented inline-markdown; `src/app/pages/daily-summary/daily-summary.component.scss` — .full-width, .back-btn, .tomorrows-note, commented declarations - **Why it exists:** Successive summary redesigns left zero-consumer fields, unmatched styles/comments, and two template subscriptions that project one already-grouped focus summary. -- **Smallest change:** Remove dead fields/imports/residue and bind focusSessionSummary once, rendering its existing count and total directly. -- **Preserve:** Focus values, notes, tabs, task states, finish-day ordering, archive writes, final sync, navigation, celebration, Electron close handling, and date logic remain unchanged. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Exact searches prove the fields and selectors dead; the two displayed focus values come from the same adjacent summary object. -- **Estimated net change:** production 15–26; comments 29–36; tests -16–-8 +- **Rejected historical estimate:** Zero LOC is authorized. production 15–26; comments 29–36; tests -16–-8 - **Gates and overlaps:** finish-day lifecycle; archive persistence; final sync sequencing; Electron close flow; PR #7808 and PR #8038 modify DailySummary files; rebase without touching finish-day code. -- **Verify:** npm run checkFile src/app/pages/daily-summary/daily-summary.component.ts; npm run checkFile src/app/pages/daily-summary/daily-summary.component.scss; npm run test:file src/app/pages/daily-summary/daily-summary.component.spec.ts; Manual current/historical summary and finish-day pass +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** P22-C2 ## C03 — Projects, tags, notes, focus, settings, worklog, and shared utilities (15 candidates) ### C03-001 — Make PanelContentService the single signal-based panel-open authority -- **Full-review result:** Rank 32/100; reviewer ranks 35/30/42. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 30/100; controlling original placements 35/30/42. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Centralize panelType/hasContent/canOpen and direct consumer reads while preserving bottom-sheet overrides, close timing, navigation effects, and plugin lifecycle. Inventory zero-read RightPanel mirrors separately to avoid overlapping LOC. - **Corrected LOC:** production re-estimate after one non-overlapping consumer inventory; comments re-estimate; reviewer scopes/counts differ; tests added 35-55 - **Material corrections:** The canonical scope omitted four zero-read RightPanel fields while claiming complete mirror removal.; The LOC estimate overlaps service centralization and consumer getter/mirror slices.; Route, responsive, selected-task, and plugin-panel transitions are timing-sensitive. @@ -771,7 +762,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-002 — Remove retired Focus Mode overlay navigation and banner scaffolding -- **Full-review result:** Rank 10/100; reviewer ranks 8/15/9. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 10/100; controlling original placements 8/15/9. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete dead injections/aliases, back/cancel methods, inert destroy Subject, unused animations, stale comments/styles, and mode-only mocks/tests. Retain ngOnDestroy with document-listener removal, warpIn, BannerComponent/template use, safe areas, and drag region. - **Corrected LOC:** production 29-45; comments 5-7; tests re-estimate while replacing implementation-detail teardown assertions; reviewer net range 23-47 removed - **Material corrections:** The canonical target list omitted dead task/config injections and session aliases.; BannerComponent and the live banner host are not residue.; The real document-listener teardown remains and must be tested behaviorally. @@ -790,26 +781,26 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-003 — Use one computed signal per Focus Mode main UI state -- **Full-review result:** Rank 88/100; reviewer ranks 87/88/91. Safety: confirm; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 88/100; controlling original placements 87/88/91. Safety: confirm; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change. Retain the semantic isShow presentation vocabulary; consider only the exact redundant inner gate or one-line tracking helper opportunistically and separately. - **Corrected LOC:** accepted production 0; accepted tests 0; proposed production 11-20; proposed tests added 7-12 - **Material corrections:** The aliases document UI intent and are cheap cached signals.; The proposal combines a naming-policy rewrite, nested-template deduplication, and a tracking helper.; Direct state coupling is less expressive for negligible node savings. - **Primary gate:** None. -- **Required verification:** No implementation verification is recommended for the rejected bundle. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.ts` — isPreparation, isCountdown, isInProgress, state-derived visibility computeds, trackById; `src/app/features/focus-mode/focus-mode-main/focus-mode-main.component.html` — duplicated state gates, simple-counter tracking - **Why it exists:** Six reactive aliases and repeated nested template gates encode only three mutually exclusive main UI states. -- **Smallest change:** Expose the three state predicates once, reuse them in compound computeds and the template, remove redundant inner gates, and track the counter id inline. -- **Preserve:** Every visible region, control order, tooltip, mode condition, animation, action, and duration persistence remains mapped to the same FocusMainUIState combinations. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** The component spec already covers Preparation, Countdown, and InProgress visibility; the removed nodes are pass-through computeds or redundant gates over those states. -- **Estimated net change:** production 11–20; tests 7–12 +- **Rejected historical estimate:** Zero LOC is authorized. production 11–20; tests 7–12 - **Gates and overlaps:** template-visibility -- **Verify:** Update the focused component spec to use the canonical predicate names and remove only the forwarding-helper test; Run checkFile and the FocusModeMainComponent spec; Cycle all three UI states in every mode and compare controls and notes visibility. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** P14-01-C2 ### C03-004 — Finish retiring FocusModeService compatibility members -- **Full-review result:** Rank 33/100; reviewer ranks 40/40/28. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 31/100; controlling original placements 40/40/28. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete isSessionCompleted, isBreakLong, sessionProgress$, and timeToGo$; rename the one break consumer/mock to isLongBreak. Retain currentSessionTime$, last-session members, and the reducer State export. - **Corrected LOC:** production 4; comments 2; tests deleted 20-30 - **Material corrections:** The reducer type alias is a distinct compatibility contract and is excluded.; currentSessionTime$ and last-session members have live Electron/effect consumers. @@ -828,7 +819,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-005 — Prune obsolete WorkContextService members and dormant pipeline sketches -- **Full-review result:** Rank 37/100; reviewer ranks 38/50/29. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 35/100; controlling original placements 38/50/29. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Remove only activeWorkContextIdIfProject$ and its now-unused imports. Route the empty load method and unrelated dormant/debug comments to separate candidates. - **Corrected LOC:** production 9; comments 0; tests 0 - **Material corrections:** The observable, 2020 load stub, and pipeline sketches have unrelated histories.; The catalog's production/comment totals therefore overstate one concept removal. @@ -847,7 +838,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-006 — Remove WorkContextService's plain isTodayList mirror -- **Full-review result:** Rank 41/100; reviewer ranks 44/51/34. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 40/100; controlling original placements 44/51/34. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Change HistoryComponent.projectColorFor to isTodayListSignal(), then delete only the mutable boolean mirror and its assignment subscription; retain isTodayList$ and isTodayListSignal and do not edit TaskComponent. - **Corrected LOC:** production 2; comments 3-4; tests 0 - **Material corrections:** The #8843/task-component dependency is stale because TaskComponent already uses the Signal.; Both reactive APIs remain live and are explicitly retained. @@ -866,7 +857,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-007 — Trim unused Observable/Signal half-pairs from GlobalConfigService -- **Full-review result:** Rank 15/100; reviewer ranks 16/19/15. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 15/100; controlling original placements 16/19/15. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only the wholly unused timelineCfg$/timelineCfg pair, evaluation and takeABreak Signals, and exclusive imports. Retain live one-subscriber Observable-to-Signal bridges and the evaluation$/takeABreak$ Observables. - **Corrected LOC:** production 14-16; comments 0; tests 0 - **Material corrections:** Collapsing four live bridges changes construction paths for modest reward and is excluded.; evaluation$ and takeABreak$ have live consumers; only their Signal halves are dead.; C01-015 must not duplicate this service slice. @@ -885,7 +876,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-008 — Delete obsolete create-project theme and issue-provider scaffolding -- **Full-review result:** Rank 49/100; reviewer ranks 30/65/43. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 45/100; controlling original placements 30/65/43. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Retain only the declaration-only issue-provider fields/type imports and empty subscription/OnDestroy lifecycle. Defer the separate theme-form binding and validation cleanup until focused create-project characterization exists. - **Corrected LOC:** production 14-17; comments 0; tests 0 - **Material corrections:** The catalog bundles separate 2019 theme-form and 2024 provider/lifecycle residue.; Changing the outer form binding is behavior-bearing and under-characterized.; Live afterClosed, session, Plainspace, and provider side effects remain. @@ -904,7 +895,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-009 — Trim the obsolete MenuTreeService reactive facade -- **Full-review result:** Rank 8/100; reviewer ranks 9/8/8. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 8/100; controlling original placements 9/8/8. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Expose the existing toSignal fields directly as projectTree/tagTree and delete the one-hop computed wrappers, projectFolders$, \_collectFolders, and the exclusive map import; retain all actions, state, algorithms, and persistence. - **Corrected LOC:** production 18-24; comments 0; tests added 4-8 - **Material corrections:** Rename/expose the existing signals instead of recreating them so identity and subscription timing remain unchanged. @@ -923,7 +914,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-010 — Remove dead scaffolding from tag display and quick-menu components -- **Full-review result:** Rank 17/100; reviewer ranks 14/20/20. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 17/100; controlling original placements 14/20/20. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Limit to TagToggleMenuList: remove the dead addNewTag output, class menuEl query, unused event parameter, redundant tagFolderMap wrapper, dead styleUrl, and unreachable SCSS. Keep the live template reference; leave TagList and TagEdit separate. - **Corrected LOC:** production 22-25; comments 0-1; tests 0 - **Material corrections:** The umbrella spans three unrelated component histories.; Open PR #8437 touches the excluded TagEdit slice, not the retained quick-menu slice.; TaskComponent is only a consumer and remains unchanged. @@ -942,7 +933,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-011 — Prune displaced worklog presentation scaffolding -- **Full-review result:** Rank 18/100; reviewer ranks 15/21/21. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 18/100; controlling original placements 15/21/21. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Limit to DialogWorklogExport extraction residue: remove the unused options/imports, two legacy comments, dead styleUrl, and unmatched wrapper SCSS file. Leave WorklogWeek changes separate and preserve child styles/export logic. - **Corrected LOC:** production 18-20; comments 2; tests 0 - **Material corrections:** Export-dialog extraction residue and WorklogWeek residue have different histories.; Matching row/column/textarea styles remain live in the extracted child. @@ -961,7 +952,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-012 — Delete the empty NoteEffects class and registration -- **Full-review result:** Rank 31/100; reviewer ranks 39/41/27. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 29/100; controlling original placements 39/41/27. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete note.effects.ts and exactly its import and EffectsModule registration; retain the note reducer registration and all other effect ordering. - **Corrected LOC:** production 6; comments 0; tests 0 - **Material corrections:** C05-014 touches the same module at distinct symbols and must land or rebase independently.; The note reducer remains registered exactly once. @@ -980,7 +971,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-013 — Remove stale NoteComponent inline-editor and input-lifecycle remnants -- **Full-review result:** Rank 79/100; reviewer ranks 78/79/79. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 77/100; controlling original placements 78/79/79. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Do not implement before PR #8982 resolves. After rebase, audit inline-editor/style residue separately from the aliased-input ngOnChanges path against the new draft lifecycle and tests; retain image-safety and all persistence behavior. - **Corrected LOC:** production re-estimate after PR #8982; comments re-estimate after PR #8982; tests re-estimate after PR #8982 - **Material corrections:** PR #8982 substantially changes the exact component and adds draft behavior/tests.; The catalog combines two different migrations.; The baseline lacks a focused NoteComponent spec.; safeImgUrl/isPathSafeToOpen are security boundaries and remain. @@ -999,7 +990,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-014 — Delete the orphaned Markdown checklist parser and model -- **Full-review result:** Rank 9/100; reviewer ranks 7/14/11. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 9/100; controlling original placements 7/14/11. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete the two converter files/specs and markdown-checklist.model.ts from src/app/features/markdown-checklist. Retain checklist operations, detection, progress, editors, and task/note behavior. - **Corrected LOC:** production 20; tests deleted 47; comments 0 - **Material corrections:** All three canonical production paths were wrong.; The model is markdown-checklist.model.ts, not markdown-checklist-task.model.ts.; PR #6782 is adjacent but does not overlap the corrected files/symbols. @@ -1018,7 +1009,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C03-015 — Remove the test-only keyboard-layout compatibility implementation -- **Full-review result:** Rank 24/100; reviewer ranks 29/29/22. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 23/100; controlling original placements 29/29/22. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete userKbLayout, saveUserKbLayout, and unused compatibility type re-exports; keep service connection and raw fallback, and update utility tests to install isolated KeyboardLayoutService instances. - **Corrected LOC:** production 18-28; comments 10-16; tests deleted net 11-27 - **Material corrections:** Keyboard normalization is a global shortcut hot path with medium risk.; Tests need fresh service instances to avoid module-global leakage.; macOS Electron startup/global-shortcut behavior requires explicit coverage.; C07 owns overlapping focused tests and must coordinate edits. @@ -1039,7 +1030,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-001 — Delete the permanently hidden issue-panel intro component -- **Full-review result:** Rank 5/100; reviewer ranks 6/5/6. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 5/100; controlling original placements 6/5/6. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete the intro TS, HTML, and SCSS files and remove only its component import/import entry, false signal, and guarded template block. - **Corrected LOC:** production 54–56; configuration 0; comments 0; test infrastructure 0; tests -35–-15; generated 0; moved 0 - **Material corrections:** Use the exact unreachable UI fence only; do not alter adjacent provider setup UI.; The characterization spec is a prudent gate, not evidence that the component is reachable. @@ -1058,26 +1049,26 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-002 — Centralize duplicated issue-field value resolution -- **Full-review result:** Rank 91/100; reviewer ranks 92/91/89. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 91/100; controlling original placements 92/91/89. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change under this candidate. CalDAV's function-valued branch and the parent-only error boundary prevent one behavior-identical four-site resolver, and the review contract excludes the proposed new abstraction. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** CaldavTimeComponent returns function values without date formatting but formats path values; the proposed shared policy is false evidence of semantic identity.; Sharing only three copies still introduces an abstraction explicitly excluded by the review contract and leaves the highest-risk special case local. - **Primary gate:** None; the candidate is excluded unless the abstraction contract changes. -- **Required verification:** If reconsidered, characterize CalDAV function and path values plus the parent-only error boundary before proposing scope. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `src/app/features/issue/issue-content/issue-content.component.ts` — IssueContentComponent.getFieldValue; `src/app/features/issue/issue-content/issue-content-custom/issue-content-custom.component.ts` — IssueContentCustomComponent.getFieldValue; `src/app/features/issue/issue-content/issue-content-custom/caldav-time/caldav-time.component.ts` — CaldavTimeComponent.fieldValue; `src/app/features/issue/issue-content/issue-content-custom/jira-link/jira-link.component.ts` — JiraLinkComponent.fieldValue; `src/app/features/issue/issue-content/get-issue-field-value.util.ts` — resolveIssueFieldValue - **Why it exists:** Four issue renderers copied the same function-or-dot-path resolution policy during component extraction. -- **Smallest change:** Add one local pure resolver and replace the four bodies; keep the parent-only try/devError boundary and renderer-specific CalDAV/Jira behavior at call sites. -- **Preserve:** Plugin-supplied field functions and paths, undefined traversal, thrown-error propagation differences, synchronous evaluation, raw values, date formatting, and link loading remain identical. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Two independent route scans identify the same four implementations and the same policy boundary. LOC uses the overlapping envelope rather than summing both estimates. -- **Estimated net change:** production 20–32; comments 0–3; tests -70–-20 +- **Rejected historical estimate:** Zero LOC is authorized. production 20–32; comments 0–3; tests -70–-20 - **Gates and overlaps:** public plugin display-field syntax; dynamic callback execution; error-boundary drift; calendar value formatting; Pre-change resolver characterization; P06-01-C3 and P06-02-C1 are exact corroborations; their LOC was not summed. -- **Verify:** Characterize function, flat/nested path, nullish/missing segment, and thrown callback behavior before extraction; npm run checkFile on all five changed TypeScript files; npm run test:file src/app/features/issue/issue-content/get-issue-field-value.util.spec.ts; Manually compare Jira, CalDAV, OpenProject, and one plugin-provided issue field. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** P06-01-C3; P06-02-C1 ### C04-003 — Delete the unused calendar-provider-by-id selector -- **Full-review result:** Rank 38/100; reviewer ranks 42/45/31. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 36/100; controlling original placements 42/45/31. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only selectCalendarProviderById. - **Corrected LOC:** production 5; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Low reward does not override the mechanical Tier A rule because the deletion has no blocker and satisfies the validity, risk, and confidence thresholds. @@ -1096,7 +1087,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-004 — Delete the orphaned Jira wonky-cookie authentication path -- **Full-review result:** Rank 19/100; reviewer ranks 22/23/13. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 19/100; controlling original placements 22/23/13. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete \_checkSetWonkyCookie and its exclusive dialog imports/injection, and remove the now-exclusive MatDialog import/provider from the Jira API spec; retain live SS.JIRA_WONKY_COOKIE cleanup in \_blockAccess. - **Corrected LOC:** production 34–40; configuration 0; comments 1; test infrastructure 0; tests 2; generated 0; moved 0 - **Material corrections:** The audit scope omitted exclusive test DI residue.; The retained unauthorized-access cleanup is live security behavior and is outside deletion scope. @@ -1115,7 +1106,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-005 — Replace Redmine ParamsBuilder with request-local parameter objects -- **Full-review result:** Rank 25/100; reviewer ranks 24/31/25. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 24/100; controlling original placements 24/31/25. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Replace the five builder chains with typed request-local parameter records in the same insertion order and delete ParamsBuilder; inline the two scope variants and add no helper abstraction. - **Corrected LOC:** production 24–38; configuration 0; comments 0; test infrastructure 0; tests -18–-10; generated 0; moved 0 - **Material corrections:** The upper LOC estimate depended on an unnecessary scope helper; direct records are the smaller design.; HttpParams key order and exact Redmine request serialization require characterization before replacement. @@ -1134,7 +1125,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-006 — Resolve the inert PluginCleanupService registry against the sandbox lifecycle plan -- **Full-review result:** Rank 84/100; reviewer ranks 84/84/84. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 84/100; controlling original placements 84/84/84. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Make no code change until sandbox lifecycle ownership is decided; create a deletion candidate only if issue #8226 rejects PluginCleanupService as the lifecycle owner. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The registry is not effect-free: it retains and releases strong iframe references even though no reader exists.; The candidate is presently an unresolved security-lifecycle architecture choice, not a behavior-preserving simplification. @@ -1153,7 +1144,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-007 — Delete the unused path-based plugin translation loader -- **Full-review result:** Rank 7/100; reviewer ranks 5/7/12. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 7/100; controlling original placements 5/7/12. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete the path loader and exclusive HttpClient/firstValueFrom dependencies, remove the now-obsolete HttpClientTestingModule from the i18n spec, and remove the stale runner mock key. - **Corrected LOC:** production 31; configuration 0; comments 4; test infrastructure 0; tests 3; generated 0; moved 0 - **Material corrections:** The original scope omitted HttpClientTestingModule residue in plugin-i18n.service.spec.ts. @@ -1172,7 +1163,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-008 — Delete the inert custom plugin initializer provider -- **Full-review result:** Rank 20/100; reviewer ranks 17/22/23. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 20/100; controlling original placements 17/22/23. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Remove the custom provider import and registration from main.ts and delete plugin-initializer.ts only. - **Corrected LOC:** production 13; configuration 0; comments 7; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The string-token provider is lazy and is never resolved; StartupService independently owns live initialization. @@ -1191,7 +1182,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-009 — Remove dormant cached-asset fields from PluginState -- **Full-review result:** Rank 78/100; reviewer ranks 79/78/76. Safety: defer; maintainability: confirm; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 76/100; controlling original placements 79/78/76. Safety: defer; maintainability: confirm; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** After PluginService security and persistence work is rebased, remove code/indexHtml/icon from PluginState, the unused PluginLoadResult type, and only duplicate state.icon writes; preserve dedicated icon/index registries and sanitization. - **Corrected LOC:** production 10–12; configuration 0; comments 1; test infrastructure 0; tests -8–-2; generated 0; moved 0 - **Material corrections:** PluginState is exposed through a public signal/service method even though current consumers do not read these fields.; Active security and persistence changes invalidate implementation-time reachability proof until rebased.; The smaller defensible production estimate is 10-12, not 14. @@ -1210,7 +1201,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-010 — Delete the disconnected eager PluginService loading subsystem -- **Full-review result:** Rank 46/100; reviewer ranks 36/53/47. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 43/100; controlling original placements 36/53/47. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete only private \_loadBuiltInPlugins, \_loadUploadedPlugins, \_loadPluginsFromPaths, and \_loadUploadedPlugin after rebase-time tracing; preserve public getAllPluginsLegacy and loadPluginFromPath, which keep \_loadPlugin and \_ensurePluginEnabledInMemory live. - **Corrected LOC:** production 115–125; configuration 0; comments 17–23; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The original 258-line scope falsely called the whole chain disconnected despite public loadPluginFromPath reaching \_loadPlugin.; Public TypeScript service methods are preserved under the contract; getAllPluginsLegacy is also a separate root cause.; The original estimate omitted substantial comment/JSDoc LOC. @@ -1229,7 +1220,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-011 — Remove obsolete route and breakpoint subscriptions from plugin side-panel buttons -- **Full-review result:** Rank 13/100; reviewer ranks 11/16/17. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 13/100; controlling original placements 11/16/17. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only the unread router/breakpoint injections, pipelines, signals, computed fields, and their exclusive imports. - **Corrected LOC:** production 20; configuration 0; comments 0; test infrastructure 0; tests -40–-25; generated 0; moved 0 - **Material corrections:** Parent MainHeader visibility remains the only responsive policy; no local replacement is needed. @@ -1248,26 +1239,26 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-012 — Share the provider build recipe across six issue and two calendar plugins -- **Full-review result:** Rank 92/100; reviewer ranks 93/92/87. Safety: defer; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 92/100; controlling original placements 93/92/87. Safety: defer; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change. Keep straightforward package-local build recipes rather than adding a shared monorepo-relative helper across eight independently executable package roots. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The review contract excludes new abstractions and bundled roots.; The helper creates package-portability and CI-invalidation coupling; only four packages currently share build-all orchestration.; Byte-identical output at one revision does not prove ongoing standalone build compatibility. - **Primary gate:** None; the abstraction is excluded unless package-portability policy and the review contract change. -- **Required verification:** If policy changes, build all eight packages both in-repository and standalone and prove helper-only changes fan out through CI. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** proposed `packages/plugin-dev/scripts/build-issue-provider.js` shared helper; `packages/plugin-dev/azure-devops-issue-provider/scripts/build.js`, `clickup-issue-provider/scripts/build.js`, `gitea-issue-provider/scripts/build.js`, `github-issue-provider/scripts/build.js`, `linear-issue-provider/scripts/build.js`, `trello-issue-provider/scripts/build.js`, `caldav-calendar-provider/scripts/build.js`, and `google-calendar-provider/scripts/build.js` package-local wrappers. - **Why it exists:** Eight independently executable package scripts duplicate one esbuild-and-asset-copy recipe, with calendar plugins differing only by absence of i18n copying. -- **Smallest change:** Add one CommonJS helper taking package root, provider name, caller-resolved esbuild, and copyI18n defaulting true; replace scripts with thin wrappers and pass false only for the two calendar packages. -- **Preserve:** Package script paths, local dependency resolution, entry point, browser/IIFE/ES2020 settings, production define, minification, sourcemaps, logging, failure exit, dist inventory, manifest/icon/i18n bytes, and calendar no-i18n output remain identical. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Independent package audits identify the same recipe and the exact calendar variant. The LOC range is a conservative combined envelope and does not double-count the shared helper addition. -- **Estimated net change:** configuration 220–301; comments 13–21 +- **Rejected historical estimate:** Zero LOC is authorized. configuration 220–301; comments 13–21 - **Gates and overlaps:** build-output reproducibility; package-local dependency resolution; plugin manifests/assets; translation assets; pre-change artifact inventory and hash characterization; I07-C01, I08-01-C03, and L10-C03 share the helper direction without additive helper LOC; C06-012 is a superseded duplicate; the Microsoft 365 provider plan may consume the helper only after output characterization. -- **Verify:** Before change, clean-build all eight packages and capture exit status, sorted dist inventory, and hashes; After change, rebuild all eight and compare inventories/hashes byte-for-byte; Assert calendar dist has no i18n and issue-provider i18n remains present; Smoke-load one rebuilt issue and one calendar provider. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** I07-C01; I08-01-C03; L10-C03 ### C04-013 — Delete the unreachable Brain Dump line-by-line fallback -- **Full-review result:** Rank 28/100; reviewer ranks 23/34/39. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 26/100; controlling original placements 23/34/39. Safety: confirm; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** After the trimmed-text guard, remove the fallback and unconditionalize the structured path in the package source, then update the byte-identical shipped bundled asset; retain final draft clearing and ordered side effects. - **Corrected LOC:** production 22–24; configuration 0; comments 1; test infrastructure 0; tests 0; generated 23–25; moved 35–50 - **Material corrections:** The audit omitted the live bundled asset copy.; Unindentation churn is moved/reindented LOC, not extra savings.; The one-off ordered-effect trace must cover warning snacks as well as task creation and persistence. @@ -1286,28 +1277,28 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C04-014 — Delete unreferenced API-test dashboard helpers and write-only sample IDs -- **Full-review result:** Rank 94/100; reviewer ranks 94/94/94. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 95/100; controlling original placements 94/94/94. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No candidate change. Retain testThemeInfo and testDeleteCounter as developer-console API exercises; the separate six authored sample-ID lines and bundled copy are below the audit value threshold. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Static caller absence is false evidence of deadness in an intentionally interactive classic-script developer dashboard.; Deleting testDeleteCounter removes the only executable dashboard exercise for a listed API and weakens tests.; The audit omitted the byte-identical shipped asset and bundled unrelated sample-ID residue. - **Primary gate:** None; preserve the manual dashboard contract. -- **Required verification:** If sample IDs are cleaned opportunistically, update the source and bundled mirror together and prove dashboard button/runAll behavior is unchanged. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `packages/plugin-dev/api-test-plugin/index.html` — testThemeInfo, testDeleteCounter, lastProjectId, lastTagId - **Why it exists:** Developer dashboard experiments remained as globally scoped functions and sample IDs after their buttons/run-all callers were removed. -- **Smallest change:** Delete the two unreferenced helpers, two write-only globals, and their assignments only. -- **Preserve:** Rendered headings/buttons, inline onclick targets, method inventory, runAllTests call order, active API exercises, dialogs, console output, iframe behavior, and public PluginAPI remain unchanged. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Markup, script, exact-string, browser-global, and repository searches find no read/call, but the dynamic developer page merits a snapshot first. -- **Estimated net change:** production 86; comments 1 +- **Rejected historical estimate:** Zero LOC is authorized. production 86; comments 1 - **Gates and overlaps:** dynamic browser globals; developer test surface; public PluginAPI exercise; Dashboard inventory and run-all characterization -- **Verify:** Capture button text/onclick inventory and run-all PluginAPI/console trace before deletion; Compare the same inventories after deletion; Run focused iframe/lifecycle E2E if selected; Manually open the dashboard and run all tests. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** I08-01-C02 ### C04-015 — Delete the superseded static procrastination-type catalog -- **Full-review result:** Rank 2/100; reviewer ranks 2/2/2. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** implemented-stashed. +- **Full-review result:** Rank 2/100; controlling original placements 2/2/2. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** implemented-stashed. - **Authoritative scope:** Delete only the deprecated JSDoc and the unreferenced procrastinationTypes export; retain the translated live factory. -- **Corrected LOC:** production 90; configuration 0; comments 6; test infrastructure 0; tests 0; generated 0; moved 0 +- **Corrected LOC:** Production code: 90 lines deleted. Comment-only lines: 6 deleted. Blank lines: 1 deleted. Total physical deletion: 97 lines. - **Material corrections:** The canonical record omitted six deleted JSDoc comment lines; the completed stash deletes 97 physical lines in total. - **Primary gate:** None. - **Required verification:** Repeat exact symbol/import searches and run the plugin typecheck/build.; Confirm the live factory retains translated IDs, order, labels, and action positions. @@ -1318,7 +1309,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Preserve:** Shared interfaces, IDs, enums, translated factory, displayed catalog, persistence identifiers, and plugin behavior remain unchanged. - **Evidence:** Exact symbol/import tracing finds no consumer and confirms App.tsx uses the translated factory. - **Estimated net change:** production 90; comments 6 -- **Stashed actual and completed verification:** The estimate was exact: 90 production and six comment lines deleted. Exact reference checks, the plugin package typecheck/build, and the production frontend build passed; translated IDs, order, and action positions were preserved. +- **Stashed actual and completed verification:** The physical deletion was exact: 90 production-code lines, 6 comment-only lines, and 1 blank line. Exact reference checks, the plugin package typecheck/build, and the production frontend build passed; translated IDs, order, and action positions were preserved. - **Gates and overlaps:** plugin domain identifiers; translated UI catalog - **Verify:** Run exact reference search; Run the package typecheck and build; Confirm catalog IDs and labels still come from the translated factory. - **Source findings:** I08-02-C01 @@ -1327,7 +1318,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-001 — Delete noncompiled Electron updater, Pomodoro/DBus, and pseudo-API remnants -- **Full-review result:** Rank 55/100; reviewer ranks 56/47/55. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 49/100; controlling original placements 56/47/55. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Keep only the coherent auto-updater concept: delete its 20-line noncompiled block and factually reword the durable packElevateHelper rationale without changing the builder value; do not bundle Pomodoro/DBus, extension, API, or pseudo-IPC comments. - **Corrected LOC:** production 0; configuration 0; comments 20; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The original 48-line sweep combines at least five unrelated histories and violates one-root-cause scope.; The builder rationale must continue to explain why elevate.exe is intentionally excluded. @@ -1346,7 +1337,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-002 — Delete the unreachable commented Android WebView OPTIONS implementation -- **Full-review result:** Rank 65/100; reviewer ranks 57/73/56. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 65/100; controlling original placements 57/73/56. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only the twelve nonblank commented alternative OPTIONS lines; retain the adjacent live synthetic OPTIONS response and WebView bridge boundary byte-identical. - **Corrected LOC:** production 0; configuration 0; comments 12; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The target is comments, not production LOC, and the live OPTIONS short-circuit immediately above it is excluded. @@ -1365,45 +1356,45 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-003 — Delete obsolete Electron DBus and shell-command store keys -- **Full-review result:** Rank 90/100; reviewer ranks 89/89/93. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 90/100; controlling original placements 89/89/93. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No combined change. D_BUS_ID and ALLOWED_COMMANDS are unrelated residues, and the latter's persisted-key/security rationale requires disproportionate compatibility proof for a four-line cleanup. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The two keys do not share one root cause.; The audit misclassified executable TypeScript enum/constant lines as configuration.; Unknown legacy store keys can survive without enum membership, but proving that boundary costs at least as much as this candidate. - **Primary gate:** None; reassess each key independently only when its containing file is already changing. -- **Required verification:** If ALLOWED_COMMANDS is reconsidered, prove an unknown legacy property survives a store load/save round trip. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `electron/CONFIG.ts` — CONFIG.D_BUS_ID; `electron/shared-with-frontend/simple-store.const.ts` — SimpleStoreKey.ALLOWED_COMMANDS - **Why it exists:** Identifiers for the abandoned DBus integration and removed shell-exec allow-list survived after their only runtime consumers were deleted. -- **Smallest change:** Delete the two zero-consumer internal members and only their stale explanatory comments; do not parse, migrate, or rewrite existing simple-store JSON. -- **Preserve:** Current CONFIG values, simple-store loading of unknown legacy keys, preload/IPC channels, and the removed-exec regression fence remain unchanged. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Repository-wide references find no live consumer or dynamic/native registration. Unknown persisted simple-store keys load independently of the enum, and electron/exec.test.cjs remains the security regression guard. -- **Estimated net change:** production 1; configuration 1; comments 3 +- **Rejected historical estimate:** Zero LOC is authorized. production 1; configuration 1; comments 3 - **Gates and overlaps:** legacy-persisted-key; removed-shell-exec-security-boundary -- **Verify:** Repeat exact string/member searches across Electron, frontend, native, build, and tests; Run simple-store and exec Electron tests; Confirm a fixture containing an unknown ALLOWED_COMMANDS key still loads without migration. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** I10-01-C01; I10-02-C1 ### C05-004 — Consolidate duplicated Electron tray message and cache synchronization -- **Full-review result:** Rank 98/100; reviewer ranks 98/98/97. Safety: defer; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 98/100; controlling original placements 98/98/97. Safety: defer; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change. Preserve the three explicit tray paths until a behavior-driven change warrants characterization; do not introduce derivation, cache, title, or tooltip helpers solely to reduce repeated lines. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** SET_PROGRESS_BAR, CURRENT_TASK_UPDATED, and syncTray have different null-task, title, icon, cache-forcing, and menu-rebuild semantics.; The proposed extraction can change the next event's rebuild decision and cross-platform tray behavior.; This is a negative-value abstraction with no presently defensible LOC credit. - **Primary gate:** None; future behavior work must first characterize each event sequence and tray recreation path. -- **Required verification:** Any future refactor needs ordered event/cache tests and Windows, Linux, and macOS tray smoke coverage. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `electron/indicator.ts` — SET_PROGRESS_BAR listener, CURRENT_TASK_UPDATED listener, syncTray, tray/menu message derivation and cache updates - **Why it exists:** Two IPC listeners and the forced tray refresh independently derive the same messages, serialize today tasks, compare five cache fields, rebuild context menus, and branch title/tooltip behavior. -- **Smallest change:** Inside indicator.ts, extract pure message derivation, cache-aware context-menu update, and title/tooltip helpers with an explicit force option; keep event-specific task-widget updates and icon timing in their current handlers. -- **Preserve:** IPC channels/payloads, cache fields, menu construction, macOS tooltip guard, title/tooltip values, task-widget updates, icon animation timing, tray recreation, and listener ordering remain unchanged. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** The same seven-argument createIndicatorMessage calls, today-task projection, cache comparisons, context-menu mutation, and platform title/tooltip branches occur three times in one module. -- **Estimated net change:** production 25–55; tests -90–-40 +- **Rejected historical estimate:** Zero LOC is authorized. production 25–55; tests -90–-40 - **Gates and overlaps:** ipc-payload-ordering; platform-tray-timing; cache-coherence; security-sensitive-main-process -- **Verify:** Add characterization tests for both IPC payload sequences and forced syncTray with unchanged/recreated tray instances; Run electron/indicator.test.cjs and all Electron main-process tests; Manually verify Windows/Linux tray title/menu and macOS tooltip with progress, current-task, pause, completion, and recreation transitions. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** I09-003 ### C05-005 — Remove redundant main-window guards after protocol readiness -- **Full-review result:** Rank 81/100; reviewer ranks 80/81/81. Safety: confirm; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 80/100; controlling original placements 80/81/81. Safety: confirm; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** When protocol-handler.ts is already changing and coverage exists, remove only the four post-readiness mainWin/webContents guards and braces; retain parsing, readiness, deferral, focus, OAuth, IPC, and ordering behavior. - **Corrected LOC:** production 8; configuration 0; comments 0; test infrastructure 0; tests -24–-10; generated 0; moved 0 - **Material corrections:** The control-flow proof is sound, but current tests omit OAuth, plainspace-connect, null/destroyed windows, and deferred URL draining.; Eight removed lines do not justify standalone public-protocol test and installed-app smoke cost. @@ -1422,7 +1413,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-006 — Delete the orphaned Android process-lifecycle observer and dependency -- **Full-review result:** Rank 26/100; reviewer ranks 25/33/26. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 25/100; controlling original placements 25/33/26. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Phase 1 deletes AppLifecycleObserver.kt and its App.kt import/registration only. Retain lifecycle-process until dependencyInsight and merged-manifest comparisons prove the direct dependency has no runtime initializer/version effect; remove it separately if proven redundant. - **Corrected LOC:** production 28–31; configuration 0; comments 2; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Source reachability proves the observer is orphaned but does not prove the direct dependency has no manifest initializer or version-selection effect.; The one configuration line is deferred and receives no current LOC credit. @@ -1441,26 +1432,26 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-007 — Centralize focus-notification activity PendingIntent construction -- **Full-review result:** Rank 96/100; reviewer ranks 96/95/96. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 97/100; controlling original placements 96/95/96. Safety: narrow; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change. Keep the six explicit PendingIntent action blocks rather than parameterizing component, action, request code, flags, and identity at a native security boundary. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Two similar content PendingIntents are intentionally outside the six action blocks and use different identity semantics.; A parameterized helper weakens auditability and can silently alias actions through one request-code or flag error.; The abstraction and locked/background device matrix are negative value relative to the readability gain. - **Primary gate:** None; reconsider only for a behavior-driven notification change with focused identity tests. -- **Required verification:** Any future edit must assert component, action, request code, activity flags, PendingIntent flags, extras, and distinctness for all six actions. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `android/app/src/main/java/com/superproductivity/superproductivity/service/FocusModeNotificationHelper.kt` — six duplicated action PendingIntent blocks in buildNotification and showCompletionNotification - **Why it exists:** Focus notification action branches repeat explicit activity Intent and immutable PendingIntent construction with only request code, action, and label varying. -- **Smallest change:** Introduce one private helper that requires the explicit activity component, action, request code, and exact immutable/update flags, then replace only the six identical blocks; do not generalize reminder broadcasts or timing code. -- **Preserve:** Intent target, actions, request codes, extras, PendingIntent identity, FLAG_UPDATE_CURRENT|FLAG_IMMUTABLE, labels, notification IDs/channels, chronometers, timer state, and completion scheduling remain unchanged. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Six 11-line blocks are structurally identical. The current Android widget plan independently establishes explicit-component and correct mutability flags as security invariants, so the helper must make them mandatory rather than implicit. -- **Estimated net change:** production 36–42 +- **Rejected historical estimate:** Zero LOC is authorized. production 36–42 - **Gates and overlaps:** android-pendingintent-identity; explicit-component-security; notification-action-timing -- **Verify:** Add/extend JVM or instrumentation assertions for action, component, request code, flags, extras, and PendingIntent distinctness; Run Android notification/focus tests and assembleDebug; On-device smoke-test pause, resume, skip, complete, skip-break, and complete-break actions from locked/background states. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** I11-01-C3 ### C05-008 — Delete unreferenced legacy Android vectors and empty value resources -- **Full-review result:** Rank 52/100; reviewer ranks 50/32/58. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 46/100; controlling original placements 50/32/58. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete only the cohesive four-vector family ic_add, ic_done, ic_pause, and ic_stat_play; leave attrs.xml and dimens.xml for a separate template-resource cleanup. - **Corrected LOC:** production 0; configuration 64; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The original 87-line estimate is arithmetically wrong: all six files contain 77 nonblank or 81 physical lines.; The smaller coherent vector-only scope is 64 configuration LOC and excludes unrelated resource kinds.; Static searches still require resource-link proof against dynamic lookup and both flavors. @@ -1479,7 +1470,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-009 — Re-evaluate the duplicate Objective-C StoreReview plugin shim after iOS widget work -- **Full-review result:** Rank 85/100; reviewer ranks 85/85/85. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 85/100; controlling original placements 85/85/85. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Make no deletion at this HEAD. After iOS widget work and lock reconciliation, compare clean builds and runtime bridge registration with and without StoreReviewPlugin.m and its four project entries while retaining Swift metadata and manual registration. - **Corrected LOC:** production 4; configuration 4; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Source references cannot prove which dynamic Capacitor metadata path the linked iOS runtime uses.; npm and Pod locks describe inconsistent Capacitor major versions.; Open widget work directly overlaps project.pbxproj and deliberately repeats the same shim pattern. @@ -1498,26 +1489,26 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-010 — Remove only proven-default iOS Capacitor flags; retain the documented keyboard flag -- **Full-review result:** Rank 95/100; reviewer ranks 95/96/95. Safety: reject; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 96/100; controlling original placements 95/96/95. Safety: reject; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** Keep all three explicit flags. Correct the inaccurate keyboard/link-preview rationale only when the file is otherwise changing; do not delete configuration based on current defaults. - **Corrected LOC:** production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Removing explicit true values couples repository policy to version-sensitive Capacitor defaults for two lines of reward.; The audit's retained resizeOnFullScreen rationale is false at this HEAD: installed code makes it Android-only, Android excludes the keyboard plugin, and iOS does not read it.; The npm/pod Capacitor version mismatch prevents meaningful generated-config equivalence proof. - **Primary gate:** None; re-evaluate defaults only during a planned Capacitor upgrade. -- **Required verification:** If policy changes, reconcile locks, capture generated configs, build both native platforms, and run the full link-preview, scroll, keyboard, and inset device matrix. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary defer. **Classification:** conflicting. - **Scope:** `capacitor.config.ts` — ios.allowsLinkPreview, ios.scrollEnabled, Keyboard.resizeOnFullScreen - **Why it exists:** Initial iOS support copied true framework defaults, while resizeOnFullScreen:false is source-traced as a no-op for the currently excluded Android Keyboard plugin but is also explicitly documented as part of the load-bearing keyboard/system-bars stack. -- **Smallest change:** At implementation HEAD, regenerate both platforms and remove only allowsLinkPreview:true and scrollEnabled:true if installed Capacitor still defaults them to true. Retain resizeOnFullScreen:false until the keyboard/system-bars plans are reconciled and device validation explicitly authorizes its removal. -- **Preserve:** iOS scrolling/link preview, keyboard resizing, Android plugin inclusion, startup overlay geometry, safe areas, system bars, content inset, and generated native configuration remain identical. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Installed Capacitor sources support removing the two iOS defaults, but repository architecture plans name resizeOnFullScreen:false among deliberate coupled configuration. The original three-flag deletion is therefore narrowed and deferred. -- **Estimated net change:** configuration 2; comments 2–4 +- **Rejected historical estimate:** Zero LOC is authorized. configuration 2; comments 2–4 - **Gates and overlaps:** version-sensitive-capacitor-default; android-keyboard-insets; ios-native-config; device-matrix-required; Reconcile docs/plans/2026-06-22-android-keyboard-and-systembars-handover.md before changing resizeOnFullScreen. -- **Verify:** Record generated Android/iOS config and installed native defaults before editing; Run cap sync for both platforms plus Android and iOS builds; Device-test iOS scrolling/link previews/keyboard and the full Android keyboard/system-bars/inset matrix before removing any keyboard flag. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** I12-C02 ### C05-011 — Remove five empty UIApplicationDelegate lifecycle stubs -- **Full-review result:** Rank 83/100; reviewer ranks 83/83/82. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 82/100; controlling original placements 83/83/82. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** After overlapping AppDelegate work and native lock reconciliation, delete only the five empty lifecycle methods and their stock comments; retain launch and all proxy forwarding methods. - **Corrected LOC:** production 10; configuration 0; comments 7; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Deleting optional selectors changes respondsToSelector and may affect plugin swizzling despite empty bodies.; The canonical LOC omitted seven stock comment lines.; Open AppDelegate work and inconsistent native locks make standalone cleanup negative value now. @@ -1536,7 +1527,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-012 — Trim duplicate predicates and unused surface from CapacitorPlatformService -- **Full-review result:** Rank 48/100; reviewer ranks 31/66/40. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 44/100; controlling original placements 31/66/40. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete only the \_isIOSBrowser helper and its no-op branch because both paths return web; do not combine token injection, public convenience-method removal, method-only spec edits, or the unrelated barrel. - **Corrected LOC:** production 10; configuration 0; comments 7; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** The original candidate bundles four separate root causes and overstates net executable reduction.; Module-level Electron token timing is not equivalent to reading navigator.userAgent at service construction in mutable-UA tests.; Deleting the no-op iOS branch preserves behavior but exposes a documentation defect that should not be hidden by bundling other cleanup. @@ -1555,7 +1546,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-013 — Remove obsolete StartupService migration-era injections -- **Full-review result:** Rank 40/100; reviewer ranks 45/46/32. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 38/100; controlling original placements 45/46/32. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete exactly the two imports, two unread injected fields, two spec imports, two unused spies, and two providers; do not alter startup ordering or any persistence, IPC, native, or sync path. - **Corrected LOC:** production 4; configuration 0; comments 0; test infrastructure 0; tests 6; generated 0; moved 0 - **Material corrections:** Removing inject() changes eager construction in isolation, but current AppComponent/TaskService construction already provides both dependencies before StartupService. @@ -1574,7 +1565,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-014 — Conditionally register ElectronEffects instead of creating a false effect field -- **Full-review result:** Rank 82/100; reviewer ranks 82/82/83. Safety: narrow; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 81/100; controlling original placements 82/82/83. Safety: narrow; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Defer the candidate. If electron.effects.ts is already changing, use the safer one-file alternative: keep EffectsModule registration unchanged and remove only the class-level boolean guard/type/imports, relying on the existing platform-gated EMPTY source. - **Corrected LOC:** production 4; configuration 0; comments 0; test infrastructure 0; tests -12–-4; generated 0; moved 0 - **Material corrections:** SnackService has constructor subscription side effects, so conditional effect registration is not proven construction-equivalent.; The existing IPC source is already EMPTY off Electron, making registration relocation unnecessary.; The one-file alternative removes the false field without the cross-file platform-registration change, but is too low-value for standalone work. @@ -1593,7 +1584,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C05-015 — Collapse CORS_SKIP_EXTRA_HEADERS identical platform branches -- **Full-review result:** Rank 43/100; reviewer ranks 46/49/35. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 41/100; controlling original placements 46/49/35. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Replace the identical Android-WebView ternary with one explicitly typed empty object and delete only the seven stale TODO/commented implementation lines. - **Corrected LOC:** production 2; configuration 0; comments 7; test infrastructure 0; tests 0; generated 0; moved 0 - **Material corrections:** Retain an explicit string-map type so spread consumers and future assignments remain type-compatible. @@ -1614,7 +1605,7 @@ The following seven domain sections contain all 100 reviewed canonical candidate ### C06-001 — Delete the superseded commented Snap release pipeline -- **Full-review result:** Rank 44/100; reviewer ranks 54/26/52. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 52/100; controlling focused placements 68/46/54; superseded original ranks 54/26/52. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete exactly the fully commented legacy block at baseline lines 63-120 of .github/workflows/build-publish-to-snap-on-release.yml. Retain every active line, including the adjacent Canonical-container rationale, SNAPCRAFT_HAS_TTY workaround, triggers, permissions, inputs, credentials, artifact checks, retries, and channel selection. - **Corrected LOC:** 0 production, 0 configuration, and exactly 58 comment lines removed; the earlier 58-64 estimate must not be used because its upper bound reaches active/container-adjacent lines. - **Material corrections:** The canonical 58-64 comment estimate is not exact: only lines 63-120 are the retired block; the 64-line upper bound reaches six active/container-adjacent lines.; Accidentally deleting active container upload lines 55-61 would change release behavior. @@ -1623,17 +1614,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** independently-confirmed-existing. - **Scope:** `.github/workflows/build-publish-to-snap-on-release.yml` — commented legacy Node/Electron/Snapcraft build-and-publish steps - **Why it exists:** The Snap workflow moved from runner-side rebuilding to exact release-asset publication through Canonical's container, but the older executable design remained as a large commented tail. -- **Smallest change:** Delete only the fully commented legacy block; do not alter any active trigger, input, permission, condition, release download, cardinality check, retry, credential, image, channel, or upload step. -- **Preserve:** Published-release and required-tag manual routes select the same single Snap asset and publish it to edge/stable with identical prerelease guards, retries, credentials, errors, runner, and container. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** A raw workflow audit and an independent comment-debt lens identify the same inert block. History shows the active release-asset path replaced the retired rebuild path to fix a publishing race. -- **Estimated net change:** comments 58–64 +- **Superseded historical estimate:** comments 58–64 - **Gates and overlaps:** release-workflow; snap-store-credentials; artifact-cardinality -- **Verify:** Parse the workflow before and after and compare normalized active objects and ordered steps for equality; Run an Actions-aware validator plus Prettier and git diff --check; Inspect the diff to confirm no executable YAML, permission, input, secret, retry, artifact, or channel changed. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-01-C01; L12-C03 ### C06-002 — Remove the duplicate Node setup from the web release job -- **Full-review result:** Rank 59/100; reviewer ranks 53/52/70. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 70/100; controlling focused placements 71/54/68; superseded original ranks 53/52/70. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only the later four-line 'Install Node.js, NPM and Yarn' setup-node step at baseline lines 40-43 of .github/workflows/build-update-web-app-on-release.yml. Retain the pinned setup-node step at lines 27-29 and every downstream build and deploy step unchanged. - **Corrected LOC:** 0 production, exactly 4 configuration lines, and 0 comment lines removed. - **Material corrections:** The current workflow has no safe smoke dispatch: workflow_dispatch reaches the production SSH deploy, so the proposed optional manual run must not be used for this cleanup.; A mistaken removal of the first setup step would leave checkout/build without the declared Node 22 setup. @@ -1642,17 +1633,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `.github/workflows/build-update-web-app-on-release.yml` — duplicate actions/setup-node invocation, Install Node.js, NPM and Yarn - **Why it exists:** A bulk Node-version migration added an early setup-node step without removing the workflow's original identical invocation; later updates kept both copies aligned. -- **Smallest change:** Delete only the later identical setup-node step and retain the first pinned Node 22 setup plus every checkout, cache, install, check, build, secret, and SSH deploy step in current order. -- **Preserve:** The job exposes the same Node/npm environment and produces and deploys the same web build; no setup output is consumed and all lint, test, build, cache, and deployment failures remain. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The two action SHA/version blocks are identical, have no ids/outputs, and no intervening step mutates Node, PATH, npm, or tool-cache state. -- **Estimated net change:** configuration 4 +- **Superseded historical estimate:** configuration 4 - **Gates and overlaps:** web-release; ssh-deployment; supply-chain-action-pin -- **Verify:** Compare normalized ordered steps, allowing exactly one removed duplicate setup block; Assert one pinned Node 22 setup remains and all downstream steps are unchanged; Use a safe manual workflow run if available; do not perform a production deploy solely for this cleanup. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-01-C02 ### C06-003 — Remove superseded desktop and MAS alternatives from electron-builder configuration -- **Full-review result:** Rank 58/100; reviewer ranks 55/48/71. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 60/100; controlling focused placements 69/51/62; superseded original ranks 55/48/71. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only the two commented alternatives at baseline lines 100-108 and 213-222 of electron-builder.yaml. Do not move or modify any active package, target, rpm, snap, pkg, macOS, MAS, signing, notarization, publish, hook, or artifact setting. - **Corrected LOC:** 0 production, 0 active configuration, and exactly 19 comment lines removed. - **Material corrections:** Adjacent active rpm, snap, pkg, and mac configuration must not move. @@ -1661,37 +1652,37 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `electron-builder.yaml` — commented legacy linux.desktop mapping, commented legacy inline mas mapping - **Why it exists:** Linux desktop schema changes and separate MAS production/development configs superseded two inline alternatives, which remained as misleading comments beside active release settings. -- **Smallest change:** Delete only the two commented legacy mappings; retain active Linux desktop metadata, every target/publish/signing/notarization setting, optional zip note, and both MAS config files. -- **Preserve:** All standard macOS, MAS, Windows, Linux, Snap, Flatpak, AppImage, deb, and rpm targets, artifact names, signing, notarization, publishing, hooks, and file inclusion remain identical. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** History ties each comment to a rejected schema or superseded inline MAS copy; package scripts resolve the current dedicated configs and no parser executes comments. -- **Estimated net change:** comments 19 +- **Superseded historical estimate:** comments 19 - **Gates and overlaps:** multi-platform-packaging; signing-configuration -- **Verify:** Parse electron-builder.yaml and compare normalized active configuration before and after; Resolve effective Linux/macOS/MAS configurations without packaging and compare active targets and signing keys; Run Prettier/config checks and inspect that no active release key moved. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-02-C02 ### C06-004 — Delete two browser-side Karma hooks that are no longer loaded -- **Full-review result:** Rank 23/100; reviewer ranks 18/9/49. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** implemented-stashed. +- **Full-review result:** Rank 55/100; controlling focused placements 58/61/51; superseded original ranks 18/9/49. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** implemented-stashed. - **Authoritative scope:** Delete only src/test-helpers/jasmine-spec-reporter-hook.js and src/test-helpers/spec-start-broadcast.js. Treat angular.json and Karma configuration only as reachability evidence; keep src/test-helpers/karma-running-spec-on-disconnect.js, src/karma.conf.js, and the empty Angular test scripts array unchanged. -- **Corrected LOC:** The two files contain 107 physical lines: 82 test-infrastructure code lines, 8 comment lines, and 17 blank lines. Count 82 test-infrastructure plus 8 comments for categorized net LOC, and do not double-count these deletions in C07. +- **Corrected LOC:** The two files contain 107 physical lines: 82 test-infrastructure-code lines, 8 comment-only lines, and 17 blank lines. Keep all three categories separate and do not double-count these deletions in C07. - **Material corrections:** The 107-line test-infrastructure count double-counts comments under the contract's separate comment category.; Broad test-helper globs or a reintroduced angular.json scripts entry at implementation HEAD would invalidate reachability proof. - **Primary gate:** Repeat entry-point and broad-glob reachability checks at implementation HEAD, run a focused Karma smoke, and coordinate C07 accounting to avoid duplicate reward. - **Required verification:** Repeat filename and entry-point search; Run one focused Karma spec; Assert active disconnect reporter/config unchanged; Repeat exact filename, symbol, Angular scripts-entry, Karma files/plugin, and import/require searches.; Run a focused Karma spec and confirm normal startup and reporting.; Verify src/test-helpers/karma-running-spec-on-disconnect.js and its Karma registration are unchanged. - **Discovery-era record (superseded):** Implemented, verified, and stashed. **Tier:** Final A. **Classification:** net-new. Rank 3; challenges: refuter confirmed, maintainer confirmed. - **Scope:** `src/test-helpers/jasmine-spec-reporter-hook.js` — waitForJasmine, installHooks; `src/test-helpers/spec-start-broadcast.js` — browser hook IIFE; `angular.json` — projects.sp2.architect.test.options.scripts consumer proof - **Why it exists:** Short-lived diagnostics for hanging Karma specs were removed from angular.json one day after introduction, while both hook files remained; one hook was never configured at all. -- **Smallest change:** Delete only the two unreachable hook files and retain the actively configured karma-running-spec-on-disconnect reporter. -- **Preserve:** Every npm/ng test command, Jasmine result, coverage path, reporter output, browser bundle, and disconnect diagnostic remains unchanged because neither deleted file enters the harness. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** No import, path, Karma file-list, or angular.json scripts entry reaches either file; history reconstructs the removed and never-wired registrations. -- **Estimated net change:** test infrastructure 107 -- **Stashed actual and completed verification:** The estimate was exact: 107 test-infrastructure lines deleted. Entry-point searches confirmed both hooks remain unloaded, a separate 15-test Karma reporter smoke passed, and the active disconnect reporter and Karma configuration were left unchanged. The full implementation batch ran 357 focused Karma tests. +- **Superseded historical estimate:** 107 physical lines: 82 test-infrastructure code, 8 comments, and 17 blank lines +- **Stashed actual and completed verification:** The physical estimate was exact: 82 test-infrastructure code lines, 8 comment lines, and 17 blank lines were deleted. Entry-point searches confirmed both hooks remain unloaded, a separate 15-test Karma reporter smoke passed, and the active disconnect reporter and Karma configuration were left unchanged. The full implementation batch ran 357 focused Karma tests. - **Gates and overlaps:** test-harness; reporter-contract; C07 test-infrastructure ownership -- **Verify:** Repeat filename and browser-entry searches; Run a focused Karma spec and confirm startup and reporting remain normal; Verify the active disconnect reporter and its config are byte-for-byte unchanged. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-04-01-dead-karma-browser-hooks ### C06-005 — Remove the never-enabled custom macOS notarizer and private shell helper -- **Full-review result:** Rank 74/100; reviewer ranks 74/74/74. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 83/100; controlling focused placements 85/84/83; superseded original ranks 74/74/74. Safety: defer; maintainability: defer; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Deferred: make no deletion while PR #9077 overlaps package metadata or until an authorized signed macOS artifact proves the active Electron Builder notarization path still notarizes and staples correctly. If both gates pass, reassess only deletion of tools/notarizeMacApp.js, tools/execCommand.js, the commented afterSign line, and the direct @electron/notarize declaration; preserve mac.notarize: true, all release secrets, and Electron Builder's transitive notarizer. - **Corrected LOC:** 0 LOC is currently authorized. The bounded deferred proposal comprises 69 release-tool/configuration code lines (68 JS plus 1 package declaration), 39 comment lines (38 JS plus the commented afterSign line), 23 blank JS lines, and an estimated 14-18 generated lockfile lines; it removes 0 production LOC. - **Material corrections:** The two tools are release tooling/configuration, not production LOC; the canonical production count also includes their comments and blanks.; Open PR #9077 still changes package.json/package-lock.json, so the stated rebase gate is live.; Static proof is insufficient for the active mac.notarize path: electron-builder uses nested @electron/notarize 2.5.0 while the dead hook imports direct 3.1.1, and the release artifact must prove the nested path still signs/notarizes.; macOS release signing/notarization; lockfile hoisting/version selection; secret-bearing release workflow; The hook has said CURRENTLY NOT USED since introduction, afterSign is commented, and the only helper import is inside that dead hook. Current npm explain shows the root @electron/notarize 3.1.1 is direct-only while app-builder-lib retains its own 2.5.0 dependency. Those facts justify the concept deletion, but release-platform verification and the live lockfile conflict prohibit Tier A. @@ -1700,17 +1691,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** conflicting. - **Scope:** `tools/notarizeMacApp.js` — myNotarize, isDesktopAppTag; `tools/execCommand.js` — execCommand; `electron-builder.yaml` — commented afterSign, mac.notarize; `package.json` — @electron/notarize direct devDependency; `package-lock.json` — root direct dependency and unreachable lock entries - **Why it exists:** An experimental custom afterSign notarizer was marked unused and never enabled; Electron Builder's active mac.notarize path replaced it, leaving the hook, its private shell wrapper, comment, and direct dependency. -- **Smallest change:** After rebasing PR #9077, delete the two tools and stale afterSign comment, remove only the unused direct @electron/notarize declaration, regenerate the lockfile, and keep mac.notarize: true and all Apple workflow secrets. -- **Preserve:** Electron Builder remains the active signing/notarization path; all macOS artifacts, targets, Apple credentials, errors, workflows, and non-macOS builds remain unchanged. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The raw platform audit proves the hook was never registered from its first revision; an independent lens finds execCommand has no other consumer. Open PR #9077 changes the root lockfile, creating a rebase conflict but not superseding the cleanup. -- **Estimated net change:** production 130–132; configuration 1; comments 1; generated 1–20 +- **Superseded historical estimate:** production 130–132; configuration 1; comments 1; generated 1–20 - **Gates and overlaps:** open PR conflict; macOS notarization; release signing; lockfile regeneration; secrets; rebase package metadata after PR #9077 before regenerating the lockfile. -- **Verify:** Rebase after PR #9077 and repeat active hook/import/require searches; Regenerate the lockfile with the pinned npm version and use npm explain to confirm Electron Builder's required transitive notarizer remains resolvable; Run Electron tests/build and an authorized macOS DMG workflow; verify the resulting artifact is notarized without exposing secrets. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-04-02-retired-custom-macos-notarizer; L01-C02 ### C06-006 — Delete the formatter for retired CI performance-metric uploads -- **Full-review result:** Rank 50/100; reviewer ranks 58/28/53. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 67/100; controlling focused placements 66/67/57; superseded original ranks 58/28/53. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete tools/gen-perf-metrics.js only. Retain the two perf-metrics .gitignore patterns and their surrounding ignore-file structure because removing them would change git-status behavior for manually produced or residual metric files; do not touch current performance coverage. - **Corrected LOC:** 0 production, exactly 25 nonblank test-infrastructure code lines, 0 comment lines, and 8 blank lines removed; remove 0 configuration lines. - **Material corrections:** Removing the .gitignore patterns is behavior-changing for existing or manually produced perf-metrics files: they would become untracked even though no current producer remains.; The exact formatter split is 25 test-infrastructure code lines, not a 25-33 range.; Developer worktrees containing old .tmp/perf-metrics files; The only current metric filename occurrences are the formatter reads and .gitignore. Commit e22fa4ac5f explicitly removed the artifact upload and PR-comment workflow, and no current producer writes these files. The corrected LOC uses nonblank formatter lines and separates the .gitignore comment marker from configuration. @@ -1719,17 +1710,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** independently-confirmed-existing. - **Scope:** `tools/gen-perf-metrics.js` — legacy performance metric Markdown formatter; `.gitignore` — obsolete perf-metrics input patterns - **Why it exists:** The PR performance-upload/comment workflow and its Nightwatch JSON producers were retired, but their formatter and ignored input filenames remained. -- **Smallest change:** Delete the formatter and only its two obsolete ignore entries, retaining current Playwright performance tests, Lighthouse checks, and failure artifact uploads. -- **Preserve:** All current CI jobs, E2E discovery, timing tests, reports, artifacts, pass/fail behavior, and platform builds remain unchanged because no current producer emits the legacy inputs. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The raw history audit and independent dead-file lens converge on the file; the removal commit for the old CI upload path and current producer searches explain why it became unreachable. -- **Estimated net change:** configuration 2–3; test infrastructure 25–33 +- **Superseded historical estimate:** configuration 2–3; test infrastructure 25–33 - **Gates and overlaps:** ci-tooling; performance-observability -- **Verify:** Repeat searches for the formatter and both input filenames across workflows, scripts, docs, and tests; List current Playwright tests to confirm discovery is unaffected; Inspect that only the two obsolete ignore patterns disappear. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-04-03-retired-performance-metrics-formatter; L01-C05 ### C06-007 — Remove ineffective options from the solution-style root tsconfig -- **Full-review result:** Rank 66/100; reviewer ranks 47/67/72. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. +- **Full-review result:** Rank 71/100; controlling focused placements 72/63/71; superseded original ranks 47/67/72. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** A. **Status:** open. - **Authoritative scope:** Delete only the four-line compilerOptions object from the solution-style root tsconfig.json. Preserve its explanatory comment, files: [], and all references to the app, worker, and spec projects. - **Corrected LOC:** 0 production, exactly 4 configuration lines, and 0 comment lines removed. - **Material corrections:** Root --showConfig will intentionally lose outDir-derived exclude and esModuleInterop, so verification must compare referenced child configs, not claim root config equality.; Untracked editor/tool consumers of the root project; reference discovery @@ -1738,17 +1729,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `tsconfig.json` — compilerOptions.esModuleInterop, compilerOptions.outDir - **Why it exists:** Build experiments added compiler options to the empty solution root, but Angular compiles child configs that extend tsconfig.base.json rather than the root. -- **Smallest change:** Delete only the root compilerOptions object and retain files: [] plus all app, worker, and spec project references. -- **Preserve:** Child inputs, outputs, diagnostics, strictness, editor project discovery, Angular configuration, and every platform build remain governed by unchanged child configs. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** TypeScript --showConfig, child extends chains, Angular tsConfig entries, and script searches prove the two options apply only to an empty root program. -- **Estimated net change:** configuration 4 +- **Superseded historical estimate:** configuration 4 - **Gates and overlaps:** typescript-solution-config; editor-project-discovery -- **Verify:** Capture root and child --showConfig before the edit and require child configs to remain identical; Run the production frontend build; Confirm editor solution discovery still opens app, worker, and spec projects. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-05-C1 -### C06-008 — Prune nine root-only packages with no remaining consumer +### C06-008 — Remove the unused direct file-saver dependency pair -- **Full-review result:** Rank 61/100; reviewer ranks 51/68/59. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 73/100; controlling focused placements 67/72/72; superseded original ranks 51/68/59. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** After PR #9077 is resolved and the dependency proof is refreshed, remove only the direct root declarations for file-saver and @types/file-saver and regenerate their direct-only lockfile nodes. Exclude clipboard, retain the transitive top-level fs-extra node, and reassess the other originally bundled packages as separate candidates rather than authorizing a nine-package batch. - **Corrected LOC:** At the frozen baseline, the narrowed pair removes 0 production, exactly 2 configuration lines, 0 comments, and 16 generated lockfile lines. Regenerate with npm 11.18.0 after PR #9077 and remeasure; accept only the two root declarations and direct-only file-saver nodes disappearing. - **Material corrections:** clipboard is not root-only: npm explain shows it satisfies ngx-markdown's optional peer dependency. The app currently does not enable ngx-markdown clipboard scripts/directives, but deleting it without an explicit feature-contract decision overstates no-consumer proof.; fs-extra is also not a root-only package: multiple platform/build dependencies consume the top-level node; only its direct root declaration is unused, so that lock node must remain.; The 100-260 generated deletion estimate is unsupported after excluding clipboard and retaining transitive fs-extra.; Optional peer provisioning; platform build dependency hoisting; lockfile supply-chain drift; Current search finds file-saver only in package metadata, and history records its replacement with native browser APIs; @types/file-saver has no independent consumer. That proof supports one pair, not a nine-root batch. The open security PR makes even the narrowed lockfile change a Tier B follow-up. @@ -1757,55 +1748,55 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** conflicting. - **Scope:** `package.json` — @dotenv-run/cli, @types/file-saver, @types/jasminewd2, @types/object-path, clipboard, file-saver, fs-extra, karma-cli, start-server-and-test; `package-lock.json` — root declarations and now-unreachable package nodes - **Why it exists:** Past runtime, Protractor/Karma CLI, environment, and file/clipboard migrations removed all entry-point consumers while direct root declarations and lock nodes remained. -- **Smallest change:** After PR #9077, remove only the nine direct devDependency keys and regenerate package-lock.json with npm 11.18.0; do not change scripts, source, package exports, overrides, or other dependencies. -- **Preserve:** Every current application, lint, type, unit, E2E, frontend, Electron, plugin, and platform build command retains its packages, arguments, outputs, and error behavior. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** Manifest/script/import/bin tracing found no current entry point for the nine direct declarations. PR #9077 concurrently edits root package metadata, requiring rebase and fresh lockfile reachability checks. -- **Estimated net change:** configuration 9; generated 100–260 +- **Superseded historical estimate:** configuration 9; generated 100–260 - **Gates and overlaps:** open PR conflict; dependency contract; lockfile regeneration; developer tooling; platform builds; rebase package metadata after PR #9077 and recheck adjacent dead-dependency work in issue #8843. -- **Verify:** Rebase after PR #9077 and repeat imports, requires, type references, scripts, binaries, workflow, plugin, Electron, and native searches for all nine package names; Regenerate the lockfile with npm 11.18.0 and inspect that only intended direct and now-unreachable nodes disappear; Run lint, test:once, production frontend build, Electron build, and relevant plugin/platform checks. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** L01-C01 ### C06-009 — Delete the never-wired single-test wrapper -- **Full-review result:** Rank 51/100; reviewer ranks 59/27/54. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 63/100; controlling focused placements 65/64/56; superseded original ranks 59/27/54. Safety: confirm; maintainability: confirm; consensus: **confirm**. **Tier:** B. **Status:** open. - **Authoritative scope:** Delete tools/test-file.js only, with no replacement and no edit to package.json or the documented npm run test:file command. -- **Corrected LOC:** The file contains 59 physical lines: exactly 47 test-infrastructure code lines, 6 comment lines, and 6 blank lines. Count 47 test-infrastructure plus 6 comments for categorized net LOC, and do not double-count this deletion in C07. +- **Corrected LOC:** The file contains 59 physical lines: exactly 47 test-infrastructure-code lines, 6 comment-only lines, and 6 blank lines. Keep all three categories separate and do not double-count this deletion in C07. - **Material corrections:** The canonical 47-59 test-infrastructure range plus 6-9 comments double-counts comments; exact separated counts are available.; A hidden personal invocation is unsupported but cannot affect tracked commands. - **Primary gate:** Repeat path, import, bin, script, workflow, and documentation searches and run npm run test:file against a small existing spec. - **Required verification:** Repeat path/reference search; Run npm run test:file on a small spec; Assert package.json unchanged; Repeat exact path, basename, import/require, bin, script, workflow, and documentation searches.; Run npm run test:file against one small existing spec.; Verify package.json and contributor documentation are unchanged. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** independently-confirmed-existing. - **Scope:** `tools/test-file.js` — legacy single-file Karma wrapper; `package.json` — working scripts.test:file consumer proof - **Why it exists:** A bespoke timeout/output-parsing wrapper was added but never connected; the supported test:file command independently invokes the Angular/Karma path. -- **Smallest change:** Delete tools/test-file.js only and leave the package script and documented npm run test:file convention unchanged. -- **Preserve:** The supported single-file command, arguments, test selection, timeout/reporting behavior, exit code, and all other test commands remain exactly as currently implemented. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** Two independent tooling lenses identify the same unreachable helper and distinguish it from the live package script. -- **Estimated net change:** comments 6–9; test infrastructure 47–59 +- **Superseded historical estimate:** comments 6–9; test infrastructure 47–59 - **Gates and overlaps:** developer-test-tooling; C07 test-tooling ownership -- **Verify:** Repeat repository-wide path/import/require/script searches; Run npm run test:file against a small existing spec; Verify package.json is unchanged. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** L01-C04; L10-C04 -### C06-010 — Retire the completed hard-coded translation cleanup script +### C06-010 — Do not retire the still-active hard-coded translation cleanup script -- **Full-review result:** Rank 100/100; reviewer ranks 100/100/100. Safety: reject; maintainability: confirm; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 100/100; controlling focused placements 100/100/100; superseded original ranks 100/100/100. Safety: reject; maintainability: confirm; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** Rejected: delete nothing. The hard-coded translation cleanup is not completed or idempotent, still has 1,276 pending removals across 28 locales, remains prescribed by documentation, and includes sync keys outside this audit's boundary. Resolve or abandon that cleanup in a separate translation-owner-reviewed task before considering any future retirement. - **Corrected LOC:** 0 LOC is authorized for deletion. The rejected target is a 370-physical-line tool containing 306 tooling-code lines, 34 comment lines, and 30 blank lines, but those figures are not realizable simplification reward while the cleanup remains pending. -- **Material corrections:** The central premise is false: an in-memory execution of removeKeys at the baseline reports 1,276 pending key removals across all 28 locale files, not an idempotent completed cleanup.; docs/unused-translations-analysis.md still explicitly recommends adding/running this script; it is not merely a historical reference.; The fixed list includes many F.SYNC keys, so the candidate is not cleanly non-sync under the stated audit boundary.; The 370 configuration plus 4-12 comment estimate double-counts the script's comments; its exact split is 306 tooling-code and 34 comments.; Loss of a documented pending maintenance capability; sync-key scope violation; mass locale mutation policy; The script is not registered in package scripts or workflows, its only outside reference is a historical recommendation whose sample already says keys are removed, and its three commits are the corresponding cleanup commits. The behavior-preserving repository case is strong, but an unregistered manual tool has no telemetry, so Tier B is more honest than A. +- **Material corrections:** The earlier completed-cleanup premise is false: a current dry run still proposes 1,276 removals across 28 locales.; The script remains documented and crosses into sync-owned translation keys, so this non-sync audit cannot authorize its retirement.; The rejected tool size receives zero reward and no deletion recipe is retained. - **Primary gate:** Hard rejection under the current facts: 1,276 pending removals, translation-owner approval, non-sync boundary violation, and a future zero-change dry run must all be resolved before a new candidate can be proposed. -- **Required verification:** A future deletion requires a zero-change dry run; Translation-owner decision on pending keys; Documentation must no longer prescribe the script; int:test without locale rewrites; Repeat exact path and symbol searches and confirm maintained docs/scripts point only to find-unused-translations.js and clean-translations.js.; Run int:unused and int:test in read-only/non-rewriting modes.; Require package.json, en.json, every other locale, and generated translation constants to remain byte-identical.; Inspect history to confirm all hard-coded key removals already landed. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `tools/cleanup-unused-translations.js` — SECTIONS_TO_REMOVE, NESTED_PATHS_TO_REMOVE, processJsonFiles; `docs/unused-translations-analysis.md` — Recommended Cleanup Script; `package.json` — maintained int:unused and clean:translations commands - **Why it exists:** A one-time translation cleanup encoded a fixed list of already-removed keys and remained after ongoing detection/cleanup moved to maintained generic commands. -- **Smallest change:** Delete the completed hard-coded script and update only its historical documentation reference to the maintained scanner/cleanup commands; do not edit locale data or package scripts. -- **Preserve:** Unused-key detection, current clean:translations behavior, English constant generation, all translation files, the no-mass-edit rule for other locales, and contributor commands remain unchanged. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Exact reference and history checks find no current entry point for the fixed-list script; maintained generic commands own the ongoing workflow. -- **Estimated net change:** configuration 370; comments 4–12 +- **Rejected historical estimate:** Zero LOC is authorized. configuration 370; comments 4–12 - **Gates and overlaps:** manual-contributor-tool; translation-workflow -- **Verify:** Repeat path and symbol searches and confirm documentation references only maintained commands; Run int:unused and int:test in a mode that does not rewrite locale files; Confirm package.json, en.json, all other locale files, and generated translation constants are unchanged. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** L12-C02 -### C06-011 — Make routine bundled-plugin build-and-copy entries declarative +### C06-011 — Delete unread copyToAssets flags from bundled-plugin metadata -- **Full-review result:** Rank 73/100; reviewer ranks 73/69/73. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 69/100; controlling focused placements 70/52/70; superseded original ranks 73/69/73. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** After PR #8067 is resolved, remove only each copyToAssets: true property that is still proven unread in packages/plugin-dev/scripts/build-all.js. Do not introduce a helper or derive paths, and preserve needsInstall, every buildCommand, copyRecursive call, ordering, parallelism, working directory, failure aggregation, special allowlist, and bundled output unchanged. - **Corrected LOC:** Exactly 13 configuration lines are removable at the frozen baseline, with 0 production, comment, generated, or moved LOC. Recheck the post-#8067 file and count one line per still-unread property (expected 13-14); do not claim the discarded 80-110-line helper estimate as reward. - **Material corrections:** The candidate combines three changes with different proofs: extracting six build/copy bodies, deriving all 13 paths, and deleting all 13 unread copyToAssets fields. That violates the one-coherent-root-cause/smallest-change contract.; The 115-155 LOC estimate cannot be exact until a concrete helper diff exists and currently mixes optional metadata cleanup into the helper reward.; Open PR #8067 still adds a special Markdown-notes entry to this file.; Bundled artifact allowlists; stale target files masking copy omissions; parallel failure aggregation; shell working directories; At the frozen HEAD copyToAssets appears thirteen times and is never read. By contrast, the proposed helper would move repeated, release-relevant file-copy behavior behind a new parameterized abstraction and require expensive artifact proof. KISS favors the tiny dead-field deletion, opportunistically after the overlapping PR. @@ -1814,17 +1805,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** conflicting. - **Scope:** `packages/plugin-dev/scripts/build-all.js` — plugins, copyRecursive, buildPlugin, routine build-and-copy entries - **Why it exists:** Six routine bundled plugins repeat the same build-and-copy command bodies while one unread metadata flag duplicates information already encoded in buildCommand. -- **Smallest change:** After PR #8067, add one local helper and compact declarations only for the six byte-equivalent routine cases; derive the path from name, delete copyToAssets, and leave every special allowlist/assertion build command—including Markdown notes—unchanged. -- **Preserve:** Plugin order/parallelism, install fallback, silent logging, working directories, recursive copying, asset allowlists, manifests/translations, failure aggregation, exit status, and every bundled output byte remain identical. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The build-duplication lens isolated exact routine cases and explicit special cases. Open PR #8067 adds another special allowlisted entry in the same file, so the cleanup must rebase rather than absorb it into the helper. -- **Estimated net change:** configuration 115–155; comments 0–6 +- **Superseded historical estimate:** configuration 115–155; comments 0–6 - **Gates and overlaps:** open PR conflict; plugin packaging; manifest copy; byte equivalence required; rebase `packages/plugin-dev/scripts/build-all.js` after PR #8067 and retain its new special-case entry. -- **Verify:** Rebase after PR #8067 and classify the Markdown-notes entry as special unless byte-for-byte equivalence is independently proven; Build all plugins before and after and compare every bundled file inventory and content hash; Force one routine failure and confirm aggregation/non-zero exit; verify special allowlists and silent mode. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** L10-C02 ### C06-015 — Remove unused palettes and glow presets from the Rainbow theme -- **Full-review result:** Rank 53/100; reviewer ranks 32/70/45. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 39/100; controlling focused placements 43/35/48; superseded original ranks 32/70/45. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Only consider deleting the five neon-rewrite definitions with no in-repository consumer: --neon-magenta, the multiline --rainbow-gradient declaration and its comment, --glow-violet, --glow-pink, and --glow-green. Keep all twelve older --rainbow-\* palette variables and --glow-cyan unless an explicit public/custom-style compatibility decision permits their removal. - **Corrected LOC:** The narrowed scope removes exactly 14 production CSS lines and 1 comment line, with 0 configuration LOC. The original 18-token/26-production-line estimate is invalid; there are 17 zero-use definitions and only these five share the defensible neon-era root cause. - **Material corrections:** There are 17 zero-use definitions, not 18.; The twelve original --rainbow-\* palette variables are explicitly described in-file as kept for identity and predate the neon rewrite; they do not share the same root cause as neon-only dead presets.; Repository search cannot prove absence of runtime consumers in user styles or plugins; CSS custom properties are observable and shipped themes are documented as starting templates.; User styles/plugin CSS dynamic consumption; runtime theme asset output; visual regression; issue #8835 adjacent theming contract; Internal search confirms all 18 cataloged names are definition-only today, but the original twelve palette names were live before the neon rewrite and the project explicitly supports an Electron styles.css that overrides or extends app styles. That dynamic boundary makes the broad removal overconfident. The five newly introduced, never-consumed presets are the defensible bounded scope. @@ -1833,76 +1824,76 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/assets/themes/rainbow.css` — legacy --rainbow-_ palette, --neon-magenta, --rainbow-gradient, unused --glow-_ presets - **Why it exists:** The 2026 neon rewrite stopped consuming the original Rainbow palette and introduced several presets that never acquired a var() use, while retaining all definitions. -- **Smallest change:** Delete only the 18 private zero-use token definitions/comments and keep every consumed neon color, --glow-cyan, pane variable, selector, asset id/URL, and dark requiredMode. -- **Preserve:** Every active CSS rule and computed referenced property, theme selection/persistence, dark-mode forcing, focus treatment, task rendering, and web/Electron/native output remains identical. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** A complete private-token definition/use inventory, repository-wide exact searches, blame, and the pre-neon parent revision prove the proposed tokens have definition-only occurrences. -- **Estimated net change:** production 26; comments 4 +- **Superseded historical estimate:** production 26; comments 4 - **Gates and overlaps:** runtime-theme-asset; task-hot-path-appearance; visual-regression; GitHub issue #8835 defines adjacent live theming work -- **Verify:** Record all private definitions/uses and representative computed styles before deletion; Require zero references to deleted names and semantic equality of all retained active rules; Smoke Rainbow on browser and Electron, including task, nav, card, button, chip, selected/current task, and focus states. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** I13-03-C01 ## C07 — Tests and non-sync E2E (15 candidates) ### C07-001 — Replace PlannerService's copied tomorrow$ implementation with production-connected cases -- **Full-review result:** Rank 71/100; reviewer ranks 69/62/68. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 68/100; controlling focused placements 59/68/63; superseded original ranks 69/62/68. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Before deleting the copied tomorrow$ pipeline, build a production-connected PlannerService harness that drives the real days$ -> tomorrow$ initialization. Install the fake clock before TestBed.inject; cover found, absent, 03:59:59.999, the exact 04:00 boundary, post-boundary re-emission, and concurrent subscribers; prove replay/refCount through upstream subscription counts rather than object identity; then delete only copied cases mapped by a tuple ledger. -- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. The overlapping reviewer totals support 155-220 net test-side LOC removed after adding the production harness; category allocation between replacement test infrastructure and deleted tests must be measured from the implementation diff. +- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. Tests: unknown; test infrastructure: unknown. The reviewers' 155-220 combined test-side reduction is a planning envelope only and is not used as a categorized LOC total or ranking reward; measure both categories independently from the implementation diff. - **Material corrections:** Every existing case replaces tomorrow$ with a copied map/find/shareReplay pipeline, so it cannot detect a regression in PlannerService's actual initializer or days$ wiring.; The service is injected in beforeEach before per-test clock installation, contrary to the proposed construction-time clock contract.; Object identity from find() does not by itself prove shareReplay behavior; the same days array yields the same object even without shareReplay.; logical-day rollover; timezone/DST; RxJS replay/refCount; service initialization order; The false coverage is certain, but building a faithful production harness is the work; a compact copied observable is not an acceptable replacement. - **Primary gate:** The replacement must exercise the service's real construction-time days$ dependency; assigning service.days$ or tomorrow$ after construction does not satisfy the gate. - **Required verification:** npm run checkFile src/app/features/planner/planner.service.spec.ts; npm run test:file src/app/features/planner/planner.service.spec.ts; npx cross-env TZ=America/Los_Angeles ng test --watch=false --include=src/app/features/planner/planner.service.spec.ts; checkFile and focused spec; Europe/Berlin and America/Los_Angeles; tuple ledger plus subscription cleanup - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `src/app/features/planner/planner.service.spec.ts` — PlannerService test provider factory, tomorrow$ suite - **Why it exists:** The spec replaces tomorrow$ with a test-owned copy of the production map/find/shareReplay pipeline, so fifteen passing cases do not exercise PlannerService and have already drifted with date changes. -- **Smallest change:** First drive the real service through a selector-specific Store spy and controllable planner-day stream; retain found, absent, before/after logical rollover, and shared-reference cases, then delete the copied observable and date-arithmetic duplicates already owned by DateService. -- **Preserve:** The real days$ -> tomorrow$ chain still returns the logical tomorrow PlannerDay or null, honors the configured 04:00 rollover, and replays the same object to multiple subscribers. Fake time is installed before service construction and always uninstalled. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The spec explicitly acknowledges that production tomorrow$ is bypassed, and its copied lines match the production implementation. This is false coverage, not ordinary duplicate assertions, so characterization is a prerequisite. -- **Estimated net change:** test infrastructure -25–0; tests 255–315 +- **Superseded historical estimate:** test infrastructure -25–0; tests 255–315 - **Gates and overlaps:** false-coverage-replacement; timezone-logical-day; rxjs-replay-timing; characterization-required; Land production-connected characterization before deleting the copied implementation. -- **Verify:** Run npm run checkFile src/app/features/planner/planner.service.spec.ts; Run npm run test:file src/app/features/planner/planner.service.spec.ts in the repository's configured timezone variants; Review that the clock is installed before TestBed injects PlannerService and that all subscriptions are cleaned up. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-01-C1 ### C07-002 — Replace the copied planner calendar-selector algorithm with real projector coverage -- **Full-review result:** Rank 60/100; reviewer ranks 63/54/60. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 57/100; controlling focused placements 54/66/52; superseded original ranks 63/54/60. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Add typed selectPlannerDays.projector cases for previous-civil-day offset bucketing, same-day inclusion and exclusion, provider grouping and order, timed/all-day classification, duration, and full property preservation. Keep the production helper private. Delete the local algorithm and its direct-only cases only after a tuple-by-tuple ledger maps every unique case to a production-projector execution. -- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. Because the reviewers classified fixture/helper lines differently, use only their overlapping aggregate: 175-200 net test-side LOC removed after the projector replacement; remeasure the tests-versus-test-infrastructure split from the final diff. +- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. Tests: unknown; test infrastructure: unknown. The reviewers' 175-200 combined test-side reduction is a planning envelope only and is not used as a categorized LOC total or ranking reward; measure both categories independently from the implementation diff. - **Material corrections:** The first large block defines a local getIcalEventsForDay algorithm and never invokes the production selector projector.; Existing projector tests cover important all-day/timed behavior but do not fully replace the shadow suite's provider, offset, property-preservation, and exclusion matrix.; Provider separation in flat local outputs is not equivalent to asserting the production grouping/order shape.; calendar provider grouping; all-day normalization; logical-day offset; timezone/DST; Production uses getDbDateStr with an offset and isAllDayCalendarEvent while the copy does not, so preserving the copy has negative maintenance value. - **Primary gate:** The production-projector characterization and provider/order/property ledger must be green before the shadow algorithm is deleted. - **Required verification:** npm run checkFile src/app/features/planner/store/planner.selectors.spec.ts; npm run test:file src/app/features/planner/store/planner.selectors.spec.ts; Run the same focused spec with TZ=America/Los_Angeles and compare the case count.; checkFile and focused spec; two timezone jobs; compare event/order/property ledger - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `src/app/features/planner/store/planner.selectors.spec.ts` — test-owned calendar-event helper, selectPlannerDays projector cases - **Why it exists:** A private helper is claimed to be tested directly but is actually reimplemented in the spec, and the copy already omits production offset and all-day semantics. -- **Smallest change:** Add focused selectPlannerDays.projector cases for same-day filtering, provider separation, and full all-day property preservation, retain existing timed/24-hour/budget cases, then delete the copied helper and its direct-only cases without exporting a new production seam. -- **Preserve:** Planner days retain timed and all-day events, provider boundaries, startOfNextDayDiffMs behavior, full event properties, ordering, and existing budget limits. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The copied implementation uses local Date components while production uses getDbDateStr(start - offset) and isAllDayCalendarEvent, proving that green tests can disagree with runtime behavior. -- **Estimated net change:** test infrastructure 45–60; tests 140–190 +- **Superseded historical estimate:** test infrastructure 45–60; tests 140–190 - **Gates and overlaps:** false-coverage-replacement; timezone-scheduling; calendar-all-day-semantics; characterization-required; Production-projector characterization must land first. -- **Verify:** Run npm run checkFile src/app/features/planner/store/planner.selectors.spec.ts; Run npm run test:file src/app/features/planner/store/planner.selectors.spec.ts under Europe/Berlin and America/Los_Angeles test jobs; Require the production projector cases to pass before removing the shadow helper. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-02-C1 ### C07-003 — Delete reminder-dialog suites that assert only local simulations -- **Full-review result:** Rank 67/100; reviewer ranks 65/58/64. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 66/100; controlling focused placements 53/71/65; superseded original ranks 65/58/64. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** After rechecking and rebasing the reminder-adjacent PR gate, add TestBed-backed component cases for the current planForTomorrow clear dispatch, remindAt clearing before the store read, a dismissed reminder re-emitted by the worker, and late worker/store emissions during close, including eager unsubscribe/double-close behavior. Preserve the future-day/04:00 boundary and pure hint tests; only then delete the four local simulations. -- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. The overlapping reviewer totals support 270-365 net test-side LOC removed after the real-component race characterizations; remeasure the tests-versus-test-infrastructure split from the final diff. +- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. Tests: unknown; test infrastructure: unknown. The reviewers' 270-365 combined test-side reduction is a planning envelope only and is not used as a categorized LOC total or ranking reward; measure both categories independently from the implementation diff. - **Material corrections:** Four describes assert local task-pipeline, action-props, dismissed-set, and close-animation simulations instead of DialogViewTaskRemindersComponent.; The plan-for-tomorrow shadow encodes obsolete behavior: production now dispatches clearDeadlineReminder({taskId}), not the copied deadline-preserving action.; Later TestBed suites cover store reconciliation generally but do not prove cleared remindAt races, dismissed-worker stale emissions, or late emissions during close against the real component.; reminder loss/duplication; worker/store race; close/unsubscribe behavior; logical-day rollover; task state; The simulations do not cover production, but their unique races are important enough that deleting them without real characterization weakens the behavioral contract. - **Primary gate:** Recheck PR #8369 and land the production-connected race and teardown characterizations before deleting any simulation. - **Required verification:** npm run checkFile src/app/features/tasks/dialog-view-task-reminders/dialog-view-task-reminders.component.spec.ts; npm run test:file src/app/features/tasks/dialog-view-task-reminders/dialog-view-task-reminders.component.spec.ts; Run focused reminder tests in Europe/Berlin and America/Los_Angeles with the clock installed before component creation.; checkFile and focused spec; assert real store actions and MatDialogRef state; stale-emission and teardown race tests - **Discovery-era record (superseded):** Open. **Tier:** Final B. **Classification:** net-new. Rank 12; challenges: refuter narrowed, maintainer narrowed. - **Scope:** `src/app/features/tasks/dialog-view-task-reminders/dialog-view-task-reminders.component.spec.ts` — buildTasksPipeline, actionProps, removeReminderFromList, handleRemindersActive simulation suites - **Why it exists:** Four component-labeled suites define and test their own pipelines, action shapes, removal helpers, and component-like object instead of executing the Angular component. -- **Smallest change:** Delete only the four explicitly simulated blocks and now-unused imports; keep all TestBed-backed component cases and shouldShowDeadlineScheduleHint coverage unchanged. -- **Preserve:** No component behavior, reminder ordering, action dispatch, scheduling, dialog lifecycle, or deadline hint assertion is removed because none of the target blocks invokes production code; all real component suites stay intact. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The blocks repeatedly say 'Simulate the component' and every expectation targets a local function or object. Their 480 lines create coverage metrics without production coverage. -- **Estimated net change:** tests 360–420 +- **Superseded historical estimate:** tests 360–420 - **Gates and overlaps:** false-coverage deletion; reminder scheduling; large test deletion; PRs #8369 and #8598 were reminder-adjacent without an exact-file overlap and did not provide the missing component-path coverage, but must be rechecked before implementation. -- **Verify:** Run npm run checkFile src/app/features/tasks/dialog-view-task-reminders/dialog-view-task-reminders.component.spec.ts; Run npm run test:file src/app/features/tasks/dialog-view-task-reminders/dialog-view-task-reminders.component.spec.ts; Before deletion, verify every target expectation's receiver is spec-local and that no TestBed-backed describe is included. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-06-C01 ### C07-004 — Replace worklog shadow algorithms with focused production calls -- **Full-review result:** Rank 62/100; reviewer ranks 64/55/62. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 56/100; controlling focused placements 55/60/55; superseded original ranks 64/55/62. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Implement as separate test-only changes: add WorklogService inclusive first/last and outside-range coverage before deleting the range shadow; add formatRows START/END rounding coverage before deleting the Math.round shadow; and add a real WorklogExportComponent ngOnInit filename assertion before deleting the component-named pseudo-test. Preserve archive-read, project/day filtering, ordering, and completion inputs; do not edit persistence code. - **Corrected LOC:** Production/configuration/comments/generated/moved: 0. The reviewers' aggregate ranges do not overlap because one omitted the safety-required real component filename case. For the controlling safety-complete scope, budget 40-80 added test-infrastructure LOC and 130-190 removed test LOC, for 50-150 net LOC removed; remeasure each independent change before combining totals. - **Material corrections:** The timezone range spec filters a local array, the export component spec reconstructs the filename, the formatter block performs Math.round directly, and the legacy service case only parses a date string.; A service range test plus a formatter test does not preserve the filename contract because WorklogExportComponent.ngOnInit remains unexecuted.; The ordinary test:file script pins Europe/Berlin; the conditional negative-offset branch needs an explicit Los Angeles run.; worklog export correctness; inclusive date range; timezone/DST; archive/persistence adjacency; The finding is valid, but bundling three root causes inflates cohesion and makes rollback/diagnosis worse. @@ -1911,17 +1902,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/worklog/worklog-export/worklog-export.util.spec.ts` — moment-based shadow blocks; `src/app/features/worklog/worklog.service.timezone.spec.ts` — local mockTasks range filtering; `src/app/features/worklog/worklog-export/worklog-export.component.tz.spec.ts` — component-name timezone pseudo-tests; `src/app/features/worklog/worklog.service.spec.ts` — getTaskListForRange$ production characterization - **Why it exists:** Timezone and rounding suites recalculate expected worklog behavior with moment/local arrays without importing the production formatter, component, or service path. -- **Smallest change:** First add one real WorklogService.getTaskListForRange$ date-range case and, only if missing, one formatRows rounding assertion; then delete the pure-JavaScript shadow blocks and pseudo-component timezone file. -- **Preserve:** Local-day range inclusion, export formatting/rounding, task ordering, timezone boundaries, observable completion, and existing getDbDateStr coverage remain asserted through production code. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The shadow suites instantiate no production target, while adjacent service/utility specs already expose the correct seams. The replacement retains any unique range and rounding equivalence class before deletion. -- **Estimated net change:** test infrastructure -18–-8; tests 205–238 +- **Superseded historical estimate:** test infrastructure -18–-8; tests 205–238 - **Gates and overlaps:** false-coverage-replacement; timezone-scheduling; export-rounding; characterization-required; Production WorklogService range characterization must pass before deleting the shadow suite. -- **Verify:** Run checkFile on every modified worklog .spec.ts file; Run npm run test:file src/app/features/worklog/worklog.service.spec.ts and the worklog-export utility spec; Run the focused specs in both repository timezone jobs and compare range boundary outputs before deleting shadows. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T03-08-C2 ### C07-005 — Delete the work-context shadow implementation after preserving its unique boundary -- **Full-review result:** Rank 27/100; reviewer ranks 60/12/24. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 47/100; controlling focused placements 51/56/39; superseded original ranks 60/12/24. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Add the yesterday dueWithTime row to work-context.service.spec.ts, verify that earlier/later, exact-now, tomorrow, dueDay, non-Today, and parent/subtask rows still execute the real WorkContextService method, then delete work-context-filter.spec.ts. Keep this test-only and do not claim or introduce new 04:00 logical-day semantics. - **Corrected LOC:** Production/configuration/comments/test infrastructure/generated/moved: 0. Remove 180-184 net test LOC after adding the mandatory yesterday production-path row. - **Material corrections:** work-context-filter.spec.ts is a complete local copy and imports only the Task type.; The real WorkContextService suite already covers later, earlier, unscheduled, done, tomorrow, dueDay, non-Today, exact-now, and parent/subtask cases, but not the shadow suite's explicit yesterday case.; Calling the preserved behavior 'logical-today' overstates the production method, which currently compares scheduled timestamps through civil end-of-day.; TODAY virtual-list semantics; scheduled boundary; task filtering; The existing service suite already calls the real filter and covers the envelope; yesterday is the only material missing row. @@ -1930,36 +1921,36 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/work-context/work-context-filter.spec.ts` — spec-local task filter implementation; `src/app/features/work-context/work-context.service.spec.ts` — production Today-context filter cases - **Why it exists:** A standalone file imports only the Task type and tests a locally written filter, while WorkContextService already owns the production behavior and nearly the same boundary matrix. -- **Smallest change:** Compare the standalone rows against the real service suite, add the yesterday boundary to WorkContextService only if it is genuinely distinct, then delete work-context-filter.spec.ts. -- **Preserve:** Today, earlier/later today, tomorrow, future dueDay, exact-now, non-Today context, and parent/subtask behavior remain covered through WorkContextService; no selector, synced-state, or logical-day implementation changes. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The target file imports no production function. The service suite covers the same envelope through the real method, with yesterday the only possible distinct row. -- **Estimated net change:** tests 180–194 +- **Superseded historical estimate:** tests 180–194 - **Gates and overlaps:** false-coverage-deletion; logical-today; synced-task-state-adjacent; Preserve the yesterday equivalence class if it is not already exercised by the real service. -- **Verify:** Run npm run checkFile src/app/features/work-context/work-context.service.spec.ts; Run npm run test:file src/app/features/work-context/work-context.service.spec.ts in both timezone jobs; Map every deleted row to an existing production-path row or the newly added yesterday characterization. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T03-08-C1 ### C07-006 — Replace the self-testing task-delete unit spec with three real E2E outcomes -- **Full-review result:** Rank 72/100; reviewer ranks 70/61/69. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 72/100; controlling focused placements 64/73/73; superseded original ranks 70/61/69. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Keep the work test-only and split it into two changes. First, replace the stale wrong-key self-test with production-path true/false/default characterization of tasks.isConfirmBeforeDelete, without editing TaskComponent. Separately retain three isolated E2E outcomes: context cancel keeps the task, context confirm removes it and exposes Undo, and keyboard confirm removes the focused task. Replace fixed waits with focus/locator state, use clean state per test, and add reload only if persistence is claimed. -- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. For the safety-complete scope that includes real config characterization, use the conservative maintainability estimate of 90-170 net test-side LOC removed; the larger deletion estimate is not controlling and the split must be remeasured after both changes. +- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. Tests: unknown; test infrastructure: unknown. The reviewers' 90-170 combined test-side reduction is a planning envelope only and is not used as a categorized LOC total or ranking reward; measure both categories independently after the two required changes. - **Material corrections:** The unit spec is a self-test and uses the obsolete misc.isConfirmBeforeTaskDelete key; production reads tasks.isConfirmBeforeDelete.; The proposed three E2E outcomes can preserve cancel/context-confirm/keyboard-confirm, but existing keyboard coverage uses forbidden fixed 200 ms waits.; The preserved contract claims persistence although the target E2E file does not reload after deletion.; destructive task action; persistence; keyboard focus; hot-path task UI; E2E flakiness; Deleting the self-test is correct, but the canonical scope overstates preserved setting coverage and bundles two different maintenance jobs. - **Primary gate:** No TaskComponent production edit is authorized; real config-path coverage, deterministic keyboard focus, and explicit task-preserved/task-removed assertions are required before claiming the old contract is replaced. - **Required verification:** npm run checkFile e2e/tests/task-basic/task-delete-confirmation.spec.ts; npm run e2e:file e2e/tests/task-basic/task-delete-confirmation.spec.ts -- --retries=0; npm run e2e:file e2e/tests/task-basic/task-crud.spec.ts -- --retries=0; checkFile; focused E2E with --retries=0; clean state per test and real task-preserved/task-removed assertions - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/tasks/task/task-delete-confirmation.spec.ts` — spec-local delete confirmation branch; `e2e/tests/task-basic/task-delete-confirmation.spec.ts` — cancel, confirm plus undo, keyboard-confirm outcomes - **Why it exists:** The unit file copies TaskComponent's if/else and asserts its own spies, while five E2E cases repeat prefixes around only three distinct user-visible outcomes. -- **Smallest change:** Delete the self-testing unit file and retain exactly three isolated E2E tests: context-menu cancel keeps the task, context-menu confirm removes it and shows Undo, and Backspace confirm removes it. Use only file-local arrange helpers if needed. -- **Preserve:** The confirmation setting, dialog title/control, cancel preservation, confirmed removal, undo snackbar, keyboard path, persistence, and task-list rendering remain covered. No TaskComponent hot-path code changes. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** Every unit assertion observes behavior executed inside the spec. The E2E show-dialog case is a prefix of accept/cancel and the snackbar case repeats the accepted path, so three outcomes preserve the complete external contract. -- **Estimated net change:** test infrastructure -24–-12; tests 230–267 +- **Superseded historical estimate:** test infrastructure -24–-12; tests 230–267 - **Gates and overlaps:** false-coverage-deletion; e2e-journey-consolidation; task-hot-path; persistence; dialog-timing; The two source findings describe complementary unit false-coverage removal and real-browser outcome consolidation for the same contract; LOC is summed without duplicate lines. -- **Verify:** Run npm run checkFile e2e/tests/task-basic/task-delete-confirmation.spec.ts; Run npm run e2e:file e2e/tests/task-basic/task-delete-confirmation.spec.ts -- --retries=0; Assert clean app state per test and retain explicit task-preserved/task-removed expectations rather than relying on dialog visibility alone. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-08-C01; T05-05-C2 ### C07-007 — Delete superseded and non-discovered Add Task Bar timezone artifacts -- **Full-review result:** Rank 76/100; reviewer ranks 75/75/80. Safety: defer; maintainability: narrow; consensus: **defer**. **Tier:** C. **Status:** deferred. +- **Full-review result:** Rank 78/100; controlling focused placements 83/78/76; superseded original ranks 75/75/80. Safety: defer; maintainability: narrow; consensus: **defer**. **Tier:** C. **Status:** deferred. - **Authoritative scope:** Deferred in full: do not delete either artifact now. After PR #8515 resolves, rebase and obtain a fresh candidate review. That review may separately consider the non-discovered .bak deletion after discovery/reference checks, and may consider the active integration spec only after mapping all eleven executions to production-connected payload-builder/component coverage and passing explicit Europe/Berlin and America/Los_Angeles runs. - **Corrected LOC:** Current authorized LOC reduction: 0. Conditional future scope is 364 inactive test-artifact LOC for the .bak file and up to 548 total test LOC only if the additional 184-line active suite independently clears its coverage gate; none of that conditional total counts as currently actionable savings. - **Material corrections:** add-task-bar.component.tz.spec.ts.bak is tracked but excluded by the `**/*.spec.ts` discovery pattern, so its deletion is safe and saves no active coverage.; add-task-bar-timezone.integration.spec.ts is also self-testing, but its exact provider/property cases are not all demonstrated by the retained timezone-logic suite.; Several US-DST-labeled dates are not made DST transitions merely by running the default Europe/Berlin test job.; add-task parsing; scheduled timestamps; timezone/DST; test discovery; active PR overlap; Both deletions are worthwhile, but their safety proofs differ and the canonical LOC narrative originally hid active case removal. @@ -1968,17 +1959,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Final B. **Classification:** net-new. Rank 10; challenges: refuter confirmed, maintainer confirmed. - **Scope:** `src/app/features/tasks/add-task-bar/add-task-bar-timezone.integration.spec.ts` — superseded timezone integration suite; `src/app/features/tasks/add-task-bar/add-task-bar-timezone-logic.spec.ts` — retained active timezone logic suite; `src/app/features/tasks/add-task-bar/add-task-bar.component.tz.spec.ts.bak` — tracked non-discovered backup suite - **Why it exists:** Timezone work left both an older utility-only integration suite and a tracked .bak Jasmine file that Karma never discovers; their names imply active component coverage that does not exist. -- **Smallest change:** Delete the superseded integration file and the .bak file. Retain the later timezone-logic suite and direct getDbDateStr/parser tests; do not rename stale backup code into the active suite. -- **Preserve:** No configured test execution is lost from the .bak deletion, and every active timezone equivalence class from the older suite remains in the newer logic/direct utility coverage. Add Task Bar production behavior is untouched. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** Angular/Karma globs exclude .bak and no file references it; the older active suite has only one production import and overlaps the later logic suite. Both artifacts create misleading coverage surface. -- **Estimated net change:** tests 548 +- **Superseded historical estimate:** tests 548 - **Gates and overlaps:** stale test artifact; timezone scheduling; large test deletion; L12 independently found the non-discovered backup and T01-05 found the separate superseded suite; PR #8515 substantially refactors Add Task Bar payload construction and PR #8927 changes `getDbDateStr` and its direct spec, so rebase and remap retained production-connected coverage after either lands. -- **Verify:** Repeat git ls-files, test-glob, and reference searches for the .bak and integration paths; Run the active Add Task Bar parser/timezone specs in both timezone jobs; Run git diff --check and verify no production file or Karma configuration changes. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-05-C01; L12-C01 ### C07-008 — Run shared repeat-config projector cases from one typed matrix -- **Full-review result:** Rank 68/100; reviewer ranks 68/63/65. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 54/100; controlling focused placements 60/48/61; superseded original ranks 68/63/65. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Limit sharing to a typed matrix for the three exactly duplicated paused rows. Create a fresh repeat config per projector execution, retain explicit projector/case names and all six Jasmine executions, and leave DAILY/WEEKLY/MONTHLY/YEARLY and other selector-specific recurrence cases explicit. Remove the two inert console logs and the 42-line commented block, and record exact case counts before and after. - **Corrected LOC:** Production/configuration/generated/moved: 0. Remove 42 comment LOC and 60-85 test LOC while adding 12-20 test-infrastructure LOC, for 82-115 net LOC removed under the narrowed paused-only abstraction. - **Material corrections:** The common selector matrices are similar but not identical: DAILY negative cases, timestamp representation, weekly coverage, and lastTaskCreationDay values differ.; Shared mutable repeat-config objects would make projector execution order observable and can leak mutations between generated cases.; The candidate misclassifies 42 commented WEEKLY lines as test LOC and reports comments as zero.; recurrence matrix drift; projector-specific semantics; mutable fixture leakage; timezone; The broad matrix optimizes LOC at the expense of test readability; only the exact paused twins earn a shared table. @@ -1987,36 +1978,36 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/task-repeat-cfg/store/task-repeat-cfg.selectors.spec.ts` — getRepeatableTasksForExactDay projector suite, getRepeatableTasksForWeekday projector suite, paused-filter cases - **Why it exists:** Two projector suites duplicate the same DAILY/WEEKLY/MONTHLY/YEARLY and paused-case setup, while obsolete commented tests and console logging obscure the active boundary-specific cases. -- **Smallest change:** Create a typed commonCases runner for genuinely identical tuples and a three-row paused matrix executed against both projectors; keep projector-specific week-view/off-cycle, unprocessed, issue-regression, and timezone narratives explicit, then remove only inert comments/logs. -- **Preserve:** Both projectors still execute every current common and paused row independently; exact-day-only behavior, ordering, lastTaskCreation, issue regressions, timezone narratives, and synced repeat-config state semantics remain unchanged. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** MONTHLY/YEARLY and paused blocks are executable twins with identical IDs, config, day, and expected arrays. The proposal shares fixtures and registration, not production selectors or executions. -- **Estimated net change:** test infrastructure -55–-30; tests 245–451 +- **Superseded historical estimate:** test infrastructure -55–-30; tests 245–451 - **Gates and overlaps:** fixture-table-refactor; recurrence-timezone; synced-state-adjacent; case-count-fence; All three findings affect disjoint regions of one spec; C1 and C2 share the proposed runner but no test rows are double-counted. -- **Verify:** Run npm run checkFile src/app/features/task-repeat-cfg/store/task-repeat-cfg.selectors.spec.ts; Run npm run test:file src/app/features/task-repeat-cfg/store/task-repeat-cfg.selectors.spec.ts in both timezone jobs; Count generated Jasmine cases before and after and require all six paused executions plus every common projector/case pair. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-04-C1; T01-04-C2; T01-04-C3 ### C07-009 — Route next/newest recurrence boundary cases through their existing scenario runners -- **Full-review result:** Rank 42/100; reviewer ranks 61/17/51. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 62/100; controlling focused placements 61/65/58; superseded original ranks 61/17/51. Safety: narrow; maintainability: confirm; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Within each file, route equality-shaped boundary cases through the existing file-local runner without changing titles, comments, inputs, or expected timestamps. Keep the International Date Line non-equality assertion explicit, preserve the issue #7355 first-occurrence exclusion, retain the clearest Feb-29-to-Feb-28 case, and delete the other two executable-identical copies. Keep the two files independently reviewable and add no cross-file helper. -- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. The overlapping reviewer totals support 95-150 net test-side LOC removed, including deletion of two duplicate Feb-29 executions; remeasure the small runner-infrastructure adjustment from the final diff. +- **Corrected LOC:** Production/configuration/comments/generated/moved: 0. Tests: unknown; test infrastructure: unknown. The reviewers' 95-150 combined test-side reduction is a planning envelope only and is not used as a categorized LOC total or ranking reward; measure both categories independently, including the two duplicate Feb-29 executions, from the final diff. - **Material corrections:** Both existing scenario helpers already call production; the opportunity is repetitive assertion shells, not false coverage.; There are three executable-identical YEARLY Feb-29-to-Feb-28 cases in get-next-repeat-occurrence.util.spec.ts, not the candidate's claimed pair.; Removing only one leaves a duplicate execution and makes the LOC estimate short by roughly one case.; recurrence boundary tuples; timezone/date mutation; issue #7355 contract fence; This reuses an already-understood local seam and preserves diagnostic test titles, so the abstraction cost is near zero. - **Primary gate:** The before/after tuple ledger must differ only by the two documented duplicate executions, and the change must not expand into issue #7355 first-occurrence behavior. - **Required verification:** Run checkFile on both modified recurrence specs; Run both focused specs in Europe/Berlin and America/Los_Angeles; Diff exact case-name and tuple counts, accounting for exactly two removed duplicate executions; checkFile and both focused specs; two timezone jobs; tuple/case ledger equal except one documented duplicate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/task-repeat-cfg/store/get-next-repeat-occurrence.util.spec.ts` — testCase runner, boundary cases, duplicate February-29 yearly case; `src/app/features/task-repeat-cfg/store/get-newest-possible-due-date.util.spec.ts` — testCase runner, boundary cases - **Why it exists:** Large recurrence sections manually repeat the same expected-date normalization, production call, and equality shell despite already having file-local scenario runners; one February-29 case is exactly duplicated. -- **Smallest change:** Route only equality-shaped next/newest cases through the existing local runners, retain titles/comments/config/date tuples, leave the International Date Line truthiness case explicit, and keep one clearly documented February-29 yearly case. -- **Preserve:** Every recurrence frequency, leap/century boundary, local-noon invariant, date input, result, and test name remains; only one executable-identical leap-day duplicate is removed. Production recurrence code is unchanged. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The inline calls have the same shaping and assertion as testCase, and the two leap-year blocks have identical executable inputs/outputs. First-occurrence tables are deliberately excluded because issue #7355 may change that contract. -- **Estimated net change:** test infrastructure -6–0; tests 83–195 +- **Superseded historical estimate:** test infrastructure -6–0; tests 83–195 - **Gates and overlaps:** fixture-table-refactor; recurrence-timezone; leap-year-boundary; case-ledger-required; T01-03-C2 removes one exact duplicate inside the T01-03-C1 refactor region; the duplicate's LOC is included once in the summed estimate. -- **Verify:** Run checkFile on both modified recurrence spec files; Run both focused specs in Europe/Berlin and America/Los_Angeles timezone jobs; Snapshot the description/config/date/expected tuple ledger before refactoring and compare it after generation. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-03-C1; T01-03-C2 ### C07-010 — Centralize iCalendar envelopes while preserving every raw parser case -- **Full-review result:** Rank 64/100; reviewer ranks 67/57/61. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 59/100; controlling focused placements 62/57/59; superseded original ranks 67/57/61. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Add one lossless spec-local default-calendar helper for ordinary VEVENT cases only; keep malformed calendars, custom headers/ranges, Office365/VTIMEZONE, orphan, and cancelled fixtures inline, preserve the eager ical.js import and all 36 named cases, compare rendered full strings for representative ordinary and every exceptional fixture, and replace both synchronous not-to-throw wrappers around async calls with awaited rejection-sensitive result assertions. - **Corrected LOC:** Accepted LOC: production 0; configuration 0; comments 0; test infrastructure -24 to -12; tests 120 to 180; generated 0; moved 0. - **Material corrections:** Envelope extraction is viable, but parser fixtures are untrusted raw text: line endings, blank/malformed continuations, header order, VTIMEZONE metadata, and orphan/custom-range exceptions must remain byte-equivalent.; Two async parser tests use expect(() => asyncCall()).not.toThrow(), which only observes Promise creation and cannot detect rejection.; The candidate explicitly proposes keeping those ineffective synchronous assertions, violating the behavioral-protection contract.; untrusted iCalendar parsing; raw byte fidelity; VTIMEZONE/provider quirks; async false positives; timezone/DST; One default helper earns its keep; a wrapper plus invocation/options framework would merely move complexity. @@ -2025,17 +2016,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/schedule/ical/get-relevant-events-from-ical.spec.ts` — VCALENDAR envelope, getRelevantEventsFromIcal invocation - **Why it exists:** Thirty-six parser cases wrap a small VEVENT/VTIMEZONE payload in the same calendar envelope and date-range invocation, burying malformed lines and boundary inputs in boilerplate. -- **Smallest change:** Add tiny spec-local wrapIcal(body, metadata?) and parseEvents(body, range?) helpers; convert ordinary cases while leaving Office365 metadata and orphan/cancelled range exceptions explicit or named. -- **Preserve:** Every raw property line, malformed payload, VTIMEZONE, Office365 metadata field, cancellation/orphan rule, parser date range, ordering, and expected event remains byte-for-byte represented in the case inputs. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** A typical case spends nine invariant lines around five to ten meaningful lines; all 36 calls share the same production seam, making this a fixture extraction rather than assertion deletion. -- **Estimated net change:** test infrastructure -20–-12; tests 195–265 +- **Superseded historical estimate:** test infrastructure -20–-12; tests 195–265 - **Gates and overlaps:** fixture-table-refactor; ical-parser-boundary; timezone-scheduling; raw-fixture-byte-fidelity -- **Verify:** Run npm run checkFile src/app/features/schedule/ical/get-relevant-events-from-ical.spec.ts; Run npm run test:file src/app/features/schedule/ical/get-relevant-events-from-ical.spec.ts in both timezone jobs; Compare the emitted full iCalendar strings for custom metadata/malformed fixtures before and after the helper extraction. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T01-02-C2 ### C07-011 — Build simple-counter streak cases from DST-safe offset fixtures -- **Full-review result:** Rank 63/100; reviewer ranks 66/56/63. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 64/100; controlling focused placements 63/62/60; superseded original ranks 66/56/63. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Introduce only a DST-safe countOnDay-from-offsets helper and one fresh counter factory; store immutable offset/value descriptions, construct dates, maps, and counters inside each test after clock installation, and retain every zero entry, disabled weekday, explicit mode/expectation, all 23 executions, and both mutation sequences; add pinned spring-forward and fall-back equivalence cases only if DST-transition protection remains claimed. - **Corrected LOC:** Accepted LOC: production 0; configuration 0; comments 0; test infrastructure -45 to -25; tests 90 to 150; generated 0; moved 0. - **Material corrections:** Several specific-day fixtures are created at describe/module evaluation time from the real current date, while generated cases mutate counter objects.; A table of prebuilt Date/counter objects would preserve shared-state leakage instead of fixing it; builders must execute after each test's fake clock is installed.; Running under two timezone names does not prove 'across both DST transitions' because current dates and the fixed January date are not transition boundaries.; DST date arithmetic; clock installation order; shared mutable fixtures; streak case-count drift; Two focused builders improve auditability; the canonical four-builder design overstates the net simplification. @@ -2044,36 +2035,36 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary A. **Classification:** net-new. - **Scope:** `src/app/features/simple-counter/get-simple-counter-streak-duration.spec.ts` — weekday maps, day-offset count fixtures, specific-days and weekly counter fixtures - **Why it exists:** Long streak fixtures repeatedly spell the same weekday/counter envelope, making the meaningful day offsets, values, disabled weekdays, and mutation steps difficult to audit. -- **Smallest change:** Add file-local typed allWeekdays, countsAtOffsets, specificDaysCounter, and weeklyCounter builders based only on the existing calendar-arithmetic daysAgo helper; convert fixtures to named offset/value data and retain every generated test and mutation. -- **Preserve:** Every daily/weekly streak, disabled weekday, count value, mutation sequence, and DST-sensitive calendar-day boundary remains an independently named execution; millisecond arithmetic is not introduced. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The suite already has a DST-safe daysAgo primitive and repeated fixtures differ primarily by small offset/value maps. Builders expose the behavioral matrix without changing it. -- **Estimated net change:** test infrastructure -46–-23; tests 160–310 +- **Superseded historical estimate:** test infrastructure -46–-23; tests 160–310 - **Gates and overlaps:** fixture-table-refactor; dst-boundary; calendar-day-arithmetic; case-count-fence -- **Verify:** Run npm run checkFile src/app/features/simple-counter/get-simple-counter-streak-duration.spec.ts; Run the focused spec in Europe/Berlin and America/Los_Angeles timezone jobs, including dates across both DST transitions; Compare the generated concrete date/count maps and Jasmine case count before and after. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T03-06-C2 -### C07-012 — Move standalone PluginService and PluginLoader cases into their canonical harnesses +### C07-012 — Keep standalone PluginService and PluginLoader cases in their focused harnesses -- **Full-review result:** Rank 97/100; reviewer ranks 97/97/98. Safety: defer; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. +- **Full-review result:** Rank 94/100; controlling focused placements 92/91/93; superseded original ranks 97/97/98. Safety: defer; maintainability: reject; consensus: **reject**. **Tier:** reject. **Status:** rejected. - **Authoritative scope:** No change: keep both focused standalone specs and their current harnesses; do not relocate the ten cases or introduce a shared provider factory under this candidate, and require a new feature-driven audit that counts relocation as moved LOC before any future redesign. - **Corrected LOC:** Accepted LOC: production 0; configuration 0; comments 0; test infrastructure 0; tests 0; generated 0; moved 0. - **Material corrections:** The standalone files contain exactly five ZIP and five iframe-loader cases, and their harnesses are duplicative.; The canonical PluginService harness defaults isPluginEnabled to false and does not provide the standalone runner fake, so naive relocation changes the enabled-state assertions.; The canonical HttpTestingController harness can strengthen request order, but must reproduce 404 versus 500 bodies and verify no unexpected requests.; These cases do not assert iframe sandbox attributes; the preserved contract overstates them as sandbox coverage.; plugin public API; nodeExecution consent boundary; plugin enabled persistence; HTTP error ordering; test harness default drift; Focused harnesses isolate security/error behavior; moving ten tests into two already broad files worsens maintainability. - **Primary gate:** None; reconsider only for a future feature-driven harness redesign with explicit behavior and moved-LOC accounting. -- **Required verification:** After rebase, run checkFile on both canonical specs; Run both focused plugin service specs; Count exactly ten relocated cases and verify HttpTestingController.verify plus ZIP bytes/manifests and enabled-state calls; No change recommended. +- **Required verification:** No implementation verification is recommended for this rejected proposal. - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `src/app/plugins/plugin.service.load-from-zip.spec.ts` — ZIP-loading standalone TestBed; `src/app/plugins/plugin.service.spec.ts` — loadPluginFromZip canonical describe; `src/app/plugins/plugin-loader.iframe-only.spec.ts` — iframe-only standalone HTTP harness; `src/app/plugins/plugin-loader.service.spec.ts` — canonical HttpTestingController harness - **Why it exists:** ZIP and iframe-only behavior live in standalone specs that reproduce dependency and HTTP routing harnesses already present in each service's canonical spec. -- **Smallest change:** Move all five ZIP cases and all five iframe-only cases into nested describes in the corresponding canonical service specs, reuse their typed spies/HttpTestingController, preserve local manifest/ZIP fixtures, then delete only the duplicate harness files. -- **Preserve:** All ten plugin loading cases, ZIP bytes/manifests, elevated-permission checks, enabled-state behavior, manifest/plugin/index HTTP order, 404/500 errors, iframe sandbox behavior, persistence, and public plugin contracts remain asserted. +- **Rejected historical proposal:** Superseded; no implementation is authorized. Follow the authoritative rejection above. +- **Rejected historical preservation notes:** Superseded by the authoritative rejection; no implementation is authorized. - **Evidence:** Provider-by-provider comparison found that the canonical harnesses already supply every required dependency and response seam. This is fixture ownership consolidation, not merging the production services. -- **Estimated net change:** test infrastructure 100–168; tests 0–25 +- **Rejected historical estimate:** Zero LOC is authorized. test infrastructure 100–168; tests 0–25 - **Gates and overlaps:** test-harness-consolidation; plugin-public-api; iframe-security; plugin-persistence; http-error-ordering; The findings apply the same canonical-harness pattern to two different plugin services; their files and LOC do not overlap. -- **Verify:** Run checkFile on both canonical plugin service spec files; Run npm run test:file src/app/plugins/plugin.service.spec.ts and src/app/plugins/plugin-loader.service.spec.ts; Count the ten moved behavior cases and verify exact HTTP request ordering/error bodies and ZIP fixture inputs after relocation. +- **Historical verification recipe:** Not applicable because the proposal is rejected. - **Source findings:** T02-04-C1; T02-04-C2 ### C07-013 — Delete unused non-sync E2E fixture, page, helper, overlay, and barrel surface -- **Full-review result:** Rank 47/100; reviewer ranks 62/25/50. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 50/100; controlling focused placements 52/59/49; superseded original ranks 62/25/50. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Ship independent zero-consumer deletions for SideNavPage plus fixture/page-barrel/docs registration, logPluginState/robustClick/robustWaitFor, attachDragGhost/fadeTransition with exclusively owned support code, and generic assertion helpers except expectNoGlobalError plus the unused utils barrel; retain safeIsVisible, ensureGlobalAddTaskBarOpen, showCaption, smoothMouseMove, every consumed video helper, and all sync-specific utilities, while deferring safeIsEnabled alone. - **Corrected LOC:** Accepted LOC: production 0; configuration 0; comments 0; test infrastructure 325 to 350; tests 0; generated 0; moved 0; safeIsEnabled and excluded overlay helpers receive no LOC credit. - **Material corrections:** Exact searches confirm SideNavPage/fixture, three plugin helpers, safeIsEnabled, the utils barrel, five assertion helpers, and four exported video helpers have no scenario consumers.; expectNoGlobalError is consumed by both non-sync and sync E2E and must remain; safeIsVisible, ensureGlobalAddTaskBarOpen, wait utilities, and all consumed video choreography must remain.; The canonical 337-358 LOC estimate appears low once the four unused overlay functions and all disjoint zero-consumer surfaces are counted.; PR #8214 is an explicit element-helpers gate even though the available local ref's current diff did not touch that file.; fixture type surface; store-video choreography; sync E2E exclusion; stale barrel/docs; current PR gate; The dead-code evidence is strong, but four unrelated concepts should not be one maintenance change. @@ -2082,17 +2073,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** conflicting. - **Scope:** `e2e/pages/side-nav.page.ts` — SideNavPage; `e2e/fixtures/test.fixture.ts` — sideNavPage fixture registration; `e2e/helpers/plugin-test.helpers.ts` — logPluginState, robustClick, robustWaitFor; `e2e/store-video/overlays.ts` — unused overlay helpers; `e2e/utils/assertions.ts` — unused assertion helpers; `e2e/utils/element-helpers.ts` — safeIsEnabled; `e2e/utils/index.ts` — unused barrel - **Why it exists:** E2E infrastructure accumulated fixture/page registrations, generic retries, video overlays, assertions, and a barrel with no scenario consumers, expanding the apparent supported test API. -- **Smallest change:** Delete only zero-consumer symbols/files and their stale documentation/export/fixture entries; retain every consumed plugin lifecycle helper, expectNoGlobalError, safeIsVisible, ensureGlobalAddTaskBarOpen, and explicit import path. -- **Preserve:** No Playwright scenario, screenshot/video choreography in use, fixture consumer, plugin lifecycle, selector, retry policy, sync helper, or assertion behavior changes. SuperSync/WebDAV helpers are untouched. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** Repository-wide exact symbol/import searches found only declarations, registrations, barrels, or stale docs for the targets, while neighboring retained helpers have concrete consumers. -- **Estimated net change:** test infrastructure 337–358 +- **Superseded historical estimate:** test infrastructure 337–358 - **Gates and overlaps:** dead-test-infrastructure; playwright-fixture-registration; store-video-choreography-fence; sync-e2e-excluded; All four sources describe disjoint zero-consumer pieces of the non-sync E2E support API; estimates are additive; Classify conflicting/B until PR #8214 lands or is rebased and element-helpers.ts is proven unused again; keep sync E2E paths excluded. -- **Verify:** Repeat exact symbol, import, fixture-key, and barrel-path searches after deletion; Run checkFile on modified E2E TypeScript files and npm run check; Run representative non-sync plugin and navigation E2E files with --retries=0; do not run or alter sync suites as part of this deletion. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T05-01-C01; T05-01-C02; T05-02-C01; T05-06-C1 -### C07-014 — Collapse route-only planner E2E smokes into behavior-bearing journeys +### C07-014 — Delete only strict-prefix planner E2E smokes after preserving isolated behaviors -- **Full-review result:** Rank 69/100; reviewer ranks 71/59/67. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 61/100; controlling focused placements 57/58/67; superseded original ranks 71/59/67. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Use an exact outcome ledger, retain isolated navigation/deep-link/refresh tests, both planner-content tests, and explicit estimate-syntax/route-return tests, and delete only cases whose planner assertion is a strict URL/router-wrapper/task-count prefix; do not create one broad planner journey, treat multiple-day/scheduled behavior as currently untested and characterize real scheduling plus day/slot placement separately if that contract is required, and do not claim or consolidate estimate persistence until the displayed/stored estimate survives reload. - **Corrected LOC:** Accepted LOC: production 0; configuration 0; comments 0; test infrastructure 15; tests 180 to 185; generated 0; moved 0. - **Material corrections:** planner-multiple-days and planner-scheduled-tasks create tasks whose titles imply dates/times but never schedule them or assert a planner day/slot.; Most basic/multiple/scheduled outcomes are URL/router-wrapper or task-count checks duplicated by navigation and visibility suites.; The time-estimate suite mostly asserts titles and navigation; it does not directly prove parsed estimate values, and its 'persistence' case does not reload.; planner logical day; task placement; estimate parsing; persistence; task-list rendering; E2E isolation; Straight deletion of strict prefixes is valuable; journey bundling is unnecessary and less diagnosable. @@ -2101,17 +2092,17 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `e2e/tests/planner/planner-basic.spec.ts` — route-only smoke; `e2e/tests/planner/planner-multiple-days.spec.ts` — route-only smoke; `e2e/tests/planner/planner-navigation.spec.ts` — canonical navigation/deep-link/refresh journey; `e2e/tests/planner/planner-scheduled-tasks.spec.ts` — route-only smoke; `e2e/tests/planner/planner-time-estimates.spec.ts` — time-estimate syntax and persistence journeys; `e2e/tests/planner/planner-task-visibility.spec.ts` — planner content assertions - **Why it exists:** Six planner files repeatedly drive the same page-object route and URL check; several names promise multiple-day or scheduled-task behavior without asserting planner content. -- **Smallest change:** Keep one navigation/deep-link/refresh suite, both task-visibility cases, and both time-estimate syntax/persistence cases; delete route-only duplicates, strengthening one retained journey with an actual planner-task/day assertion if a label represents a required behavior. -- **Preserve:** Planner routing, deep links, refresh, visible task content, multiple-day/scheduled placement where actually required, estimate short syntax, estimate persistence, logical-day scheduling, and task-list rendering remain covered with isolated state and retries=0. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** The route-only files execute the same page-object path and assert no named domain behavior. Neighboring visibility/estimate suites already carry the real assertions; labels are not treated as coverage. -- **Estimated net change:** test infrastructure 15–33; tests 175–265 +- **Superseded historical estimate:** test infrastructure 15–33; tests 175–265 - **Gates and overlaps:** e2e-journey-consolidation; planner-logical-day; task-hot-path; persistence; state-isolation; Strengthen a retained behavior journey before deleting any route-only case whose title encodes a still-required scheduled/multiple-day contract. -- **Verify:** Run checkFile on every modified planner E2E spec; Run each retained planner spec with npm run e2e:file -- --retries=0; Use locator/state assertions for planner task/day output and do not replace them with URL-only checks or fixed waits. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T05-03-C1 ### C07-015 — Consolidate plugin upload and API-test smokes into explicit lifecycle journeys -- **Full-review result:** Rank 70/100; reviewer ranks 72/60/66. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. +- **Full-review result:** Rank 58/100; controlling focused placements 56/55/66; superseded original ranks 72/60/66. Safety: narrow; maintainability: narrow; consensus: **narrow**. **Tier:** B. **Status:** open. - **Authoritative scope:** Use two staged changes: first make SettingsPage upload/enable/disable operations state-based and keep an isolated uploaded-plugin lifecycle covering absent, upload-disabled, enable, reload-persisted, disable, re-enable, remove, and reload-absent; then retain two isolated API-plugin tests for activation/menu/exact-route/iframe-heading/reload persistence and disable/menu-removal/reload/re-enable restoration before deleting strict prefix smokes; keep catalog/install-control, metadata, sandbox/nodeExecution coverage, and plugin-simple-enable reconciliation separate, with the latter excluded from LOC credit. - **Corrected LOC:** Accepted LOC: production 0; configuration 0; comments 0; test infrastructure -25 to 20; tests 570 to 680; generated 0; moved 0. - **Material corrections:** The six API Test Plugin files repeat card/enable/menu/route/iframe setup, and plugin-upload reimplements SettingsPage operations.; SettingsPage enable/disable/upload methods use fixed 500/1000 ms waits and return success before asserting the final toggle/card state, so they are not yet safe canonical primitives.; Neither uploaded nor bundled lifecycle currently reloads to prove the persistence contract claimed by the candidate.; Existing iframe smokes do not assert sandbox attributes; sandbox/elevated-permission protection is owned by separate unit/security suites and must not be credited as an E2E outcome.; plugin-simple-enable.spec.ts overlaps the uploaded journey but is outside the listed candidate and contains only a comment, not an assertion, for no-menu behavior.; plugin public API; iframe rendering/security boundary; enabled-state persistence; uploaded-plugin cleanup; E2E state isolation; fixed-wait flakiness; The duplication is real, but two focused lifecycle contracts are maintainable; a single mega-journey is not. @@ -2120,12 +2111,12 @@ The following seven domain sections contain all 100 reviewed canonical candidate - **Discovery-era record (superseded):** Open. **Tier:** Preliminary B. **Classification:** net-new. - **Scope:** `e2e/tests/plugins/plugin-upload.spec.ts` — uploaded-plugin lifecycle; `e2e/tests/plugins/enable-plugin-test.spec.ts` — API Test Plugin smoke; `e2e/tests/plugins/plugin-enable-verify.spec.ts` — API Test Plugin smoke; `e2e/tests/plugins/plugin-iframe.spec.ts` — API Test Plugin iframe smoke; `e2e/tests/plugins/plugin-lifecycle.spec.ts` — API Test Plugin disable lifecycle; `e2e/tests/plugins/plugin-loading.spec.ts` — canonical settings/menu/route/iframe lifecycle; `e2e/tests/plugins/test-plugin-visibility.spec.ts` — API Test Plugin visibility smoke; `e2e/pages/settings.page.ts` — existing plugin settings methods - **Why it exists:** The upload spec reimplements SettingsPage operations, while six API Test Plugin specs repeat the same card, enable, menu, route, and iframe prefixes across smoke-level assertions. -- **Smallest change:** Drive upload/existence/enable/disable/status through existing SettingsPage methods, keeping removal local; retain one API Test Plugin lifecycle that proves card -> enable -> menu -> route/iframe -> disable removal -> re-enable restoration, and keep distinct catalog/install-control and metadata suites. -- **Preserve:** Initial-disabled, upload, existence, enable, disable, re-enable, removal, menu visibility, exact plugin route, iframe heading, persistence, elevated/security controls, and plugin metadata remain asserted. Each journey starts with isolated state and uses state-based waits. +- **Superseded historical proposal:** Do not implement this broader recipe; follow the authoritative scope above. +- **Superseded historical preservation notes:** Follow the authoritative scope, gate, and verification above. - **Evidence:** SettingsPage already exposes all repeated upload operations except one-consumer removal, and plugin-loading plus plugin-lifecycle contain the union of six smoke files' distinct outcomes. -- **Estimated net change:** test infrastructure 5–55; tests 670–800 +- **Superseded historical estimate:** test infrastructure 5–55; tests 670–800 - **Gates and overlaps:** e2e-journey-consolidation; plugin-public-api; iframe-security; plugin-persistence; test-state-isolation; T05-04-C1 covers uploaded-plugin lifecycle reuse; T05-04-C2 covers bundled API Test Plugin smoke collapse. They share SettingsPage conventions but no test LOC. -- **Verify:** Run checkFile on the modified plugin E2E specs and SettingsPage only if it changes; Run each retained plugin journey with npm run e2e:file -- --retries=0; Assert iframe heading, route, menu removal/restoration, and enabled state directly; preserve plugin cleanup even after assertion failures. +- **Superseded historical verification recipe:** Follow the required verification above. - **Source findings:** T05-04-C1; T05-04-C2 ## Cross-domain corrections and duplicate resolutions @@ -2474,7 +2465,7 @@ GitHub state was checked on 2026-07-16 and is inherently time-sensitive. Recheck ## Evidence and limitations -The ignored evidence directory is `.tmp/simplification-audit/104043e2d220336d37c96623229640233093f045/`. It contains manifests, coverage, 116 vertical artifacts, 12 lens artifacts, eight consolidation/guardian records, 100 safety reviews, 100 independent maintainability reviews, three reconciliation records, and three complete rankings. This document is designed to remain useful if those ignored files disappear; the source IDs are supplemental traceability. +The ignored evidence directory is `.tmp/simplification-audit/104043e2d220336d37c96623229640233093f045/`. It contains manifests, coverage, 116 vertical artifacts, 12 lens artifacts, eight consolidation/guardian records, 100 safety reviews, 100 independent maintainability reviews, three reconciliation records, three complete original rankings, and three focused final-scope replacement rankings. This document is designed to remain useful if those ignored files disappear, but the committed record alone cannot reproduce the campaign; the source IDs are supplemental traceability. Limitations: diff --git a/docs/plans/2026-07-16-systematic-simplification-audit-results.md b/docs/plans/2026-07-16-systematic-simplification-audit-results.md index 8ad95e4b4b..e3aa70e1ac 100644 --- a/docs/plans/2026-07-16-systematic-simplification-audit-results.md +++ b/docs/plans/2026-07-16-systematic-simplification-audit-results.md @@ -15,10 +15,10 @@ The non-sync codebase audit and full portfolio review are complete. Discovery it - Seven domain consolidations normalized those claims into 105 domain candidate slots. The exclusion guardian removed five whole-candidate duplicates and narrowed one overlapping candidate, leaving 100 unique canonical candidates. - Every candidate received two independent reviews: a safety/correctness pass and a maintainability/value pass. - Conservative reconciliation produced 26 confirmed, 47 narrowed, 12 deferred, and 15 rejected findings. -- Three independent rankers ordered all 100 reconciled records by risk/reward. The final actionable backlog contains 33 Tier A and 40 Tier B findings. +- Three independent rankers ordered the original reconciled records by risk/reward. Three focused reviewers later replaced the stale placements for 27 materially revised C06/C07 scopes; the final actionable backlog contains 33 Tier A and 40 Tier B findings. - Cross-model corroboration was offered after the multi-agent review and skipped. -The [durable backlog](../non-sync-code-simplification-audit.md) contains the authoritative 100-item order and, under every candidate, the reconciled scope, corrected LOC categories, material corrections, primary gate, and required verification. Discovery-era estimates are retained there only as traceability and are superseded where the full review differs. +The [durable decision record](../non-sync-code-simplification-audit.md) contains the authoritative 100-item order and, under every candidate, the reconciled scope, corrected LOC categories, material corrections, primary gate, and required verification. Discovery-era estimates are retained there only as traceability and are superseded where the full review differs. Raw manifests and reviewer artifacts remain in the ignored local `.tmp` workspace, so this commit does not independently reproduce the campaign. ## Coverage proof @@ -40,33 +40,28 @@ The coverage ledger contains 2,665 `reviewed` paths and four `semantic-excluded` ## Final portfolio summary -The final order uses mean rank across three complete independent rankings, with lower risk, lower effort, higher reconciled priority, and candidate ID as exact tie-breakers. Actionable findings are ordered before deferred and rejected records. +The final order keeps the original three placements for the 73 scopes that did not materially change and replaces the stale placements for the 27 revised C06/C07 scopes with three fresh independent global placements. Mean applicable placement controls within the actionable, deferred, and rejected bands; exact ties prefer lower risk, then lower effort, then higher reconciled priority, then candidate ID. -| Band | Ranks | Count | Meaning | -| ------ | -------------------------------------------: | ----: | ----------------------------------------------------- | -| Tier A | 1–73, interleaved with Tier B by risk/reward | 33 | Actionable with a closed or nearly closed proof | -| Tier B | 1–73, interleaved with Tier A by risk/reward | 40 | Actionable after the recorded candidate-specific gate | -| Tier C | 74–85 | 12 | Deferred pending stronger evidence or value | -| Reject | 86–100 | 15 | Do not implement as described | +| Band | Ranks | Count | Meaning | +| ------ | -------------------------------------------: | ----: | ---------------------------------------------------- | +| Tier A | 1–73, interleaved with Tier B by risk/reward | 33 | Higher-confidence, lower-risk actionable work | +| Tier B | 1–73, interleaved with Tier A by risk/reward | 40 | Actionable with greater risk, effort, or uncertainty | +| Tier C | 74–85 | 12 | Deferred pending stronger evidence or value | +| Reject | 86–100 | 15 | Do not implement as described | The next five open findings are C01-005, C02-005, C04-001, C01-006, and C04-007. Their scopes are documented as disjoint, but each should remain its own change and verification boundary. ## First implementation batch — verified and stashed -The three recommended non-overlapping Tier A changes were implemented and verified on 2026-07-17, then stashed at the user's request. They are not present in the current worktree. The patch is commit `11043158b95aee6a44dfcf4e69315abda4b88704`, currently referenced by `stash@{0}` with message `codex: verified simplification implementation batch`: +The three recommended non-overlapping changes were implemented and verified on 2026-07-17, then stashed at the user's request. They are not present in the current worktree. The patch is stash object `11043158b95aee6a44dfcf4e69315abda4b88704` with message `codex: verified simplification implementation batch`; it was `stash@{0}` at audit time, but stash ordinals are mutable and local: 1. **C04-015 — static procrastination catalog** 2. **C01-002 — duration wrappers** 3. **C06-004 — unloaded Karma hooks** -Original conservative forecast: +The original forecast used file-level categories that did not consistently separate comments and blank lines, so it is not repeated as categorized evidence. The line-level actual below controls. -- 238–241 production LOC -- 6 comment LOC -- 126–133 test LOC -- 107 test-infrastructure LOC - -They have no dependency edge or file overlap. The full review later reordered the entire portfolio; these three retain their verified implementation status rather than receiving a special ranking boost. +They have no dependency edge or file overlap. Their verified status is evidence that lowers residual uncertainty; it is not a separate LOC or reward bonus. Minimum verification: @@ -76,16 +71,18 @@ Minimum verification: Actual schema-aligned implementation diff: -| Category | Added | Deleted | Net reduction | -| ----------------------- | ----: | ------: | ------------: | -| Production | 1 | 245 | 244 | -| Comments | 0 | 6 | 6 | -| Tests | 0 | 155 | 155 | -| Test infrastructure | 0 | 107 | 107 | -| Separator whitespace | 0 | 1 | 1 | -| **Physical diff total** | **1** | **514** | **513** | +Deleted lines are classified individually: blank and comment-only lines take precedence, and each remaining nonblank line is assigned to production code, test code, or test-infrastructure code by file role. -C01-002 exceeded its forecast because the exact implementation removed 155 production lines and 155 obsolete/self-only test lines, with one replacement formatting line. Review confirmed that the extra deletion is entirely within the challenged dead-pipe, provider, mock, and unused-parameter scope. +| Category | Added | Deleted | Net reduction | +| ------------------------ | ----: | ------: | ------------: | +| Production code | 1 | 222 | 221 | +| Test code | 0 | 125 | 125 | +| Test-infrastructure code | 0 | 82 | 82 | +| Comment-only lines | 0 | 34 | 34 | +| Blank lines | 0 | 51 | 51 | +| **Physical diff total** | **1** | **514** | **513** | + +C01-002's line-level actual is 132 production-code deletions, 125 test-code deletions, 20 comment-only deletions, and 33 blank-line deletions, plus one production-code insertion. Review confirmed that every deleted line is within the challenged dead-pipe, provider, mock, and unused-parameter scope. Verification completed: @@ -97,7 +94,7 @@ Verification completed: ## Remaining implementation order -Use the final 100-item order in the [durable backlog](../non-sync-code-simplification-audit.md). It replaces the earlier top-12 and provisional follow-up lists that were recorded here before the full review. +Use the final 100-item order in the [durable decision record](../non-sync-code-simplification-audit.md). It replaces the earlier top-12 and provisional follow-up lists that were recorded here before the full review. - Apply each candidate's authoritative scope, not its broader discovery-era proposal. - Satisfy its primary gate before editing. @@ -160,7 +157,7 @@ The campaign executed: - 100 safety/correctness reviews across seven domains. - 100 blind maintainability/value reviews across seven domains. - 3 independent 100-item ranking passes. -- 27 final C06/C07 wording reconciliations across three focused reviewers, without verdict or rank changes. +- 27 final C06/C07 scope reconciliations followed by three fresh independent global-placement passes for those revised scopes. Artifacts are stored under the ignored directory: @@ -176,7 +173,10 @@ Key entries: - `full-review/maint-C01.json` through `maint-C07.json` — blind maintainability/value verdicts - `full-review/consensus-*.json` — conservative reconciliations - `full-review/global-rank-R1.json` through `global-rank-R3.json` — complete independent rankings -- `full-review/manual-reconcile-*.json` — controlling single-scope overrides for 27 mechanically ambiguous C06/C07 records +- `full-review/manual-reconcile-C06.json` and `manual-reconcile-C07-*.json` — controlling scope and score overrides for 27 mechanically ambiguous C06/C07 records +- `full-review/manual-reconcile-rejections.json` — neutralized implementation guidance for all 15 rejected records +- `full-review/manual-reconcile-implemented-loc.json` — exact line-level category corrections for the verified implementation batch +- `full-review/final-scope-rank-*.json` — three focused replacement placement passes for those 27 records ## Known limitations