Proof Packet

Evidence you can inspect.

v3 · 2026-09-13 · Provenance labels corrected · All exhibits redacted of credentials, customer data, and server addresses

Every exhibit carries one provenance label. Condensed record (01, 03, 05, 07): taken from a dated internal record, then shortened and redacted. Reconstructed (02): assembled from two dated records, showing today’s corrected wording. Illustrative (04, 06): built to show a production format, not taken from a real record. The label, date, and scope sit at the top of each exhibit.

01 CONDENSED RECORD

Review Ledger

Condensed record · 35th-pass review ledger, 2026-06-20 · Reformatted, session ID redacted, four of eight honored anchors omitted for length · Scope: v5.4.49 verbosity output-style sync + EP15 staging loader

# REVIEW LEDGER — 35th-Pass Code Review (2026-06-20)

Bootstrap:
  session_id: [redacted]
  prior passes: 34 (all findings terminal at pass 34)
  prior HEAD: 28b0a978 → current HEAD: 51ded459
  project context loaded: Yes (carl / anthony / diana / abish)
  MUST-ENFORCE preferences honored: Yes

Scope:
  Single code delta since 34th all-green pass:
    commit c3d48923 — v5.4.49 verbosity ↔ output-style sync
    commit 51ded459 — EP15 greenhouse staging loader
  Files deep-reviewed:
    docpro-extension/src/SidebarProvider.ts
    docpro-extension/src/sidebar/MessageRouter.ts
    media/sidebar.template.html
    docs/SugarShack/Greenhouse/Episodes/scripts/load_ep15_episode.py
    dist/SidebarProvider.js (dist parity)
    tests/sidebar/VerbosityOutputStyle.spec.ts

———

SUMMARY

  Severity    Found   Remaining
  --------    -----   ---------
  Critical      0         0
  High          0         0
  Medium        0         0
  Low           1         0
  ANCHOR-CHAL   0         0
  Total         1         0

Net: 1 Low finding, FIXED-VERIFIED. 0 open.

———

LOW

  ID       Sev   Status           File:Line
  ------   ---   ------           ---------
  Ext-L1   Low   FIXED-VERIFIED   SidebarProvider.ts:~1473

  What: Dropdown-display test for "Explanatory" matches case-insensitively
  (onDisk.toLowerCase() === "explanatory"), but the self-heal that rewrites
  the value to canonical "Explanatory" fired only on the exact lowercase
  string (if (onDisk === "explanatory")). Result: "EXPLANATORY" displayed
  as Detailed but was never healed; Claude Code’s case-sensitive matcher
  silently ignored it, producing no Insight callouts.

  Fix: heal predicate changed to
    onDisk.toLowerCase() === "explanatory" && onDisk !== "Explanatory"
  First clause: exact case-insensitive match (same test as display branch).
  Second clause: excludes canonical value (idempotent).
  Regression test added: "EXPLANATORY" → displays Detailed + heals to canonical.
  Rebuilt dist from tsc. Version: 5.4.49 → 5.4.50. Gauge: 0 open.

———

HONORED, NOT RE-FLAGGED

  Native outputStyle mechanism, not prompt injection
    _setVerbosityMode writes the Claude Code outputStyle settings key.
    It injects no prompt text. Directly honors standing "DO NOT CHANGE
    PROMPTS / use the native mechanism" rule. Not a finding.

  FIX M20 $HOME write-guard
    _updateClaudeSettings:1535 — refuses to write when no workspace
    folder is open. Read and write targets match. Not a finding.

  EP15 staging loader
    ORM select/delete (no SQL string-building). Idempotent guard refuses
    to overwrite any row with mp3_path set or non-editing status.
    One-off staging script. Not a finding.

  Entire backend / frontend / migrations / extension remainder
    0 findings at 33rd/34th cold passes with no source change since.
    Dispositions honored under the cold-review pull model.

What this shows: Loam’s code review runs against a persistent ledger. The same codebase is reviewed pass after pass; the gauge tracks open findings across all passes, not just the current one. A finding marked FIXED-VERIFIED closes only when the fix is verified in compiled dist, not just source. Previous architectural decisions are re-confirmed each pass rather than silently assumed.

02 RECONSTRUCTED

Remediation Pass

Reconstructed · Combines the SiteWork M3 finding (2026-06-21) with the SitePass2 M2 verification (2026-06-22) · The “After” text is the wording in use since 2026-08-31, not the wording shipped on 2026-06-21

# RECONSTRUCTED REMEDIATION RECORD — SiteWork M3 finding (2026-06-21)
# Sources: SiteWork M3 fix list; SitePass2 M2 verification (2026-06-22)

———

FINDING (caught pre-deploy by Carl + security review)

  Claim on site: "Raw audio is not retained."

  Source check: grep "recording_data" backend/
    → voice client: recording_data = audio_bytes  [live write]
    → backend/models.py, ReachOutCall.recording_data = LargeBinary, nullable=True

  Verdict: OVERCLAIM. Binary audio data IS written to ReachOutCall.recording_data
  after a Meet the Team or Call Team session. The claim "not retained" was false.

———

CORRECTION

  Before (incorrect):
    "Raw audio is not retained."

  After (current wording, source-verified 2026-08-31):
    "Call audio is stored as binary in the database (ReachOutCall.recording_data,
    backend/models.py). It is cleared automatically after 30 days by
    cleanup_old_recordings() (idle_monitor_service.py). A separate
    cleanup_old_call_records() helper defaults to a 90-day cutoff, but it is
    not in the scheduled monitor; it currently runs only through the
    authorized Loam administrator cleanup endpoint (routes/reachout.py)."

  Pages corrected:
    security.html  — calls bullet + data table rows + auto-expire statement
    for-it.html    — data boundary list (line 706)
    episodes.html  — footnote (line 882)
    getting-started.html — no audio claim present; confirmed clean

  Correction method: read backend source first, write HTML second.
  No placeholder cells published. Table cells not yet verifiable → "Contact us."

———

VERIFICATION

  Abish Agent 1 (backend accuracy): 9/9 cells verified against backend/models.py
  Abish Agent 2 (cross-page consistency): zero vague phrases remaining
    grep "some calls" → 0 hits
    grep "expires on its own" → 0 hits
    grep "expiring status lifecycle" → 0 hits

  Conditional flag: Studio audio retention absent from episodes.html.
  Ruling: deferred to FIX-LIST (no Studio section exists to anchor it).
  Status: REMEDIATED. Deploy authorized.

What this shows: one overclaim about call audio, the source check that disproved it, and the corrected wording. This exhibit is assembled from two dated records. The corrected text shown is today’s wording; the June 21 correction used different words.

03 CONDENSED RECORD

Audit Pass — Anchor-Challenge Exhibit

Condensed record · 35th-pass review ledger, 2026-06-20 · “Honored, not re-flagged” section; the Purpose paragraph is added explanation

# ANCHOR-CHALLENGE EXHIBIT — 35th-Pass Code Review (2026-06-20)
# Section: Honored, not re-flagged

Purpose: When a reviewer encounters a pattern that looks like a finding
but is actually a documented architectural decision, it is recorded here
rather than flagged. This prevents the same correct design from being
re-opened as a finding on every subsequent pass.

———

ANCHOR VERIFIED — Native outputStyle mechanism, not prompt injection

  Pattern observed:
    _setVerbosityMode() and _updateClaudeSettings() in SidebarProvider.ts
    write the Claude Code-native "outputStyle" key to .claude/settings.local.json
    when the user selects "Detailed" in the Response Style dropdown.

  Why this looks like a finding:
    Behavioral modification of Claude Code via a settings write is functionally
    adjacent to prompt injection. A cold reviewer unfamiliar with the standing
    decision might flag it.

  Why it was not flagged:
    Standing MUST-ENFORCE rule: "DO NOT CHANGE PROMPTS. Use the vendor’s native
    mechanism." The outputStyle settings key IS the native mechanism. Anthropic
    ships it specifically for this purpose. The alternative (injecting a prompt
    directive) was the prohibited path. This implementation is the correct one.

  Cross-references honored:
    REVIEW-2026-05-24 Ext-M14 — "terse" reserved-for-future (intentional no-op).
    FIX M20 $HOME write-guard — write path guarded, read path matches target.
    FIX M21 on-show reload — dropdown reloads from disk on sidebar open.

  Reviewer ruling: HONORED. Not a finding.
  Carried forward to pass 36+ as a standing not-a-finding.

———

ANCHOR-CHALLENGE count this pass: 0
(No anchor was successfully challenged. All 4 standing anchors verified accurate.)

What this shows: Loam’s review system carries forward architectural decisions as anchors. A subsequent pass must confirm an anchor is still accurate before relying on it — it cannot simply assume. If a cold reviewer challenges an anchor and proves it is wrong, it becomes a finding. If the anchor holds, the ruling is "honored, not re-flagged" and the record shows why.

04 ILLUSTRATIVE

Memory Entry — Before and After Compression

Illustrative · Constructed to show the format compress_persona_memory() writes · Not a real memory record

# MEMORY COMPRESSION EXHIBIT
# Illustrative. The content is constructed; the format matches the code.
# No customer data, no real session IDs.

———

BEFORE COMPRESSION (appended session entries)

--- session (2026-05-14 09:41 UTC) ---
Rebuilt the MCP server after a source change and the fix still was not
live. The compiled output had not been checked before we called it shipped.
MUST-ENFORCE: After any MCP src change, grep dist/*.js for the changed token before declaring shipped.

--- session (2026-05-15 11:20 UTC) ---
The service crashed on the first request after a sync. Ownership on the
app path was wrong again; the terminal looked clean.
MUST-ENFORCE: After every rsync to [server redacted], run chown -R on the app path.

--- session (2026-05-16 14:05 UTC) ---
Publishing failed with a 401. The package was fine; the token was not.
MUST-ENFORCE: vsce 401 on publish — run the verify-pat probe first; do not repackage.
MUST-ENFORCE: After every rsync to [server redacted], run chown -R on the app path.

———

AFTER COMPRESSION

--- compressed (2026-05-21, from 818 to 511 chars, sessions distilled) ---

Deploys here have gone wrong while the terminal looked clean. Check the
compiled output before calling a fix shipped, fix ownership after every
sync, and treat a publish 401 as a token problem before a package problem.

--- HARD RULES ---
MUST-ENFORCE: After any MCP src change, grep dist/*.js for the changed token before declaring shipped.
MUST-ENFORCE: After every rsync to [server redacted], run chown -R on the app path.
MUST-ENFORCE: vsce 401 on publish — run the verify-pat probe first; do not repackage.

What this shows: how compression treats pinned rules. Every line marked MUST-ENFORCE is lifted out before the model rewrites the memory, then appended afterward word for word under HARD RULES. A repeated rule, ignoring case and trailing punctuation, is kept once, which is why four marked lines become three. Everything else is rewritten by the model, including lessons that were never marked and any second line of a rule. Compression is skipped if no Anthropic key is available, and abandoned if the model call fails, returns nothing, or the memory changed while it ran.

05 CONDENSED RECORD

Build Mode Milestone Log

Condensed record · SiteWork milestone log, M2, 2026-06-21 · Internal paths and server addresses redacted; the product name in quoted copy is updated to Loam

# BUILD MODE MILESTONE LOG — SiteWork (2026-06-21)
# Milestone 2: Fix Get Started (install safety + access)
# Source: docs/SiteWork_[redacted]/MILESTONES.md

Status: COMPLETE & LIVE
Commit: 3119e8c8
QA: Abish Code Sweep = SHIP
Sign-offs: Carl (security/hash gate), Diana (desktop + mobile visuals)
Deploy: git pull --ff-only (nginx direct-serve, no build step)

———

DELIVERABLES

  [x] Choose-your-path section after hero
        4 cards: Individual builder, Enterprise pilot, Research access,
        Security review. Enterprise card uses amber to mark higher intent.

  [x] Costs reframed
        "Loam is in limited access, moving deliberately."
        No published cost reason. No "pricing in refinement."

  [x] Before-you-install block
        Windows status, VS Code 1.93+ requirement, API key (dp_ prefix),
        Marketplace path, what installs (two user-space pieces),
        where data goes with links to /security and /for-it.

  [x] P0.4 install reorder
        Marketplace card (RECOMMENDED, green) first
        → inspectable PowerShell installer (download-only irm -OutFile)
        → Verify step (Get-AuthenticodeSignature + Get-FileHash,
              Expected SHA-256 visible near the command)
        → Run step (irm ... | iex LAST, after safety explanation)
        → Arrival → Uninstall/revoke/remove
        → Enterprise/security contact callout

  [x] Installer stated signed (Toast2IT LLC OV, valid to 2027-04-15)
        "No system service, kernel driver, or background telemetry agent."

  [x] JSON-LD HowTo rewritten to Marketplace-first safe order
        Was: pipe-first in Google-indexed structured data.
        Now: VS Code Extension first in HowToStep 1.

  [x] Cross-page fix
        for-it.html published a stale installer SHA-256.
        Corrected to live hash so both pages byte-match the served artifact.

ACCEPTANCE CRITERIA MET

  IT never sees irm | iex before the safer explanation.
  Proof: installer hash appears before pipe command in served HTML document order.
  Verified on-box + from public origin (curl body grep, not local file read).

  A visitor knows whether they can install today and how to request access.

QA GATE RESULT: SHIP

  Blast radius: getting-started.html (+407/-39), for-it.html (1 line)
  Security: hash-before-pipe ordering verified; no pipe-command-first exposure
  Regression: JSON-LD HowTo step order verified; no breaking change to step 2+
  Architectural consistency: install sequence matches security model on /for-it

What this shows: Build Mode milestones have explicit acceptance criteria, not just task checklists. "Done" is defined before work starts and verified — not declared by the implementer. QA is a separate gate that reads the same acceptance criteria and confirms them independently. A milestone marked COMPLETE has a commit hash, a QA verdict, and sign-offs on record.

06 ILLUSTRATIVE

Call Trigger Record

Illustrative · Constructed from the ReachOutCall schema in backend/models.py · Not a real call record

# ILLUSTRATIVE RECORD — ReachOutCall + linked MeetSession
# Source schema: backend/models.py
#   ReachOutCall class: core call record, transcript, recording
#   MeetSession class: encrypted session fields, linked to ReachOutCall
# This is a constructed example. No customer data. No real session IDs.

———

  id                       [redacted UUID]
  user_id                  [redacted UUID]

  trigger                  meet_the_team
  persona_key              carl
  source                   ide
  status                   complete
  duration_seconds         263  (4m 23s)

  transcript               [stored]
                           Column type: Text, nullable=True (ReachOutCall.transcript)
                           Encryption: PLAINTEXT — not encrypted at rest
                           Note: The transcript field is readable by backend
                           processes without decryption. This is disclosed on
                           the security page.

  recording_data           [stored]
                           Column type: LargeBinary, nullable=True (ReachOutCall.recording_data)
                           Content: raw audio bytes, fetched post-call
                           recording_status: ready

  recording_duration_seconds  263

  guest_name               [redacted]
  guest_phone              [redacted]

  —— linked MeetSession record ——
  guest_context            [stored, encrypted]
                           Column type: EncryptedText (Fernet) (MeetSession.guest_context)
                           Note: These fields live on MeetSession, not on
                           ReachOutCall itself. One MeetSession row is created
                           per Meet the Team call and linked to the ReachOutCall.

  situational_brief        [stored, encrypted]
  canon_events             [stored, encrypted]
  guest_profile            [stored, encrypted]
  full_log                 [stored, encrypted]
  summary                  [stored, encrypted]

  created_at               2026-06-14 14:32:07 UTC

———

RETENTION CONTROLS (source: idle_monitor_service.py and routes/reachout.py)

  recording_data cleared:     30 days (scheduled cleanup_old_recordings)
  recording_status after:     "expired"
  Full record auto-deletion:  not currently scheduled
  Admin cleanup default:      records older than 90 days
                              (cleanup_old_call_records;
                               admin endpoint in routes/reachout.py)

  Note: retention_days=30 and retention_days=90 are Python default arguments,
  not database-driven config values. The 30-day audio cleanup is wired into
  the monitor loop. The 90-day full-record helper is admin-triggered only;
  the existence of the helper is not an automatic-retention promise.

What this shows: The ReachOutCall record schema distinguishes encrypted fields (guest context, profile, session log) from plaintext fields (transcript). This distinction is disclosed on the security page. Fetched audio is cleared on the scheduled 30-day path. Full-record cleanup exists with a 90-day default cutoff but is triggered by an authorized Loam administrator, not scheduled.

07 CONDENSED RECORD

Security Claim Map

Condensed record · Compiled from the 2026-06-22 source verification · Row 4 revised 2026-08-31 · Line numbers were correct on the date verified and have since moved

Claim Source Field / Mechanism File:Line (as verified) Verified Auth
IDE conversation turns encrypted at rest IDESessionTurn.content / EncryptedText (Fernet) backend/models.py:859 2026-06-22 Engineering
Call transcripts stored as plaintext (not encrypted) ReachOutCall.transcript / Text, nullable backend/models.py:505 2026-06-22 Engineering
Call audio recordings cleared at 30 days cleanup_old_recordings(retention_days=30) — Python default arg backend/services/idle_monitor_service.py:752 2026-06-22 Engineering
Full-record cleanup exists with a 90-day default cutoff; it is not automatically scheduled cleanup_old_call_records(retention_days=90), invoked by the admin-only cleanup endpoint backend/services/idle_monitor_service.py:866; backend/routes/reachout.py:253 2026-08-31 Engineering
Morning Read audio stored as file path (not binary blob) DailyBriefEpisode.mp3_path / Text, nullable backend/models.py:1064 2026-06-22 Engineering
Studio audio stored as file path (not binary blob) SaturdayNightEpisode.mp3_path / Text, nullable backend/models.py:1149 2026-06-22 Engineering
Meet the Team guest context encrypted at rest MeetSession.guest_context / EncryptedText (Fernet) — linked session record, separate from ReachOutCall row backend/models.py:542 2026-06-22 Engineering
Team memory content encrypted at rest PersonaMemory.content / EncryptedText (Fernet) backend/models.py:691 2026-06-22 Engineering
Morning Read download links expire at 48 hours MORNING_READ_DOWNLOAD_EXPIRE_HOURS = 48 backend/auth.py:117 2026-06-22 Engineering
Studio download links expire at 72 hours SATURDAY_NIGHT_DOWNLOAD_EXPIRE_HOURS = 72 backend/auth.py:118 2026-06-22 Engineering
Conference Call trigger type trigger = "manual" — shares ReachOutCall model and retention backend/routes/ide/calls_tips.py:303 2026-06-22 Engineering

What this shows: this dated claim map links selected security statements to the source locations checked on June 22, 2026. It is an audit artifact, not a guarantee that later copy and code remain synchronized.