docs: post-pilot polish — de-lint, doc-truth, replay demo, architecture diagram, pilot field report (#35)
* docs: de-lint, fix doc-truth gaps, add badges + CHANGELOG + vuln reporting Post-pilot repo polish (Phase A of the presentation-hardening pass): - .gitignore: also ignore .idea/, *.swp, scratch/ so editor/scratch litter can't be committed. - Remove the two dead linear.app hyperlinks (docs/agent-monitoring.md, sensorwatch-monitor/SKILL.md); keep the LEO-### ids as plain-text provenance. - README: add PyPI-version, Python-versions, crates.io, and MIT-license badges; drop the stale "once published" crates hedge (crates.io is live). - ROADMAP: add `report` to the Rust CLI status row. - SECURITY.md: add a "Reporting a Vulnerability" section (private GitHub security advisories) — README/CONTRIBUTING routed reporters here but there was no reporting path. - CHANGELOG.md: new (Keep a Changelog), from the v0.1.0/v0.1.1/v0.2.0 tag history plus an Unreleased section for the post-0.2.0 C++/Rust/CLI/skills work. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi * docs: no-hardware replay demo, architecture diagram, pilot field report Post-pilot showcase assets (Phase B of the presentation-hardening pass): - examples/demo/: a committed 4-sample +12V fixture, a commented threshold rule, and a walkthrough README. `watch --replay` fires a critical event with zero hardware on any OS (exit 10); `--follow` records the full fire -> clear lifecycle. make_demo_gif.py runs those exact commands, captures their real stdout and exit codes, and renders the committed demo.gif from them, so the recording can't drift from the CLI. - Mermaid five-layer architecture diagram in README and docs/agent-monitoring.md (validated), replacing the text-only layer table as the visual hook. - docs/pilot-field-report.md: a sanitized write-up of the week-long, agent-run pilot — the quiet 8-day soak, two fault drills (a synthetic escalation-ladder run and a real OCCT thermal event delivered over three channels), and the three defects adversarial testing surfaced. Host/network/account specifics scrubbed. - README: a "Try it in 60 seconds -- no hardware" quickstart with the demo GIF. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi * docs: address PR review on the demo GIF generator Round 1 feedback (Copilot) on examples/demo/make_demo_gif.py: - load_font: the fallback returned ImageFont.load_default() (not a FreeTypeFont), so the return annotation was wrong. Use load_default(size), which returns a sized FreeTypeFont on modern Pillow — the annotation is now accurate and the fallback still honors the requested size. - The exit note hard-coded "a rule fired" regardless of the real exit code. Gate it on rc1 == 10 (the "rule fired" contract) so a demo command that exits any other way can't render as a passing one. No visual change to the committed demo.gif (the real run exits 10 and Cascadia Mono is present, so neither path is exercised on the recording host). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi * docs: address round-1 rollup reviews (codex / claude / kimi) Doc-truth and robustness fixes from the three rollup reviews: - Pilot field report ran as an INTERACTIVE session, not the headless per-wake supervisor. Corrected the "fresh invocation / zero context growth" claims to describe the real runtime (bounded per-wake reads + on-disk state + periodic compaction), and framed headless invocation as the Phase-2 graduation the discipline enables. (codex #1, claude #1) - ROADMAP: flipped the Phase 1 pilot from "now underway" to complete (dates, both drills), linked the field report, and now tracks the three pilot defects as Phase 2/C follow-ups so the report's "see roadmap" is true. Softened the escalation-ladder claim: the tier-3 issue rung is a drafted-artifact placeholder, not a wired action. Diagrams say "issue-draft" to match. (codex #1/#2, claude #1) - README Requirements: split into replay-demo (Rust >= 1.82 + C compiler), Python-package, and live-monitor prerequisites, and noted HWiNFO's free-tier 12-hour Shared Memory limit for always-on use. Added a Windows PowerShell command variant to the quickstart. (codex #3, claude #2, kimi #4/#5) - README: added the shipped `report` subcommand to the sensorwatch-cli enumeration. (codex #5) - make_demo_gif.py: fail closed — validate rc1==10, rc2==0, and fired/cleared event states before rendering, so a broken demo can't overwrite demo.gif with a passing recording; and search Linux/macOS font dirs so regeneration off Windows uses a real monospace font. (codex #4, claude #6/#7, kimi #3) - CI: added a replay-demo smoke test to the rust job (Ubuntu + Windows) — the one-shot exits 10 with a fired event, --follow emits fired+cleared — so the "60-second demo" can't silently rot. (kimi #2) - Dropped stale publication hedges in rust/Cargo.toml and CONTRIBUTING.md (both registries have shipped). (claude #3) - examples/demo/README: reset logs/ before the --follow example so its sample output actually shows seq 1. (claude #8) - CHANGELOG: clarified that post-0.2.0 Rust/CLI/skill work is recorded under Unreleased until the next Python tag. (kimi #6) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi * docs: consolidate the LEO-411 monitor worked example from PR #33 Pulls the reviewed, non-overlapping substance of PR #33 into this PR so the post-pilot docs land as one unit (and #33 can close): - examples/monitor-setup/ — a copy-from starting point for the always-on agent monitor on the free ntfy path: an annotated config.toml exercising all five rule kinds, an ntfy-only notify.toml (with commented Pushover/SMTP add-ons, all placeholder values), and a PILOT_TEST_PLAN.md acceptance checklist. Complements examples/demo/ (try-a-fire) with a real-setup example, and is where the HWiNFO free-tier note also lives. - README: a pointer to the worked example from the monitor-skill section, merged into the same paragraph as the new architecture diagram. - skills/sensorwatch-monitor/SKILL.md: three correctness clarifications — drain the spool on bootstrap (watch never replays it on re-arm), open_incident.py's --classification requirement, and the ack_event.py pending-path constraint plus its update-deduped incident partner. Verified: config.toml parses through `watch` (valid rule set), all relative links and anchors in the pulled files resolve, and notify.toml carries only placeholder secrets (topic sensorwatch-CHANGEME, example.com addresses). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi * docs: address round-2 review (codex 2×P1 + P2s, kimi nits) Tier-3 contract alignment (codex #1 / claude #1) — the authoritative skill surfaces still directed a real Linear issue while ROADMAP/report/diagrams say "issue-draft placeholder", so an agent could attempt an unsupported action. Reworded to the issue-draft/outbox placeholder (real tracker/webhook = Phase C): SKILL.md tier table, the tier-3 guidance paragraph, and the security summary; templates/bootstrap.md; scripts/escalation_gate.py's tier ladder; and notify.py's docstring. Monitor worked example runnable from a clean state (codex #2) — examples/ monitor-setup/README.md §3 now initializes the state directory with init_state.py (ack_event.py needs cursor.json) and starts the layer-1 `sensorwatch log` alongside the one-shot watcher (live watch samples HWiNFO directly and writes no sensors_*.jsonl, so report/baseline had no history). Fixed config.toml's "watch reads the log stream" comment. PILOT_TEST_PLAN §6 notes the logger must be running for the 24h baseline. Verified end to end: init_state.py creates the state tree, and the plan's fixture fires psu-12v-sag (exit 10) against the example config. POSIX/PowerShell (codex #3) — documented that the worked-example and test-plan commands are POSIX shell (Git Bash/WSL) and added a PowerShell variant to the demo README's --follow section. ROADMAP opener (codex #4) — the real notification transport shipped in LEO-339; only the unattended runtime remains in progress. Nits — CI demo smoke test now also asserts the --follow exit code (kimi #3); make_demo_gif.py drops the now-unreachable caption branch (kimi #1) and broadens load_font's return annotation (kimi #2). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi * docs: address round-3 review — honest tier-3 contract, single-cwd worked example Round 3 (codex 2×P1, both independently confirmed by claude; kimi approve w/ suggestions; 2 Copilot nits): Tier-3 contract, honest this time (codex P1 #1) — round 2 overcorrected: the skill claimed tier 3 "emits an issue-draft to outbox/", but notify.py in the canonical routed mode never writes outbox (fallback only when notify.toml is absent). Reworded to what the tooling does today: tier 3 delivers the same routed notification as tier 2; no distinct issue action is wired (Phase C); an agent may force a durable draft with --adapter outbox (verified at runtime: writes the draft file AND records delivery, so it arms the cooldown and counts toward the daily cap — documented). Applied to SKILL.md (table, guidance, security summary), templates/bootstrap.md, escalation_gate.py, and the ROADMAP ladder bullet. Worked example: one working directory (codex P1 #2, claude confirm) — every command in examples/monitor-setup/README.md and PILOT_TEST_PLAN.md now runs from examples/monitor-setup/: helper scripts as ../../skills/..., a working- directory-and-binary note in both files, and the bare-`sensorwatch` trap called out with the path-qualified Rust binary (kimi #1). Verified end to end from that cwd: config validate (exit 0) → init_state → replay fire (exit 10, spool written) → open → summary pending=1 → re-open update-deduped → ack (cursor 0→1, file to spool/acked/). Nits — fixture/for_samples cross-references in config.toml and the test plan (kimi #3); never-commit-a-real-topic warning in notify.toml (kimi #4); make_demo_gif.py falls back to argless load_default() on Pillow < 10.1 (Copilot); rust/Cargo.toml comment says "both library crates", CLI repo-only (Copilot). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi * docs: address round-4 review — Python prerequisite + ladder-label truth codex P1 — a user with HWiNFO + the Rust CLI hits exit 127 at the very first monitor-state command because Python was never listed as an agent-monitor prerequisite. Added Python 3.12+ (with the python/python3/py launcher note) to examples/monitor-setup/README.md prerequisites, the sensorwatch-monitor SKILL.md prerequisites (list renumbered), and the root README's live-monitor requirements bucket. codex P2 / kimi's remaining inconsistency — the Mermaid ladder label and the ROADMAP ladder enumeration still read "issue-draft", over-promising a distinct tier-3 artifact the routed path doesn't produce. Both diagram copies (kept byte-identical) now read "issue (Phase C)" and the ROADMAP enumerates the rung as a placeholder pointing at the explanation below it. kimi polish — the root README Install section now notes that the PyPI package's `sensorwatch` console script is the Python logger, not the Rust CLI with snapshot/watch/report, and to path-qualify the Rust binary when both are on PATH. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxKabmaTX8ZY8PJBkrKxmi --------- Co-authored-by: lcj-claude-coder <lcj.claude.coder@pm.me> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
A
Agent for Leonard Janke committed
786212ee5173ea42c0145ad2c8ec59cd4672f306
Parent: 5ee6f3a
Committed by GitHub <noreply@github.com>
on 7/14/2026, 12:22:04 AM