Files
ThothII/docs/superpowers/plans/2026-07-14-memory-selection-clarity.md
T

116 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Memory Selection Clarity Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Make Phase 2 memory checkboxes mean only “apply this memory now”, with recommended memories preselected and unselected memories left undecided.
**Architecture:** The Pi gate converts each `recommended:true` Phase 2 option into the existing multiselect descriptor’s `selected` flag. The shared React multiselect keeps its generic behavior, while Phase 2 supplies explicit Italian selection and confirmation copy through descriptor fields. Only selected IDs continue to create decisions; omitted IDs remain non-persisting.
**Tech Stack:** Pi extension JavaScript (`node:test`), React 18/TypeScript, Vitest.
## Global Constraints
- UI copy is English except workspace/document content; this Phase 2 reviewer prompt is workspace-language Italian and stays Italian.
- No unselected memory may create `memory_rejected` or any other decision.
- Keep the generic multiselect compatible with existing widgets.
---
### Task 1: Carry recommendations into checked Phase 2 options
**Files:**
- Modify: `harness/.pi/extensions/tht-gate.js:686-750`
- Test: `harness/.pi/extensions/gate/__tests__/gate_reviewer_decide.test.js`
**Interfaces:**
- Consumes: `reviewer_decide.options[].recommended?: boolean`.
- Produces: a multiselect descriptor whose recommended option IDs occur in `selected`, and whose Phase 2 title/action communicate application only.
- [ ] **Step 1: Write the failing test**
Exercise the gate with one recommended and one optional decision, capture its UI request, and assert `selected` is the recommended ID, the title asks to select memories to apply, and `confirm_label` is `Applica le memory selezionate`.
- [ ] **Step 2: Run test to verify it fails**
Run: `node --test harness/.pi/extensions/gate/__tests__/gate_reviewer_decide.test.js`
Expected: FAIL because the descriptor has no `selected` recommendation mapping or memory-specific copy.
- [ ] **Step 3: Write minimal implementation**
In `reviewer_decide`, map each recommended option to `selected: true` before calling `buildMultiselectRequest`; add optional `selection_label` and `confirm_label` fields to the descriptor only for the F2 memory title.
- [ ] **Step 4: Run the gate tests**
Run: `node --test harness/.pi/extensions/gate/__tests__/*.test.js`
Expected: PASS.
### Task 2: Render Phase 2 action copy without changing generic multiselect behavior
**Files:**
- Modify: `frontend/src/api/types.ts`
- Modify: `frontend/src/widgets/MultiselectWidget.tsx`
- Test: `frontend/src/widgets/MultiselectWidget.test.tsx`
**Interfaces:**
- Consumes: optional `WidgetDescriptor.selection_label?: string` and `WidgetDescriptor.confirm_label?: string`.
- Produces: supplied labels in the count and confirm button; absent labels retain `selected` and `Confirm`.
- [ ] **Step 1: Write the failing test**
Render a descriptor with one checked recommended memory and the custom labels. Assert the checkbox is checked, the count reads `1 / 2 memory da applicare`, and confirmation uses `Applica le memory selezionate` while emitting only checked IDs.
- [ ] **Step 2: Run test to verify it fails**
Run: `cd frontend && npx vitest run src/widgets/MultiselectWidget.test.tsx`
Expected: FAIL because the descriptor type and component ignore the custom labels.
- [ ] **Step 3: Write minimal implementation**
Add the two optional descriptor fields and use them with the existing generic strings as fallbacks. Do not alter checkbox response semantics.
- [ ] **Step 4: Run widget test and typecheck**
Run: `cd frontend && npx vitest run src/widgets/MultiselectWidget.test.tsx && npx tsc -b`
Expected: PASS.
### Task 3: Align the Phase 2 model instructions with implementation
**Files:**
- Modify: `harness/.pi/skills/tht-sessione/memoria.md`
- Modify: `harness/.pi/skills/tht-sessione/SKILL.md`
**Interfaces:**
- Consumes: selected options are applied; omitted options are not applied now.
- Produces: instructions that never ask the model to create a negative “do not use” option or a persistent rejection for unchecked memories.
- [ ] **Step 1: Update the memory checklist contract**
State that every row describes a candidate memory declaratively, `recommended:true` preselects only memories proposed for use, and unchecked candidates are not applied now and may be considered again after a reopen.
- [ ] **Step 2: Verify no obsolete rejection instruction remains**
Run: `rg -n "deselected.*memory_rejected|deselezionate.*memory_rejected|mem_id" harness/.pi/skills/tht-sessione`
Expected: no matches.
### Task 4: Full verification
**Files:**
- Verify only.
- [ ] **Step 1: Run focused gate and frontend checks**
Run: `node --test harness/.pi/extensions/gate/__tests__/*.test.js && cd frontend && npx vitest run src/widgets/MultiselectWidget.test.tsx && npx tsc -b`
Expected: all commands exit 0.
- [ ] **Step 2: Review the diff**
Run: `git diff --check && git diff -- harness/.pi/extensions/tht-gate.js frontend/src/api/types.ts frontend/src/widgets/MultiselectWidget.tsx harness/.pi/skills/tht-sessione`
Expected: no whitespace errors; changes only implement the clarified memory-selection contract.