fix: clarify memory selection semantics
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user