Napkin analysis and trace audit

Identity and status

Retained on 2026-10-11 from the audit in the commissioning conversation. This working report consolidates the returned findings and trace anchors; it is not a new audit or a verbatim session transcript. Severity and recommendations are the auditors' judgments, not adopted method decisions.

run-id: AAS-2026-10-10-napkin-b831630d0978-01
method-commit: 6ff7c828e94dd66abdf5af00c89db6420bc6a1ad
source-revision: 7582d6a46f5a11995956e60a59c41a5b242109f1
worker-profile: pi-sol
audit-date: 2026-10-11

Local worktree: /home/zby/llm/commonplace/.commonplace/worktrees/napkin-b831630d0978. Local session trace: /home/zby/.pi/agent/sessions/--home-zby-llm-commonplace--/2026-10-10T22-10-09-558Z_01a127dd-cc16-745a-b8d3-80ae1386ab9d.jsonl. Original worker messages are embedded in subagent tool-result details.results[].messages arrays, not separate worker session files.

Path abbreviations below are relative to that worktree:

  • A/: kb/agentic-system-analyses/retained/napkin/.
  • S/: related-systems/Michaelliv--napkin/.
  • Attempt IDs refer to this run's state/handouts/ directories.

Outcome and limits

The central characterization survived the audit: file-backed retention, caller-requested retrieval, instruction-mediated curation, and no demonstrated learning benefit. Three medium-severity gaps and three narrower qualifications were identified. No high-severity finding overturned that account.

Two independent reviewers inspected correctness against the frozen source; the coordinator spot-checked principal findings. A separate reviewer inspected all 13 original workers' embedded traces. This was static inspection, not target or benchmark execution. Publication-byte integrity was not independently audited. No analysis, method, run state, or integration was changed.

The original audit recommended a corrected run before integration. That remains a local recommendation, not an authorized run or evidence that a general method change is needed. All findings below come from one run.

Correctness findings

N1 — Medium: Distillation instructions conflict with path semantics

The skill's creation example at S/skills/distill/SKILL.md:86 supplies a title and --path "<folder>". But S/src/core/crud.ts:46–53 treats the path as the complete target filename and ignores the title when a path is supplied. A title of Connection Pooling and path of guides targets guides.md, not guides/Connection Pooling.md. CLI forwarding is at S/src/main.ts:230–241.

The skilled retention account in A/runtime.md:35,107 and A/synthesis.md:16–18 omits this constraint. Literal adherence is insufficient; the agent must correct the path. A related basename rewrite example at S/skills/distill/SKILL.md:79–80 can target a root-level file instead of an existing nested note because creation does not use read-style resolution. No actual distillation failure was executed or observed.

N2 — Medium: Saved files inherit a consumer established only for in-memory results

A/memory-profile.md:613–624 assigns wired knowledge authority at benchmark aggregation/reporting to the retained benchmark-results object. A/memory.md:180 identifies JSONL/JSON files, while A/epistemic.md:307 describes aggregation as later read-back.

The inspected drivers add result objects to an array and separately save them: S/bench/longmemeval-eval.ts:628–632 and S/bench/locomo-eval.ts:439–445. Aggregation consumes allResults, not a reload of those files (661–694 and 454–495, respectively). The analysis record contract excludes ordinary current-run state from read-back.

Separate storage from current-run aggregation. Retained-file consumption remains unresolved unless a concrete reload path is identified. This does not establish that no external consumer exists.

N3 — Medium: Documented automatic delivery is treated as wholly indeterminate

A/memory-profile.md:915–975 withholds a positive automatic-delivery finding; A/profile-verification.md:24–25 endorses it. Yet S/docs/distill.md:11–24 describes a timer, a new-entry check, and prompt assembly from NAPKIN.md and templates. Lines 44,75,79–82 describe background operation, template selection, and supplying that retained context to the model.

This supports a documented claim of automatic delivery, not implementation or deployment verification. Missing implementation should not erase the claimed mechanism. Add the source facts to the underlying records before changing the profile; the profile should not invent facts absent from those records.

N4 — Low: Search withdrawal needs a default-search qualification

A/memory.md:75,310, A/synthesis.md:18, and A/memory-profile.md:808–819 describe withdrawal of soft-deleted content from ordinary search, with explicit reads remaining possible. Folder-scoped search can also discover deleted Markdown files: S/src/core/search.ts:53,234 passes the search folder into enumeration, while S/src/utils/files.ts:28–54 skips encountered hidden directories but not a directly selected starting folder.

Thus --path .trash can search deleted notes. The supported statement is withdrawal from default vault-wide discovery, not all search. The analysis already rejects secure-deletion guarantees; this is a missing condition.

N5 — Low: Empty context creation is conditional

A/runtime.md:18 says discovery creates an empty NAPKIN.md. S/src/utils/vault.ts:91–94 writes it only if absent. Existing populated context is preserved. The broader finding that discovery can mutate state still holds.

N6 — Low: Benchmark averages exclude failed questions

A/epistemic.md:82 says error/null results withhold measurement but does not explain the changed denominator. Only non-null results enter allResults; means and confidence intervals use those surviving results: S/bench/longmemeval-eval.ts:628–632,661–694 and S/bench/locomo-eval.ts:439–445,483–495.

These are successful-run-conditional metrics. Correlation between failure and difficulty could make aggregates optimistic. Whether any published score was affected is unknown; the analysis already withholds verification of headline accuracy.

Trace findings

Trace anchors use 1-based JSONL line numbers (L) and 0-based indices in each worker's embedded messages array (m). A parallel result number distinguishes the two workers on L26. These locators refer to the session file above.

T1 — A substantive analytical error was caught and repaired

The initial 000008-epistemic treated the auxiliary exposure-measurement script as an operative evaluation route despite an incompatible corpus-loader call.

  • 000014-reconciliation, L30 m40: retained the conflict.
  • 000017-report-verification, L34 m63: made correction a publication blocker.
  • 000019-epistemic, L38 m41: made nine coordinated replacements.
  • 000026-report-verification, L46 m67: independently accepted the repair.

This is successful semantic review after content validation, not an outstanding error. The incompatibility was established statically, not by executing the script. It should count as evidence that the correction loop worked, alongside its cost.

T2 — Shell success masked a failed operation

000005-runtime, L22 m16–17, requested nonexistent src/utils/file.ts with wc. The output reported failure, but a final successful printf made the tool call succeed. At m23 the worker read the correct src/utils/files.ts. The source-access need was recovered, although the inventory command was not rerun successfully.

Other compound commands did not preserve individual statuses: L26 memory m21 and m49, and L26 epistemic m23. No underlying failure was demonstrated for those commands. The worker rules already require status preservation, so recurrence could reflect noncompliance rather than a missing rule.

T3 — Three validation failures were repaired

  • 000003-boundary, L18 m93: quotation-attribution errors; repaired at m98 and validation passed at m101.
  • 000008-epistemic, L26 result 1 m64: quotation-attribution errors; repaired at m65.
  • Same worker, m68: a quote occurred three times; m69 supplied the disambiguating source range and m72 passed validation.

These repairs added attribution or disambiguation. No claim withdrawal or narrowing was identified in these validation repairs.

T4 — Actual output truncation was recovered

000007-memory, L26 result 0 m50, retained lines 110–584 of a search result, dropping 109 lines. The narrower search at m51–52 recovered the omitted SDK matches. No unrecovered substantive content was identified.

Some required reads advertised a remaining line that proved to be empty EOF content. Two verification workers deferred or omitted such continuations. This is a procedural imperfection, not evidence of a substantive reading gap. Scoped source reads were allowed and were not classified as failures merely because more source lines existed.

T5 — Read logs record requested rather than actual ranges

000026-report-verification logs ranges such as search lines 160–339, overview lines 985–1084, and the distill skill lines 1–180, although the corresponding files have 252, 1033, and 136 lines. Reads are at L46 m49 and m54; the authored log is at m67. 000017-report-verification has similar ranges.

The tools returned through EOF. This does not establish fabricated content or insufficient reading, but the retained logs are not exact coverage records.

T6 — No unauthorized mutation observed

Inspection found no explicit worker writes outside assigned outputs, identities, or scratch paths; no target execution, network use, nested delegation, or prior-review exposure was observed. The correcting epistemic worker copied its supplied previous report into its own output before editing. The memory-profile worker executed an authorized scratch generator and revalidated semantic self-revisions after an earlier validation pass. Neither was an unauthorized repair.

Coverage and cost

Attempt Session anchor Tool calls
000003-boundary L18 77
000005-runtime L22 42
000007-memory L26 result 0 57
000008-epistemic L26 result 1 45
000014-reconciliation L30 23
000017-report-verification L34 42
000019-epistemic L38 27
000023-reconciliation L42 23
000026-report-verification L46 44
000028-memory-profile L50 29
000030-profile-verification L54 30
000032-synthesis L60 34
000034-synthesis-verification L64 32

Total: 13 workers, 836 embedded messages, 505 tool calls (419 reads, 47 bash, 33 writes, 6 edits). Seventeen validation invocations produced 14 passes and three failures; every worker eventually obtained a pass. All enclosing worker results reported exit code 0, empty stderr, and normal stop.

Harness-reported usage: 305 model turns; 991,770 input tokens; 12,145,408 cache-read tokens; 93,797 output tokens; $4.1360508 reported cost; 2,420.02 summed worker-seconds. Summed time is not wall-clock time because workers overlapped. These figures cover the original analysis workers, not this audit.

Repeated independent reads were partly required by the method. Avoidable retries and successful semantic review should not be collapsed into one waste measure. Missing host implementation, target-run evidence, datasets, and raw benchmark traces remain evidence limits, not execution failures established by this audit.

Improvement candidates, not adopted changes

The audit proposed checking skill examples against APIs, requiring concrete reload consumers for retained-memory claims, preserving documentation-backed mechanisms at their actual evidence strength, inspecting benchmark denominators, reporting recovered failures, and making consequential profile verification selectively source-facing. It also proposed better shell-status handling and accurate source-read ranges.

These are hypotheses for comparison with other reports. N1–N6 could be local output mistakes; T1 shows an existing safeguard working; T2 concerns an already stated rule. No candidate has cross-run support established here. The workshop's multi-report decision boundary supersedes treating this list as a method-edit backlog.