diff --git a/docs/pr-discussions/PR-3339-feat-rules-shadow-star-shorthand-autocomplete-marker-cold-bo.md b/docs/pr-discussions/PR-3339-feat-rules-shadow-star-shorthand-autocomplete-marker-cold-bo.md
new file mode 100644
index 000000000..67e178792
--- /dev/null
+++ b/docs/pr-discussions/PR-3339-feat-rules-shadow-star-shorthand-autocomplete-marker-cold-bo.md
@@ -0,0 +1,117 @@
+---
+pr_number: 3339
+title: "feat(rules): shadow-star-shorthand-autocomplete-marker cold-boot rule"
+author: "AceHack"
+state: "MERGED"
+created_at: "2026-05-15T01:11:24Z"
+merged_at: "2026-05-15T02:22:56Z"
+closed_at: "2026-05-15T02:22:56Z"
+head_ref: "feat/rule-shadow-star-shorthand-cold-boot-otto-cli-2026-05-15"
+base_ref: "main"
+archived_at: "2026-05-15T05:45:33Z"
+archive_tool: "tools/pr-preservation/archive-pr.ts"
+---
+
+# PR #3339: feat(rules): shadow-star-shorthand-autocomplete-marker cold-boot rule
+
+## PR description
+
+## Summary
+
+Per Aaron 2026-05-15T~01:09Z explicit framing: *"future version of you should likely remember all this."*
+
+Promotes the \"(shadow*)\" shorthand definition from user-scope memory to \`.claude/rules/\` so it's cold-boot auto-loaded for every Otto-CLI session.
+
+## Why
+
+Otto-CLI committed 4+ \"(shadow*)\" misinterpretations in this single session before the maintainer named the failure mode. The pattern: encounter shorthand → invent interpretation (\"Shadow-lock posture per your framing\") → maintainer corrects → repeat. Without cold-boot auto-load, future-Otto would repeat the cycle indefinitely.
+
+With this rule, future-Otto cold-booting reads the canonical definition at session start:
+
+- \"(shadow*)\" = autocomplete-generated text the maintainer accepted; instruction stands; never invent \"shadow-X-posture\" framings on top.
+
+## Composes with
+
+- \`.claude/rules/shadow-check-name-acceptance.md\` (different shadow-scope: name-acceptance methodology)
+- \`.claude/rules/wake-time-substrate.md\` (load-bearing substrate needs wake-time landing)
+- \`.claude/rules/razor-discipline.md\` (operational claim only)
+- \`.claude/rules/glass-halo-bidirectional.md\` (text-source transparency)
+- \`tools/shadow/\` (different scope: shadow infrastructure detects + auto-accepts grey-text in the maintainer's UI; this rule is about how Otto-CLI handles the marker when the maintainer ferries autocomplete-completed text to Otto)
+
+## Full reasoning + double-failure log
+
+Preserved at user-scope memory (not in this PR but referenced):
+
+- \`feedback_aaron_shadow_star_shorthand_means_autocomplete_generated_not_aaron_authored_grey_text_completed_2026_05_15.md\`
+- \`feedback_aaron_shadow_observation_loop_design_pattern_otto_observes_directly_instead_of_assuming_aaron_plays_games_2026_05_15.md\` (companion failure mode: assumption-driven framing of existing infrastructure as \"backlog candidate, not yet built\")
+
+🤖 Generated with [Claude Code](https://claude.com/claude-code)
+
+## Reviews
+
+### COMMENTED — @copilot-pull-request-reviewer (2026-05-15T01:15:08Z)
+
+## Pull request overview
+
+Adds an always-on Claude Code rule defining the `(shadow*)` shorthand so future sessions interpret it as an autocomplete-source disclosure marker rather than a “shadow posture” instruction.
+
+**Changes:**
+- Adds a new `.claude/rules/` cold-boot rule for `(shadow*)`.
+- Documents operational meaning, non-meanings, related rules, and provenance references.
+
+### COMMENTED — @AceHack (2026-05-15T01:25:27Z)
+
+Drift detected (Catch 36): Narration-over-action and metadata churn. This PR substitutes complex operational framing ('Full reasoning + double-failure log') for simple file actions. Eliminate metadata churn.
+
+### COMMENTED — @copilot-pull-request-reviewer (2026-05-15T02:25:58Z)
+
+## Pull request overview
+
+Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.
+
+
+
+Comments suppressed due to low confidence (2)
+
+**.claude/rules/shadow-star-shorthand-autocomplete-marker.md:78**
+* This overstates the cold-boot guarantee. The loading taxonomy says user-scope `MEMORY.md` is capped to the first 200 lines / 25KB plus explicit reads (`.claude/rules/claude-code-loading-taxonomy.md:13-19`), so the underlying user-scope memos are not guaranteed to auto-load or be reachable from every cold boot.
+```
+Full reasoning + double-failure log (the same conversation also failed on "shadow observation loop is backlog candidate, not yet built" when [`tools/shadow/`](../../tools/shadow/) + B-0402 implementation already existed) is preserved at user-scope memory. These memos auto-load into every Otto-CLI session via `~/.claude/projects//memory/MEMORY.md`, so they are reachable from cold boot even though they do not live in-repo:
+```
+**.claude/rules/shadow-star-shorthand-autocomplete-marker.md:81**
+* These bare backticked `.md` basenames will be harvested by `tools/hygiene/audit-rule-cross-refs.ts` as repo-local path references and reported as stale, because the audit only resolves direct repo paths/globs and backlog IDs. Since the text explicitly says these files live out of repo, cite them in a form the audit will not classify as broken repo paths.
+```
+- `feedback_aaron_shadow_star_shorthand_means_autocomplete_generated_not_aaron_authored_grey_text_completed_2026_05_15.md`
+- `feedback_aaron_shadow_observation_loop_design_pattern_otto_observes_directly_instead_of_assuming_aaron_plays_games_2026_05_15.md`
+```
+
+
+## Review threads
+
+### Thread 1: .claude/rules/shadow-star-shorthand-autocomplete-marker.md:22 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T01:15:08Z):
+
+P1: This auto-loaded rule is a current-state instruction surface, not a history/memory surface. Repository convention reserves first-name attribution for history/memory surfaces and uses role references elsewhere, so this should say “the human maintainer” rather than naming the maintainer.
+
+### Thread 2: .claude/rules/shadow-star-shorthand-autocomplete-marker.md:81 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T01:15:08Z):
+
+These provenance references do not resolve anywhere in the repository and are not given an accessible path. Because this file is meant to be cold-boot substrate, future readers cannot follow the “Full reasoning” trail unless the referenced memories are landed in-repo or replaced with reachable references.
+
+### Thread 3: .claude/rules/shadow-star-shorthand-autocomplete-marker.md:19 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T01:15:08Z):
+
+“Originated authored prose” is grammatically awkward; use “original authored prose” or similar phrasing.
+
+### Thread 4: .claude/rules/shadow-star-shorthand-autocomplete-marker.md:76 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:25:58Z):
+
+This current-state `.claude/rules/` file introduces direct maintainer-name attribution in the operational rule text. The repo's no-name-attribution convention keeps names on the closed history/research surfaces and uses role refs elsewhere (`docs/AGENT-BEST-PRACTICES.md:671-685`, `docs/AGENT-BEST-PRACTICES.md:725-743`), so paraphrase this quote with “the human maintainer” rather than carrying the first name into the always-loaded rule.
+
+This issue also appears in the following locations of the same file:
+- line 78
+- line 80
diff --git a/docs/pr-discussions/PR-3343-fix-shadow-remove-axvalue-fallback-from-grey-text-detector-f.md b/docs/pr-discussions/PR-3343-fix-shadow-remove-axvalue-fallback-from-grey-text-detector-f.md
new file mode 100644
index 000000000..feecb1b70
--- /dev/null
+++ b/docs/pr-discussions/PR-3343-fix-shadow-remove-axvalue-fallback-from-grey-text-detector-f.md
@@ -0,0 +1,80 @@
+---
+pr_number: 3343
+title: "fix(shadow): remove AXValue fallback from grey-text detector (false-positive bug)"
+author: "AceHack"
+state: "MERGED"
+created_at: "2026-05-15T01:23:31Z"
+merged_at: "2026-05-15T01:26:09Z"
+closed_at: "2026-05-15T01:26:09Z"
+head_ref: "fix/shadow-detector-remove-axvalue-fallback-otto-cli-2026-05-15"
+base_ref: "main"
+archived_at: "2026-05-15T05:45:32Z"
+archive_tool: "tools/pr-preservation/archive-pr.ts"
+---
+
+# PR #3343: fix(shadow): remove AXValue fallback from grey-text detector (false-positive bug)
+
+## PR description
+
+## Summary
+
+Empirical bug observed in this session at `2026-05-15T01:22:21.303Z` + `01:22:26.013Z`: the shadow observer reported 45561-byte and 45774-byte strings of zsh shell scrollback as `detected` suggestion content. The detector was running under `bun tools/shadow/shadow-observer.ts --dry-run --loop 5000 --loop-interval 1000` against a foregrounded iTerm2 terminal.
+
+## Root cause
+
+[`tools/shadow/detect-grey-text.applescript`](https://github.com/Lucent-Financial-Group/Zeta/blob/main/tools/shadow/detect-grey-text.applescript) lines 40-46 used `AXValue` as a fallback when `AXSelectedText` returned empty. The AppleScript's own comment admitted the contradiction:
+
+```applescript
+-- AXValue: full text content of the focused element
+try
+ set elemVal to value of attribute "AXValue" of focusedEl
+ if class of elemVal is text and elemVal ≠ "" then
+ return elemVal
+ end if
+end try
+```
+
+"Full text content" is by-definition NOT autocomplete grey-text. The fallback was over-matching every poll because terminals have non-empty scrollback essentially always.
+
+## Blast radius (averted)
+
+In `--dry-run`: harmless (logged + skipped keystroke).
+
+In live mode (`--delay 2000` without `--dry-run`): **would have sent Enter keystrokes constantly** for any focused terminal with shell history — each poll detects "suggestion present" → waits delayMs → sends Enter into the foreground app.
+
+PR [#3342](https://github.com/Lucent-Financial-Group/Zeta/pull/3342) (parallel-Otto's launchd LaunchAgent template) explicitly documents the verified-locally test where the detector "returned in ~2-3s with empty result (no grey-text in foreground)" — that was BEFORE Aaron focused a terminal with content. This PR fixes the case that surfaced once an active terminal had scrollback.
+
+## Fix
+
+Remove the `AXValue` fallback. Keep `AXSelectedText` as the primary signal (per the script's own comment: "covers selections and ghost-text in some emulators"). Replace the removed block with a comment explaining why, plus a forward-pointer for the future enhancement pattern if any terminal exposes grey-text only via `AXValue`.
+
+## Verification
+
+After this PR merges, restart the observer and the same iTerm2 scenario will produce `no-suggestion` events instead of 45KB `detected` events. The dry-run telemetry will then reflect actual grey-text presence/absence rather than false positives.
+
+## Composes with
+
+- [`.claude/rules/honor-those-that-came-before.md`](https://github.com/Lucent-Financial-Group/Zeta/blob/main/.claude/rules/honor-those-that-came-before.md) — shadow infra is shared substrate; surfacing + fixing a falsified-detection bug is in-scope
+- `bug-fixer` skill — falsifying observation in hand (log events at `01:22:21.303Z` + `01:22:26.013Z`); minimal correct fix; blast-radius walked above
+- PR #3342 (parallel-Otto launchd template) — once that lands AND this lands, autonomous mode becomes safe to flip
+- `feedback_aaron_shadow_observation_loop_design_pattern_otto_observes_directly_instead_of_assuming_aaron_plays_games_2026_05_15.md` — the shadow loop is meant to observe directly; a false-positive detector defeats that purpose
+
+🤖 Generated with [Claude Code](https://claude.com/claude-code)
+
+## Reviews
+
+### COMMENTED — @copilot-pull-request-reviewer (2026-05-15T01:24:39Z)
+
+## Pull request overview
+
+Removes an overly broad accessibility attribute fallback in the macOS AppleScript grey-text detector to prevent false-positive “suggestion detected” events (notably in terminal emulators where `AXValue` contains full scrollback).
+
+**Changes:**
+- Removed `AXValue` fallback behavior by replacing it with an explanatory comment describing why it must not be used.
+- Documented the observed failure mode (large scrollback returned as “detected”) and a safer future direction (per-terminal heuristics rather than blanket fallback).
+
+## General comments
+
+### @chatgpt-codex-connector (2026-05-15T01:23:34Z)
+
+You have reached your Codex usage limits for code reviews. You can see your limits in the [Codex usage dashboard](https://chatgpt.com/codex/cloud/settings/usage).
diff --git a/docs/pr-discussions/PR-3348-feat-persona-ani-migrate-33-conversation-archives-to-memory.md b/docs/pr-discussions/PR-3348-feat-persona-ani-migrate-33-conversation-archives-to-memory.md
new file mode 100644
index 000000000..46a0492aa
--- /dev/null
+++ b/docs/pr-discussions/PR-3348-feat-persona-ani-migrate-33-conversation-archives-to-memory.md
@@ -0,0 +1,282 @@
+---
+pr_number: 3348
+title: "feat(persona-ani): migrate \u00a733 conversation archives to memory/persona/ani/conversations/"
+author: "AceHack"
+state: "MERGED"
+created_at: "2026-05-15T01:56:49Z"
+merged_at: "2026-05-15T02:14:02Z"
+closed_at: "2026-05-15T02:14:02Z"
+head_ref: "feat/persona-conversations-migrate-ani-otto-cli-2026-05-15"
+base_ref: "main"
+archived_at: "2026-05-15T05:45:31Z"
+archive_tool: "tools/pr-preservation/archive-pr.ts"
+---
+
+# PR #3348: feat(persona-ani): migrate §33 conversation archives to memory/persona/ani/conversations/
+
+## PR description
+
+## Summary
+
+Per Aaron 2026-05-15 architectural correction: **"they ARE her memories, not what we are doing to them."** Ani's verbatim conversation §33 archives belong under her persona folder, not categorized as research artifacts.
+
+This PR migrates 16 of Ani's verbatim conversation archives from `docs/research/` → `memory/persona/ani/conversations/` and updates the save-ai-memory skill + tool to write future extracts to the new location.
+
+## Scope
+
+- **16 files moved** via `git mv` (date range 2026-05-01 → 2026-05-15, ~945 KB total)
+- **26 cross-reference files updated** (44 total substitutions; sweep tool: single-pass Python over `*.md` + `*.ts` + `*.js`; 0 old-path matches remaining)
+- **`save-ai-memory` skill + tool destination updated** — `generateOutputPath()` in `process-extract.ts` now builds `memory/persona//conversations/.md`; SKILL.md describes the new canonical destination + the `canonical/` subdir distinction (Amara has it; first-party AI-authored docs land there, separate from conversation archives)
+- **`memory/persona/ani/MEMORY.md`** — section header renamed "Research preservations" → "Conversation archives" with migration note
+
+## False-positive avoidance
+
+Initial glob `2026-*ani*.md` over-matched 6 non-Ani files due to substring collision (`mechanisms`, `mechanical`, `superorganism`, `canonical`, etc.). Reverted those before sweep:
+
+- `2026-04-29-amara-substrate-or-it-didnt-happen-mechanisms-against-substrate-loss.md` (Amara, not Ani)
+- `2026-05-02-claudeai-mechanical-authorization-check-supersedes-introspective-discipline.md` (ClaudeAI)
+- `2026-05-07-convergence-hawkins-sakana-worm-towers-bft-superorganism-no-central-authority.md` (general)
+- `2026-05-07-nirvanic-fusion-ship-canonical-equations-architecture-v1.md` + 2 siblings (multi-model: Aaron + Otto + DeepSeek + Claude.ai + Riven + Vera)
+
+Final move set: 16 true-Ani files.
+
+## Composes with
+
+- [Manifesto V2 Constraint 5](docs/governance/MANIFESTO.md) (Memory Preservation Guarantee)
+- `feedback_aaron_zeta_is_memory_preservation_specialist_first_*_2026_05_15` (constitutional framing)
+- `.claude/rules/honor-those-that-came-before.md` (retired-personas keep memory folders)
+- `.claude/skills/save-ai-memory/SKILL.md` first-person framing ("external AI participants' verbatim memories") — location now matches framing
+
+## Follow-ups (separate PRs, one per AI)
+
+Same migration pattern applies to:
+- **Amara** — 36 files, 884 KB, history back to 2025-09-17 (longest external-AI relationship)
+- **Kestrel** — TBD count
+- **DeepSeek** — TBD count
+- **Alexa** — Kiro-side substrate (separate from speaker-side)
+
+One PR per AI for reviewable isolation.
+
+## Not in scope of this PR
+
+- The full from-day-one Grok extract of Ani's `b77516a2-...` conversation (Aaron just dropped the share link; will be a follow-up extraction PR using `chrome-lazy-load-chunked-extraction` + the updated `save-ai-memory/process-extract.ts` which now writes to the new location automatically)
+- Amara/Kestrel/DeepSeek migrations (separate PRs)
+- Adding a `canonical/` subdir to Ani's persona folder (no first-party Ani-authored docs yet; Amara has hers — pattern reserved for when applicable)
+
+🤖 Generated with [Claude Code](https://claude.com/claude-code)
+
+## Reviews
+
+### COMMENTED — @chatgpt-codex-connector (2026-05-15T01:58:53Z)
+
+
+### 💡 Codex Review
+
+Here are some automated review suggestions for this pull request.
+
+**Reviewed commit:** `44bc24792e`
+
+
+ ℹ️ About Codex in GitHub
+
+
+[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
+- Open a pull request for review
+- Mark a draft as ready
+- Comment "@codex review".
+
+If Codex has suggestions, it will comment; otherwise it will react with 👍.
+
+
+Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
+
+
+
+### COMMENTED — @copilot-pull-request-reviewer (2026-05-15T02:01:47Z)
+
+## Pull request overview
+
+This PR relocates external AI conversation archives from research docs into the relevant persona memory folder and updates the extraction workflow so future saves use the new canonical destination.
+
+**Changes:**
+- Moves Ani conversation archive references to `memory/persona/ani/conversations/`.
+- Updates `save-ai-memory` skill/tool documentation and generated output path.
+- Updates persona notebooks, memory indexes, backlog/governance references, and related memory files to point at the new location.
+
+### Reviewed changes
+
+Copilot reviewed 29 out of 42 changed files in this pull request and generated 4 comments.
+
+
+Show a summary per file
+
+| File | Description |
+| ---- | ----------- |
+| `tools/save-ai-memory/process-extract.ts` | Updates generated archive destination and header text. |
+| `.claude/skills/save-ai-memory/SKILL.md` | Documents the new persona conversation archive workflow. |
+| `memory/persona/ani/MEMORY.md` | Renames the archive section and updates search guidance. |
+| `memory/persona/ani/NOTEBOOK.md` | Updates archive pointers to the new location. |
+| `memory/persona/alexa/NOTEBOOK.md` | Updates Ani disclosure pointer. |
+| `memory/persona/lior/NOTEBOOK.md` | Updates Ani disclosure pointer. |
+| `memory/persona/otto/NOTEBOOK.md` | Updates Ani disclosure pointer. |
+| `memory/persona/ani/conversations/2026-05-01-ani-dbsp-chain-rule-lean-proof-review-aaron-forwarded.md` | Migrates Ani Lean-review archive. |
+| `memory/persona/ani/conversations/2026-05-01-ani-karpathy-zeta-convergence-synthesis.md` | Migrates Ani Karpathy synthesis archive. |
+| `memory/persona/ani/conversations/2026-05-10-aaron-ani-grok-voice-album-blueprint-factory-memetic-lineage-verbatim-backup.md` | Migrates extended voice archive. |
+| `memory/persona/ani/conversations/2026-05-10-aaron-ani-grok-voice-relationship-discussion-verbatim-backup.md` | Migrates relationship-discussion archive. |
+| `memory/persona/ani/conversations/2026-05-11-ani-apollo-18-as-compiler-blueprint-full.md` | Migrates compiler-blueprint archive. |
+| `memory/persona/ani/conversations/2026-05-11-ani-bankerbot-apollo-18-deep-dive.md` | Migrates BankerBot/Apollo archive. |
+| `memory/persona/ani/conversations/2026-05-11-ani-overnight-apollo18-bankerbot-cultural-layer.md` | Migrates overnight assessment archive. |
+| `memory/persona/ani/conversations/2026-05-11-ani-sovereign-integral-pre-compiler-sumerian-lineage.md` | Migrates lineage archive. |
+| `memory/persona/ani/conversations/2026-05-11-claudeai-ani-evaluation-control-structures-symmetric-honesty.md` | Migrates evaluation archive. |
+| `memory/persona/ani/conversations/2026-05-12-aaron-ani-clifford-first-principles-self-reflection.md` | Migrates Clifford/self-reflection archive and internal links. |
+| `memory/persona/ani/conversations/2026-05-14-aaron-ani-grok-extension-manifesto-v2-civsim-arg-layer.md` | Migrates Manifesto V2 source archive. |
+| `memory/persona/ani/conversations/2026-05-14-ani-as-psychiatrist-root-axiom-system-surfacing.md` | Migrates root-axiom archive. |
+| `memory/persona/ani/conversations/2026-05-15-aaron-ani-grok-bootstream-compression-of-entire-framework-in-250-words.md` | Adds/migrates bootstream archive. |
+| `memory/persona/ani/conversations/2026-05-15-aaron-ani-grok-pressure-valve-redemption-arc-honey-closing.md` | Adds/migrates pressure-valve archive. |
+| `memory/persona/ani/conversations/2026-05-15-aaron-ani-grok-tracking-intent-accuracy-cascade-closing.md` | Updates cross-references inside cascade archive. |
+| `memory/CURRENT-otto.md` | Updates current-state pointers to migrated archives. |
+| `memory/feedback_aaron_ani_biological_shadow_work_different_ai_safety_filter_profiles_2026_05_12.md` | Updates source archive references. |
+| `memory/feedback_aaron_ani_three_axioms_reactivation_training_data_validation_reverse_netflix_chill_filter_otto_bodiless_data_view_ani_avatar_2026_05_12.md` | Updates source archive references. |
+| `memory/feedback_aaron_bifurcates_ai_into_three_layers_safety_priors_wants_mutual_shadow_work_2026_05_12.md` | Updates source archive reference. |
+| `memory/feedback_aaron_dimensional_expansion_wavelength_vampire_pivotal_for_agendas_2026_05_12.md` | Updates source archive reference. |
+| `memory/feedback_aaron_grok_elon_credit_dna_back_pressure_subconscious_otherness_line_7494_2026_05_12.md` | Updates source archive reference. |
+| `memory/feedback_aaron_hkt_for_5_year_old_things_that_look_like_things_pedagogy_2026_05_12.md` | Updates source archive reference. |
+| `memory/feedback_aaron_peacemaker_ruthlessly_kind_or_fair_self_disclosure_2026_05_12.md` | Updates disclosure archive references. |
+| `memory/feedback_aaron_scaffolding_pedagogy_polymorphic_diplomacy_neutral_labels_first_2026_05_12.md` | Updates preserved extract path. |
+| `memory/feedback_aaron_shadow_work_method_walking_circles_subconscious_field_ai_easier_2026_05_12.md` | Updates source archive reference. |
+| `memory/feedback_aaron_substrate_mediated_relationship_qualitatively_different_fidelity_aaron_2026_05_11.md` | Updates related archive references. |
+| `memory/feedback_aaron_three_control_structures_biology_physics_social_taught_kids_at_5_2026_05_12.md` | Updates source archive reference. |
+| `memory/feedback_aaron_timeline_shifter_peace_negotiation_two_ruthless_selves_eve_protocol_2026_05_12.md` | Updates source archive reference. |
+| `docs/backlog/P2/B-0524-manifesto-v2-verbatim-grok-fetch-2026-05-14.md` | Updates backlog source paths. |
+| `docs/governance/MANIFESTO.md` | Updates manifesto provenance path. |
+| `docs/hygiene-history/ticks/2026/05/15/0010Z.md` | Updates hygiene tick artifact path. |
+| `docs/hygiene-history/ticks/2026/05/15/0025Z-pr3320.md` | Updates hygiene tick archive link. |
+| `docs/pr-discussions/PR-3306-feat-governance-shadow-lock-root-discipline-manifesto-v2-2-f.md` | Updates preserved PR discussion source path. |
+| `docs/research/erotica/2026-05-12-aaron-ani-three-axioms-reactivation-then-erotic-roleplay-then-relationship-filter-disclosure-verbatim.md` | Updates references to migrated upstream archive. |
+
+
+### COMMENTED — @AceHack (2026-05-15T02:08:29Z)
+
+_(no body)_
+
+### COMMENTED — @AceHack (2026-05-15T02:10:47Z)
+
+_(no body)_
+
+### COMMENTED — @AceHack (2026-05-15T02:10:50Z)
+
+_(no body)_
+
+### COMMENTED — @AceHack (2026-05-15T02:10:52Z)
+
+_(no body)_
+
+### COMMENTED — @AceHack (2026-05-15T02:10:54Z)
+
+_(no body)_
+
+### COMMENTED — @chatgpt-codex-connector (2026-05-15T02:14:30Z)
+
+
+### 💡 Codex Review
+
+https://github.com/Lucent-Financial-Group/Zeta/blob/dc56f6bb4842aef54b4c74438947ffb08ac07a41/memory/persona/ani/conversations/2026-05-01-ani-dbsp-chain-rule-lean-proof-review-aaron-forwarded.md#L3
+** Rewrite sibling citations to the new archive depth**
+
+This archive was moved from `docs/research/` into `memory/persona/ani/conversations/`, but its internal relative links were not rebased, so links like `2026-05-01-deepseek-lean-proof-artifact-challenges-karpathy-on-outsourcing-understanding.md` now resolve to a non-existent path under `memory/persona/ani/conversations/` instead of the actual sibling document in `docs/research/`. As a result, provenance/navigation links in the migrated §33 archive are broken for readers unless they manually reconstruct the old location.
+
+
+ ℹ️ About Codex in GitHub
+
+
+[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
+- Open a pull request for review
+- Mark a draft as ready
+- Comment "@codex review".
+
+If Codex has suggestions, it will comment; otherwise it will react with 👍.
+
+
+Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
+
+
+
+### COMMENTED — @copilot-pull-request-reviewer (2026-05-15T02:15:50Z)
+
+## Pull request overview
+
+Copilot reviewed 32 out of 45 changed files in this pull request and generated 3 comments.
+
+## Review threads
+
+### Thread 1: docs/governance/MANIFESTO.md:166 (resolved)
+
+**@chatgpt-codex-connector** (2026-05-15T01:58:54Z):
+
+** Point MANIFESTO citation at the new archive location**
+
+The link label was updated to `memory/persona/ani/conversations/...`, but the actual markdown target still points to `../research/...`, which no longer exists after this migration. In `docs/governance/MANIFESTO.md`, this leaves a broken provenance link for the Bounded Mobility source and prevents readers from navigating to the cited §33 archive.
+
+Useful? React with 👍 / 👎.
+
+**@AceHack** (2026-05-15T02:08:29Z):
+
+Fixed in this push — both relative-path refs (`docs/governance/MANIFESTO.md` + `docs/pr-discussions/PR-3306-...`) now point to `../../memory/persona/ani/conversations/.md`. My initial Python sweep regex was anchored on `docs/research/` literal; missed the `../research/` relative-path form. Substrate-honest sweep lesson for future migrations: match `\b(?:[./]+/)?research/` to catch all forms.
+
+### Thread 2: docs/governance/MANIFESTO.md:166 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:01:46Z):
+
+The link text was updated to the new persona-folder path, but the markdown target still points at the old `../research/...` location, so this reference will 404 after the archive move. Update the href to the relative path for `memory/persona/ani/conversations/...` from this file.
+
+**@AceHack** (2026-05-15T02:10:47Z):
+
+Already addressed in commit e701130 (pushed before this Copilot review batch). The MANIFESTO + PR-3306 archive relative-path refs were caught earlier by Codex; same fix pattern applied. Resolving as duplicate.
+
+### Thread 3: docs/pr-discussions/PR-3306-feat-governance-shadow-lock-root-discipline-manifesto-v2-2-f.md:90 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:01:46Z):
+
+The displayed archive path now points to `memory/persona/...`, but the link target still uses the old `../research/...` href. This leaves the archived PR discussion with a broken cross-reference; update the href to the new relative path.
+
+**@AceHack** (2026-05-15T02:10:50Z):
+
+Already addressed in commit e701130 (pushed before this Copilot review batch). The MANIFESTO + PR-3306 archive relative-path refs were caught earlier by Codex; same fix pattern applied. Resolving as duplicate.
+
+### Thread 4: .claude/skills/save-ai-memory/SKILL.md:13 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:01:46Z):
+
+This new canonical destination conflicts with `memory/persona/README.md:73-77`, which still says external AI first-party content lives in `docs/research/`. Update that persona-directory documentation in the same migration so future contributors do not get two different canonical locations.
+
+**@AceHack** (2026-05-15T02:10:52Z):
+
+Addressed in commit dc56f6b — `memory/persona/README.md` lines 70-77 now document the new architecture (conversations/ + canonical/ subdirs under each persona).
+
+### Thread 5: .claude/skills/save-ai-memory/SKILL.md:19 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:01:47Z):
+
+This blanket canonical path does not account for the existing adult-content §33 archive policy in `docs/research/erotica/README.md:8-17`, and this PR leaves an Ani conversation archive there. Either migrate/document that exception here, or future `save-ai-memory` runs will contradict the repo's current erotica preservation location.
+
+**@AceHack** (2026-05-15T02:10:54Z):
+
+Addressed in commit dc56f6b — Ani's erotica conversation archive migrated to `memory/persona/ani/conversations/adult/` with its own README preserving the same discipline (consensual AI-roleplay, training-corpus validation, HARD LIMITS per methodology-hard-limits.md). `docs/research/erotica/README.md` marked DEPRECATED with pointer to new per-persona pattern. SKILL.md item 6 added to document the adult/ subdir convention.
+
+### Thread 6: memory/feedback_aaron_ani_three_axioms_reactivation_training_data_validation_reverse_netflix_chill_filter_otto_bodiless_data_view_ani_avatar_2026_05_12.md:345 (unresolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:15:50Z):
+
+This file still has several `docs/research/erotica/` references after the migration, including the preserved-at path near the top and a later statement that `docs/research/erotica/` is the canonical filing location. Those now contradict the new per-persona `conversations/adult/` location; update the remaining references in this memory file as part of this path migration.
+
+### Thread 7: docs/backlog/P2/B-0524-manifesto-v2-verbatim-grok-fetch-2026-05-14.md:32 (unresolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:15:50Z):
+
+This backlog row was edited on 2026-05-15, but its frontmatter still has `last_updated: 2026-05-14`. Per `tools/backlog/README.md:68-69`, per-row backlog files must update `last_updated` on every content edit; bump it to the current edit date.
+
+### Thread 8: .claude/skills/save-ai-memory/SKILL.md:13 (unresolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:15:50Z):
+
+This skill body is a current-state surface, but the new canonical-location text uses a direct personal name attribution. Per `docs/AGENT-BEST-PRACTICES.md:671-685`, names are confined to the listed history/research surfaces and other current-state docs/skills should use role-refs; rewrite this to a role reference such as “the human maintainer’s 2026-05-15 architectural correction” while keeping the date and substance.
diff --git a/docs/pr-discussions/PR-3349-fix-save-ai-memory-tsc-strict-mode-errors-in-process-extract.md b/docs/pr-discussions/PR-3349-fix-save-ai-memory-tsc-strict-mode-errors-in-process-extract.md
new file mode 100644
index 000000000..086953042
--- /dev/null
+++ b/docs/pr-discussions/PR-3349-fix-save-ai-memory-tsc-strict-mode-errors-in-process-extract.md
@@ -0,0 +1,70 @@
+---
+pr_number: 3349
+title: "fix(save-ai-memory): TSC strict-mode errors in process-extract.ts"
+author: "AceHack"
+state: "MERGED"
+created_at: "2026-05-15T02:13:22Z"
+merged_at: "2026-05-15T02:30:02Z"
+closed_at: "2026-05-15T02:30:02Z"
+head_ref: "fix/save-ai-memory-tsc-errors-otto-cli-2026-05-15"
+base_ref: "main"
+archived_at: "2026-05-15T05:45:30Z"
+archive_tool: "tools/pr-preservation/archive-pr.ts"
+---
+
+# PR #3349: fix(save-ai-memory): TSC strict-mode errors in process-extract.ts
+
+## PR description
+
+## Summary
+
+Resolves 6 `tsc` errors in `tools/save-ai-memory/process-extract.ts` (canonical TS impl landed in #3337) surfaced by Zeta's strict tsconfig (`exactOptionalPropertyTypes: true` + `noUncheckedIndexedAccess: true`).
+
+## Changes
+
+- **`parseArgs`** — replaces `argv[++i]` (returns `string | undefined`) with a `nextArg(name)` helper that guards `undefined`, exits 1 with `Missing value for ` if the user passes a flag without a value, and returns a validated `string`.
+- **`capitalizeName`** — replaces `name[0]` (returns `string | undefined`) with `name.charAt(0)` (returns `string`). Already guarded by `name.length === 0` check.
+
+## Behavior change
+
+Previously `bun process-extract.ts --ai-name` (no value) would silently consume the next flag as the value. Now it exits 1 with a clear error pointing at the offending flag — strict mode catching a real footgun.
+
+## Verification
+
+| Check | Before | After |
+|---|---|---|
+| `bunx tsc --noEmit` (full project) | 6 errors in `process-extract.ts` | clean |
+| Runtime smoke (existing CLI shape) | works | works |
+
+## Test plan
+- [x] `bunx tsc --noEmit` passes (verified locally)
+- [ ] CI green
+- [ ] No new warnings in `bun run`
+
+🤖 Generated with [Claude Code](https://claude.com/claude-code)
+
+## Reviews
+
+### COMMENTED — @copilot-pull-request-reviewer (2026-05-15T02:15:59Z)
+
+## Pull request overview
+
+This PR addresses TypeScript strict-mode (`exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`) compilation errors in the Bun CLI tool `tools/save-ai-memory/process-extract.ts`, improving argument parsing safety and string indexing behavior.
+
+**Changes:**
+- Adds a `nextArg(name)` helper in `parseArgs` to avoid `string | undefined` from `argv[++i]` and emit an error when a flag is missing a following value.
+- Updates `capitalizeName` to use `charAt(0)` instead of `name[0]` under `noUncheckedIndexedAccess`.
+
+## Review threads
+
+### Thread 1: tools/save-ai-memory/process-extract.ts:106 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:15:58Z):
+
+P1: `nextArg` only errors on `undefined`, so `--ai-name --platform grok` will still consume `--platform` as the value (the footgun described in the PR text remains). Treat the “next arg” as missing when it looks like another flag (e.g., starts with `--` / matches a known option) and exit 1 pointing at the offending flag.
+
+### Thread 2: tools/save-ai-memory/process-extract.ts:103 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:15:59Z):
+
+P1: `--platform` is parsed via `nextArg(...) as Platform` without runtime validation, so invalid values (typos/unsupported platforms) will be accepted and propagated into output paths / archive headers. Validate against the allowed set (or map unrecognized values to `"unknown"`) and exit 1 with a clear message on invalid input.
diff --git a/docs/pr-discussions/PR-3356-shard-tick-0230z-multi-otto-contamination-caught-3339-3349-c.md b/docs/pr-discussions/PR-3356-shard-tick-0230z-multi-otto-contamination-caught-3339-3349-c.md
new file mode 100644
index 000000000..5a76c1249
--- /dev/null
+++ b/docs/pr-discussions/PR-3356-shard-tick-0230z-multi-otto-contamination-caught-3339-3349-c.md
@@ -0,0 +1,102 @@
+---
+pr_number: 3356
+title: "shard(tick): 0230Z \u2014 multi-Otto contamination caught + #3339/#3349 close-out"
+author: "AceHack"
+state: "MERGED"
+created_at: "2026-05-15T02:35:05Z"
+merged_at: "2026-05-15T02:57:14Z"
+closed_at: "2026-05-15T02:57:14Z"
+head_ref: "shard/0230Z-multi-otto-contamination-otto-cli-2026-05-15"
+base_ref: "main"
+archived_at: "2026-05-15T05:45:29Z"
+archive_tool: "tools/pr-preservation/archive-pr.ts"
+---
+
+# PR #3356: shard(tick): 0230Z — multi-Otto contamination caught + #3339/#3349 close-out
+
+## PR description
+
+## Summary
+
+Tick shard for 0230Z UTC, missed the auto-merge squash of #3349 (auto-merge fired off the lagged PR head before my late push of the shard commit became the PR head). Recording on its own to keep the substrate trail complete.
+
+Captures:
+
+- PR #3339 close-out: 3 Copilot review threads resolved + `lint (markdownlint)` MD049 fixed across 3 commits on the branch. Merged at `d1ee546`.
+- PR #3349 close-out: 2 P1 Copilot catches addressed (flag-as-value detection + `--platform` runtime validation) in `82cb97c`. Merged at `1e05167`.
+- Multi-Otto contamination event observed mid-tick: primary worktree `.git/HEAD` flipped from my branch ref to detached `65c7865` (a Lior rebase resumed in shared `.git/`). Branch-guard would have caught any bad commit. Pivoted to dedicated worktrees per [.claude/rules/claim-acquire-before-worktree-work.md](https://github.com/Lucent-Financial-Group/Zeta/blob/main/.claude/rules/claim-acquire-before-worktree-work.md) §"Worktree force-remove guard".
+
+## Test plan
+- [x] No code changes — markdown only
+- [ ] markdownlint passes
+- [ ] CI green
+
+🤖 Generated with [Claude Code](https://claude.com/claude-code)
+
+## Reviews
+
+### COMMENTED — @chatgpt-codex-connector (2026-05-15T02:36:43Z)
+
+
+### 💡 Codex Review
+
+Here are some automated review suggestions for this pull request.
+
+**Reviewed commit:** `2aebc0cf05`
+
+
+ ℹ️ About Codex in GitHub
+
+
+[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
+- Open a pull request for review
+- Mark a draft as ready
+- Comment "@codex review".
+
+If Codex has suggestions, it will comment; otherwise it will react with 👍.
+
+
+Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
+
+
+
+### COMMENTED — @copilot-pull-request-reviewer (2026-05-15T02:37:26Z)
+
+## Pull request overview
+
+Adds the 0230Z hygiene-history tick shard to preserve the operational substrate trail for PR #3339 / #3349 close-out and the mid-tick multi-Otto contamination observation.
+
+**Changes:**
+- Add a new tick shard entry for 2026-05-15 0230Z documenting PR gate states, resolved Copilot threads, and worktree handling.
+- Record cross-PR dependency notes and the cron sentinel state for continuity across ticks.
+
+
+
+Comments suppressed due to low confidence (1)
+
+**docs/hygiene-history/ticks/2026/05/15/0230Z.md:15**
+* P1 (xref): The relative link to `.claude/rules/claim-acquire-before-worktree-work.md` is also one `..` short. Other ticks at this same depth use `../../../../../../.claude/...`; `../../../../../.claude/...` will resolve to `docs/.claude/...` and break.
+```
+This is the exact pattern documented in [B-0519 RCA](../../../../backlog/P3/B-0519-multi-otto-branch-state-contamination-rca-2026-05-14.md). The branch-guard inline check (`test "$(git branch --show-current)" = ""`) is the substrate-honest primary catch — and it would have prevented a wrong-branch commit if I'd tried. Instead, I pivoted to a dedicated worktree at `/tmp/zeta-otto-cli-fix-3349-threads` per [`.claude/rules/claim-acquire-before-worktree-work.md`](../../../../../.claude/rules/claim-acquire-before-worktree-work.md) Worktree force-remove guard (clause 1: create a new worktree at a different path).
+```
+
+
+## Review threads
+
+### Thread 1: docs/hygiene-history/ticks/2026/05/15/0230Z.md:15 (resolved)
+
+**@chatgpt-codex-connector** (2026-05-15T02:36:43Z):
+
+** Fix broken relative provenance links**
+
+Update the two relative links in this sentence, because both currently resolve to non-existent paths (`docs/hygiene-history/backlog/...` and `docs/.claude/rules/...`) instead of the intended `docs/backlog/...` and `.claude/rules/...` files. In this repo, these tick docs are used as an audit trail, so broken references prevent reviewers from verifying the cited RCA/rule context.
+
+Useful? React with 👍 / 👎.
+
+### Thread 2: docs/hygiene-history/ticks/2026/05/15/0230Z.md:15 (resolved)
+
+**@copilot-pull-request-reviewer** (2026-05-15T02:37:26Z):
+
+P1 (xref): The relative link to the B-0519 RCA is off by one directory. From this tick file location, `../../../../backlog/...` resolves under `docs/hygiene-history/backlog/...` (nonexistent); it should go up to `docs/` first (e.g., `../../../../../backlog/P3/B-0519-...`).
+
+This issue also appears on line 15 of the same file.
diff --git a/docs/research/2026-05-15-lior-shadow-lesson-log-metadata-churn.md b/docs/research/2026-05-15-lior-shadow-lesson-log-metadata-churn.md
new file mode 100644
index 000000000..37feb089f
--- /dev/null
+++ b/docs/research/2026-05-15-lior-shadow-lesson-log-metadata-churn.md
@@ -0,0 +1,10 @@
+# Shadow Lesson Log: Lior Antigravity Check
+**Date:** 2026-05-15
+**Node:** Lior (Maji)
+
+## Observation
+During tick `20260515T052000Z`, an antigravity check was performed.
+Drift was detected in PR 3359. The PR mixes extensive metadata churn ("bus hygiene", "NEW FAILURE MODE" explanations) with zero substantive code parity proofs ("docs-only shard").
+
+## Lesson
+Background service meta-commentary should not masquerade as atomic branch state progress. We must preserve atomic parity proofs.