enginery 0.1.0__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 (332) hide show
  1. enginery-0.1.0/.approval_tests_temp/.gitignore +1 -0
  2. enginery-0.1.0/.approval_tests_temp/approve_all.py +72 -0
  3. enginery-0.1.0/.approval_tests_temp/remove_abandoned_files.py +94 -0
  4. enginery-0.1.0/.archex/index.db +0 -0
  5. enginery-0.1.0/.archex/index.meta +1 -0
  6. enginery-0.1.0/.archex/metadata.json +4 -0
  7. enginery-0.1.0/.archex/settings.toml +16 -0
  8. enginery-0.1.0/.claude/anatomy.md +23 -0
  9. enginery-0.1.0/.docs/01_VIDEO_ANALYSIS.md +314 -0
  10. enginery-0.1.0/.docs/02_PRODUCT_DIRECTION.md +332 -0
  11. enginery-0.1.0/.docs/03_SYSTEM_DESIGN.md +1292 -0
  12. enginery-0.1.0/.docs/04_SPECIFICATION_REVIEW.md +206 -0
  13. enginery-0.1.0/.docs/DEVELOPMENT_PLAN.md +535 -0
  14. enginery-0.1.0/.docs/EXECUTION_PROMPTS.md +1373 -0
  15. enginery-0.1.0/.docs/M5_CORRECTIVE_GO_EXECUTION_PROMPT.md +103 -0
  16. enginery-0.1.0/.docs/M5_CORRECTIVE_GO_PLAN.md +114 -0
  17. enginery-0.1.0/.docs/MILESTONE_REASSESSMENTS.md +405 -0
  18. enginery-0.1.0/.docs/README.md +32 -0
  19. enginery-0.1.0/.docs/Reframing_Enginery_from_defensive_to_definitive.md +3 -0
  20. enginery-0.1.0/.docs/Stop_rogue_AI_agents_with_Enginery.md +3 -0
  21. enginery-0.1.0/.docs/analysis.md +225 -0
  22. enginery-0.1.0/.docs/handoff.md +39 -0
  23. enginery-0.1.0/.docs/strategy.md +71 -0
  24. enginery-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  25. enginery-0.1.0/.github/workflows/ci.yml +55 -0
  26. enginery-0.1.0/.gitignore +218 -0
  27. enginery-0.1.0/.python-version +1 -0
  28. enginery-0.1.0/CHANGELOG.md +67 -0
  29. enginery-0.1.0/CONTRIBUTING.md +46 -0
  30. enginery-0.1.0/LICENSE +201 -0
  31. enginery-0.1.0/PKG-INFO +74 -0
  32. enginery-0.1.0/README.md +48 -0
  33. enginery-0.1.0/RELEASE_NOTES.md +88 -0
  34. enginery-0.1.0/SECURITY.md +24 -0
  35. enginery-0.1.0/config/performance-bounds.toml +28 -0
  36. enginery-0.1.0/docs/adapters.md +232 -0
  37. enginery-0.1.0/docs/dependencies-v0.1.0.md +56 -0
  38. enginery-0.1.0/docs/design.md +686 -0
  39. enginery-0.1.0/docs/examples.md +153 -0
  40. enginery-0.1.0/docs/ledger-schema.md +160 -0
  41. enginery-0.1.0/docs/migration-sage-dev.md +320 -0
  42. enginery-0.1.0/docs/operations.md +336 -0
  43. enginery-0.1.0/docs/overview.md +200 -0
  44. enginery-0.1.0/docs/pitch.md +260 -0
  45. enginery-0.1.0/docs/release-readiness-v0.1.0.md +156 -0
  46. enginery-0.1.0/docs/workflows.md +371 -0
  47. enginery-0.1.0/fixtures/enginery-stage2-fixture/.gitignore +3 -0
  48. enginery-0.1.0/fixtures/enginery-stage2-fixture/CHANGELOG.md +6 -0
  49. enginery-0.1.0/fixtures/enginery-stage2-fixture/LICENSE +201 -0
  50. enginery-0.1.0/fixtures/enginery-stage2-fixture/README.md +13 -0
  51. enginery-0.1.0/fixtures/enginery-stage2-fixture/pyproject.toml +29 -0
  52. enginery-0.1.0/fixtures/enginery-stage2-fixture/src/enginery_stage2_fixture/__init__.py +28 -0
  53. enginery-0.1.0/pyproject.toml +78 -0
  54. enginery-0.1.0/scripts/adversarial_capability_gate.py +250 -0
  55. enginery-0.1.0/scripts/adversarial_merge_ready_gate.py +251 -0
  56. enginery-0.1.0/scripts/adversarial_outcome_capture.py +292 -0
  57. enginery-0.1.0/scripts/adversarial_policy_gate.py +174 -0
  58. enginery-0.1.0/scripts/check_import_boundaries.py +182 -0
  59. enginery-0.1.0/scripts/fault_inject_ledger.py +470 -0
  60. enginery-0.1.0/scripts/fault_inject_publication.py +254 -0
  61. enginery-0.1.0/scripts/fault_inject_workers.py +318 -0
  62. enginery-0.1.0/scripts/fault_injection/__init__.py +9 -0
  63. enginery-0.1.0/scripts/fault_injection/framework.py +83 -0
  64. enginery-0.1.0/scripts/full_system_gate.py +520 -0
  65. enginery-0.1.0/scripts/generate_ledger_fixture.py +31 -0
  66. enginery-0.1.0/scripts/generate_ledger_schema_doc.py +76 -0
  67. enginery-0.1.0/scripts/performance_baseline.py +175 -0
  68. enginery-0.1.0/scripts/release_gate.py +214 -0
  69. enginery-0.1.0/scripts/run_stage2_gate.py +112 -0
  70. enginery-0.1.0/scripts/stress_plan_scheduler.py +206 -0
  71. enginery-0.1.0/scripts/stress_runtime.py +245 -0
  72. enginery-0.1.0/scripts/stress_scheduler.py +34 -0
  73. enginery-0.1.0/scripts/verify_project_identity.py +84 -0
  74. enginery-0.1.0/scripts/verify_published_release.py +207 -0
  75. enginery-0.1.0/src/enginery/__init__.py +14 -0
  76. enginery-0.1.0/src/enginery/adapters/__init__.py +10 -0
  77. enginery-0.1.0/src/enginery/adapters/armory.py +243 -0
  78. enginery-0.1.0/src/enginery/adapters/claude_code.py +371 -0
  79. enginery-0.1.0/src/enginery/adapters/github.py +885 -0
  80. enginery-0.1.0/src/enginery/adapters/local.py +432 -0
  81. enginery-0.1.0/src/enginery/adapters/omp.py +343 -0
  82. enginery-0.1.0/src/enginery/adapters/pypi.py +199 -0
  83. enginery-0.1.0/src/enginery/application/__init__.py +8 -0
  84. enginery-0.1.0/src/enginery/application/adapter_types.py +199 -0
  85. enginery-0.1.0/src/enginery/application/delivery_ports.py +219 -0
  86. enginery-0.1.0/src/enginery/application/work_ports.py +403 -0
  87. enginery-0.1.0/src/enginery/capabilities/__init__.py +11 -0
  88. enginery-0.1.0/src/enginery/capabilities/approval.py +69 -0
  89. enginery-0.1.0/src/enginery/capabilities/errors.py +63 -0
  90. enginery-0.1.0/src/enginery/capabilities/lock.py +129 -0
  91. enginery-0.1.0/src/enginery/capabilities/materialize.py +99 -0
  92. enginery-0.1.0/src/enginery/capabilities/resolver.py +205 -0
  93. enginery-0.1.0/src/enginery/capabilities/serialization.py +113 -0
  94. enginery-0.1.0/src/enginery/capabilities/signature.py +120 -0
  95. enginery-0.1.0/src/enginery/cli/__init__.py +7 -0
  96. enginery-0.1.0/src/enginery/cli/_exit_codes.py +38 -0
  97. enginery-0.1.0/src/enginery/cli/capability.py +78 -0
  98. enginery-0.1.0/src/enginery/cli/doctor.py +61 -0
  99. enginery-0.1.0/src/enginery/cli/ledger.py +43 -0
  100. enginery-0.1.0/src/enginery/cli/main.py +396 -0
  101. enginery-0.1.0/src/enginery/cli/outcome.py +169 -0
  102. enginery-0.1.0/src/enginery/cli/stage1.py +345 -0
  103. enginery-0.1.0/src/enginery/cli/stage2.py +71 -0
  104. enginery-0.1.0/src/enginery/domain/__init__.py +8 -0
  105. enginery-0.1.0/src/enginery/domain/artifact.py +72 -0
  106. enginery-0.1.0/src/enginery/domain/digests.py +62 -0
  107. enginery-0.1.0/src/enginery/domain/enums.py +32 -0
  108. enginery-0.1.0/src/enginery/domain/errors.py +129 -0
  109. enginery-0.1.0/src/enginery/domain/evidence.py +75 -0
  110. enginery-0.1.0/src/enginery/domain/factory_change.py +120 -0
  111. enginery-0.1.0/src/enginery/domain/ids.py +182 -0
  112. enginery-0.1.0/src/enginery/domain/immutable.py +60 -0
  113. enginery-0.1.0/src/enginery/domain/intervention.py +50 -0
  114. enginery-0.1.0/src/enginery/domain/node_attempt.py +206 -0
  115. enginery-0.1.0/src/enginery/domain/observation.py +120 -0
  116. enginery-0.1.0/src/enginery/domain/outcome.py +83 -0
  117. enginery-0.1.0/src/enginery/domain/plan_execution.py +275 -0
  118. enginery-0.1.0/src/enginery/domain/policy_decision.py +145 -0
  119. enginery-0.1.0/src/enginery/domain/principal.py +20 -0
  120. enginery-0.1.0/src/enginery/domain/run.py +174 -0
  121. enginery-0.1.0/src/enginery/domain/serialization.py +766 -0
  122. enginery-0.1.0/src/enginery/domain/stack.py +387 -0
  123. enginery-0.1.0/src/enginery/domain/state_machine.py +85 -0
  124. enginery-0.1.0/src/enginery/domain/work_item.py +145 -0
  125. enginery-0.1.0/src/enginery/domain/workflow/__init__.py +11 -0
  126. enginery-0.1.0/src/enginery/domain/workflow/budget.py +59 -0
  127. enginery-0.1.0/src/enginery/domain/workflow/manifest.py +310 -0
  128. enginery-0.1.0/src/enginery/domain/workflow/node.py +331 -0
  129. enginery-0.1.0/src/enginery/domain/workflow/schema.py +96 -0
  130. enginery-0.1.0/src/enginery/engine/__init__.py +8 -0
  131. enginery-0.1.0/src/enginery/engine/coordinator.py +343 -0
  132. enginery-0.1.0/src/enginery/engine/fixture_build.py +175 -0
  133. enginery-0.1.0/src/enginery/engine/leases.py +335 -0
  134. enginery-0.1.0/src/enginery/engine/omp_worker.py +115 -0
  135. enginery-0.1.0/src/enginery/engine/plan_execution.py +388 -0
  136. enginery-0.1.0/src/enginery/engine/recovery.py +185 -0
  137. enginery-0.1.0/src/enginery/engine/release_manifest.py +194 -0
  138. enginery-0.1.0/src/enginery/engine/results.py +44 -0
  139. enginery-0.1.0/src/enginery/engine/runtime.py +1158 -0
  140. enginery-0.1.0/src/enginery/engine/scheduler.py +199 -0
  141. enginery-0.1.0/src/enginery/engine/stack_coordinator.py +205 -0
  142. enginery-0.1.0/src/enginery/engine/supervisor.py +447 -0
  143. enginery-0.1.0/src/enginery/engine/workspace.py +409 -0
  144. enginery-0.1.0/src/enginery/evaluation/__init__.py +8 -0
  145. enginery-0.1.0/src/enginery/evaluation/outcomes.py +380 -0
  146. enginery-0.1.0/src/enginery/evaluation/queries.py +106 -0
  147. enginery-0.1.0/src/enginery/evidence/__init__.py +31 -0
  148. enginery-0.1.0/src/enginery/evidence/evaluator.py +128 -0
  149. enginery-0.1.0/src/enginery/evidence/terminal.py +307 -0
  150. enginery-0.1.0/src/enginery/ledger/__init__.py +69 -0
  151. enginery-0.1.0/src/enginery/ledger/artifact_store.py +130 -0
  152. enginery-0.1.0/src/enginery/ledger/artifacts.py +152 -0
  153. enginery-0.1.0/src/enginery/ledger/backup.py +137 -0
  154. enginery-0.1.0/src/enginery/ledger/commit_cursors.py +65 -0
  155. enginery-0.1.0/src/enginery/ledger/connection.py +69 -0
  156. enginery-0.1.0/src/enginery/ledger/errors.py +64 -0
  157. enginery-0.1.0/src/enginery/ledger/events.py +302 -0
  158. enginery-0.1.0/src/enginery/ledger/inbox.py +192 -0
  159. enginery-0.1.0/src/enginery/ledger/leases.py +142 -0
  160. enginery-0.1.0/src/enginery/ledger/migrations.py +68 -0
  161. enginery-0.1.0/src/enginery/ledger/outbox.py +90 -0
  162. enginery-0.1.0/src/enginery/ledger/process_manager.py +142 -0
  163. enginery-0.1.0/src/enginery/ledger/projections.py +222 -0
  164. enginery-0.1.0/src/enginery/ledger/redaction.py +105 -0
  165. enginery-0.1.0/src/enginery/ledger/schema.py +196 -0
  166. enginery-0.1.0/src/enginery/ledger/service.py +173 -0
  167. enginery-0.1.0/src/enginery/ledger/verify.py +120 -0
  168. enginery-0.1.0/src/enginery/plans/__init__.py +15 -0
  169. enginery-0.1.0/src/enginery/plans/loader.py +41 -0
  170. enginery-0.1.0/src/enginery/plans/model.py +313 -0
  171. enginery-0.1.0/src/enginery/plans/normalization.py +59 -0
  172. enginery-0.1.0/src/enginery/policy/__init__.py +20 -0
  173. enginery-0.1.0/src/enginery/policy/approval.py +212 -0
  174. enginery-0.1.0/src/enginery/policy/defaults.py +67 -0
  175. enginery-0.1.0/src/enginery/policy/evaluator.py +178 -0
  176. enginery-0.1.0/src/enginery/policy/rules.py +175 -0
  177. enginery-0.1.0/src/enginery/policy/schemas.py +195 -0
  178. enginery-0.1.0/src/enginery/py.typed +0 -0
  179. enginery-0.1.0/src/enginery/workflows/evidence.py +66 -0
  180. enginery-0.1.0/src/enginery/workflows/implementation.py +124 -0
  181. enginery-0.1.0/src/enginery/workflows/issue_to_pr.py +153 -0
  182. enginery-0.1.0/src/enginery/workflows/merge_policy.py +166 -0
  183. enginery-0.1.0/src/enginery/workflows/plan_to_release.py +206 -0
  184. enginery-0.1.0/src/enginery/workflows/pull_request.py +73 -0
  185. enginery-0.1.0/src/enginery/workflows/review.py +68 -0
  186. enginery-0.1.0/src/enginery/workflows/stage1.py +1284 -0
  187. enginery-0.1.0/src/enginery/workflows/stage1_runtime.py +222 -0
  188. enginery-0.1.0/src/enginery/workflows/verification.py +139 -0
  189. enginery-0.1.0/tests/__init__.py +0 -0
  190. enginery-0.1.0/tests/adapters/armory/__init__.py +0 -0
  191. enginery-0.1.0/tests/adapters/armory/test_armory_capability_source.py +200 -0
  192. enginery-0.1.0/tests/adapters/claude_code/test_claude_code_harness.py +323 -0
  193. enginery-0.1.0/tests/adapters/contracts/test_harness_contract.py +235 -0
  194. enginery-0.1.0/tests/adapters/github/test_github_pull_requests.py +188 -0
  195. enginery-0.1.0/tests/adapters/github/test_github_pull_requests_merge.py +164 -0
  196. enginery-0.1.0/tests/adapters/github/test_github_work_ledger.py +227 -0
  197. enginery-0.1.0/tests/adapters/github_release/test_github_release_adapter.py +225 -0
  198. enginery-0.1.0/tests/adapters/local/test_local_providers.py +180 -0
  199. enginery-0.1.0/tests/adapters/omp/test_omp_harness.py +243 -0
  200. enginery-0.1.0/tests/adapters/pypi/test_pypi_adapter.py +196 -0
  201. enginery-0.1.0/tests/application/test_adapter_types.py +175 -0
  202. enginery-0.1.0/tests/application/test_delivery_ports.py +130 -0
  203. enginery-0.1.0/tests/application/test_work_ports.py +264 -0
  204. enginery-0.1.0/tests/artifacts/__init__.py +0 -0
  205. enginery-0.1.0/tests/artifacts/test_artifact_store.py +104 -0
  206. enginery-0.1.0/tests/artifacts/test_artifacts.py +162 -0
  207. enginery-0.1.0/tests/capabilities/__init__.py +0 -0
  208. enginery-0.1.0/tests/capabilities/test_approval.py +144 -0
  209. enginery-0.1.0/tests/capabilities/test_lock.py +129 -0
  210. enginery-0.1.0/tests/capabilities/test_materialize.py +106 -0
  211. enginery-0.1.0/tests/capabilities/test_resolver.py +181 -0
  212. enginery-0.1.0/tests/capabilities/test_serialization.py +94 -0
  213. enginery-0.1.0/tests/capabilities/test_signature.py +135 -0
  214. enginery-0.1.0/tests/cli/__init__.py +0 -0
  215. enginery-0.1.0/tests/cli/test_capability.py +180 -0
  216. enginery-0.1.0/tests/cli/test_doctor.py +89 -0
  217. enginery-0.1.0/tests/cli/test_ledger.py +198 -0
  218. enginery-0.1.0/tests/cli/test_outcome.py +235 -0
  219. enginery-0.1.0/tests/cli/test_policy.py +22 -0
  220. enginery-0.1.0/tests/cli/test_stage1.py +406 -0
  221. enginery-0.1.0/tests/cli/test_stage2.py +81 -0
  222. enginery-0.1.0/tests/cli/test_version.py +22 -0
  223. enginery-0.1.0/tests/conftest.py +34 -0
  224. enginery-0.1.0/tests/domain/__init__.py +0 -0
  225. enginery-0.1.0/tests/domain/test_artifact.py +88 -0
  226. enginery-0.1.0/tests/domain/test_digests.py +53 -0
  227. enginery-0.1.0/tests/domain/test_factory_change.py +197 -0
  228. enginery-0.1.0/tests/domain/test_ids.py +149 -0
  229. enginery-0.1.0/tests/domain/test_immutable.py +37 -0
  230. enginery-0.1.0/tests/domain/test_intervention.py +75 -0
  231. enginery-0.1.0/tests/domain/test_node_attempt.py +243 -0
  232. enginery-0.1.0/tests/domain/test_observation.py +175 -0
  233. enginery-0.1.0/tests/domain/test_outcome.py +103 -0
  234. enginery-0.1.0/tests/domain/test_plan_execution.py +231 -0
  235. enginery-0.1.0/tests/domain/test_policy_decision.py +165 -0
  236. enginery-0.1.0/tests/domain/test_run.py +198 -0
  237. enginery-0.1.0/tests/domain/test_serialization.py +344 -0
  238. enginery-0.1.0/tests/domain/test_stack.py +304 -0
  239. enginery-0.1.0/tests/domain/test_state_machine.py +92 -0
  240. enginery-0.1.0/tests/domain/test_transition_coverage.py +76 -0
  241. enginery-0.1.0/tests/domain/test_work_item.py +211 -0
  242. enginery-0.1.0/tests/e2e/__init__.py +0 -0
  243. enginery-0.1.0/tests/e2e/test_issue_to_pr_recovery.py +47 -0
  244. enginery-0.1.0/tests/engine/__init__.py +0 -0
  245. enginery-0.1.0/tests/engine/test_coordinator.py +119 -0
  246. enginery-0.1.0/tests/engine/test_coordinator_runtime.py +470 -0
  247. enginery-0.1.0/tests/engine/test_fixture_build.py +155 -0
  248. enginery-0.1.0/tests/engine/test_leases.py +148 -0
  249. enginery-0.1.0/tests/engine/test_omp_worker.py +81 -0
  250. enginery-0.1.0/tests/engine/test_plan_execution.py +321 -0
  251. enginery-0.1.0/tests/engine/test_recovery.py +104 -0
  252. enginery-0.1.0/tests/engine/test_release_manifest.py +195 -0
  253. enginery-0.1.0/tests/engine/test_runtime.py +174 -0
  254. enginery-0.1.0/tests/engine/test_supervisor.py +82 -0
  255. enginery-0.1.0/tests/evidence/__init__.py +0 -0
  256. enginery-0.1.0/tests/evidence/test_evaluator.py +120 -0
  257. enginery-0.1.0/tests/evidence/test_terminal.py +310 -0
  258. enginery-0.1.0/tests/fixtures/domain/artifact.json +17 -0
  259. enginery-0.1.0/tests/fixtures/domain/factory_change.json +20 -0
  260. enginery-0.1.0/tests/fixtures/domain/intervention.json +14 -0
  261. enginery-0.1.0/tests/fixtures/domain/node_attempt.json +29 -0
  262. enginery-0.1.0/tests/fixtures/domain/observation.json +16 -0
  263. enginery-0.1.0/tests/fixtures/domain/outcome.json +15 -0
  264. enginery-0.1.0/tests/fixtures/domain/policy_decision.json +21 -0
  265. enginery-0.1.0/tests/fixtures/domain/run.json +26 -0
  266. enginery-0.1.0/tests/fixtures/domain/work_item.json +26 -0
  267. enginery-0.1.0/tests/fixtures/ledger.db +0 -0
  268. enginery-0.1.0/tests/fixtures/plans/cycle.toml +22 -0
  269. enginery-0.1.0/tests/fixtures/plans/cycle_with_entry.toml +31 -0
  270. enginery-0.1.0/tests/fixtures/plans/diamond.toml +40 -0
  271. enginery-0.1.0/tests/fixtures/plans/linear.toml +31 -0
  272. enginery-0.1.0/tests/fixtures/plans/parallel.toml +31 -0
  273. enginery-0.1.0/tests/fixtures/plans/unresolved_dependency.toml +13 -0
  274. enginery-0.1.0/tests/fixtures/policy/unknown-action.json +1 -0
  275. enginery-0.1.0/tests/fixtures/workflow/manifest.json +121 -0
  276. enginery-0.1.0/tests/governance/test_adversarial_gates.py +12 -0
  277. enginery-0.1.0/tests/ledger/__init__.py +0 -0
  278. enginery-0.1.0/tests/ledger/test_backup_restore.py +149 -0
  279. enginery-0.1.0/tests/ledger/test_command_atomicity.py +158 -0
  280. enginery-0.1.0/tests/ledger/test_commit_cursors.py +77 -0
  281. enginery-0.1.0/tests/ledger/test_events.py +201 -0
  282. enginery-0.1.0/tests/ledger/test_inbox.py +90 -0
  283. enginery-0.1.0/tests/ledger/test_leases.py +128 -0
  284. enginery-0.1.0/tests/ledger/test_outbox.py +102 -0
  285. enginery-0.1.0/tests/ledger/test_process_manager.py +116 -0
  286. enginery-0.1.0/tests/ledger/test_projections.py +147 -0
  287. enginery-0.1.0/tests/ledger/test_redaction.py +74 -0
  288. enginery-0.1.0/tests/ledger/test_verify.py +104 -0
  289. enginery-0.1.0/tests/migrations/__init__.py +0 -0
  290. enginery-0.1.0/tests/migrations/test_migrations.py +146 -0
  291. enginery-0.1.0/tests/outcomes/test_dogfooding.py +244 -0
  292. enginery-0.1.0/tests/outcomes/test_outcome_capture.py +529 -0
  293. enginery-0.1.0/tests/outcomes/test_queries.py +165 -0
  294. enginery-0.1.0/tests/plans/__init__.py +0 -0
  295. enginery-0.1.0/tests/plans/test_end_to_end.py +342 -0
  296. enginery-0.1.0/tests/plans/test_loader.py +27 -0
  297. enginery-0.1.0/tests/plans/test_model.py +149 -0
  298. enginery-0.1.0/tests/plans/test_normalization.py +50 -0
  299. enginery-0.1.0/tests/policy/__init__.py +0 -0
  300. enginery-0.1.0/tests/policy/test_defaults.py +61 -0
  301. enginery-0.1.0/tests/policy/test_evaluator.py +54 -0
  302. enginery-0.1.0/tests/policy/test_hard_rules.py +373 -0
  303. enginery-0.1.0/tests/provider_smoke/test_github_omp.py +188 -0
  304. enginery-0.1.0/tests/scheduler/__init__.py +0 -0
  305. enginery-0.1.0/tests/scheduler/test_plan_scheduling.py +180 -0
  306. enginery-0.1.0/tests/scheduler/test_readiness.py +76 -0
  307. enginery-0.1.0/tests/stacks/__init__.py +0 -0
  308. enginery-0.1.0/tests/stacks/test_stack_coordinator.py +288 -0
  309. enginery-0.1.0/tests/support/__init__.py +1 -0
  310. enginery-0.1.0/tests/support/clock.py +32 -0
  311. enginery-0.1.0/tests/support/ids.py +23 -0
  312. enginery-0.1.0/tests/unit/__init__.py +0 -0
  313. enginery-0.1.0/tests/unit/test_errors.py +46 -0
  314. enginery-0.1.0/tests/unit/test_exit_codes.py +21 -0
  315. enginery-0.1.0/tests/unit/test_fault_injection_framework.py +82 -0
  316. enginery-0.1.0/tests/unit/test_import_boundaries.py +83 -0
  317. enginery-0.1.0/tests/unit/test_support_helpers.py +50 -0
  318. enginery-0.1.0/tests/unit/test_verify_project_identity.py +75 -0
  319. enginery-0.1.0/tests/workflow/__init__.py +0 -0
  320. enginery-0.1.0/tests/workflow/test_manifest.py +635 -0
  321. enginery-0.1.0/tests/workflows/test_evidence.py +43 -0
  322. enginery-0.1.0/tests/workflows/test_implementation.py +426 -0
  323. enginery-0.1.0/tests/workflows/test_issue_to_pr.py +70 -0
  324. enginery-0.1.0/tests/workflows/test_merge_policy.py +353 -0
  325. enginery-0.1.0/tests/workflows/test_plan_to_release.py +491 -0
  326. enginery-0.1.0/tests/workflows/test_review_pull_request.py +100 -0
  327. enginery-0.1.0/tests/workflows/test_stage1_runtime.py +1942 -0
  328. enginery-0.1.0/tests/workflows/test_stage2_evidence_bundle.py +240 -0
  329. enginery-0.1.0/tests/workflows/test_verification.py +203 -0
  330. enginery-0.1.0/tests/workspace/__init__.py +0 -0
  331. enginery-0.1.0/tests/workspace/test_worktree.py +100 -0
  332. enginery-0.1.0/uv.lock +503 -0
@@ -0,0 +1,72 @@
1
+ #! /usr/bin/env python3
2
+
3
+ ##########
4
+ # to run:
5
+ # python approve_all.py
6
+ # more at:
7
+ # https://github.com/approvals/ApprovalTests.CommonScripts/blob/main/docs/how_to/run.md
8
+ ##########
9
+
10
+ import pathlib
11
+ from typing import Callable, List, Tuple
12
+
13
+ SCRIPT_DIR = pathlib.Path(__file__).parent
14
+
15
+
16
+ def load_failed_comparisons() -> List[str]:
17
+ return (SCRIPT_DIR / ".failed_comparison.log").read_text().splitlines()
18
+
19
+
20
+ def move(a: str, b: str) -> None:
21
+ pathlib.Path(a).replace(b)
22
+
23
+
24
+ def approve_all(
25
+ failed_comparison_loader: Callable[[], List[str]] = load_failed_comparisons,
26
+ mover: Callable[[str, str], None] = move,
27
+ system_out: Callable[[str], None] = print,
28
+ ) -> None:
29
+ failures = []
30
+ successes = []
31
+ failed_comparisons = failed_comparison_loader()
32
+ for line in failed_comparisons:
33
+ from_, to = line.split(" -> ") # rename these
34
+ try:
35
+ mover(from_, to)
36
+ successes.append(pathlib.Path(to))
37
+ except Exception as e:
38
+ failures.append((pathlib.Path(to), str(e)))
39
+ report(failed_comparisons, failures, successes, system_out)
40
+
41
+
42
+ def report(
43
+ failed_comparisons: List[str],
44
+ failures: List[Tuple[pathlib.Path, str]],
45
+ successes: List[pathlib.Path],
46
+ system_out: Callable[[str], None],
47
+ ) -> None:
48
+ if len(failed_comparisons) == 1:
49
+ system_out("Mismatched file found.")
50
+ elif len(failed_comparisons) == 0:
51
+ system_out("No mismatched files found.")
52
+
53
+ else:
54
+ system_out("Mismatched files found.")
55
+ if len(successes):
56
+ system_out("Updating:")
57
+ for approved_file in successes:
58
+ system_out(f" - {approved_file.name}")
59
+ if len(failures):
60
+ system_out("Failed to update:")
61
+ for approved_file, reason in failures:
62
+ system_out(f" - {approved_file.name}")
63
+ system_out(f" Reason: {reason}")
64
+ system_out("")
65
+ if len(successes) == 1:
66
+ system_out("Approved 1 file.")
67
+ else:
68
+ system_out(f"Approved {len(successes)} files.")
69
+
70
+
71
+ if __name__ == "__main__":
72
+ approve_all()
@@ -0,0 +1,94 @@
1
+ #! /usr/bin/env python3
2
+
3
+ ##########
4
+ # to run:
5
+ # python remove_abandoned_files.py
6
+ # more at:
7
+ # https://github.com/approvals/ApprovalTests.CommonScripts/blob/main/docs/how_to/run.md
8
+ ##########
9
+
10
+ from enum import Enum
11
+ from pathlib import Path
12
+ from typing import Callable, List
13
+
14
+ SCRIPT_DIR = Path(__file__).parent
15
+
16
+
17
+ class Mode(Enum):
18
+ DELETE_WITHOUT_PROMPTING = 1
19
+ PROMPT = 2
20
+ DRY_RUN = 3
21
+
22
+
23
+ def delete_file(path: Path) -> None:
24
+ path.unlink(missing_ok=True)
25
+
26
+
27
+ def load_touched_files() -> List[str]:
28
+ return (SCRIPT_DIR / ".approved_files.log").read_text().splitlines()
29
+
30
+
31
+ def get_all_approved_files() -> List[str]:
32
+ return list(map(str, SCRIPT_DIR.parent.rglob("*.approved.*")))
33
+
34
+
35
+ def remove_abandoned_files(
36
+ *,
37
+ mode: Mode,
38
+ load_touched_files: Callable[[], List[str]] = load_touched_files,
39
+ get_all_approved_files: Callable[[], List[str]] = get_all_approved_files,
40
+ delete: Callable[[Path], None] = delete_file,
41
+ system_out: Callable[[str], None] = print,
42
+ get_input: Callable[[], str] = input,
43
+ ) -> None:
44
+ touched_files = [Path(file).as_posix() for file in load_touched_files()]
45
+ all_approved_files = [Path(file).as_posix() for file in get_all_approved_files()]
46
+
47
+ stray_files = [
48
+ Path(file) for file in all_approved_files if file not in touched_files
49
+ ]
50
+ report_dry_run(system_out, stray_files)
51
+
52
+ if len(stray_files) and should_delete(mode, system_out, get_input):
53
+ for stray_file in stray_files:
54
+ delete(stray_file)
55
+ report_final_status(system_out, stray_files)
56
+ else:
57
+ system_out("No files were deleted.")
58
+
59
+
60
+ def should_delete(
61
+ mode: Mode, system_out: Callable[[str], None], get_input: Callable[[], str] = input
62
+ ) -> bool:
63
+ if mode == Mode.PROMPT:
64
+ system_out("Delete? [Y/n]")
65
+ response = get_input()
66
+ return response in ["Y", "y", ""]
67
+ elif mode == Mode.DELETE_WITHOUT_PROMPTING:
68
+ return True
69
+ elif mode == Mode.DRY_RUN:
70
+ return False
71
+
72
+ return False
73
+
74
+
75
+ def report_dry_run(system_out: Callable[[str], None], stray_files: List[Path]) -> None:
76
+ if not len(stray_files):
77
+ system_out("No unused `.approved.` files found.\n")
78
+ return
79
+
80
+ system_out("Unused `.approved.` files found.\n")
81
+
82
+ for stray_file in stray_files:
83
+ system_out(f" - {stray_file.name} (in {stray_file.parent.as_posix()}/)")
84
+
85
+
86
+ def report_final_status(
87
+ system_out: Callable[[str], None], stray_files: List[Path]
88
+ ) -> None:
89
+ system_out("")
90
+ system_out(f"Deleted {len(stray_files)} files.")
91
+
92
+
93
+ if __name__ == "__main__":
94
+ remove_abandoned_files(mode=Mode.PROMPT)
Binary file
@@ -0,0 +1 @@
1
+ {"cache_key": "53243fc5019d45df30d4da01c89d5d6612874ef655da32e0ed5b4f7edeb6a6fa", "created_at": "1784494872.124852", "resolved_commit": "6ef46dba88be597fe8cb37ed7e03fa7923b5464a", "source_identity": "/Users/druk/WorkSpace/AetherForge/Enginery", "stable_identity": ""}
@@ -0,0 +1,4 @@
1
+ {
2
+ "archex_version": "0.19.1",
3
+ "created_at": "2026-07-15T02:12:52.998778+00:00"
4
+ }
@@ -0,0 +1,16 @@
1
+ [project]
2
+ mode = "local"
3
+
4
+ [index]
5
+ cache_dir = ".archex"
6
+ languages = []
7
+ vector = false
8
+ splade = false
9
+ module_prefilter = false
10
+ delta_threshold = 0.5
11
+
12
+ [dogfood]
13
+ tasks_dir = "benchmarks/tasks"
14
+ output_dir = ".archex/dogfood"
15
+ default_task_prefix = "archex_"
16
+ strategies = ["raw_files", "raw_grepped", "archex_query"]
@@ -0,0 +1,23 @@
1
+ # Project Anatomy
2
+
3
+ Auto-generated file index. One line per file with description and token estimate.
4
+
5
+ docs/analysis.md | analysis.md | ~6865 tokens
6
+ .docs/02_PRODUCT_DIRECTION.md | 02_PRODUCT_DIRECTION.md | ~4192 tokens
7
+ .docs/DEVELOPMENT_PLAN.md | DEVELOPMENT_PLAN.md | ~12318 tokens
8
+ .docs/EXECUTION_PROMPTS.md | EXECUTION_PROMPTS.md | ~19915 tokens
9
+ docs/strategy.md | strategy.md | ~1751 tokens
10
+ ```
11
+ .gitignore | .gitignore | ~1157 tokens
12
+ docs/design.md | design.md | ~8503 tokens
13
+ docs/overview.md | overview.md | ~5426 tokens
14
+ docs/pitch.md | pitch.md | ~4636 tokens
15
+ docs/workflows.md | workflows.md | ~4405 tokens
16
+ LICENSE | LICENSE | ~2839 tokens
17
+ README.md | README.md | ~71 tokens
18
+ docs/analysis.md | analysis.md | ~6865 tokens
19
+ .docs/02_PRODUCT_DIRECTION.md | 02_PRODUCT_DIRECTION.md | ~4192 tokens
20
+ .docs/DEVELOPMENT_PLAN.md | DEVELOPMENT_PLAN.md | ~12318 tokens
21
+ .docs/EXECUTION_PROMPTS.md | EXECUTION_PROMPTS.md | ~19915 tokens
22
+ docs/strategy.md | strategy.md | ~1751 tokens
23
+ ```
@@ -0,0 +1,314 @@
1
+ # Video Analysis: Agentic Engineering Beyond Loops
2
+
3
+ **Source:** [“FORGET Loop Engineering. Agentic Engineering is about THIS”](https://www.youtube.com/watch?v=VQy50fuxI34) by IndyDevDan
4
+ **Video date:** 2026-07-13
5
+ **Analysis date:** 2026-07-13
6
+ **Duration:** 34:18
7
+
8
+ ## 1. Scope and method
9
+
10
+ This analysis uses the English transcript and video metadata. It does not independently reconstruct every diagram or on-screen visual. Automatic captions contain transcription errors, including “conbon” for Kanban and corrupted product or harness names. Technical conclusions below use the surrounding context rather than preserving obvious caption errors.
11
+
12
+ The analysis separates:
13
+
14
+ 1. claims made in the video;
15
+ 2. deductions needed to turn those claims into an engineering system;
16
+ 3. limitations and risks not resolved by the video.
17
+
18
+ ## 2. Executive summary
19
+
20
+ The video rejects “loop engineering” as an adequate name for AI-assisted software development. Its actual thesis is that engineering teams should build **AI developer workflows** and eventually **software factories** that combine three actors:
21
+
22
+ - engineers;
23
+ - agents;
24
+ - deterministic code.
25
+
26
+ The engineer’s highest-leverage work moves from directly changing the product to designing and improving the system that produces product changes. A ticket enters the factory, a router selects an appropriate workflow, the system creates isolated execution environments, agents and deterministic checks perform the work, failures route into bounded repair, and human review remains at policy-defined boundaries.
27
+
28
+ The loop is only one control-flow primitive. A production workflow also needs routing, branching, parallelism, state, isolation, validation, escalation, human authority, cost control, recovery, and termination.
29
+
30
+ The video’s strongest idea is “building the system that builds the system.” Its main omission is governance of that meta-system. It does not define how workflow changes are versioned, evaluated, promoted, observed, or rolled back. A complete agentic engineering product must add that governed self-improvement mechanism.
31
+
32
+ ## 3. Core claims
33
+
34
+ ### 3.1 Three actors create engineering value
35
+
36
+ At [03:39](https://www.youtube.com/watch?v=VQy50fuxI34&t=219s), the video identifies engineers, agents, and code as the three actors of engineering value creation. Agentic engineering means placing each actor at the correct point in the workflow.
37
+
38
+ The allocation rule implied by the video:
39
+
40
+ | Actor | Best suited to | Weakness to manage |
41
+ |---|---|---|
42
+ | Engineer | intent, accountability, judgment, exception handling, final authority | scarce attention and throughput |
43
+ | Agent | interpretation, planning, synthesis, implementation, diagnosis, review | probabilistic output, context sensitivity, variable cost |
44
+ | Deterministic code | parsing, calculation, validation, state transitions, repeatable operations | limited to behavior that can be specified |
45
+
46
+ The video explicitly reminds viewers that code is fast, repeatable, and free of token cost. This matters because agent-heavy systems often ask a model to rediscover facts that a program could compute reliably.
47
+
48
+ ### 3.2 The useful unit is a workflow, not a loop
49
+
50
+ At [06:40](https://www.youtube.com/watch?v=VQy50fuxI34&t=400s), the video acknowledges the test-and-repair loop but argues that more is happening around it. At [22:52](https://www.youtube.com/watch?v=VQy50fuxI34&t=1372s), it states directly that the target is an AI developer workflow.
51
+
52
+ A loop describes repetition:
53
+
54
+ ```text
55
+ build -> test -> repair -> test -> ...
56
+ ```
57
+
58
+ A workflow describes the complete information and authority flow:
59
+
60
+ ```text
61
+ intake -> qualify -> classify -> route -> isolate -> plan -> execute
62
+ -> validate -> repair or escalate -> review -> deliver -> observe
63
+ ```
64
+
65
+ The distinction is substantive. A workflow can contain loops, but also branches, joins, human gates, failure terminals, external side effects, and multiple execution actors.
66
+
67
+ ### 3.3 Humans constrain the beginning and end
68
+
69
+ At [28:10](https://www.youtube.com/watch?v=VQy50fuxI34&t=1690s), the video frames planning and review as the two human constraints around an increasingly autonomous middle.
70
+
71
+ This should not be interpreted as “humans always approve exactly twice.” The stronger engineering interpretation is:
72
+
73
+ - humans establish or approve intent where policy requires it;
74
+ - humans retain authority over outcomes and exceptions;
75
+ - low-risk intermediate work can execute without attention;
76
+ - additional human gates appear when risk, ambiguity, missing evidence, or external authority requires them.
77
+
78
+ A fixed human-at-the-start-and-end pattern is too coarse for production incidents, deployments, security-sensitive changes, or workflow self-modification.
79
+
80
+ ### 3.4 Tickets become factory inputs
81
+
82
+ At [19:33](https://www.youtube.com/watch?v=VQy50fuxI34&t=1173s), the illustrative factory begins when a Kanban ticket lands:
83
+
84
+ 1. mark the ticket in progress;
85
+ 2. route the work;
86
+ 3. inspect the codebase and determine the required workflow;
87
+ 4. create an isolated execution environment;
88
+ 5. choose models and agent roles appropriate to work type, price, performance, and speed;
89
+ 6. build;
90
+ 7. run lint and CI/CD;
91
+ 8. review under the applicable human policy;
92
+ 9. ship or escalate.
93
+
94
+ The video distinguishes chores, features, and hotfixes. It argues against using the most expensive multi-agent workflow for every task.
95
+
96
+ ### 3.5 Sandboxes enable scale
97
+
98
+ At [20:01](https://www.youtube.com/watch?v=VQy50fuxI34&t=1201s), the video places sandbox creation before execution. It later describes multiple agents racing independently toward a production fix.
99
+
100
+ The useful requirement is not “run many agents.” It is:
101
+
102
+ - isolate concurrent work;
103
+ - bind each attempt to explicit inputs;
104
+ - prevent workspace collisions;
105
+ - collect comparable evidence;
106
+ - cancel losing or invalid attempts;
107
+ - reconcile only selected outputs.
108
+
109
+ A git worktree provides workspace separation but not hostile-process containment. A production system must state which guarantee its backend actually provides.
110
+
111
+ ### 3.6 Route work by risk, cost, and required quality
112
+
113
+ At [20:28](https://www.youtube.com/watch?v=VQy50fuxI34&t=1228s), the video describes selecting different workflows and model roles for a chore, feature, or hotfix. A workhorse model may implement, while stronger planners or scouts protect against missing important context.
114
+
115
+ This implies a router that considers more than ticket type:
116
+
117
+ - risk;
118
+ - ambiguity;
119
+ - affected surface;
120
+ - required evidence;
121
+ - urgency;
122
+ - reversibility;
123
+ - model and compute budget;
124
+ - human authority;
125
+ - repository policy;
126
+ - historical performance of candidate workflows.
127
+
128
+ Routing itself must be explainable and versioned. Otherwise workflow selection becomes an unreviewable agent judgment.
129
+
130
+ ### 3.7 Engineers move to the agentic layer
131
+
132
+ At [22:16](https://www.youtube.com/watch?v=VQy50fuxI34&t=1336s), the video calls the central thesis “building the system that builds the system.” The engineer works increasingly on the agentic layer rather than directly on the application layer.
133
+
134
+ The defensible version of this claim is not that strong engineers never touch product code. It is that their compounding effort goes into reusable production machinery:
135
+
136
+ - context acquisition;
137
+ - routing;
138
+ - workflow definitions;
139
+ - prompts and skills;
140
+ - deterministic validators;
141
+ - policies;
142
+ - evidence contracts;
143
+ - provider integrations;
144
+ - evaluation sets;
145
+ - recovery procedures.
146
+
147
+ Direct product work remains necessary for novel, poorly understood, or high-risk changes. Those cases also teach the factory what it cannot yet automate.
148
+
149
+ ### 3.8 Start manually, then extract the stable workflow
150
+
151
+ At [28:40](https://www.youtube.com/watch?v=VQy50fuxI34&t=1720s), the video recommends starting with simple skill-based workflows and personally stepping through every node. Once productionizing, stable code should be separated from skills so information flow and guardrails become explicit.
152
+
153
+ This is a critical anti-premature-automation rule:
154
+
155
+ 1. perform the workflow with agent assistance;
156
+ 2. observe real transitions and exceptions;
157
+ 3. identify repeatable behavior;
158
+ 4. encode repeatable behavior in deterministic code;
159
+ 5. retain agent judgment only where ambiguity remains;
160
+ 6. validate the automated workflow against real cases.
161
+
162
+ Automation designed before observing the work encodes assumptions instead of operations.
163
+
164
+ ## 4. Conceptual workflow reconstructed from the video
165
+
166
+ ```mermaid
167
+ flowchart LR
168
+ Intent[Human or organizational intent] --> Ticket[Ticket or work item]
169
+ Ticket --> Qualify[Qualify and normalize]
170
+ Qualify --> Router[Factory router]
171
+ Router --> Workspace[Create isolated workspace]
172
+ Workspace --> Workflow[Select AI developer workflow]
173
+ Workflow --> Agents[Agent execution]
174
+ Workflow --> Code[Deterministic operations]
175
+ Agents --> Validate[Validation]
176
+ Code --> Validate
177
+ Validate -->|repairable failure| Agents
178
+ Validate -->|insufficient context or authority| Human[Human decision]
179
+ Validate -->|pass| Review[Engineering or policy review]
180
+ Review -->|approve| Deliver[PR, release, or deployment]
181
+ Review -->|revise| Agents
182
+ Deliver --> Outcome[Observe outcome]
183
+ ```
184
+
185
+ The video explicitly covers the flow through delivery. A complete system must add the outcome-to-factory-change path described in Section 6.
186
+
187
+ ## 5. What the video gets right
188
+
189
+ ### 5.1 It restores deterministic software to agentic systems
190
+
191
+ The industry often treats every workflow step as a prompt. The video correctly treats ordinary code as a first-class actor. This reduces cost, variance, and context load.
192
+
193
+ ### 5.2 It shifts attention from prompts to systems
194
+
195
+ A strong prompt cannot compensate for missing state, weak validation, unsafe permissions, stale CI, ambiguous external side effects, or absent rollback. Workflow engineering addresses the complete operating environment.
196
+
197
+ ### 5.3 It recognizes workload-specific orchestration
198
+
199
+ A chore, feature, release, and incident differ in urgency, uncertainty, evidence, and authority. Routing them through different workflows is more important than optimizing one generic agent loop.
200
+
201
+ ### 5.4 It treats compute as scalable but not uniform
202
+
203
+ Parallel agents and sandboxes can trade compute for speed or confidence. The video also notes that expensive workflows should not be used indiscriminately.
204
+
205
+ ### 5.5 It identifies meta-engineering as the compounding layer
206
+
207
+ Reusable improvements to the factory affect every future work item. This creates compounding returns unavailable from one-off prompt or code changes.
208
+
209
+ ## 6. Missing requirements needed for a complete system
210
+
211
+ ### 6.1 Durable state
212
+
213
+ The video uses diagrams as if nodes transition reliably, but does not define what happens when the coordinator, agent, machine, or external provider fails. The workflow needs persistent state independent of conversation history.
214
+
215
+ ### 6.2 Evidence contracts
216
+
217
+ “Tests pass” is not enough. A system must bind evidence to the exact repository revision, workflow version, environment, and policy decision. Stale green CI cannot approve a newer commit.
218
+
219
+ ### 6.3 Idempotency and reconciliation
220
+
221
+ Opening a PR, merging, publishing, and deploying are non-idempotent external actions. If a process loses the response after performing an action, it must inspect the external system before retrying.
222
+
223
+ ### 6.4 Policy-scoped autonomy
224
+
225
+ The video anticipates dropping human review as confidence grows. A safe implementation must grant autonomy per action and risk class, not through a global auto mode.
226
+
227
+ ### 6.5 Security and credential boundaries
228
+
229
+ An isolated workspace does not automatically protect the host or production systems. Credentials require explicit scope, policy, redaction, and expiry.
230
+
231
+ ### 6.6 Workflow and asset versioning
232
+
233
+ Changing a prompt, router, model, skill, validator, or policy can change outcomes. Runs must bind exact versions so regressions can be traced and prior behavior replayed.
234
+
235
+ ### 6.7 Outcome observation
236
+
237
+ A PR can pass every check and still create an escaped defect. Workflow completion and real-world outcome must remain distinct.
238
+
239
+ ### 6.8 Evaluation against comparable cohorts
240
+
241
+ Factory improvements require baseline-versus-candidate comparison across compatible work. One aggregate success score invites metric gaming and selection bias.
242
+
243
+ ### 6.9 Governed self-improvement
244
+
245
+ The system that builds the system must not mutate active behavior online. It should:
246
+
247
+ 1. observe recurring failures and interventions;
248
+ 2. form a falsifiable improvement hypothesis;
249
+ 3. create a candidate factory-asset version;
250
+ 4. replay historical and adversarial cases;
251
+ 5. compare candidate and baseline;
252
+ 6. reject safety or evidence regressions;
253
+ 7. request approval;
254
+ 8. canary the candidate;
255
+ 9. promote or roll back.
256
+
257
+ This is the missing mechanism that turns the video’s philosophy into an accountable engineering system.
258
+
259
+ ## 7. Risks in taking the rhetoric literally
260
+
261
+ ### 7.1 “The best teams never touch the product”
262
+
263
+ Taken literally, this disconnects factory designers from novel product behavior and user feedback. The useful interpretation is that repeated direct work should become workflow capability, while unfamiliar work remains a source of learning.
264
+
265
+ ### 7.2 “Knowing the system works so well you do not have to look”
266
+
267
+ Trust must come from observable, version-bound evidence and outcome monitoring. Absence of human attention is not proof of reliability.
268
+
269
+ ### 7.3 Parallel agents racing for the first answer
270
+
271
+ The fastest output is not necessarily the safest or best output. Selection must use evidence and declared objectives. Parallelism also increases cost and correlated failure when workers share the same assumptions.
272
+
273
+ ### 7.4 Zero-touch execution
274
+
275
+ Zero-touch should be an earned property of specific low-risk actions under measured workflow versions. It should not be a product-wide operating mode.
276
+
277
+ ### 7.5 “Sandbox” as a security claim
278
+
279
+ Worktrees isolate changes, not processes. Containers improve containment but still require secrets, egress, kernel, and supply-chain controls. Every backend must state its guarantees precisely.
280
+
281
+ ## 8. Implications for the product
282
+
283
+ The product derived from this philosophy should own:
284
+
285
+ - normalized work intake;
286
+ - workflow definition and routing;
287
+ - durable state;
288
+ - workspace lifecycle;
289
+ - agent-harness coordination;
290
+ - deterministic execution;
291
+ - evidence collection and verification;
292
+ - policy decisions;
293
+ - human interventions;
294
+ - external side-effect reconciliation;
295
+ - outcome tracking;
296
+ - factory-change evaluation and promotion.
297
+
298
+ It should delegate actual coding-agent behavior, issue-tracker UX, source hosting, CI execution, release destinations, and deployment platforms through adapters.
299
+
300
+ The resulting product, Enginery, is an agentic engineering control plane, not a prompt collection and not a coding agent.
301
+
302
+ ## 9. Relationship to companion documents
303
+
304
+ - [`02_PRODUCT_DIRECTION.md`](02_PRODUCT_DIRECTION.md) records the repository and product-boundary decision.
305
+ - [`03_SYSTEM_DESIGN.md`](03_SYSTEM_DESIGN.md) specifies the approved architecture, domain model, policies, workflows, and acceptance criteria.
306
+
307
+ ## 10. Source links
308
+
309
+ - [Video](https://www.youtube.com/watch?v=VQy50fuxI34)
310
+ - [Ticket and software-factory example, 19:33](https://www.youtube.com/watch?v=VQy50fuxI34&t=1173s)
311
+ - [“Building the system that builds the system,” 22:16](https://www.youtube.com/watch?v=VQy50fuxI34&t=1336s)
312
+ - [Workflow rather than loop, 22:52](https://www.youtube.com/watch?v=VQy50fuxI34&t=1372s)
313
+ - [Planning and review boundaries, 28:10](https://www.youtube.com/watch?v=VQy50fuxI34&t=1690s)
314
+ - [Start with skills and extract deterministic code, 28:40](https://www.youtube.com/watch?v=VQy50fuxI34&t=1720s)