microduck-cli 0.9.0__tar.gz → 0.9.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. microduck_cli-0.9.2/.devague/current +1 -0
  2. microduck_cli-0.9.2/.devague/current_plan +1 -0
  3. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.devague/deliveries/microduck-cli-env-teach-operate-rules.json +55 -1
  4. microduck_cli-0.9.2/.devague/deliveries/orin-sanity.json +125 -0
  5. microduck_cli-0.9.2/.devague/frames/orin-sanity.json +408 -0
  6. microduck_cli-0.9.2/.devague/plans/orin-sanity.json +316 -0
  7. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/CHANGELOG.md +18 -0
  8. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/PKG-INFO +1 -1
  9. microduck_cli-0.9.2/docs/deliveries/2026-09-04-orin-sanity.md +113 -0
  10. microduck_cli-0.9.2/docs/plans/2026-09-04-orin-sanity.md +67 -0
  11. microduck_cli-0.9.2/docs/specs/2026-09-04-orin-sanity.md +89 -0
  12. microduck_cli-0.9.2/docs/verification/2026-09-04-orin-sanity.md +259 -0
  13. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/pyproject.toml +1 -1
  14. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/uv.lock +1 -1
  15. microduck_cli-0.9.0/.devague/current +0 -1
  16. microduck_cli-0.9.0/.devague/current_plan +0 -1
  17. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/agent-config/SKILL.md +0 -0
  18. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  19. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/agent-config/scripts/show.sh +0 -0
  20. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/ask-colleague/SKILL.md +0 -0
  21. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  22. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  23. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  24. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  25. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  26. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  27. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/challenge/SKILL.md +0 -0
  28. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/cicd/SKILL.md +0 -0
  29. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  30. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  31. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  32. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  33. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  34. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/communicate/SKILL.md +0 -0
  35. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  36. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  37. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  38. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  39. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  40. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  41. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/deviate/SKILL.md +0 -0
  42. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  43. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  44. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/operate-microduck/SKILL.md +0 -0
  45. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  46. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  47. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/recall/SKILL.md +0 -0
  48. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/recall/scripts/recall.sh +0 -0
  49. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/remember/SKILL.md +0 -0
  50. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/remember/scripts/remember.sh +0 -0
  51. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/run-tests/SKILL.md +0 -0
  52. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
  53. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/scope/SKILL.md +0 -0
  54. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/sonarclaude/SKILL.md +0 -0
  55. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  56. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  57. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  58. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/summarize-delivery/SKILL.md +0 -0
  59. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/think/SKILL.md +0 -0
  60. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/think/scripts/think.sh +0 -0
  61. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/validate-delivery/SKILL.md +0 -0
  62. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/version-bump/SKILL.md +0 -0
  63. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills/version-bump/scripts/bump.py +0 -0
  64. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.claude/skills.local.yaml.example +0 -0
  65. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.devague/frames/microduck-cli-env-teach-operate-rules.json +0 -0
  66. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.devague/plans/microduck-cli-env-teach-operate-rules.json +0 -0
  67. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.flake8 +0 -0
  68. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.github/workflows/publish.yml +0 -0
  69. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.github/workflows/tests.yml +0 -0
  70. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.gitignore +0 -0
  71. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/.markdownlint-cli2.yaml +0 -0
  72. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/AGENTS.colleague.md +0 -0
  73. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/CLAUDE.md +0 -0
  74. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/LICENSE +0 -0
  75. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/README.md +0 -0
  76. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/culture.yaml +0 -0
  77. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/docs/deliveries/2026-09-03-microduck-cli-env-teach-operate-rules.md +0 -0
  78. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/docs/operating-the-duck.md +0 -0
  79. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/docs/plans/2026-09-03-microduck-cli-env-teach-operate-rules.md +0 -0
  80. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/docs/skill-sources.md +0 -0
  81. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/docs/specs/2026-09-03-microduck-cli-env-teach-operate-rules.md +0 -0
  82. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/docs/upstream-pins.md +0 -0
  83. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/docs/verification/2026-09-04-sim-bringup.md +0 -0
  84. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/__init__.py +0 -0
  85. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/__main__.py +0 -0
  86. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/__init__.py +0 -0
  87. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/compose.py +0 -0
  88. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/default_rules.toml +0 -0
  89. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/defaults.py +0 -0
  90. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/engine.py +0 -0
  91. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/human_gate.py +0 -0
  92. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/idle.py +0 -0
  93. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/intents.py +0 -0
  94. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/liveness.py +0 -0
  95. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/model.py +0 -0
  96. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/release.py +0 -0
  97. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/replay.py +0 -0
  98. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/rule_engine.py +0 -0
  99. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/rules.py +0 -0
  100. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/sense.py +0 -0
  101. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/senselog.py +0 -0
  102. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/sink.py +0 -0
  103. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/behavior/skills.py +0 -0
  104. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/__init__.py +0 -0
  105. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/__init__.py +0 -0
  106. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/cli.py +0 -0
  107. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/doctor.py +0 -0
  108. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/duck.py +0 -0
  109. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/env.py +0 -0
  110. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/explain.py +0 -0
  111. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/learn.py +0 -0
  112. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/overview.py +0 -0
  113. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/policy.py +0 -0
  114. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/rules.py +0 -0
  115. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_commands/whoami.py +0 -0
  116. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_errors.py +0 -0
  117. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/cli/_output.py +0 -0
  118. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/duck/__init__.py +0 -0
  119. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/duck/addressing.py +0 -0
  120. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/duck/gate.py +0 -0
  121. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/duck/record.py +0 -0
  122. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/env/__init__.py +0 -0
  123. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/env/doctor.py +0 -0
  124. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/env/hosts.py +0 -0
  125. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/env/params.py +0 -0
  126. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/env/stack.py +0 -0
  127. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/explain/__init__.py +0 -0
  128. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/explain/catalog.py +0 -0
  129. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/explain/duck.py +0 -0
  130. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/explain/env.py +0 -0
  131. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/explain/policy.py +0 -0
  132. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/explain/rules.py +0 -0
  133. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/ipc/__init__.py +0 -0
  134. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/ipc/client.py +0 -0
  135. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/ipc/proto.py +0 -0
  136. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/train/__init__.py +0 -0
  137. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/train/artifacts.py +0 -0
  138. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/microduck_cli/train/lane.py +0 -0
  139. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/sonar-project.properties +0 -0
  140. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/__init__.py +0 -0
  141. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/fake_robotd.py +0 -0
  142. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/fixtures/duck_ipc_proto.json +0 -0
  143. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/live/__init__.py +0 -0
  144. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/live/test_live_cli.py +0 -0
  145. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_addressing.py +0 -0
  146. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_cli.py +0 -0
  147. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_cli_introspection.py +0 -0
  148. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_client.py +0 -0
  149. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_default_rules.py +0 -0
  150. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_duck.py +0 -0
  151. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_engine.py +0 -0
  152. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_env.py +0 -0
  153. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_env_doctor.py +0 -0
  154. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_fake_robotd.py +0 -0
  155. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_gate.py +0 -0
  156. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_hosts.py +0 -0
  157. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_human_gate.py +0 -0
  158. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_idle.py +0 -0
  159. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_intents.py +0 -0
  160. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_lane.py +0 -0
  161. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_learn_skill.py +0 -0
  162. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_links.py +0 -0
  163. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_liveness.py +0 -0
  164. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_lockstep.py +0 -0
  165. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_model.py +0 -0
  166. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_no_config_writes.py +0 -0
  167. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_no_hardware_paths.py +0 -0
  168. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_no_secrets_in_output.py +0 -0
  169. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_params.py +0 -0
  170. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_policy.py +0 -0
  171. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_proto.py +0 -0
  172. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_record.py +0 -0
  173. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_release.py +0 -0
  174. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_replay.py +0 -0
  175. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_rule_engine.py +0 -0
  176. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_rules.py +0 -0
  177. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_rules_cli.py +0 -0
  178. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_sense.py +0 -0
  179. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_senselog.py +0 -0
  180. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_sink.py +0 -0
  181. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_skills.py +0 -0
  182. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_stack.py +0 -0
  183. {microduck_cli-0.9.0 → microduck_cli-0.9.2}/tests/test_zero_deps.py +0 -0
@@ -0,0 +1 @@
1
+ orin-sanity
@@ -0,0 +1 @@
1
+ orin-sanity
@@ -2,7 +2,7 @@
2
2
  "plan_slug": "microduck-cli-env-teach-operate-rules",
3
3
  "schema_version": 2,
4
4
  "created": "2026-09-03T19:58:22Z",
5
- "updated": "2026-09-03T22:16:39Z",
5
+ "updated": "2026-09-03T23:34:51Z",
6
6
  "deviations": [
7
7
  {
8
8
  "id": "d1",
@@ -614,6 +614,60 @@
614
614
  "origin": "llm",
615
615
  "status": "proposed",
616
616
  "superseded": false
617
+ },
618
+ {
619
+ "id": "b10",
620
+ "kind": "amended",
621
+ "behavior_text": "Review wave (PR #3): 'rules engine start' and 'rules intent' (spooling into a live engine) go through the same consent gate as every mover (TTY prompt / dry-run on a pipe / --apply); 'engine start' claims <state>/engine.lock, waits for the child's heartbeat, and logs the child to <state>/engine.log",
622
+ "caused_by": [
623
+ "c7",
624
+ "c24",
625
+ "c32"
626
+ ],
627
+ "evidence_refs": [],
628
+ "origin": "llm",
629
+ "status": "proposed",
630
+ "superseded": false
631
+ },
632
+ {
633
+ "id": "b11",
634
+ "kind": "amended",
635
+ "behavior_text": "Review wave (PR #3): 'duck record' opens its own links for pad.input and tof.stream (DUCK_PAD_SOCKET / <name>-tof.sock) and writes frames in reader arrival order from a bounded notification queue; absent sources are named drops",
636
+ "caused_by": [
637
+ "c41"
638
+ ],
639
+ "evidence_refs": [],
640
+ "origin": "llm",
641
+ "status": "proposed",
642
+ "superseded": false
643
+ },
644
+ {
645
+ "id": "b12",
646
+ "kind": "amended",
647
+ "behavior_text": "Review wave (PR #3): the smoke gate compares the recorded RL commit with the checkout's HEAD; 'env up' tears down what it started on a failed start; rules refuse non-finite numbers; sense booleans are strict; a mode rule reaches robot.setMode; repeated skills are re-sent after the owner expires",
648
+ "caused_by": [
649
+ "c8",
650
+ "c22",
651
+ "c12",
652
+ "c23"
653
+ ],
654
+ "evidence_refs": [],
655
+ "origin": "llm",
656
+ "status": "proposed",
657
+ "superseded": false
658
+ },
659
+ {
660
+ "id": "b13",
661
+ "kind": "amended",
662
+ "behavior_text": "Review wave (PR #3, SonarCloud): 'duck quack' in text mode crashed on a mis-called emit_result after the sound had gone out (exit 1 for a quack that happened) \u2014 fixed with a regression test; SignalExit now derives from Exception and is re-raised through TickBus isolation so a SIGTERM inside a driver still unwinds the loop",
663
+ "caused_by": [
664
+ "c6",
665
+ "c35"
666
+ ],
667
+ "evidence_refs": [],
668
+ "origin": "llm",
669
+ "status": "proposed",
670
+ "superseded": false
617
671
  }
618
672
  ],
619
673
  "supersessions": [
@@ -0,0 +1,125 @@
1
+ {
2
+ "plan_slug": "orin-sanity",
3
+ "schema_version": 2,
4
+ "created": "2026-09-04T06:57:02Z",
5
+ "updated": "2026-09-04T07:09:04Z",
6
+ "deviations": [],
7
+ "evidence": [
8
+ {
9
+ "id": "e1",
10
+ "obligation_ref": "o1",
11
+ "test_ref": "MICRODUCK_LIVE=1 MICRODUCK_LIVE_BODY=sim MICRODUCK_LIVE_SIM=1 pytest -m live -n0 (tests/live/test_live_cli.py)",
12
+ "behavior_text": "12 live checks operate the CLI as subprocesses against the real robotd + MuJoCo body: doctor, version, health at 50 Hz, init dry-run+apply, enable+skill, move+stop, rules check, over-limit refusal, six-step engine start, pure-JSONL record, status/down, sim stand-up \u2014 12 passed",
13
+ "contract_text": "env up --sim yields a standing duck on this box, the live suite passes (MICRODUCK_LIVE=1, walking sentinel still xfail), the gates are green, and CI passes on the record PR",
14
+ "evidence_type": "automated",
15
+ "strength": "execution",
16
+ "strength_basis": "live suite ran green on this Orin during the sanity run; outputs in docs/verification/2026-09-04-orin-sanity.md",
17
+ "outcome": "pass",
18
+ "run": {
19
+ "timestamp": "2026-09-04T09:16:00+03:00",
20
+ "commit": "3c09fb0"
21
+ },
22
+ "origin": "llm",
23
+ "status": "approved",
24
+ "superseded": false,
25
+ "seq": 1
26
+ },
27
+ {
28
+ "id": "e2",
29
+ "obligation_ref": "o2",
30
+ "test_ref": "tests/live/test_live_cli.py::test_sim_body_walks_forward_on_move (non-strict xfail sentinel)",
31
+ "behavior_text": "the walking test reported xfailed (1 xfailed in the suite summary) \u2014 locomotion still absent at this pin, no XPASS",
32
+ "contract_text": "the walking xfail sentinel stays expected-fail on Orin; an XPASS is reported as news",
33
+ "evidence_type": "automated",
34
+ "strength": "execution",
35
+ "strength_basis": "same live run; '12 passed, 1098 deselected, 1 xfailed in 29.79s' quoted in the record",
36
+ "outcome": "pass",
37
+ "run": {
38
+ "timestamp": "2026-09-04T09:16:00+03:00",
39
+ "commit": "3c09fb0"
40
+ },
41
+ "origin": "llm",
42
+ "status": "approved",
43
+ "superseded": false,
44
+ "seq": 2
45
+ },
46
+ {
47
+ "id": "e3",
48
+ "obligation_ref": "o3",
49
+ "test_ref": "tests/test_hosts.py (14 tests incl. test_gb10_torch_source_applies_and_no_remediation)",
50
+ "behavior_text": "the classifier's full matrix passes unchanged: gb10/DGX-Spark still classifies with torch_source_applies=True and no remediation; jetson-agx-orin classifies with the unverified remediation \u2014 re-run fresh on the delivery branch",
51
+ "contract_text": "hosts.py needs no change; the sanity confirms the live verdict without touching the classifier \u2014 Spark support kept, not replaced",
52
+ "evidence_type": "automated",
53
+ "strength": "execution",
54
+ "strength_basis": "14 passed in 0.09s at the delivery branch commit; hosts.py diff empty all run",
55
+ "outcome": "pass",
56
+ "run": {
57
+ "timestamp": "2026-09-04T09:45:00+03:00",
58
+ "commit": "e627cad"
59
+ },
60
+ "origin": "llm",
61
+ "status": "approved",
62
+ "superseded": false,
63
+ "seq": 3
64
+ },
65
+ {
66
+ "id": "e4",
67
+ "obligation_ref": "o3",
68
+ "test_ref": "microduck env doctor (live, on-box)",
69
+ "behavior_text": "live doctor reported '[ok] host_class: jetson-agx-orin (NVIDIA Jetson AGX Orin); torch source applies: False' on this box",
70
+ "contract_text": "the live classifier verdict matches the code's jetson-agx-orin branch",
71
+ "evidence_type": "automated",
72
+ "strength": "execution",
73
+ "strength_basis": "doctor output pasted in the record's bring-up section",
74
+ "outcome": "pass",
75
+ "run": {
76
+ "timestamp": "2026-09-04T08:55:00+03:00",
77
+ "commit": "3c09fb0"
78
+ },
79
+ "origin": "llm",
80
+ "status": "approved",
81
+ "superseded": false,
82
+ "seq": 4
83
+ },
84
+ {
85
+ "id": "e5",
86
+ "obligation_ref": "o4",
87
+ "test_ref": "PR #6 CI (lint, test x2, version-check, test-publish, GitGuardian)",
88
+ "behavior_text": "all required checks pass on the record PR at 0.9.2; Sonar/Qodo clean, zero unresolved threads",
89
+ "contract_text": "a dated record lands via a version-bumped PR with CI green",
90
+ "evidence_type": "automated",
91
+ "strength": "execution",
92
+ "strength_basis": "gh pr checks 6: all pass after the MD014 fix",
93
+ "outcome": "pass",
94
+ "run": {
95
+ "timestamp": "2026-09-04T09:40:00+03:00",
96
+ "commit": "e627cad"
97
+ },
98
+ "origin": "llm",
99
+ "status": "approved",
100
+ "superseded": false,
101
+ "seq": 5
102
+ },
103
+ {
104
+ "id": "e6",
105
+ "obligation_ref": "o5",
106
+ "test_ref": "WANDB_MODE=offline microduck policy smoke Mjlab-Velocity-Flat-MicroDuck --json (timeout 900s)",
107
+ "behavior_text": "the smoke failed cleanly in 37s \u2014 torch SBSA cu130 wheel ships sm_110/sm_121 kernels only, not Orin's sm_87 (cudaErrorNoKernelImageForDevice); jp6 fallback closed (no cp312 torch 2.9.1); recorded verbatim in the record's check-5 section as the finding that settles the parked torch risk",
108
+ "contract_text": "a torch failure is a finding, not a sanity failure; anything not attempted lands in an explicit NOT-verified section",
109
+ "evidence_type": "automated",
110
+ "strength": "execution",
111
+ "strength_basis": "smoke ran on-box under timeout; stderr traceback quoted unchanged; HF half recorded as not attempted (no hf session)",
112
+ "outcome": "pass",
113
+ "run": {
114
+ "timestamp": "2026-09-04T09:17:42+03:00",
115
+ "commit": "3c09fb0"
116
+ },
117
+ "origin": "llm",
118
+ "status": "approved",
119
+ "superseded": false,
120
+ "seq": 6
121
+ }
122
+ ],
123
+ "deltas": [],
124
+ "supersessions": []
125
+ }
@@ -0,0 +1,408 @@
1
+ {
2
+ "slug": "orin-sanity",
3
+ "title": "orin-sanity",
4
+ "schema_version": 6,
5
+ "status": "exported",
6
+ "created": "2026-09-04T05:02:12Z",
7
+ "updated": "2026-09-04T06:57:21Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "text": "microduck-cli passes the on-box sanity checks on Jetson AGX Orin, recorded as a verification doc beside the Spark one",
13
+ "origin": "user",
14
+ "status": "confirmed",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h1",
18
+ "text": "every number and output line in the Orin record is pasted from an actual run on this box; nothing is smoothed, and any check that fails or cannot run is recorded verbatim as such",
19
+ "status": "confirmed",
20
+ "instruction": ""
21
+ }
22
+ ],
23
+ "hard_questions": [],
24
+ "links": [],
25
+ "instruction": "bring the box up (rustup, clone both repos at the docs/upstream-pins.md commits, uv sync the RL venv, set MICRODUCK_CLONE/DUCK_SIM_RL), run env doctor until healthy, then execute the six checks of docs/verification/2026-09-04-sim-bringup.md in order (fake body first, then sim), run the live suite, and write the record with outputs pasted unchanged",
26
+ "revisions": []
27
+ },
28
+ {
29
+ "id": "c2",
30
+ "kind": "requirement",
31
+ "text": "re-run the Spark sanity's six success-signal checks on this Jetson AGX Orin and land a sibling record in docs/verification/ \u2014 the Spark record's 'What was NOT verified' names 'Jetson Thor / AGX Orin \u2014 not attempted; the host classifier only' as the gap",
32
+ "origin": "llm",
33
+ "status": "confirmed",
34
+ "honesty_conditions": [
35
+ {
36
+ "id": "h2",
37
+ "text": "the Orin checks map 1:1 to the Spark record's six checks; anything not attempted lands in an explicit NOT-verified section, never silently omitted",
38
+ "status": "confirmed",
39
+ "instruction": ""
40
+ }
41
+ ],
42
+ "hard_questions": [],
43
+ "links": [],
44
+ "instruction": "run the six checks in the Spark record's order (fake body first, then MuJoCo sim), paste each check's output unchanged into docs/verification/<date>-orin-sanity.md with the CLI commit named per check",
45
+ "revisions": []
46
+ },
47
+ {
48
+ "id": "c3",
49
+ "kind": "requirement",
50
+ "text": "bring the box up first: this Orin has no cargo/rustc, no microduck/microduck_rl clones, and MICRODUCK_CLONE/DUCK_SIM_RL unset \u2014 install rustup (env doctor requires cargo, stack.py remediation says >= 1.89; Spark used 1.93.1), clone both repos at the pins in docs/upstream-pins.md, uv sync the RL venv; user approved installing rust",
51
+ "origin": "llm",
52
+ "status": "confirmed",
53
+ "honesty_conditions": [
54
+ {
55
+ "id": "h3",
56
+ "text": "bring-up uses exactly the pinned commits from docs/upstream-pins.md and rustup for the toolchain; no system-wide installs beyond the rust toolchain the user approved",
57
+ "status": "confirmed",
58
+ "instruction": ""
59
+ }
60
+ ],
61
+ "hard_questions": [],
62
+ "links": [],
63
+ "instruction": "install rustup (stable toolchain, cargo >= 1.89), clone pollen-robotics/microduck at 0cd676d (branch sim-remote-io) and microduck_rl at 29e887e (branch develop) beside this repo or set MICRODUCK_CLONE/DUCK_SIM_RL, uv sync the RL clone, then iterate 'microduck env doctor' to healthy",
64
+ "revisions": []
65
+ },
66
+ {
67
+ "id": "c4",
68
+ "kind": "boundary",
69
+ "text": "microduck_cli/env/hosts.py needs no change: classify() already returns jetson-agx-orin for this box (tegra_release present, 'orin' in the gpu-name haystack) with torch_source_applies=False and the unverified remediation \u2014 the sanity run confirms the live verdict, it does not touch the classifier",
70
+ "origin": "llm",
71
+ "status": "confirmed",
72
+ "honesty_conditions": [
73
+ {
74
+ "id": "h4",
75
+ "text": "if the live doctor does NOT report jetson-agx-orin on this box, that is a classifier defect to surface to the user \u2014 never patched silently mid-sanity",
76
+ "status": "confirmed",
77
+ "instruction": ""
78
+ }
79
+ ],
80
+ "hard_questions": [],
81
+ "links": [],
82
+ "instruction": "verify via 'microduck env doctor --json' that this box reports host_class jetson-agx-orin with the unverified-torch remediation; the diff of microduck_cli/env/hosts.py stays empty",
83
+ "revisions": []
84
+ },
85
+ {
86
+ "id": "c5",
87
+ "kind": "boundary",
88
+ "text": "microduck_cli/env/doctor.py needs no change: the host_class check is info-only and always passes (torch_source_applies=False just attaches the remediation text) \u2014 on this box doctor will fail on cargo_version and the clone-pin checks until bring-up is done, which is the tool doing its job",
89
+ "origin": "llm",
90
+ "status": "confirmed",
91
+ "honesty_conditions": [
92
+ {
93
+ "id": "h5",
94
+ "text": "doctor failures on this box are fixed by changing the environment, never by editing the checks",
95
+ "status": "confirmed",
96
+ "instruction": ""
97
+ }
98
+ ],
99
+ "hard_questions": [],
100
+ "links": [],
101
+ "instruction": "drive bring-up from doctor output; the diff of microduck_cli/env/doctor.py stays empty",
102
+ "revisions": []
103
+ },
104
+ {
105
+ "id": "c6",
106
+ "kind": "non_goal",
107
+ "text": "no re-pin: the sanity runs against the exact pins in docs/upstream-pins.md (microduck sim-remote-io 0cd676d, microduck_rl develop 29e887e, API 16) \u2014 re-pinning is its own deliberate PR with its own re-verification",
108
+ "origin": "llm",
109
+ "status": "confirmed",
110
+ "honesty_conditions": [],
111
+ "hard_questions": [],
112
+ "links": [],
113
+ "instruction": "",
114
+ "revisions": []
115
+ },
116
+ {
117
+ "id": "c7",
118
+ "kind": "boundary",
119
+ "text": "the walking xfail sentinel stays expected-fail on Orin: locomotion-not-achieved is a pin-level defect (walk network selected but joint targets static, ruled out CLI/params/keyframe/RTF on Spark), not host-level \u2014 an Orin walk failure is NOT a regression, and an XPASS would mean the pin question needs revisiting, not the Orin run",
120
+ "origin": "llm",
121
+ "status": "confirmed",
122
+ "honesty_conditions": [
123
+ {
124
+ "id": "h6",
125
+ "text": "an XPASS on the walking sentinel is reported to the user as news (walking arrived at this pin), never silently absorbed",
126
+ "status": "confirmed",
127
+ "instruction": ""
128
+ }
129
+ ],
130
+ "hard_questions": [],
131
+ "links": [],
132
+ "instruction": "run 'MICRODUCK_LIVE=1 uv run pytest -m live -n0' (plus MICRODUCK_LIVE_SIM=1 for the sim body); the walking sentinel must report xfail, and its result is quoted in the record",
133
+ "revisions": []
134
+ },
135
+ {
136
+ "id": "c8",
137
+ "kind": "audience",
138
+ "text": "the operator of this box plus future agents and reviewers who need microduck-cli's verified-on-Orin status; mesh peers reading docs/verification/",
139
+ "origin": "user",
140
+ "status": "confirmed",
141
+ "honesty_conditions": [
142
+ {
143
+ "id": "h7",
144
+ "text": "the record must be trustworthy to a reader who did not watch the run \u2014 no reference to unavailable scratchpad logs as load-bearing evidence",
145
+ "status": "confirmed",
146
+ "instruction": ""
147
+ }
148
+ ],
149
+ "hard_questions": [],
150
+ "links": [],
151
+ "instruction": "write the record self-contained like the Spark one: a header table (host, L4T/CUDA, toolchain, pins, CLI commits, daemon API) so a reader needs no session context",
152
+ "revisions": []
153
+ },
154
+ {
155
+ "id": "c9",
156
+ "kind": "before_state",
157
+ "text": "the Spark record names 'Jetson Thor / AGX Orin \u2014 not attempted; the host classifier only' as an open gap, and this box is bare: no rust toolchain, no microduck/microduck_rl clones, MICRODUCK_CLONE/DUCK_SIM_RL unset",
158
+ "origin": "user",
159
+ "status": "confirmed",
160
+ "honesty_conditions": [
161
+ {
162
+ "id": "h8",
163
+ "text": "the before-state is recorded as probed on this box, not assumed",
164
+ "status": "confirmed",
165
+ "instruction": ""
166
+ }
167
+ ],
168
+ "hard_questions": [],
169
+ "links": [],
170
+ "instruction": "record the bare-box starting state (no rust, no clones, unset env vars) in the record so the bring-up steps are reproducible",
171
+ "revisions": []
172
+ },
173
+ {
174
+ "id": "c10",
175
+ "kind": "after_state",
176
+ "text": "a dated record docs/verification/<date>-orin-sanity.md exists beside the Spark one, recording the six checks as run on this Orin with outputs pasted verbatim \u2014 including check 5's torch-on-L4T outcome, pass or fail \u2014 and lands via a version-bumped PR",
177
+ "origin": "user",
178
+ "status": "confirmed",
179
+ "honesty_conditions": [
180
+ {
181
+ "id": "h9",
182
+ "text": "the record is written only from actual runs at named CLI commits, per-check, as the Spark doc does",
183
+ "status": "confirmed",
184
+ "instruction": ""
185
+ }
186
+ ],
187
+ "hard_questions": [],
188
+ "links": [],
189
+ "instruction": "name the file with the run date, link docs/upstream-pins.md, open the PR with a version bump via the version-bump + cicd skills",
190
+ "revisions": []
191
+ },
192
+ {
193
+ "id": "c11",
194
+ "kind": "success_signal",
195
+ "text": "env up --sim yields a standing duck on this box, the live suite passes (MICRODUCK_LIVE=1, walking sentinel still xfail), the gates (check 6) are green, and CI passes on the record PR",
196
+ "origin": "user",
197
+ "status": "confirmed",
198
+ "honesty_conditions": [
199
+ {
200
+ "id": "h10",
201
+ "text": "success signals are pasted outputs, never paraphrased summaries",
202
+ "status": "confirmed",
203
+ "instruction": ""
204
+ }
205
+ ],
206
+ "hard_questions": [],
207
+ "links": [],
208
+ "instruction": "quote the standing-duck monitor frames, the live-suite summary line, and the check-6 gate outputs verbatim in the record",
209
+ "revisions": []
210
+ },
211
+ {
212
+ "id": "c12",
213
+ "kind": "assumption",
214
+ "text": "uv sync of the microduck_rl clone must succeed for checks 1-4 as well, not just check 5: body_server (MuJoCo) and onnxruntime live in that venv, and uv sync will attempt the pytorch-cu129 aarch64 torch wheel on this box \u2014 a torch install failure would block the sim body, not only the smoke",
215
+ "origin": "llm",
216
+ "status": "confirmed",
217
+ "honesty_conditions": [
218
+ {
219
+ "id": "h11",
220
+ "text": "if uv sync fails on the torch wheel, the record states the failure verbatim and the sim checks are reported as blocked-by-venv (falling back to the --fake body only), never silently narrowed",
221
+ "status": "confirmed",
222
+ "instruction": ""
223
+ }
224
+ ],
225
+ "hard_questions": [],
226
+ "links": [],
227
+ "instruction": "",
228
+ "revisions": []
229
+ },
230
+ {
231
+ "id": "c13",
232
+ "kind": "requirement",
233
+ "text": "the record's header states the box's runtime conditions the tick-rate signals depend on: power mode (probed today: MAXN), memory pressure at run time, and what else was running \u2014 on Jetson unified memory the GPU budget is the system budget",
234
+ "origin": "llm",
235
+ "status": "confirmed",
236
+ "honesty_conditions": [
237
+ {
238
+ "id": "h12",
239
+ "text": "the header's runtime-conditions values (power mode, memory, co-tenants) are probed again at run time on the sanity box, never copied forward from this challenge pass's probes",
240
+ "status": "confirmed",
241
+ "instruction": ""
242
+ }
243
+ ],
244
+ "hard_questions": [],
245
+ "links": [],
246
+ "instruction": "",
247
+ "revisions": []
248
+ }
249
+ ],
250
+ "open_vagueness": [
251
+ {
252
+ "id": "v1",
253
+ "text": "MuJoCo body_server + onnxruntime aarch64 wheels installed and ran on Spark (GB10, also linux-aarch64) but have never been exercised on Orin's L4T userspace; likely fine (plain aarch64 CPU wheels, ORT dlopened from the RL venv) but only the live run tells",
254
+ "kind": "unknown_nonblocking",
255
+ "claim_id": null,
256
+ "resolved": false,
257
+ "resolution": "",
258
+ "resolution_claim_id": null
259
+ },
260
+ {
261
+ "id": "v2",
262
+ "text": "check 5 may hang rather than fail cleanly on an incompatible torch/GPU stack \u2014 the run needs a timeout discipline (lands plan-side as a risk/task once /spec-to-plan seeds the plan)",
263
+ "kind": "unknown_nonblocking",
264
+ "claim_id": null,
265
+ "resolved": false,
266
+ "resolution": "",
267
+ "resolution_claim_id": null
268
+ }
269
+ ],
270
+ "scope_entries": [
271
+ {
272
+ "id": "s1",
273
+ "surface": "docs/verification/2026-09-04-sim-bringup.md",
274
+ "finding": "the Spark sanity is the template: six checks (env up --sim standing duck, health 50Hz, duck do skill, rules overlay + refusal, policy smoke local+HF dry-run, the gates) plus the fake-body pass and the live suite; its NOT-verified list explicitly names AGX Orin as not attempted",
275
+ "seeds": [
276
+ "c2"
277
+ ]
278
+ },
279
+ {
280
+ "id": "s2",
281
+ "surface": "this box (Jetson AGX Orin, L4T R39, CUDA 13.2, driver 595.78)",
282
+ "finding": "probed read-only: /etc/nv_tegra_release R39 present, GPU 'Orin (nvgpu)', uv + python 3.12.3 present, but no rust toolchain and no upstream clones \u2014 bring-up is a prerequisite, and the user approved installing rust",
283
+ "seeds": [
284
+ "c3"
285
+ ]
286
+ },
287
+ {
288
+ "id": "s3",
289
+ "surface": "microduck_cli/env/hosts.py",
290
+ "finding": "jetson-agx-orin branch exists and matches this box's probe (gpu 'Orin (nvgpu)', nv_tegra_release R39); torch_source_applies=False by design \u2014 Jetson gets JetPack-index torch, not pytorch-cu129",
291
+ "seeds": [
292
+ "c4"
293
+ ]
294
+ },
295
+ {
296
+ "id": "s4",
297
+ "surface": "microduck_cli/env/doctor.py",
298
+ "finding": "host_class check is severity=info, passed=True regardless of torch verdict (lines 540-560); the real Orin blockers doctor will report are cargo_version and the clone checks \u2014 MICRODUCK_CLONE else ../microduck sibling, DUCK_SIM_RL/MICRODUCK_RL_CLONE else ../microduck_rl sibling",
299
+ "seeds": [
300
+ "c5"
301
+ ]
302
+ },
303
+ {
304
+ "id": "s5",
305
+ "surface": "docs/upstream-pins.md",
306
+ "finding": "pins are validated-against commits; the doc itself says re-pin deliberately (one PR, all rows) and re-run on-box verification when you do \u2014 so the Orin sanity holds the pins fixed",
307
+ "seeds": [
308
+ "c6"
309
+ ]
310
+ },
311
+ {
312
+ "id": "s6",
313
+ "surface": "tests/live/test_live_cli.py",
314
+ "finding": "the live suite (MICRODUCK_LIVE=1, -m live -n0; MICRODUCK_LIVE_SIM=1 for the MuJoCo body) is the runnable half of the sanity \u2014 12 checks passed on Spark; test_sim_body_walks_forward_on_move is a non-strict xfail sentinel by design",
315
+ "seeds": [
316
+ "c7"
317
+ ]
318
+ },
319
+ {
320
+ "id": "s7",
321
+ "surface": "microduck_cli/train/lane.py + microduck_rl [tool.uv.sources] (read at the pin via hosts.py docstring)",
322
+ "finding": "the train lane resolves the RL clone via DUCK_SIM_RL/MICRODUCK_RL_CLONE and shells to uv run train there; whether that venv's torch actually runs on Orin is exactly the t8/t15 unknown_nonblocking risk the classifier remediation names \u2014 seeded question q1 (include check 5 or record it not-attempted)",
323
+ "seeds": []
324
+ },
325
+ {
326
+ "id": "s8",
327
+ "surface": "challenge pass / adjacent-systems lens: microduck_rl pyproject at pin + train/lane.py",
328
+ "finding": "the RL venv is a shared dependency of the sim checks and the smoke; torch install failure contaminates checks 1-4, not just 5 \u2014 seeded the venv assumption",
329
+ "seeds": [
330
+ "c12"
331
+ ]
332
+ },
333
+ {
334
+ "id": "s9",
335
+ "surface": "challenge pass / operations lens: this box (nvpmodel, free, ps)",
336
+ "finding": "probed: MAXN power mode, 12 cores, 1.4T disk free, port 7801 free, headless (no DISPLAY, matches the Spark recipe) \u2014 but 53Gi/61Gi RAM held by a vLLM engine (colleague backend), ~7.7Gi available",
337
+ "seeds": [
338
+ "c13"
339
+ ]
340
+ },
341
+ {
342
+ "id": "s10",
343
+ "surface": "challenge pass / failure-mode lens: policy smoke on unverified torch",
344
+ "finding": "a hang is likelier than a clean ImportError on a bad GPU stack; Spark's smoke took 58.6s \u2014 parked the timeout-discipline residual for the plan leg",
345
+ "seeds": []
346
+ },
347
+ {
348
+ "id": "s11",
349
+ "surface": "challenge pass / reversibility lens: rustup + clones",
350
+ "finding": "clean: rustup self uninstall reverses the toolchain, clones are plain directories; g++ is absent but rust links via cc \u2014 if any build step wants g++ an apt install is surfaced to the user first, not done silently",
351
+ "seeds": []
352
+ },
353
+ {
354
+ "id": "s12",
355
+ "surface": "challenge pass / security lens: bring-up downloads",
356
+ "finding": "clean pass: clones are pinned commits from pollen-robotics, wheels from PyPI/PyTorch indexes over uv, rustup from the official installer; no credentials touched (HF/wandb stay unset unless check 5 needs the dry-run namespace)",
357
+ "seeds": []
358
+ }
359
+ ],
360
+ "lapses": [],
361
+ "obligations": [
362
+ {
363
+ "id": "o1",
364
+ "claim_id": "c11",
365
+ "seam": "opt-in live suite against the real daemon + MuJoCo body",
366
+ "behavior": "the CLI operates a real simulated duck end to end on this host: doctor, health at 50 Hz, init/enable/skill, move+stop, rules check, refusal, six-step engine start, record, stand-up",
367
+ "source_text": "env up --sim yields a standing duck on this box, the live suite passes (MICRODUCK_LIVE=1, walking sentinel still xfail), the gates (check 6) are green, and CI passes on the record PR",
368
+ "origin": "user",
369
+ "status": "approved"
370
+ },
371
+ {
372
+ "id": "o2",
373
+ "claim_id": "c7",
374
+ "seam": "walking sentinel (test_sim_body_walks_forward_on_move)",
375
+ "behavior": "locomotion remains expected-fail at this pin; an XPASS would be surfaced, never absorbed",
376
+ "source_text": "the walking xfail sentinel stays expected-fail on Orin: locomotion-not-achieved is a pin-level defect (walk network selected but joint targets static, ruled out CLI/params/keyframe/RTF on Spark), not host-level \u2014 an Orin walk failure is NOT a regression, and an XPASS would mean the pin question needs revisiting, not the Orin run",
377
+ "origin": "user",
378
+ "status": "approved"
379
+ },
380
+ {
381
+ "id": "o3",
382
+ "claim_id": "c4",
383
+ "seam": "env/hosts.py classifier (unit + live doctor)",
384
+ "behavior": "jetson-agx-orin is classified correctly on this box AND the gb10/DGX-Spark class still classifies with torch_source_applies=True \u2014 Orin support is additive, Spark support unchanged",
385
+ "source_text": "microduck_cli/env/hosts.py needs no change: classify() already returns jetson-agx-orin for this box (tegra_release present, 'orin' in the gpu-name haystack) with torch_source_applies=False and the unverified remediation \u2014 the sanity run confirms the live verdict, it does not touch the classifier",
386
+ "origin": "user",
387
+ "status": "approved"
388
+ },
389
+ {
390
+ "id": "o4",
391
+ "claim_id": "c10",
392
+ "seam": "PR #6 (docs/orin-sanity, 0.9.2)",
393
+ "behavior": "the verification record lands via a version-bumped PR with CI green",
394
+ "source_text": "a dated record docs/verification/<date>-orin-sanity.md exists beside the Spark one, recording the six checks as run on this Orin with outputs pasted verbatim \u2014 including check 5's torch-on-L4T outcome, pass or fail \u2014 and lands via a version-bumped PR",
395
+ "origin": "user",
396
+ "status": "approved"
397
+ },
398
+ {
399
+ "id": "o5",
400
+ "claim_id": "c2",
401
+ "seam": "policy smoke on the Orin GPU (check 5)",
402
+ "behavior": "the smoke is attempted under an explicit timeout and its outcome recorded verbatim \u2014 pass, fail, or timeout",
403
+ "source_text": "re-run the Spark sanity's six success-signal checks on this Jetson AGX Orin and land a sibling record in docs/verification/ \u2014 the Spark record's 'What was NOT verified' names 'Jetson Thor / AGX Orin \u2014 not attempted; the host classifier only' as the gap",
404
+ "origin": "user",
405
+ "status": "approved"
406
+ }
407
+ ]
408
+ }