Skip to content

docs: PII cleanup plan for base/overlay sanitization - #2

Draft
lutzfinger wants to merge 1 commit into
mainfrom
claude/code-review-privacy-style-1q80dg
Draft

docs: PII cleanup plan for base/overlay sanitization#2
lutzfinger wants to merge 1 commit into
mainfrom
claude/code-review-privacy-style-1q80dg

Conversation

@lutzfinger

Copy link
Copy Markdown
Owner

What

Adds CLEANUP-PLAN-PII.md — a working plan to strip operator PII from the public
base repo so it honors its own PRINCIPLES.md §17/§18/§24 (mechanisms public,
values private overlay).

This PR is plan-only. No code/PII has been changed yet. It exists so the
cleanup can be executed in a fresh session (the container is ephemeral; pushing is
the only way the plan survives).

Why

A code review found ~40+ files in the base repo contain real operator data that
should live only in the private SAI overlay:

  • real emails (operator + third-party contacts + a customer)
  • hardcoded operator name as code defaults in app/tools/*
  • live financial data in skills/receipt-collector/docs/STATUS.md (real QBO
    invoice/purchase IDs with clickable qbo.intuit.com?txnId= links, amounts,
    vendors, a named person) — highest severity
  • identity-revealing paths (~/Lutz_Dev/SAI/, /Users/<user>/)
  • real home city / street address in trip-mileage fixtures

The plan groups these into 6 phases (emails, names, financial data, paths,
locations, then enforce via the existing scripts/boundary_check.py linter +
gitignored boundary_check_private_terms.txt).

Notes

  • The plan doc itself contains no literal private values — only file paths and
    categories — so it is safe to commit. Exact literals are rediscovered via the
    documented grep commands / the boundary linter.
  • The public side (this repo) does replace-with-placeholder only. Moving the
    real values into the private SAI overlay must be done from a session that has
    that repo mounted (not available here).
  • CLEANUP-PLAN-PII.md is temporary and should be deleted when the cleanup lands.

https://claude.ai/code/session_01EyXsoFMqtvrTLvVh8n9uCB


Generated by Claude Code

Working plan to strip operator PII from the public base repo per
PRINCIPLES.md 17/18/24 (mechanisms public, values private overlay).
Names files and categories only; contains no literal private values.
Delete once cleanup is complete.
@lutzfinger
lutzfinger force-pushed the claude/code-review-privacy-style-1q80dg branch from 006c35c to 7d2bfa8 Compare June 14, 2026 20:01
lutzfinger added a commit that referenced this pull request Jun 14, 2026
…oice draft -> approve -> send)

Email sai@ 'send an invoice to <name> over <amount> for <services>' and the
daemon drafts an UNSENT QBO invoice, replies in-thread, and on the operator's
APPROVE reply sends it (CC hello@example.com) or on REJECT deletes it.
Reuses the poll loop, email_intents (new intent_kind=invoice), send_reply, and
qb_client. The send is gated by the email reply (#2/#7a); fail closed on bad
amount / unresolved name / missing service item; idempotent by trigger_hash.

- qb_client: create_customer, get_invoice, send_invoice (set BillEmailCc then
  POST /send), delete_invoice.
- invoice_logic_bridge: imports the ONE source of truth (invoice-draft-and-send
  lib/invoice_lib.py) instead of duplicating money logic (#33a coupling,
  loose-ended to app/canonical).
- dispatch_agent: INVOICE_DRAFT verdict (cost-compiler trip/receipt cases still
  win; guarded against regression).
- invoice_intent: turn-1 draft + approve/reject reply handlers.
- email_runner: wire the new-trigger branch + invoice reply routing.
16 new tests; full receipt-collector suite 68 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@lutzfinger
lutzfinger force-pushed the claude/code-review-privacy-style-1q80dg branch from 7d2bfa8 to 51f529a Compare June 14, 2026 22:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants