solidprivacy-nl commited on
Commit
5d879cc
·
1 Parent(s): 8707402

Record v13.6 two-mode UI skeleton implementation

Browse files
Files changed (1) hide show
  1. WORKPACKAGES.md +100 -198
WORKPACKAGES.md CHANGED
@@ -60,7 +60,7 @@ UI integration should therefore happen sequentially.
60
 
61
  ---
62
 
63
- ## Completed prerequisite
64
 
65
  ### WP0 — v12.3 stabilization check
66
 
@@ -75,21 +75,10 @@ Evidence:
75
  - Simplified review table working.
76
  - Technical details available in separate expander.
77
 
78
- ---
79
-
80
- ## Completed UI workpackages
81
-
82
  ### WP1 — v12.4 Review guidance text
83
 
84
  Status: completed.
85
 
86
- Outcome:
87
-
88
- - Review workflow guidance is visible.
89
- - Export semantics were not changed.
90
-
91
- ---
92
-
93
  ### WP2 — v12.5 Final review summary
94
 
95
  Status: completed and formally closed after verification.
@@ -105,9 +94,6 @@ Outcome:
105
 
106
  - The app shows `Eindcontrole vóór download` before downloads.
107
  - The summary is advisory and does not change export/download semantics.
108
- - v12.5 is complete.
109
-
110
- ---
111
 
112
  ### WP3 — v12.6 Export sanity checks
113
 
@@ -141,12 +127,6 @@ Implemented files:
141
  - `scrub_key.py`
142
  - `tests/test_scrub_key.py`
143
 
144
- Outcome:
145
-
146
- - v13.0 model/spec is complete.
147
-
148
- ---
149
-
150
  ### WP4B / WP4B-FIX — v13.1 Scrub Key JSON export UI and mapping hotfix
151
 
152
  Status: completed and app-verified.
@@ -156,12 +136,6 @@ Implemented files:
156
  - `fix_streamlit_nested_expanders.py`
157
  - `tests/test_scrub_key_ui_patch.py`
158
 
159
- Outcome:
160
-
161
- - v13.1 Scrub Key JSON export is complete and app-verified.
162
-
163
- ---
164
-
165
  ### WP5 — v13.2 Scrub Key import/reload helper and tests
166
 
167
  Status: completed.
@@ -171,12 +145,6 @@ Implemented files:
171
  - `scrub_key_import.py`
172
  - `tests/test_scrub_key_import.py`
173
 
174
- Outcome:
175
-
176
- - v13.2 helper layer was ready for UI integration and is now part of the completed v13.2 import/reload flow.
177
-
178
- ---
179
-
180
  ### WP6 — v13.2 Scrub Key import/reload UI integration
181
 
182
  Status: completed and app-verified.
@@ -186,12 +154,6 @@ Implemented files:
186
  - `fix_streamlit_nested_expanders.py`
187
  - `tests/test_scrub_key_import_ui_patch.py`
188
 
189
- Outcome:
190
-
191
- - v13.2 Scrub Key import/reload UI is completed, app-verified and closed.
192
-
193
- ---
194
-
195
  ### WP7A / WP7B / WP7B-FINAL — v13.3 Deterministic reinsert helper
196
 
197
  Status: completed and formally closed after Actions/sync verification.
@@ -201,14 +163,6 @@ Implemented files:
201
  - `scrub_key_reinsert.py`
202
  - `tests/test_scrub_key_reinsert.py`
203
 
204
- Outcome:
205
-
206
- - Added deterministic local `reinsert_from_scrub_key(text, scrub_key)`.
207
- - Helper reports audit fields and no-AI/no-cloud status.
208
- - v13.3 deterministic reinsert helper is completed and formally closed.
209
-
210
- ---
211
-
212
  ### WP8 — v13.3 Deterministic reinsert UI planning
213
 
214
  Status: implemented; reinsert UI implementation completed in WP8B and app-verified in WP8C.
@@ -220,12 +174,6 @@ Implemented files:
220
  - `CHANGELOG.md`
221
  - `handover/workpackages/20260607_1900_v13_3_reinsert_ui_planning.md`
222
 
223
- Outcome:
224
-
225
- - v13.3 deterministic reinsert UI was planned before implementation.
226
-
227
- ---
228
-
229
  ### WP8B / WP8C — v13.3 Deterministic reinsert UI implementation and app verification closeout
230
 
231
  Status: completed and app-verified after Actions/sync verification.
@@ -246,8 +194,6 @@ Outcome:
246
  - No AI calls, cloud processing, automatic document rehydration or DOCX/PDF reinsert were added.
247
  - Existing scrubbed export/download behavior was not changed.
248
 
249
- ---
250
-
251
  ### WP9 — AI-output / document reinsert workflow UX and architecture review
252
 
253
  Status: completed; review-only workpackage.
@@ -257,72 +203,30 @@ Added files:
257
  - `AI_OUTPUT_REINSERT_WORKFLOW_REVIEW.md`
258
  - `handover/workpackages/20260608_0000_ai_output_reinsert_workflow_review.md`
259
 
260
- Changed files:
261
-
262
- - `WORKPACKAGES.md`
263
- - `CHANGELOG.md`
264
-
265
  Outcome:
266
 
267
- - Pasted-text reinsert remains a safe baseline and fallback, but is not sufficient as the final legal-document workflow.
268
- - Recommended UX direction is a two-mode interface:
269
- - `Anonimiseren`;
270
- - `Originele waarden terugzetten`.
271
- - Recommended implementation sequence is phased:
272
- - keep pasted text;
273
- - add TXT upload/download reinsert;
274
- - add DOCX reinsert helper and tests;
275
- - add DOCX reinsert UI;
276
- - investigate PDF text extraction only;
277
- - consider PDF output only after reliability review.
278
- - Recommended architecture remains local-only, deterministic and helper-first.
279
-
280
- Validation:
281
-
282
- - Tests: not applicable; planning/review-only workpackage.
283
- - App verification: not applicable; no UI behavior changed.
284
-
285
- ---
286
 
287
  ### WP10 — v13.4 TXT/DOCX reinsert foundation helper and tests
288
 
289
  Status: implemented; awaiting coordinator verification of Actions/sync.
290
 
291
- Latest implementation commit checked by WP10B:
292
-
293
- ```text
294
- eb0c1ed2397ec1a4dc256d6e7e615ac4c026c0ee
295
- ```
296
-
297
  Added files:
298
 
299
  - `scrub_key_document_reinsert.py`
300
  - `tests/test_scrub_key_document_reinsert.py`
301
  - `handover/workpackages/20260608_0000_v13_4_txt_docx_reinsert_foundation.md`
302
 
303
- Changed files:
304
-
305
- - `WORKPACKAGES.md`
306
- - `CHANGELOG.md`
307
-
308
- Implemented helper behavior:
309
 
310
- - Added `reinsert_text_document(text, scrub_key)` for plain text document-level reinsert.
311
- - Added `reinsert_txt_bytes(content, scrub_key, encoding="utf-8")` for TXT bytes input/output.
312
- - Added `reinsert_docx_bytes(content, scrub_key)` for DOCX main-document text-node reinsert.
313
  - Reuses existing deterministic `reinsert_from_scrub_key(...)` logic.
314
- - Returns restored text / restored bytes plus audit summary fields.
315
- - Reports `document_type`, `local_only=True`, `ai_processing=False` and `cloud_processing=False`.
316
- - Keeps TXT/DOCX reinsert pure and side-effect free.
317
- - Does not mutate the input Scrub Key.
318
-
319
- DOCX foundation limitations:
320
-
321
- - Processes only `word/document.xml` text nodes.
322
- - Supports normal body paragraphs and tables in `word/document.xml`.
323
- - Does not restore placeholders split across multiple Word runs/text nodes.
324
- - Does not process headers, footers, comments, tracked changes or metadata.
325
- - Does not claim perfect formatting preservation.
326
 
327
  Validation status:
328
 
@@ -332,31 +236,7 @@ Validation status:
332
  - `PYTHONPATH=. pytest -q tests/test_scrub_key_document_reinsert.py` → 14 passed.
333
  - Local reconstructed full available subset:
334
  - `PYTHONPATH=. pytest -q` → 32 passed.
335
- - Repository clone via container was not possible because outbound GitHub DNS was unavailable, so validation was performed on reconstructed files from GitHub-fetched content plus the new helper/tests.
336
-
337
- WP10B verification / closeout status:
338
-
339
- - Commit metadata visible for `eb0c1ed2397ec1a4dc256d6e7e615ac4c026c0ee`.
340
- - GitHub combined commit status returned an empty status list.
341
- - GitHub workflow-runs query for the commit returned no visible workflow runs.
342
- - GitHub Actions: not visible through connector.
343
- - Hugging Face sync: not visible through connector.
344
- - App verification: not applicable; helper-only package and no UI behavior changed.
345
-
346
- Boundaries preserved:
347
-
348
- - No UI files changed.
349
- - No edit to `fix_streamlit_nested_expanders.py`.
350
- - No edit to `presidio_streamlit.py`.
351
- - No PDF reinsert implementation added.
352
- - No AI calls added.
353
- - No cloud processing added.
354
- - No automatic app document rehydration added.
355
- - Existing TXT, CSV, DOCX and PDF scrubbed export/download behavior was not changed.
356
- - Scrub Key JSON export/import behavior was not changed.
357
- - Synthetic test data only.
358
-
359
- ---
360
 
361
  ### WP10B — v13.4 TXT/DOCX reinsert foundation verification and closeout
362
 
@@ -366,19 +246,11 @@ Added files:
366
 
367
  - `handover/workpackages/20260608_0000_v13_4_txt_docx_reinsert_foundation_closeout.md`
368
 
369
- Changed files:
370
-
371
- - `WORKPACKAGES.md`
372
- - `CHANGELOG.md`
373
-
374
  Outcome:
375
 
376
  - WP10 closeout was performed without changing code.
377
  - Actions/sync could not be verified through connector-visible status data.
378
  - WP10 remains implemented and awaits coordinator verification of Actions/sync.
379
- - App verification is not applicable because WP10 added helper/test logic only and no UI behavior.
380
-
381
- ---
382
 
383
  ### WP11 — v13.5 Two-mode reinsert UI planning
384
 
@@ -389,79 +261,108 @@ Added files:
389
  - `TWO_MODE_UI_SPEC.md`
390
  - `handover/workpackages/20260608_0000_v13_5_two_mode_ui_planning.md`
391
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
392
  Changed files:
393
 
 
394
  - `WORKPACKAGES.md`
395
  - `CHANGELOG.md`
396
 
397
- Outcome:
398
 
399
- - Recommended moving Scrub to a two-mode interface:
 
400
  - `Anonimiseren`;
401
  - `Originele waarden terugzetten`.
402
- - Compared the current single-scroll workflow, Streamlit tabs, and a landing choice with two large cards/buttons.
403
- - Recommended Streamlit tabs or two clear mode panels as the first implementation step.
404
- - Recommended landing cards as the longer-term mature product direction, not the next patch-based step.
405
- - Specified the ideal user journey for `Anonimiseren`.
406
- - Specified the ideal user journey for `Originele waarden terugzetten`.
407
- - Planned TXT/DOCX reinsert UI phasing:
408
- - keep pasted text available;
409
- - add TXT upload/download UI after the mode skeleton is verified;
410
- - add DOCX upload/download UI later using WP10 helper;
411
- - keep PDF reinsert excluded until separate reliability review.
412
- - Reconfirmed local-only design, no AI calls, no cloud processing, no silent overwrite of review rows, no Scrub Key storage, and no export/download semantics changes.
413
-
414
- Validation:
415
-
416
- - Tests: not applicable; planning/specification-only workpackage.
417
- - App verification: not applicable; no UI behavior changed.
 
 
 
 
 
 
 
 
418
 
419
  Boundaries preserved:
420
 
421
- - No UI code changed.
422
- - No edit to `fix_streamlit_nested_expanders.py`.
423
- - No edit to `presidio_streamlit.py`.
424
- - No edit to `scrub_key_document_reinsert.py`.
425
- - No edit to `scrub_key_reinsert.py`.
426
- - No edit to `scrub_key.py`.
427
- - No edit to `scrub_key_import.py`.
428
- - No edit to `tests/*`.
429
- - No TXT/DOCX reinsert UI added.
430
  - No PDF reinsert added.
431
- - No AI/cloud behavior added.
432
- - No export/download behavior changed.
 
 
 
 
433
 
434
  ---
435
 
436
  ## Active / next recommended workpackage
437
 
438
- ### WP12 — v13.6 Two-mode UI skeleton and tab separation
439
 
440
- Status: recommended next implementation workpackage; not started here.
441
 
442
  Goal:
443
 
444
- - Implement the first two-mode UI structure with minimal risk.
445
- - Use Streamlit tabs or two clear mode panels:
446
- - `Anonimiseren`;
447
- - `Originele waarden terugzetten`.
448
- - Keep the existing anonymization workflow working.
449
- - Keep pasted-text reinsert available.
450
- - Keep Scrub Key export/import behavior unchanged.
451
- - Keep existing scrubbed TXT/CSV/DOCX/PDF downloads unchanged.
452
-
453
- Recommended scope:
454
-
455
- - UI skeleton/navigation only.
456
- - Move or present current anonymization workflow under `Anonimiseren` where feasible.
457
- - Move or present current Scrub Key load + pasted-text reinsert flow under `Originele waarden terugzetten` where feasible.
458
- - Add/adjust patch-level UI tests.
459
- - Ask for app verification because UI behavior changes.
460
- - Do not add TXT upload reinsert UI yet.
461
- - Do not add DOCX upload reinsert UI yet.
462
- - Do not add PDF reinsert.
463
- - Do not add AI/cloud behavior.
464
- - Do not change export/download semantics.
465
 
466
  Recommended later workpackages:
467
 
@@ -475,10 +376,11 @@ WP15 — PDF text extraction reliability review only
475
 
476
  ## Recommended execution order
477
 
478
- 1. Coordinator may still verify WP10 GitHub Actions and Hugging Face sync, because connector-visible status data was unavailable in WP10B.
479
- 2. Start WP12 as the first UI implementation step.
480
- 3. After WP12 is app-verified, implement TXT reinsert upload/download UI.
481
- 4. After TXT UI is verified, implement DOCX reinsert upload/download UI.
482
- 5. Keep PDF full reinsert out of scope until a separate reliability review.
483
- 6. Keep AI/cloud behavior out unless explicitly approved.
484
- 7. Preserve export/download and Scrub Key import/export semantics.
 
 
60
 
61
  ---
62
 
63
+ ## Completed prerequisite and UI workpackages
64
 
65
  ### WP0 — v12.3 stabilization check
66
 
 
75
  - Simplified review table working.
76
  - Technical details available in separate expander.
77
 
 
 
 
 
78
  ### WP1 — v12.4 Review guidance text
79
 
80
  Status: completed.
81
 
 
 
 
 
 
 
 
82
  ### WP2 — v12.5 Final review summary
83
 
84
  Status: completed and formally closed after verification.
 
94
 
95
  - The app shows `Eindcontrole vóór download` before downloads.
96
  - The summary is advisory and does not change export/download semantics.
 
 
 
97
 
98
  ### WP3 — v12.6 Export sanity checks
99
 
 
127
  - `scrub_key.py`
128
  - `tests/test_scrub_key.py`
129
 
 
 
 
 
 
 
130
  ### WP4B / WP4B-FIX — v13.1 Scrub Key JSON export UI and mapping hotfix
131
 
132
  Status: completed and app-verified.
 
136
  - `fix_streamlit_nested_expanders.py`
137
  - `tests/test_scrub_key_ui_patch.py`
138
 
 
 
 
 
 
 
139
  ### WP5 — v13.2 Scrub Key import/reload helper and tests
140
 
141
  Status: completed.
 
145
  - `scrub_key_import.py`
146
  - `tests/test_scrub_key_import.py`
147
 
 
 
 
 
 
 
148
  ### WP6 — v13.2 Scrub Key import/reload UI integration
149
 
150
  Status: completed and app-verified.
 
154
  - `fix_streamlit_nested_expanders.py`
155
  - `tests/test_scrub_key_import_ui_patch.py`
156
 
 
 
 
 
 
 
157
  ### WP7A / WP7B / WP7B-FINAL — v13.3 Deterministic reinsert helper
158
 
159
  Status: completed and formally closed after Actions/sync verification.
 
163
  - `scrub_key_reinsert.py`
164
  - `tests/test_scrub_key_reinsert.py`
165
 
 
 
 
 
 
 
 
 
166
  ### WP8 — v13.3 Deterministic reinsert UI planning
167
 
168
  Status: implemented; reinsert UI implementation completed in WP8B and app-verified in WP8C.
 
174
  - `CHANGELOG.md`
175
  - `handover/workpackages/20260607_1900_v13_3_reinsert_ui_planning.md`
176
 
 
 
 
 
 
 
177
  ### WP8B / WP8C — v13.3 Deterministic reinsert UI implementation and app verification closeout
178
 
179
  Status: completed and app-verified after Actions/sync verification.
 
194
  - No AI calls, cloud processing, automatic document rehydration or DOCX/PDF reinsert were added.
195
  - Existing scrubbed export/download behavior was not changed.
196
 
 
 
197
  ### WP9 — AI-output / document reinsert workflow UX and architecture review
198
 
199
  Status: completed; review-only workpackage.
 
203
  - `AI_OUTPUT_REINSERT_WORKFLOW_REVIEW.md`
204
  - `handover/workpackages/20260608_0000_ai_output_reinsert_workflow_review.md`
205
 
 
 
 
 
 
206
  Outcome:
207
 
208
+ - Recommended two-mode direction: `Anonimiseren` and `Originele waarden terugzetten`.
209
+ - Recommended keeping pasted-text reinsert as fallback.
210
+ - Recommended controlled TXT/DOCX phases before PDF.
211
+ - Recommended local-only, deterministic, helper-first architecture.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
 
213
  ### WP10 — v13.4 TXT/DOCX reinsert foundation helper and tests
214
 
215
  Status: implemented; awaiting coordinator verification of Actions/sync.
216
 
 
 
 
 
 
 
217
  Added files:
218
 
219
  - `scrub_key_document_reinsert.py`
220
  - `tests/test_scrub_key_document_reinsert.py`
221
  - `handover/workpackages/20260608_0000_v13_4_txt_docx_reinsert_foundation.md`
222
 
223
+ Outcome:
 
 
 
 
 
224
 
225
+ - Added `reinsert_text_document(text, scrub_key)`.
226
+ - Added `reinsert_txt_bytes(content, scrub_key, encoding="utf-8")`.
227
+ - Added `reinsert_docx_bytes(content, scrub_key)`.
228
  - Reuses existing deterministic `reinsert_from_scrub_key(...)` logic.
229
+ - No UI, PDF, AI, cloud, or export/download behavior change.
 
 
 
 
 
 
 
 
 
 
 
230
 
231
  Validation status:
232
 
 
236
  - `PYTHONPATH=. pytest -q tests/test_scrub_key_document_reinsert.py` → 14 passed.
237
  - Local reconstructed full available subset:
238
  - `PYTHONPATH=. pytest -q` → 32 passed.
239
+ - Repository clone via container was not possible because outbound GitHub DNS was unavailable.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
 
241
  ### WP10B — v13.4 TXT/DOCX reinsert foundation verification and closeout
242
 
 
246
 
247
  - `handover/workpackages/20260608_0000_v13_4_txt_docx_reinsert_foundation_closeout.md`
248
 
 
 
 
 
 
249
  Outcome:
250
 
251
  - WP10 closeout was performed without changing code.
252
  - Actions/sync could not be verified through connector-visible status data.
253
  - WP10 remains implemented and awaits coordinator verification of Actions/sync.
 
 
 
254
 
255
  ### WP11 — v13.5 Two-mode reinsert UI planning
256
 
 
261
  - `TWO_MODE_UI_SPEC.md`
262
  - `handover/workpackages/20260608_0000_v13_5_two_mode_ui_planning.md`
263
 
264
+ Outcome:
265
+
266
+ - Recommended moving Scrub to a two-mode interface:
267
+ - `Anonimiseren`;
268
+ - `Originele waarden terugzetten`.
269
+ - Compared current single-scroll workflow, Streamlit tabs, and landing cards.
270
+ - Recommended Streamlit tabs or clear mode panels as first implementation.
271
+ - Recommended landing cards as longer-term product direction.
272
+ - Planned TXT/DOCX reinsert UI phasing and kept PDF out of implementation scope.
273
+
274
+ ---
275
+
276
+ ## Current implementation workpackage
277
+
278
+ ### WP12 — v13.6 Two-mode UI skeleton and tab separation
279
+
280
+ Status: implemented; awaiting GitHub Actions, Hugging Face sync and app verification.
281
+
282
+ Added files:
283
+
284
+ - `tests/test_two_mode_ui_patch.py`
285
+ - `handover/workpackages/20260608_0000_v13_6_two_mode_ui_skeleton.md`
286
+
287
  Changed files:
288
 
289
+ - `fix_streamlit_nested_expanders.py`
290
  - `WORKPACKAGES.md`
291
  - `CHANGELOG.md`
292
 
293
+ Implemented behavior:
294
 
295
+ - Added a minimal two-mode UI skeleton through the existing startup patch flow.
296
+ - Adds visible Streamlit tabs near the top of the app:
297
  - `Anonimiseren`;
298
  - `Originele waarden terugzetten`.
299
+ - Adds short captions that explain the privacy intent of each mode.
300
+ - Keeps the existing anonymization/scrub workflow available.
301
+ - Keeps existing Scrub Key export/import labels available.
302
+ - Keeps existing pasted-text reinsert workflow available.
303
+ - Keeps existing scrubbed TXT/CSV/DOCX/PDF downloads unchanged.
304
+
305
+ Validation status:
306
+
307
+ - Added `tests/test_two_mode_ui_patch.py` with patch-level checks for:
308
+ - mode labels;
309
+ - Streamlit tabs;
310
+ - existing Scrub Key export/import labels;
311
+ - existing pasted-text reinsert labels;
312
+ - existing scrubbed download markers;
313
+ - no TXT upload reinsert UI;
314
+ - no DOCX upload reinsert UI;
315
+ - no PDF reinsert;
316
+ - no AI/cloud/rehydration behavior;
317
+ - no direct alteration of `apply_replacements_to_text`.
318
+ - Local clone/test run could not be performed in the container because outbound GitHub DNS failed:
319
+ - `Could not resolve host: github.com`.
320
+ - GitHub Actions: awaiting verification.
321
+ - Hugging Face sync: awaiting verification.
322
+ - App verification: required because UI behavior changed.
323
 
324
  Boundaries preserved:
325
 
326
+ - `presidio_streamlit.py` was not directly edited.
327
+ - No TXT upload reinsert UI added.
328
+ - No DOCX upload reinsert UI added.
 
 
 
 
 
 
329
  - No PDF reinsert added.
330
+ - No AI calls added.
331
+ - No cloud processing added.
332
+ - No automatic document rehydration added.
333
+ - No existing scrubbed export/download semantics intentionally changed.
334
+ - No Scrub Key export/import behavior intentionally changed.
335
+ - No secrets, tokens or real personal data stored.
336
 
337
  ---
338
 
339
  ## Active / next recommended workpackage
340
 
341
+ ### WP12B — v13.6 Two-mode UI skeleton app verification closeout
342
 
343
+ Status: recommended next closeout workpackage after coordinator evidence.
344
 
345
  Goal:
346
 
347
+ - Verify GitHub Actions tests.
348
+ - Verify GitHub to Hugging Face sync.
349
+ - Verify the Hugging Face app UI.
350
+ - Close WP12 only after evidence shows the UI still works.
351
+
352
+ Required app verification:
353
+
354
+ - `Anonimiseren` mode is visible.
355
+ - `Originele waarden terugzetten` mode is visible.
356
+ - Anonymization workflow still works.
357
+ - Review table still appears.
358
+ - Scrub Key JSON export still appears.
359
+ - Scrub Key import/reload still appears.
360
+ - Pasted-text reinsert still works.
361
+ - `Download herstelde tekst (.txt)` still works.
362
+ - Existing scrubbed TXT/CSV/DOCX/PDF downloads remain available.
363
+ - No TXT/DOCX upload reinsert UI appears yet.
364
+ - No PDF reinsert appears.
365
+ - No AI/cloud behavior appears.
 
 
366
 
367
  Recommended later workpackages:
368
 
 
376
 
377
  ## Recommended execution order
378
 
379
+ 1. Verify WP12 GitHub Actions and Hugging Face sync.
380
+ 2. Verify the Hugging Face app for the two-mode skeleton.
381
+ 3. Close WP12 through WP12B if verification is green.
382
+ 4. After WP12 is app-verified, implement TXT reinsert upload/download UI.
383
+ 5. After TXT UI is verified, implement DOCX reinsert upload/download UI.
384
+ 6. Keep PDF full reinsert out of scope until a separate reliability review.
385
+ 7. Keep AI/cloud behavior out unless explicitly approved.
386
+ 8. Preserve export/download and Scrub Key import/export semantics.