docs: document three-auditor panel and fix-loop protocol#1
Merged
Conversation
One shared prompt, three concurrent seats, sequential waves across a checklist so agents do not fan out or substitute a single droid run for the full panel.
Document the full per-check cycle: three seats → fix → auditor-loop → repeat, then advance only when residual majors are gone.
Snapshot cleanup is try/finally; audit uses requested vs injected vs failed; PATH-resolved op warns to set OBSERVER_OP_BIN; multiple pending approvals require --run-id; runguard state is rebound via _STATE_DIR not env-only.
Residual re-audits use droid exec; auditor-loop briefs are prompt inputs only.
…n dry-run. Avoid orphaned 0600 pointer temps when op is missing, and stop treating grep/head -n as a dry-run sample for the secrets approval carve-out.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
CHECK: secrets-possession-boundary
HEAD: 17310ae (branch nm/secrets-possession-boundary; secrets implementation landed as 66c692f → 6145fd7 → e876f97 on main)
SCOPE:
record_secrets_injection, resolve_op_bin, snapshot_secrets_env, cmd_run --secrets path)
INTENT:
Opt-in credential injection via KEY=op:// pointer files and
op run, so scriptslaunched outside the harness do not get vault credentials. Possession boundary,
not a sandbox.
DELIBERATE (do not reverse):
before op is invoked (exit 4)
NON-GOALS:
REPORT: severity + evidence; report only (no product file edits unless your seat
is no-mistakes after an explicit fix gate).
Also validate the audit-panel process docs commits on this branch. Do not reverse DELIBERATE secrets design. Prefer blocking on correctness/security/test failures over ponytail-style shrinks.
What Changed
docs/audit-panel.mddescribing the three-seat audit panel (buggie · no-mistakes · ponytail ultra), run concurrently per check with a single shared prompt, then synthesize and fix agreed majors../auditor-loop/run.shon the same check until no major issues remain before advancing, and noted the no-mistakes seat needs a feature branch with real commits ahead ofmain.auditor-loop/*references as operator-local/git-excluded rather than live repo links to avoid dead links in the published tree.Risk Assessment
✅ Low: The only change is a new documentation file whose sole prior finding was fixed per the user's instructions; all referenced local paths are correctly caveated as operator-local/git-excluded, so there is nothing functional or user-visible at risk.
Testing
Ran the secrets suite (tests/test_secrets.py, 21/21 pass) and produced a reviewer-visible CLI transcript from real
observer_kit run --secretsinvocations that exercises the full possession boundary end-to-end: exit-2 grammar rejections (plain + ${} templates, value not echoed), dry-run samples still injected, exit-4 full-run approval gate with op never invoked, an approved run where op injects vault values and the stale parent literal for a declared key is scrubbed, the names-only OBSERVER_SECRETS hint, and a durable names-only secrets_audit.jsonl confirmed leak-free. The base→target diff itself is docs/audit-panel.md, whose auditor-loop/* references I confirmed are untracked and correctly labeled operator-local/git-excluded — internally consistent, no broken links. This is a CLI/docs change with no rendered UI surface, so a text CLI transcript is the appropriate end-user artifact; all checks pass.Evidence: Secrets possession-boundary end-to-end CLI transcript
Evidence: test_secrets.py result
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
🔧 **Review** - 1 issue found → auto-fixed ✅
docs/audit-panel.md:4- The three seat links[buggie](../.claude/skills/buggie/SKILL.md),[no-mistakes](.../no-mistakes/SKILL.md), and[ponytail ultra](.../ponytail/SKILL.md)resolve to repo paths that don't exist —.claude/skills/in this repo only containsobserver-flowandobserver-kit, and these skills aren't present at the user skills level either. Anyone reading the doc through the repo gets dead links. Unlike theauditor-loop/*references, these are not caveated as git-excluded/operator-local, so they read as live repo links. Confirm whether these skills are meant to be operator-local (then caveat them like the auditor-loop paths) or vendored into the repo.🔧 Fix: De-link operator-local audit seats in audit-panel doc
✅ Re-checked - no issues remain.
✅ **Test** - passed
✅ No issues found.
/tmp/nmvenv/bin/python tests/test_secrets.py— 21/21 pass (grammar, dedup, exit-2 refusals, parent-env scrub, op-missing fail-closed, wrap shape, names-only audit + lane events, exit-4 approval gate, dry-run injection, ensure_secrets_approval)End-to-endpython -m observer_kit run --secrets ... -- <child>CLI transcript with a fakeopon OBSERVER_OP_BIN, covering: plain value refused (exit 2), op:// ${} interpolation refused (exit 2), dry-run sample injected (exit 0), full-run without approval refused (exit 4, op not invoked), approved run injecting vault values with stale parent HUBSPOT_TOKEN literal scrubbed, and OBSERVER_SECRETS names-only markerInspected .observer/secrets_audit.jsonl and grepped for literal credential values (sk-live / vault-secret) — names only, no leakVerified docs/audit-panel.md references viagit ls-files auditor-loop/,ls auditor-loop/,git check-ignore— files are untracked and correctly described as operator-local/git-excludedCross-checked README.md --secrets/op:// documentation against observed CLI behavior (exit 4 on unapproved full run, samples ok, KEY=op:// only)git status --porcelain— worktree clean, no transient artifacts left behind✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.