Executor instructions: Follow this plan step by step. Run every verification command and confirm the expected result before moving to the next step. If anything in the “STOP conditions” section occurs, stop and report — do not improvise. When done, update the status row for this plan in
plans/README.md— unless a reviewer dispatched you and told you they maintain the index.Drift check (run first):
grep -rn "revealText\|reveal(" src/ | grep -v "shared/messages\|shared/offscreen-routing\|offscreen.ts\|rampart-worker.tsIf this grep finds a NEW caller of reveal (e.g. a content-script response observer), the feature has been wired since planning — STOP; this plan is obsolete and should be marked REJECTED inplans/README.md.
a6293e1, 2026-07-17The README advertises: “Reversible placeholders. Redacted tokens like
[PERSON_1] or [SSN_1] rehydrate back to their real values within the same
conversation, so model responses referencing them still read naturally.”
This does not happen. The plumbing exists end-to-end — a PW_REVEAL_TEXT
message type, an offscreen route, and guard.reveal() in the worker — but
nothing ever sends that message: no content-script code observes model
responses or calls reveal. A user who reads the feature list expects
assistant replies to show real values; they will see raw [PERSON_1] tokens
and conclude the extension is broken. Actively wrong docs are worse than
missing ones. The honest fix today is to describe what ships; actually wiring
response rehydration is a separate, larger piece of work (recorded as a
direction option in plans/README.md).
README.md:32 (Features bullet):
- **Reversible placeholders.** Redacted tokens like `[PERSON_1]` or `[SSN_1]` rehydrate back to their real values within the same conversation, so model responses referencing them still read naturally.
README.md:65 (Known limitations bullet):
- Reversible placeholders are scoped to a single conversation/tab; they reset on navigation, tab close, or extension reload.
revealText appears only in src/shared/messages.ts
(type + validator), src/shared/offscreen-routing.ts (route set),
src/offscreen.ts:86 (dispatch to worker), src/rampart-worker.ts:134-137
(guard.reveal). Zero senders. The per-conversation placeholder maps DO
exist and are kept in worker memory (guards map keyed by conversation),
and ARE reset on navigation/tab close (src/background.ts:28-42), so the
limitations bullet is about a real mechanism — it just isn’t user-visible
yet.PRIVACY.md mentions “Placeholder maps stay in extension memory…” —
accurate, no change needed.plans/README.md proposes wiring it; the dead code is small and typed.| Purpose | Command | Expected on success |
|---|---|---|
| Tests | npm test |
all pass (proves no accidental code change) |
In scope:
README.md (two bullets)Out of scope:
src/ — no code changes, including no deletion of reveal plumbing.PRIVACY.md, NOTICE.advisor/008-readme-rehydrationdocs(readme): describe placeholder rehydration as planned, not shippedReplace the README.md:32 bullet with:
- **Reversible placeholders (foundation).** Redaction keeps a per-conversation map from tokens like `[PERSON_1]` or `[SSN_1]` back to their real values, held only in extension memory. Automatic rehydration of model responses is not wired up yet — replies will show the placeholder tokens as-is.
Replace the README.md:65 bullet with:
- Model responses are not yet rehydrated: replies that reference redacted values show the placeholder tokens (e.g. `[PERSON_1]`) rather than the original text. The placeholder maps that would enable this are kept per conversation/tab and reset on navigation, tab close, or extension reload.
Verify: grep -n "rehydrate" README.md → both occurrences now describe
the feature as not-yet-wired.
Verify: git diff --name-only → exactly README.md (plus
plans/README.md once you update the status row).
Verify: npm test → all pass.
None — docs-only.
git diff --name-only shows only README.md and plans/README.mdnpm test exits 0plans/README.md status row updated