Skip to content

feat(papercuts): a local feedback loop from one-tap report to verified fix #22

Description

@nohat

Goal

One tap (or none) to a report that carries everything an agent needs, then triage, a fix, a deploy, and a measured close, all on my machines. Reporting costs nothing, and the loop reaches "validated" without me being the test runner. Design page: docs/fork/papercuts.md. Capture (stages 1 and 2) is built; this tracks everything after it.

Decision, 2026-10-05

"i want a personal feedback loop that enforces privacy and security by keeping everything local to me and my environments implemented first. no need for different parts inside my loop to preserve privacy from other parts--that's just theater. only when we are thinking about possibly upstreaming the feature we can worry about privacy and security."

Consequences:

Shape

report (tap, shake, palette, or the stall watchdog)
  -> record + trace slice on the receiving server        (immutable)   #26 #27 #28
  -> overlay: status history, signature, issue link      (append-only) #24 #29
  -> triage job (hourly, silent when idle) -> issue      (public-safe) #30
  -> I dispatch /defect-session papercuts                              #32 #31
  -> fix on fix/* -> gate -> fork-deploy                 (existing)
  -> overlay: fixed in <fork version>; soak; recur or close            #33

Waves

Wave 0 (now): decision record in docs/fork/papercuts.md; #23 egress.
Wave 1 (parallel): #24 overlay and CLI, #25 identity and retry, #26 server snapshot. #27 client capture follows #25 because both edit PapercutReporter.tsx; contract edits to papercut.ts are additive but will touch the same file, so merge in order.
Wave 2: #28 watchdog reports (after #26), #29 signature (after #24, and after about 10 real records from #26 and #27), #31 repro kit.
Wave 3: #30 triage job (after #24 and #29). Milestone: a stalled thread becomes a triaged issue with no tap and no message from me.
Wave 4: #32 dispatch mode, #33 recurrence, soak, close, and metrics.

Checklist

Assumptions recorded (change by comment)

  • Triage state is overlay files plus a CLI, not an RPC or a database, because the live server owns the records and one user needs nothing larger.
  • Signature is computed at triage and stored in the overlay, not at ingest, so the recipe can change without touching server code.
  • Soak is 7 days after deploy; closing is reversible.
  • Triage runs hourly and is silent on an empty list; dispatch stays mine (posture).
  • Build identity is the fork version.

Not now (each needs an exhibit first)

A list view on web, desktop, and mobile (the CLI and the issues are the view; build it once they prove insufficient, and it must show status and undo on every surface). Android hang records (ApplicationExitInfo). A persistent outbox for web and desktop beyond retry in memory. An MCP toolkit for reports. Embeddings or LLM duplicate search over free text. Session replay. A priority model. Auto-dispatch of fixes. A sink layer.

Open question for later

Whether to auto-dispatch fixes for a class of cluster with a good track record. Decide with the numbers from #33, not before.

What success looks like

Median report to triaged issue under an hour, none of it hand-reconstructed. A failing test for most bounded clusters. Recurrence per build visible in one command. I touch the loop twice: the tap, and the dispatch.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions