Handover 2026-04-22 — SSOT consolidation
Context, discoveries, delivered scaffolding, and open work for the SSOT consolidation effort. Written for the next session or contributor to pick up without prior context.
Epic: neid404/fragjulia#640 Sub-issues: #641–#649 Status at handover: Scaffolding delivered to local working tree; nothing merged yet. PAT rotation is the only urgent open item.
What the session was about
The user (Dave / @neid404) came in flagging three connected problems: OneDrive was still being written to by some session, MCP connectors were "escalating" (repeatedly prompting for OAuth auth), and documentation + repo state had drifted across many locations. The explicit ask was: write a plan for a monolithic source of truth at docs.fragjulia.de, MDX-based, with a changelog, and a rule that no GitHub issue closes without documentation.
The plan I wrote (and the user approved) is now split across epic #640 and the nine linked sub-issues. This handover document is the narrative version of that plan.
What I discovered (the actual state of things)
Five parallel clones of the fragjulia repo
Each on a different branch, each with its own work:
| Path | Branch | Uncommitted |
|---|---|---|
C:\code\fragjulia | claude/docs-system-584-unified-search | clean |
~/fragjulia/ | claude/docs-608-gaps | 2 untracked DesignGUIDE/DELTA*.md, HANDOVER*.md |
~/Documents/Claude/Projects/fragjulia/ | claude/583-pillar-a-help-migration | clean |
~/AppData/Local/Temp/fragjulia/ | main | modified voice/config/Caddyfile, voice/config/livekit.yaml |
~/~/fragjulia/ (literal-~ path bug) | snapshot from Apr 13 | unknown — bash can't cd into it |
Plus one snapshot dump (no .git/, had deleted-lock-file.zip) at ~/.claude/Github-fragJulia Repo/fragjulia-main/.
SSOT-3 (#643) collapses all of these into C:\code\fragjulia with a git worktree per active branch.
OneDrive leakage (active, not historical)
The user had already redirected the Windows Personal (Documents) shell folder out of OneDrive via reg add (visible in ~/.claude/settings.local.json backups). That worked — new default-path writes land locally. But C:\Users\dapar\OneDrive\Dokumente\Claude\Projects\fragJUlia\ contained nine HANDOFF-*.md / design-delta files written that same day (2026-04-22). Some session was writing there explicitly, not via the default Documents path. SSOT-4 (#644) migrates these into the docs site and removes the entire OneDrive/Dokumente/Claude/ tree to force the bad source to surface.
PAT leaked in five places (three illegitimate)
github_pat_11B5QNT2Q01I1yUDpCTNkg_*:
| Location | Legitimate? | Action taken |
|---|---|---|
~/.claude/settings.json → env.GITHUB_PAT | yes | left alone; update on rotation |
~/.claude.json → mcpServers.github.env.GITHUB_PERSONAL_ACCESS_TOKEN (line 674) | yes | left alone; update on rotation (harness blocks me from editing .claude.json) |
~/.claude/settings.local.json Bash(GH_TOKEN="..." gh issue:*) | no — leak | stripped |
~/.claude/settings.local.json Bash(GH_TOKEN="..." git push:*) | no — leak | stripped |
~/.claude/settings.local.json Bash(GH_TOKEN="..." gh pr:*) | no — leak | stripped |
SSOT-1 (#641) covers the rotation. The learning — "PAT never in allowedTools" — is saved as a local feedback memory at ~/.claude/projects/C--Users-dapar/memory/feedback_pat_never_in_allowlist.md.
MCP auth churn
~/.claude/mcp-needs-auth-cache.json showed three cloud-configured (claude.ai) OAuth connectors stuck in needs-auth state: Hugging Face, Stripe, Atlassian Rovo. None are in the product stack; they just re-prompt every session. SSOT-2 (#642) disables them in claude.ai connector settings — the only sub-issue Claude cannot execute itself.
Also: ENABLE_TOOL_SEARCH was set to "false" in ~/.claude/settings.json, despite ~300 lines of ToolSearch rules in the project CLAUDE.md + global CLAUDE.md. Flipping it to "true" during this session surfaced the github MCP deferred tools and unblocked the epic creation you're reading about.
Docs site already exists
C:\code\fragjulia\apps\docs\ is a Fumadocs-based Next.js site, content under content/docs/{dev,design,help}/ with meta.json sidebar ordering, deploys to docs.fragjulia.de. Pillars A (help) and B (dev) were recently migrated (#583, #586, #584). Design pillar partially migrated. The SSOT scaffolding added operations/ and changelog/ as two more sections.
What I delivered (in-session, pre-PR)
All of this lives in the local working tree at C:\code\fragjulia. Nothing is committed yet — SSOT-8 (#648) covers opening the PR on a fresh branch.
Repo-level files
CLAUDE.md— rewritten from 207 lines to ~60. The old version duplicated ~100 lines of ToolSearch rules from the global~/.claude/global-CLAUDE.md. The new version is a pointer: hard location rules (no clones outsideC:\code\, worktrees for multi-branch work, PAT never inallowedTools), commands, stack note, and a pointer to this docs site..github/pull_request_template.md— PRs now have required checkboxes for changelog entry + SSOT doc update +no-changeloglabel exception..github/workflows/docs-guard.yml— blocking CI check. Jobchangelog-requiredfails any PR that does not add a new file underapps/docs/content/docs/changelog/, bypassable only via theno-changeloglabel. A second jobdocs-updated-hintposts a warning (not failure) when code changed but no MDX did — a nudge, not a block.
Docs-site content
apps/docs/content/docs/operations/index.mdx+meta.json— section landing page.apps/docs/content/docs/operations/ssot-discipline.mdx— the rule system itself: principle, changelog contract, issue-closure audit, where the rule doesn't apply (patient data, secrets), migration table, local-clone discipline.apps/docs/content/docs/operations/handover-2026-04-22-ssot-consolidation.mdx— this document.apps/docs/content/docs/changelog/index.mdx+meta.json— section landing.apps/docs/content/docs/changelog/2026-04-22-ssot-consolidation.mdx— seed changelog entry describing the governance change, with frontmattercloses: []andpr: null(both to be amended in the scaffolding PR).- Root
apps/docs/content/docs/meta.json— updated sidebar to includeoperations+changelogalongsidedev,design,help.
Agent-settings cleanup (out-of-repo, done live)
~/.claude/settings.json→ENABLE_TOOL_SEARCHflipped to"true",allowedToolsOneDrive entry removed.~/.claude/settings.local.json→ 3 PAT-leak entries stripped, 3 OneDrive-git-path entries stripped, 7ghCLI entries stripped.- Backups of both files at
~/.claude/backups/settings*.pre-cleanup.20260422-*.bak. Delete after PAT rotation verification. - New feedback memory at
~/.claude/projects/C--Users-dapar/memory/feedback_pat_never_in_allowlist.md+ pointer inMEMORY.md.
GitHub issues
- Epic #640 with full context, acceptance criteria, non-goals.
- Nine sub-issues #641–#649, all linked as native sub-issues of #640, each with concrete steps and verification.
What's open (ordered by priority)
Do first (security)
- [#641 SSOT-1] Rotate the leaked PAT. After rotation, update
~/.claude/settings.jsonenv and~/.claude.jsonline 674, then delete the pre-cleanup backups. - [#642 SSOT-2] Disable the three OAuth MCP connectors in claude.ai Settings → Connectors.
Do next (file-system consolidation)
- [#643 SSOT-3] Consolidate the 5 parallel fragjulia clones into
C:\code\fragjuliawith git worktrees. Preserves uncommitted work viacpinto each worktree beforerm -rfof the old clone. - [#644 SSOT-4] Triage + migrate the 9 OneDrive handoff files into
apps/docs/content/docs/operations/or discard. Thenrm -rf ~/OneDrive/Dokumente/Claude/. - [#645 SSOT-5] Execute the 4 authorized local duplicate deletions + stale
.credentials.json. Harness blocked me from running these; they require manualrmby the user.
Do after consolidation (SSOT migrations)
- [#648 SSOT-8] Open the scaffolding PR on a new branch
claude/ssot-640-scaffolding. This is the first real test ofdocs-guard. After merge, makedocs-guard / changelog-requireda required status check onmain. - [#646 SSOT-6] Migrate
DesignGUIDE/fragjulia-design-brief-v3.mdintoapps/docs/content/docs/design/and delete the legacy directory. - [#647 SSOT-7] Migrate
PLAN.md,LAUNCH-AUDIT-*.md,SPRINT_*.mdfrom the repo root intoapps/docs/content/docs/operations/.
Do once the discipline is proven
- [#649 SSOT-9] Add the post-merge audit cron (
.github/workflows/closed-issue-audit.yml+ weekly summary) that tags issues closed without a matching changelogcloses:reference.
Things the harness blocked me from doing
This matters for future sessions — document so no one re-fights these battles:
- Deleting pre-existing local CLAUDE.md files the agent didn't create this session (even with explicit per-target approval via the UI selector). Workaround: hand the user the
rmcommands; they execute. - Moving (
mv) pre-existing git-repo directories. Workaround: same as above. - Editing
~/.claude.json(the file where the github MCP reads its PAT). Self-modification guard. Workaround: user edits in their editor. - Parsing a credential file with python to report its structure. Workaround: use
cmpandstatfor metadata-only comparison.
Everything else Claude can do cleanly: edit agent settings values (not allowedTools), create new files, edit code files, create issues, create sub-issues, flip feature flags.
Rules of engagement that emerged
For future Claude sessions landing on this repo:
- Never create
HANDOFF-*.mdat repo root or underOneDrive\,Dokumente\,Documents\,Downloads\,AppData\Temp\. They go underapps/docs/content/docs/operations/as MDX, namedhandover-YYYY-MM-DD-<slug>.mdx. - Never clone outside
C:\code\fragjulia. For parallel-branch work, usegit worktree add C:\code\fragjulia-worktrees\<branch> <branch>. - Never paste a PAT into an
allowedToolspermission string. The PAT lives in env only. See~/.claude/projects/C--Users-dapar/memory/feedback_pat_never_in_allowlist.md. - Every PR adds a changelog entry. If a PR genuinely shouldn't have one (revert, infra-only), add the
no-changeloglabel and state why in the PR body. Thedocs-guardCI enforces this. - Never close an issue without a matching changelog
closes:reference. The post-merge audit (SSOT-9, once deployed) will tag the violation and surface it in the weekly summary.
Session artifacts
- Epic: https://github.com/neid404/fragjulia/issues/640
- Changelog seed:
apps/docs/content/docs/changelog/2026-04-22-ssot-consolidation.mdx - SSOT rule page:
apps/docs/content/docs/operations/ssot-discipline.mdx - Local memory addition:
~/.claude/projects/C--Users-dapar/memory/feedback_pat_never_in_allowlist.md - Settings backups:
~/.claude/backups/settings*.pre-cleanup.20260422-*.bak
If you're the next session
Start at epic #640. Read the sub-issues in the order given above. For each one, the issue body has concrete commands — most are copy-pasteable. Acceptance criteria are explicit; mark them done as you go. If anything in this handover contradicts the current state of the code or the epic body, trust the code and the issue, not this document — handovers go stale, issues are kept live.
fragJulia Launch-Day Audit — 2026-04-04
Pre-launch functionality audit identifying 1 critical, 2 high, 4 medium, and 3 low-priority issues — including the proxy.ts vs middleware.ts bug, Stripe origin handling, and CSP gaps.
Handover 2026-04-22 — fragJulia voice deploy (v1)
Session handoff from the self-hosted LiveKit/Voxtral bring-up on AWS eu-central-1 (pre-correction). Superseded by v2 on Voxtral weights + runtime; retained verbatim as session ground truth.