Repository navigation
feat(examples): add reproducible industrial presenter walkthrough - #327
Conversation
Add a single-terminal workflow-scope demonstration with owned local services, measured motion forwarding, offline evidence verification and tamper rejection. Include a hashed release lock, a timed presenter guide, and focused unit and live CI coverage. Signed-off-by: Carlos Hernandez <carloshvp@gmail.com>
imran-siddique
left a comment
There was a problem hiding this comment.
Approving 04043d9. Here, from the hash lock on Python 3.12: 22 controller tests pass and validate_artifacts.py reports 2 valid receipts. The live suite will not start on Windows (SIGINT unsupported, WinError 10013 binding 8443), which PRESENTING.md:16 already scopes to macOS and Linux; the hosted Linux job ran all 5 live tests OK. The links failure is two 503s in unchanged READMEs (alakris-authority-comparison, litzki-systems-sovp), and both URLs return 200 now, so a rerun should clear it.
dinakarjs
left a comment
There was a problem hiding this comment.
Independent approval of the bounded software presenter walkthrough at 04043d9. No blocking runtime finding in this review. This does not certify robot safety, physical completion, independent controller identity, hardware provenance or a cryptographic manifest-to-session binding; PRESENTING.md correctly excludes those claims.
Linux/Python 3.12 with a fresh environment installed from requirements-presenter.txt using --require-hashes: 22 unit/controller tests pass; validate_artifacts.py verifies the committed manifest, TRACE/audit evidence and 2 teaching-controller receipts; all 5 live tests pass after clearing inherited proxy variables. The first live run had one SOCKS dependency failure in the unchanged original agent's trust_env=True client, not the new presenter client; no proxy or runtime behavior was changed. The live tests exercise fresh sessions, delayed presenter pauses, interruption, closed input, partial startup cleanup, stopped-service offline verification and tamper refusal.
I also generated a fresh standalone --auto run, stopped its services, prohibited socket creation and independently checked the original, altered and receipt-stripped evidence. Original verifies; both altered and stripped bundles refuse without partial success text on stdout. The historical committed packet is now outside the verifier freshness window in a direct unpinned-time call, so I used fresh evidence rather than weakening freshness.
Imran's nonblocking portable-coverage suggestion remains confirmed: replacing verify_evidence.verify's 'if not receipts' with False still passes all 5 test_presenter.py tests. An isolated review probe stubbing only the downstream verifier catches that mutation and, after restoration, confirms the refusal happens before the downstream function is called. Removing receipts from a real signed bundle can also be rejected by downstream integrity checks; that case alone does not isolate this guard. Please retain a portable direct verify() no-receipts test as the follow-up, independent of the Linux-only live suite.
Targeted E4/E7/E9/F lint and diff whitespace checks pass. A broader inherited lint configuration additionally reported style/executable-bit diagnostics; that broader scan is not claimed clean or an existing enforced examples gate. Temporary edits restored; worktree clean. No package publication or external service call required.
|
The nonblocking portable wrapper-test follow-up is now concrete in draft #332, based directly on your unchanged 04043d9 head and targeting this PR's branch. It adds only tests/test_verify_evidence.py: missing receipts refuse before a stubbed downstream verifier is called, the admitted twin forwards once, and downstream failure publishes no partial report. All 25 unit tests pass; the three new tests also pass without loading downstream runtime packages. Removing only the wrapper receipt-presence guard in process makes all three negative subcases fail while the other controls pass. Ruff/diff checks pass. No runtime, fixture, live-host or hardware change; please assess/integrate when convenient. My existing #327 approval remains bounded to its reviewed head. |
Signed-off-by: Carlos Hernandez <carloshvp@gmail.com>
|
Resolved the failing The latest failed attempt was two HTTP 404 references to The fresh link-check run passes on |
The industrial example currently needs three terminals and manual service cleanup. This adds a reproducible, presenter-controlled walkthrough showing why an in-envelope motion still needs workflow authorization.
python present.pystarts local cMCP and the simulated controller, then advances through six screens with five Enter presses: mission, undeclared-workflow denial, declared-workflow authorization, session close and service shutdown, offline verification, and rejection of a tampered copy. The controller's measured motion-request counter stays 0 for the denied request and becomes 1 for the authorized request. Every state-read/motion pair stays together so presenter pauses do not weaken the five-second token expiry.Reproduce this PR before merge:
Validation on macOS with Python 3.11.12 and a fresh environment installed from the hash lock: 22 unit tests, five live tests, committed artifact validation, Ruff and local documentation links passed. Live tests cover two fresh runs, both first pauses beyond five seconds, offline verification with socket operations forbidden, altered/missing evidence, the original three-path runner, Ctrl+C, EOF and partial startup cleanup. The Linux industrial CI job also passed all 22 unit tests, five live tests, and committed artifact validation.
Evidence remains explicitly software-only. The controller uses a public teaching key; signatures do not establish hardware provenance or physical completion. Agent Manifest validation remains offline, without manifest-to-session identity binding. Forwarding counters are diagnostic observations, not signed hardware telemetry. No frontend or robot hardware is required.
Requested and directed by @carloshvp; implemented with AI assistance.