prusik 0.197.3__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 (233) hide show
  1. prusik-0.197.3/CHANGELOG.md +18 -0
  2. prusik-0.197.3/LICENSE +201 -0
  3. prusik-0.197.3/MANIFEST.in +21 -0
  4. prusik-0.197.3/NOTICE +6 -0
  5. prusik-0.197.3/PKG-INFO +278 -0
  6. prusik-0.197.3/README.md +251 -0
  7. prusik-0.197.3/prusik/__init__.py +1 -0
  8. prusik-0.197.3/prusik/__main__.py +1097 -0
  9. prusik-0.197.3/prusik/absence.py +199 -0
  10. prusik-0.197.3/prusik/affected.py +141 -0
  11. prusik-0.197.3/prusik/agents_doctor.py +146 -0
  12. prusik-0.197.3/prusik/artifact_variants.py +187 -0
  13. prusik-0.197.3/prusik/baseline.py +277 -0
  14. prusik-0.197.3/prusik/binding_check.py +297 -0
  15. prusik-0.197.3/prusik/binding_detect.py +210 -0
  16. prusik-0.197.3/prusik/binding_detect_js.py +324 -0
  17. prusik-0.197.3/prusik/blast_plan.py +572 -0
  18. prusik-0.197.3/prusik/bridge.py +394 -0
  19. prusik-0.197.3/prusik/brief_lint.py +399 -0
  20. prusik-0.197.3/prusik/calibration.py +389 -0
  21. prusik-0.197.3/prusik/capture_diagnose.py +123 -0
  22. prusik-0.197.3/prusik/catch_quality.py +379 -0
  23. prusik-0.197.3/prusik/ci_comment.py +348 -0
  24. prusik-0.197.3/prusik/consistency.py +875 -0
  25. prusik-0.197.3/prusik/convergence.py +101 -0
  26. prusik-0.197.3/prusik/criterion.py +116 -0
  27. prusik-0.197.3/prusik/critic_recall.py +218 -0
  28. prusik-0.197.3/prusik/cross_builder.py +358 -0
  29. prusik-0.197.3/prusik/detect.py +542 -0
  30. prusik-0.197.3/prusik/detectors/__init__.py +78 -0
  31. prusik-0.197.3/prusik/detectors/base.py +55 -0
  32. prusik-0.197.3/prusik/detectors/binding.py +37 -0
  33. prusik-0.197.3/prusik/detectors/test_reach.py +35 -0
  34. prusik-0.197.3/prusik/discovery.py +250 -0
  35. prusik-0.197.3/prusik/discovery_plugins/__init__.py +43 -0
  36. prusik-0.197.3/prusik/discovery_plugins/go.py +24 -0
  37. prusik-0.197.3/prusik/discovery_plugins/javascript.py +43 -0
  38. prusik-0.197.3/prusik/discovery_plugins/python.py +29 -0
  39. prusik-0.197.3/prusik/doctor.py +1301 -0
  40. prusik-0.197.3/prusik/effort.py +198 -0
  41. prusik-0.197.3/prusik/eval.py +544 -0
  42. prusik-0.197.3/prusik/evidence.py +222 -0
  43. prusik-0.197.3/prusik/feedback.py +392 -0
  44. prusik-0.197.3/prusik/feedback_store.py +308 -0
  45. prusik-0.197.3/prusik/findings.py +378 -0
  46. prusik-0.197.3/prusik/fix_round.py +452 -0
  47. prusik-0.197.3/prusik/gate.py +2833 -0
  48. prusik-0.197.3/prusik/infra_check.py +131 -0
  49. prusik-0.197.3/prusik/init.py +409 -0
  50. prusik-0.197.3/prusik/injection.py +174 -0
  51. prusik-0.197.3/prusik/issue_plugins/__init__.py +35 -0
  52. prusik-0.197.3/prusik/issue_plugins/github.py +57 -0
  53. prusik-0.197.3/prusik/issue_plugins/linear.py +17 -0
  54. prusik-0.197.3/prusik/issues.py +74 -0
  55. prusik-0.197.3/prusik/ledger.py +222 -0
  56. prusik-0.197.3/prusik/manifest.py +259 -0
  57. prusik-0.197.3/prusik/metrics.py +177 -0
  58. prusik-0.197.3/prusik/narrative_claim.py +164 -0
  59. prusik-0.197.3/prusik/pause.py +128 -0
  60. prusik-0.197.3/prusik/permissions.py +193 -0
  61. prusik-0.197.3/prusik/phases.py +325 -0
  62. prusik-0.197.3/prusik/platform_adapter.py +112 -0
  63. prusik-0.197.3/prusik/preflight.py +70 -0
  64. prusik-0.197.3/prusik/prove.py +106 -0
  65. prusik-0.197.3/prusik/refresh.py +496 -0
  66. prusik-0.197.3/prusik/refresh_merge.py +316 -0
  67. prusik-0.197.3/prusik/report.py +292 -0
  68. prusik-0.197.3/prusik/roles.py +64 -0
  69. prusik-0.197.3/prusik/scan.py +280 -0
  70. prusik-0.197.3/prusik/schema.py +857 -0
  71. prusik-0.197.3/prusik/serve.py +204 -0
  72. prusik-0.197.3/prusik/showcase.py +270 -0
  73. prusik-0.197.3/prusik/sprint_cli.py +137 -0
  74. prusik-0.197.3/prusik/suite_baseline.py +55 -0
  75. prusik-0.197.3/prusik/suite_delta.py +163 -0
  76. prusik-0.197.3/prusik/templates/.claude/agents/backend-builder.md +47 -0
  77. prusik-0.197.3/prusik/templates/.claude/agents/brief-critic.md +38 -0
  78. prusik-0.197.3/prusik/templates/.claude/agents/cartographer.md +29 -0
  79. prusik-0.197.3/prusik/templates/.claude/agents/conventions-enforcer.md +138 -0
  80. prusik-0.197.3/prusik/templates/.claude/agents/conventions-scribe.md +26 -0
  81. prusik-0.197.3/prusik/templates/.claude/agents/feature-planner.md +31 -0
  82. prusik-0.197.3/prusik/templates/.claude/agents/frontend-builder.md +47 -0
  83. prusik-0.197.3/prusik/templates/.claude/agents/integrator.md +86 -0
  84. prusik-0.197.3/prusik/templates/.claude/agents/plan-critic.md +85 -0
  85. prusik-0.197.3/prusik/templates/.claude/agents/pr-composer.md +43 -0
  86. prusik-0.197.3/prusik/templates/.claude/agents/regression-sentinel.md +227 -0
  87. prusik-0.197.3/prusik/templates/.claude/agents/scope-critic.md +71 -0
  88. prusik-0.197.3/prusik/templates/.claude/agents/scoping.md +47 -0
  89. prusik-0.197.3/prusik/templates/.claude/agents/test-writer.md +42 -0
  90. prusik-0.197.3/prusik/templates/.claude/commands/brief-form.md +12 -0
  91. prusik-0.197.3/prusik/templates/.claude/commands/brief-new.md +27 -0
  92. prusik-0.197.3/prusik/templates/.claude/commands/issues-sync.md +12 -0
  93. prusik-0.197.3/prusik/templates/.claude/commands/sprint-advance.md +39 -0
  94. prusik-0.197.3/prusik/templates/.claude/commands/sprint-complete.md +23 -0
  95. prusik-0.197.3/prusik/templates/.claude/commands/sprint-pause.md +13 -0
  96. prusik-0.197.3/prusik/templates/.claude/commands/sprint-resume.md +8 -0
  97. prusik-0.197.3/prusik/templates/.claude/commands/sprint-run.md +290 -0
  98. prusik-0.197.3/prusik/templates/.claude/commands/sprint-start.md +64 -0
  99. prusik-0.197.3/prusik/templates/.claude/commands/sprint-status.md +8 -0
  100. prusik-0.197.3/prusik/templates/.claude/commands/sprint-triage.md +13 -0
  101. prusik-0.197.3/prusik/templates/.claude/commands/sprint-watchdog.md +15 -0
  102. prusik-0.197.3/prusik/templates/.claude/schemas/brief-schema.yaml +50 -0
  103. prusik-0.197.3/prusik/templates/.claude/schemas/plan-schema.yaml +38 -0
  104. prusik-0.197.3/prusik/templates/.claude/schemas/scope-schema.yaml +44 -0
  105. prusik-0.197.3/prusik/templates/.claude/settings.json +125 -0
  106. prusik-0.197.3/prusik/templates/.claude/sprint-config-presets/fastapi-postgres.yaml +114 -0
  107. prusik-0.197.3/prusik/templates/.claude/sprint-config.yaml +377 -0
  108. prusik-0.197.3/prusik/templates/artifacts/brief.md +14 -0
  109. prusik-0.197.3/prusik/templates/artifacts/plan.md +26 -0
  110. prusik-0.197.3/prusik/templates/artifacts/retro.md +14 -0
  111. prusik-0.197.3/prusik/templates/artifacts/scope.md +31 -0
  112. prusik-0.197.3/prusik/test_reach.py +311 -0
  113. prusik-0.197.3/prusik/test_suggestion.py +183 -0
  114. prusik-0.197.3/prusik/toggle.py +59 -0
  115. prusik-0.197.3/prusik/triage.py +152 -0
  116. prusik-0.197.3/prusik/trust_report.py +480 -0
  117. prusik-0.197.3/prusik/ts_resolve.py +197 -0
  118. prusik-0.197.3/prusik/ui_coverage.py +146 -0
  119. prusik-0.197.3/prusik/uninstall.py +168 -0
  120. prusik-0.197.3/prusik/update_cmd.py +124 -0
  121. prusik-0.197.3/prusik/verify_loop.py +353 -0
  122. prusik-0.197.3/prusik/version_check.py +163 -0
  123. prusik-0.197.3/prusik/watchdog.py +123 -0
  124. prusik-0.197.3/prusik/worktree_setup.py +128 -0
  125. prusik-0.197.3/prusik.egg-info/PKG-INFO +278 -0
  126. prusik-0.197.3/prusik.egg-info/SOURCES.txt +231 -0
  127. prusik-0.197.3/prusik.egg-info/dependency_links.txt +1 -0
  128. prusik-0.197.3/prusik.egg-info/entry_points.txt +2 -0
  129. prusik-0.197.3/prusik.egg-info/requires.txt +2 -0
  130. prusik-0.197.3/prusik.egg-info/top_level.txt +1 -0
  131. prusik-0.197.3/pyproject.toml +111 -0
  132. prusik-0.197.3/setup.cfg +4 -0
  133. prusik-0.197.3/tests/test_absence.py +147 -0
  134. prusik-0.197.3/tests/test_affected.py +102 -0
  135. prusik-0.197.3/tests/test_artifact_variants.py +124 -0
  136. prusik-0.197.3/tests/test_b26.py +517 -0
  137. prusik-0.197.3/tests/test_baseline.py +143 -0
  138. prusik-0.197.3/tests/test_baseline_clock_caveat.py +100 -0
  139. prusik-0.197.3/tests/test_behavior_verify_scope.py +98 -0
  140. prusik-0.197.3/tests/test_binding.py +411 -0
  141. prusik-0.197.3/tests/test_blast_plan.py +266 -0
  142. prusik-0.197.3/tests/test_blast_recall.py +86 -0
  143. prusik-0.197.3/tests/test_blast_verify.py +96 -0
  144. prusik-0.197.3/tests/test_blocked_criterion.py +57 -0
  145. prusik-0.197.3/tests/test_boundary_worktree.py +73 -0
  146. prusik-0.197.3/tests/test_bridge.py +253 -0
  147. prusik-0.197.3/tests/test_bridge_status_reslug.py +48 -0
  148. prusik-0.197.3/tests/test_brief.py +1105 -0
  149. prusik-0.197.3/tests/test_brief_critic_guards.py +30 -0
  150. prusik-0.197.3/tests/test_brief_measurability_numeric.py +59 -0
  151. prusik-0.197.3/tests/test_calibration.py +314 -0
  152. prusik-0.197.3/tests/test_capture_diagnose.py +84 -0
  153. prusik-0.197.3/tests/test_capture_env_guard.py +81 -0
  154. prusik-0.197.3/tests/test_capture_reset_clear.py +48 -0
  155. prusik-0.197.3/tests/test_capture_shell_wrapper_guard.py +95 -0
  156. prusik-0.197.3/tests/test_capture_worktree_canonical.py +125 -0
  157. prusik-0.197.3/tests/test_catch_quality.py +260 -0
  158. prusik-0.197.3/tests/test_ci_comment.py +280 -0
  159. prusik-0.197.3/tests/test_ci_shaped_criteria.py +58 -0
  160. prusik-0.197.3/tests/test_convergence.py +117 -0
  161. prusik-0.197.3/tests/test_convergence_noop_success.py +108 -0
  162. prusik-0.197.3/tests/test_criterion.py +77 -0
  163. prusik-0.197.3/tests/test_critic_outcome.py +116 -0
  164. prusik-0.197.3/tests/test_critic_recall.py +119 -0
  165. prusik-0.197.3/tests/test_cross_builder.py +225 -0
  166. prusik-0.197.3/tests/test_detector_precision.py +76 -0
  167. prusik-0.197.3/tests/test_detectors.py +391 -0
  168. prusik-0.197.3/tests/test_deviations_reconcile.py +108 -0
  169. prusik-0.197.3/tests/test_doctor.py +419 -0
  170. prusik-0.197.3/tests/test_effort.py +148 -0
  171. prusik-0.197.3/tests/test_eslint_clean_evidence.py +62 -0
  172. prusik-0.197.3/tests/test_eval.py +209 -0
  173. prusik-0.197.3/tests/test_eval_scorecard.py +72 -0
  174. prusik-0.197.3/tests/test_evidence.py +426 -0
  175. prusik-0.197.3/tests/test_evidence_hash_gitignore.py +101 -0
  176. prusik-0.197.3/tests/test_false_clean_diagnosis.py +61 -0
  177. prusik-0.197.3/tests/test_fanout_lane.py +79 -0
  178. prusik-0.197.3/tests/test_feedback.py +64 -0
  179. prusik-0.197.3/tests/test_feedback_store.py +172 -0
  180. prusik-0.197.3/tests/test_field_worktree_fixes.py +72 -0
  181. prusik-0.197.3/tests/test_findings.py +274 -0
  182. prusik-0.197.3/tests/test_fingerprint_auto_refresh.py +71 -0
  183. prusik-0.197.3/tests/test_fix_round_auto.py +98 -0
  184. prusik-0.197.3/tests/test_fixround_reassembly.py +216 -0
  185. prusik-0.197.3/tests/test_full_suite_gate.py +126 -0
  186. prusik-0.197.3/tests/test_infra_check.py +154 -0
  187. prusik-0.197.3/tests/test_init_refresh.py +1677 -0
  188. prusik-0.197.3/tests/test_injection.py +142 -0
  189. prusik-0.197.3/tests/test_ledger_read_cache.py +42 -0
  190. prusik-0.197.3/tests/test_lint.py +57 -0
  191. prusik-0.197.3/tests/test_lint_evidence_primitive.py +94 -0
  192. prusik-0.197.3/tests/test_map_freshness_drift.py +96 -0
  193. prusik-0.197.3/tests/test_merge_hooks.py +175 -0
  194. prusik-0.197.3/tests/test_metrics.py +131 -0
  195. prusik-0.197.3/tests/test_misc.py +1926 -0
  196. prusik-0.197.3/tests/test_moat_marker_integrity.py +90 -0
  197. prusik-0.197.3/tests/test_narrative_claim.py +112 -0
  198. prusik-0.197.3/tests/test_permissions_add.py +95 -0
  199. prusik-0.197.3/tests/test_phase_gate_outcome.py +89 -0
  200. prusik-0.197.3/tests/test_phases.py +3633 -0
  201. prusik-0.197.3/tests/test_plan_modules_exclusion_subsection.py +62 -0
  202. prusik-0.197.3/tests/test_platform_adapter.py +90 -0
  203. prusik-0.197.3/tests/test_preflight.py +114 -0
  204. prusik-0.197.3/tests/test_prove.py +220 -0
  205. prusik-0.197.3/tests/test_prove_flaky.py +71 -0
  206. prusik-0.197.3/tests/test_prove_ts.py +124 -0
  207. prusik-0.197.3/tests/test_refresh_merge_dragged_comment.py +67 -0
  208. prusik-0.197.3/tests/test_report.py +204 -0
  209. prusik-0.197.3/tests/test_reviewer_snapshot_stability.py +78 -0
  210. prusik-0.197.3/tests/test_roles.py +70 -0
  211. prusik-0.197.3/tests/test_scan.py +179 -0
  212. prusik-0.197.3/tests/test_scope_modules_parsing.py +68 -0
  213. prusik-0.197.3/tests/test_serve.py +174 -0
  214. prusik-0.197.3/tests/test_showcase.py +171 -0
  215. prusik-0.197.3/tests/test_suite_delta.py +103 -0
  216. prusik-0.197.3/tests/test_template_skew.py +66 -0
  217. prusik-0.197.3/tests/test_test_reach.py +175 -0
  218. prusik-0.197.3/tests/test_test_suggestion.py +216 -0
  219. prusik-0.197.3/tests/test_thrash_advisory.py +43 -0
  220. prusik-0.197.3/tests/test_triage_size_gate.py +39 -0
  221. prusik-0.197.3/tests/test_trust_report.py +91 -0
  222. prusik-0.197.3/tests/test_ts_prove_detect.py +70 -0
  223. prusik-0.197.3/tests/test_ts_resolve.py +99 -0
  224. prusik-0.197.3/tests/test_ui_coverage.py +114 -0
  225. prusik-0.197.3/tests/test_ui_sprint_conventions.py +57 -0
  226. prusik-0.197.3/tests/test_uninstall_settings.py +108 -0
  227. prusik-0.197.3/tests/test_update_whats_new.py +63 -0
  228. prusik-0.197.3/tests/test_verify_loop.py +297 -0
  229. prusik-0.197.3/tests/test_version_check.py +76 -0
  230. prusik-0.197.3/tests/test_worktree_env_files.py +73 -0
  231. prusik-0.197.3/tests/test_worktree_hash_derived_dirs.py +49 -0
  232. prusik-0.197.3/tests/test_worktree_setup.py +71 -0
  233. prusik-0.197.3/tests/test_writable_blindspot.py +60 -0
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ All notable changes to **Prusik** are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/), and versions are `MAJOR.MINOR.PATCH`.
5
+
6
+ ## [0.197.3] — 2026-07-12
7
+
8
+ Initial public release of the **Prusik** open-core engine — a deterministic,
9
+ evidence-based build harness for autonomous coding agents. Core capabilities:
10
+
11
+ - **FSM sprint gates** (brief → scope → plan → build → review) with fail-closed enforcement.
12
+ - **Execution-evidence verification** — a claim of "done" must carry reproducible proof
13
+ (real, ungameable executed counts), not prose.
14
+ - **Adversarial critics** — scope, plan, architecture, conventions, and test-craft review.
15
+ - **Fix-round convergence control** — bounded retries with escalate-to-human on stall.
16
+ - **Blast-radius prediction** — predicted-at-risk tests must be verified, not passed vacuously.
17
+
18
+ Apache-2.0.
prusik-0.197.3/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for describing the origin of the Work and
141
+ reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2026 Rajasekhar Yakkali
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,21 @@
1
+ # Source-distribution contents. The wheel ships `prusik*` only (see
2
+ # pyproject [tool.setuptools.packages.find]); this controls the sdist.
3
+
4
+ graft prusik/templates
5
+ recursive-include prusik/templates *
6
+ recursive-include prusik/templates .*
7
+ include LICENSE NOTICE README.md CHANGELOG.md
8
+
9
+ # NEVER publish internal / HQ / strategy material — explicit defense-in-depth
10
+ # beyond .gitignore, so these can never reach PyPI even if ignore rules change:
11
+ # strategy/ — internal product-build strategy (operator: never even commit)
12
+ # hq/ — HQ-only fleet/feedback/metrics/proof-card code (boundary thesis)
13
+ # benchmarks/ docs/ — eval fixtures + design docs, not shipped product
14
+ prune strategy
15
+ prune hq
16
+ prune benchmarks
17
+ prune docs
18
+ prune examples
19
+
20
+ global-exclude __pycache__
21
+ global-exclude *.py[cod]
prusik-0.197.3/NOTICE ADDED
@@ -0,0 +1,6 @@
1
+ prusik
2
+ Copyright 2026 Rajasekhar Yakkali
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ See the LICENSE file for the full terms.
@@ -0,0 +1,278 @@
1
+ Metadata-Version: 2.4
2
+ Name: prusik
3
+ Version: 0.197.3
4
+ Summary: Iron-clad autonomous harness for Claude Code agent teams — phase gates, scoping, triage, evidence, binding-mismatch detection, and closed-loop verification.
5
+ Author: Rajasekhar Yakkali
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Repository, https://github.com/getprusik/prusik
8
+ Project-URL: Changelog, https://github.com/getprusik/prusik/blob/main/CHANGELOG.md
9
+ Keywords: claude-code,ai-agents,autonomous,sdlc,agent-orchestration,code-review,llm,verification
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Topic :: Software Development :: Quality Assurance
13
+ Classifier: Topic :: Software Development :: Build Tools
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Operating System :: OS Independent
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ License-File: NOTICE
24
+ Requires-Dist: PyYAML>=6.0
25
+ Requires-Dist: ruamel.yaml>=0.18
26
+ Dynamic: license-file
27
+
28
+ # Prusik
29
+
30
+ An iron-clad autonomous harness for Claude Code agent teams. Phase gates, pure-code triage, deterministic discovery, schema-enforced artifacts, and a ledger that closes the feedback loop — so quality depends on prusik, not on anyone remembering the playbook.
31
+
32
+ ## Why this exists
33
+
34
+ Claude Code can coordinate agent teams, but without discipline it burns tokens on malformed work, loses context across sessions, and lets specialists freelance outside their scope. Prusik converts discipline into enforcement: hooks block out-of-phase writes, schemas reject shallow artifacts, triage routes between solo execution and team sprints deterministically, a watchdog catches stuck teammates, and a ledger records every transition for audit and self-tuning.
35
+
36
+ ## Install
37
+
38
+ One line, from git, for any project:
39
+
40
+ ```bash
41
+ pipx install git+https://github.com/getprusik/prusik.git
42
+ ```
43
+
44
+ (Or `pip install git+https://github.com/getprusik/prusik.git` if you don't use pipx.)
45
+
46
+ This puts a `prusik` command on your PATH.
47
+
48
+ ## Prove your agent's tests actually ran (zero ceremony)
49
+
50
+ No `init`, no config, no buy-in. Wrap any test/lint/type command and prusik
51
+ proves it *really ran clean* — from the tool's own output, not the agent's word:
52
+
53
+ ```bash
54
+ prusik prove -- pytest -q
55
+ prusik prove --kind types -- mypy src/
56
+ prusik prove --min 20 --json -- pytest tests/
57
+ ```
58
+
59
+ Exit code reflects the truth: `0` only when the command exited 0 **and** real
60
+ work was observed. The case it exists to catch — *exit 0 but zero tests
61
+ executed* ("tests pass ✅" when nothing actually ran: auto-skip, no collection,
62
+ wrong path) — fails with rc=1. Drop it into CI or a pre-push hook as the
63
+ one-line anti-fabrication check; the full harness below is opt-in from there.
64
+
65
+ ## Adopt / pause / remove
66
+
67
+ ```bash
68
+ cd your-project
69
+ prusik init # scaffold .claude/, briefs/, design/, .sprint/
70
+ prusik init --conventions ~/workspace/python/best-practices # ... with a convention pack
71
+
72
+ prusik status # show current state / active sprint
73
+ prusik disable # pause hooks without removing files (reversible)
74
+ prusik enable # resume
75
+
76
+ prusik uninstall # remove only what prusik installed (preserves user edits)
77
+ prusik uninstall --force # also remove files you modified
78
+ prusik uninstall --keep-artifacts # keep .sprint/ (ledger, inventory, dep-graph)
79
+ ```
80
+
81
+ `prusik init` writes `.claude/.prusik-manifest.json` tracking every file it creates with a content hash. `prusik uninstall` uses that manifest to remove only prusik-written files — any custom agents, commands, or config tweaks you added stay put. The `.gitignore` block prusik adds is wrapped in markers so it can be cleanly unwound too.
82
+
83
+ Your project now has:
84
+ - `.claude/settings.json` — PreToolUse/Stop/SessionStart hooks wired to `prusik gate`
85
+ - `.claude/sprint-config.yaml` — phase FSM + triage heuristics + pre-sprint gates + issues + watchdog settings
86
+ - `.claude/agents/*.md` — role library (cartographer, scoping, planner, builders, reviewers, integrator, brief-critic)
87
+ - `.claude/commands/*.md` — slash commands (`/brief-new`, `/sprint-start`, `/sprint-advance`, `/sprint-status`, `/sprint-complete`, `/sprint-watchdog`, `/issues-sync`, `/brief-form`)
88
+ - `.claude/schemas/*.yaml` — brief + scope schemas
89
+ - `briefs/`, `design/`, `reports/`, `decisions/`, `worktrees/`, `.sprint/`
90
+
91
+ ## The flow (one feature, end-to-end)
92
+
93
+ ```
94
+ /brief-new email-receipts # 5-field wizard; writes briefs/email-receipts.md
95
+ prusik discovery all # (first time or stale) inventory + dep graph
96
+ /sprint-start email-receipts # brief-critic runs; brief validated; scoping begins
97
+ <scoping role writes design/email-receipts/scope.md>
98
+ /sprint-advance triage --feature email-receipts # pure-code solo vs team routing
99
+ /sprint-advance <solo_execute | planning> --feature email-receipts
100
+ <builders in worktrees; heartbeat every N turns>
101
+ /sprint-advance reviewing # regression-sentinel + conventions-enforcer PASS
102
+ /sprint-advance integrating # integrator merges; pr-composer drafts PR
103
+ /sprint-complete email-receipts --tokens N --duration-min M
104
+ ```
105
+
106
+ At each step prusik enforces:
107
+ - **Writable paths** by phase (PreToolUse hook)
108
+ - **Exit artifact existence + schema** before advancing (advance gate + Stop hook)
109
+ - **Required sections + must_contain tokens** (plan approval, regression PASS, etc.)
110
+ - **Cross-reference integrity** (scope.md's declared modules must exist in the repo)
111
+ - **Pre-sprint gates** (brief-critique PASS before scoping)
112
+
113
+ ## What's in prusik
114
+
115
+ ### Engine (`prusik/`)
116
+
117
+ | Module | Purpose |
118
+ |---|---|
119
+ | `evidence.py` | The anti-fabrication primitive: `executed_count` (real work from the tool's own output) + `prove_verdict`. Shared by `prove` and `gate capture` |
120
+ | `prove.py` | `prusik prove` — standalone "did it actually run clean?" gate (no FSM) |
121
+ | `schema.py` | Loads YAML schemas; validates briefs, scopes, triage decisions; cross-refs module paths against the repo |
122
+ | `ledger.py` | Append-only `.sprint/ledger.jsonl`; richer `digest()` with outcome stats |
123
+ | `phases.py` | Phase FSM engine; writable-path resolution; sprint state on disk |
124
+ | `gate.py` | Hook + CLI entry points: `pre-tool`, `stop`, `session-start`, `advance`, `brief`, `scope`, `sprint-start`, `sprint-complete` |
125
+ | `discovery.py` | Inventory + dep graph (plugin-based) |
126
+ | `discovery_plugins/` | `python` (ast), `javascript`/`typescript`/`jsx`/`tsx` (regex), `go` (regex) |
127
+ | `triage.py` | Pure-code routing from `scope.md` + `brief.md` to `decisions/<feature>.json` |
128
+ | `watchdog.py` | Polls heartbeats, phase staleness, budget — files incidents under `.sprint/incidents/` |
129
+ | `issues.py` | Tracker sync coordinator |
130
+ | `issue_plugins/` | `github` (via `gh` CLI), `linear` (stub) |
131
+ | `serve.py` | Tier-3 GUI: stdlib `http.server` rendering a form from the brief schema |
132
+ | `init.py` | `prusik init` — scaffolds prusik into a target project |
133
+
134
+ ### Templates (`prusik/templates/` — copied by `prusik init`)
135
+
136
+ - `.claude/` — settings.json, sprint-config.yaml, agents/, commands/, schemas/
137
+ - `artifacts/` — brief/scope/plan/retro skeletons
138
+
139
+ ## Commands
140
+
141
+ | Command | What it does |
142
+ |---|---|
143
+ | `prusik prove [--kind tests\|lint\|types] [--min N] [--json] -- <cmd>` | Prove a command actually ran clean (no FSM); rc=0 only if proven |
144
+ | `prusik scan [--detectors a,b] [--no-local-detectors]` | Static detectors (binding-mismatch, test-reach) + your own from `.claude/detectors/*.py` |
145
+ | `prusik init [--conventions PATH] [--force]` | Scaffold into current project |
146
+ | `prusik gate pre-tool` | PreToolUse hook: block writes/bash outside phase |
147
+ | `prusik gate stop` | Stop hook: block session end if phase artifacts missing |
148
+ | `prusik gate session-start` | SessionStart hook: inject active sprint context |
149
+ | `prusik gate advance <phase> --feature F` | Advance FSM, verify exit artifacts |
150
+ | `prusik gate brief <path>` | Validate a brief against the schema |
151
+ | `prusik gate scope <path>` | Validate a scope artifact (plus cross-ref) |
152
+ | `prusik gate sprint-start <feature>` | Begin a sprint (runs pre-sprint gates) |
153
+ | `prusik gate sprint-complete --feature F [--duration-min M] [--tokens N] [--escalated]` | Close, record predicted vs actual |
154
+ | `prusik discovery inventory \| dep-graph \| all` | Deterministic discovery |
155
+ | `prusik triage --feature F` | Pure-code solo/team routing |
156
+ | `prusik issues sync` | Pull issues from configured tracker |
157
+ | `prusik issues search "query"` | Cheap keyword search over synced issues |
158
+ | `prusik watchdog [--poll MIN]` | One-shot or polling heartbeat/budget watcher |
159
+ | `prusik serve [--port N]` | Launch local web form at 127.0.0.1:N |
160
+ | `prusik status` | Current phase, writable patterns, exit artifact status |
161
+ | `prusik digest` | Ledger summary: outcomes, escalation rate, prediction error, gate blocks by phase |
162
+ | `prusik metrics [--since ISO] [--json]` | Defect-prevention scorecard: what prusik flagged/caught/blocked (factual ledger counts) |
163
+
164
+ ## Concepts
165
+
166
+ ### Engine vs opinions
167
+
168
+ Prusik ships the enforcement engine (language-agnostic). Opinions come from **convention packs** — directories with a `conventions.yaml` manifest. A target project can ingest one or more packs; each pack's content becomes a convention baseline that roles read from.
169
+
170
+ ### The phase FSM
171
+
172
+ Declared in `.claude/sprint-config.yaml`. Each phase specifies:
173
+ - `writable` — glob patterns the PreToolUse hook enforces
174
+ - `deny_bash` — regex patterns for shell commands blocked in this phase
175
+ - `exit_artifacts` — files (with optional schema/section/content validators) required before advancing
176
+ - `budget_tokens` — advisory budget; watchdog files an incident if exceeded
177
+
178
+ ### Pre-sprint gates
179
+
180
+ A sprint can't start until declared gates pass. Default: `brief_critique` requires `reports/<feature>/brief-critique.txt` containing `PASS` (produced by the `brief-critic` role). Disable via `pre_sprint_gates.brief_critique.enabled: false`.
181
+
182
+ ### Triage
183
+
184
+ `prusik triage --feature <name>` is pure-code. Reads `design/<feature>/scope.md` + `briefs/<feature>.md`, applies heuristics from `sprint-config.yaml`, writes `decisions/<feature>.json`. Zero LLM tokens.
185
+
186
+ ### Ledger + digest
187
+
188
+ Every phase transition, gate block, triage decision, watchdog incident, and sprint completion writes to `.sprint/ledger.jsonl`. `prusik digest` surfaces:
189
+ - Sprint outcomes and **solo→team escalation rate**
190
+ - **Mean prediction error** for duration and tokens
191
+ - **Gate blocks by phase** (where are the rough edges?)
192
+ - Triage mode distribution
193
+ - Watchdog incident counts by kind
194
+
195
+ This is how prusik becomes self-tuning: if escalation rate climbs or prediction error drifts, tune the heuristics in `sprint-config.yaml`.
196
+
197
+ For the team-lead view — *what has prusik actually caught?* — `prusik metrics` turns the same ledger into a defect-prevention scorecard: binding-mismatches flagged, non-runs/failures caught by the evidence gate, review fix-rounds, out-of-phase writes blocked, verify-loop closure rate. Every number is a recorded event (factual, not a modeled "bugs prevented" claim); `--json` feeds a dashboard or trend.
198
+
199
+ ### Input surfaces (GUI)
200
+
201
+ Three ways to author a brief. Same schema; same canonical `briefs/<slug>.md` output.
202
+
203
+ | Tier | Surface | Audience | Shipped? |
204
+ |---|---|---|---|
205
+ | 1 | `/brief-new` slash command wizard | Engineers using Claude Code | ✓ |
206
+ | 2 | `prusik gate brief <path>` (validate hand-written) | Engineers outside CC | ✓ |
207
+ | 3 | `prusik serve` — local web form at 127.0.0.1:8765 | Non-engineer stakeholders | ✓ |
208
+ | 4 | Issue tracker template (labels → enums) | Teams living in Linear/GitHub | Sketch — see `issues.tracker` config |
209
+
210
+ ## Cohesion safeguards (v0.3)
211
+
212
+ Three mechanical defenses against scope drift across features, each running automatically:
213
+
214
+ 1. **Map staleness detection.** `prusik discovery fingerprint-map` snapshots the dep-graph when `design/map.md` is written. The `map_freshness` pre-sprint gate compares the current dep-graph against the fingerprint and blocks `/sprint-start` if drift exceeds `max_drift_pct` (default 30%). Forces the cartographer to refresh before a new feature sprint runs on a stale map.
215
+
216
+ 2. **scope-critic reviewer.** `scoping` phase now requires `reports/<feature>/scope-approval.txt` to contain `APPROVED`. Mirrors `plan-critic` but for the scope artifact. Catches missed blast radius, overreached size, hollow risks — at the cheapest possible stage.
217
+
218
+ 3. **Cross-artifact consistency checks.** `prusik gate advance` now runs deterministic checks between artifacts:
219
+ - `plan_within_scope` — plan.md's modules ⊆ scope.md's modules; scope creep caught at planning→building advance
220
+ - `builder_writes_within_plan` — files written under `worktrees/*/` must fall inside plan.md's declared modules (tests exempted); catches rogue builders at building→reviewing advance
221
+ - `brief_type_matches_scope` — `bug_fix`/`doc`/`config` with L/XL size is flagged at scoping→triage advance
222
+
223
+ ## Compared to other harness / agent tooling
224
+
225
+ Prusik operates at one specific layer — **process discipline for build-time agent teams.** Other tools occupy adjacent layers; prusik composes with them, doesn't try to absorb them.
226
+
227
+ | Tool | Layer | What it does | When to use it INSTEAD of prusik |
228
+ |---|---|---|---|
229
+ | **[learn-harness-engineering](https://github.com/walkinglabs/learn-harness-engineering)** | Pedagogy | Course + skill that teaches how to build a harness; ships templates, not a runtime | If you want to LEARN harness design before adopting one. Prusik is the runtime adopters reach for after the course. |
230
+ | **[sentrux](https://github.com/sentrux/sentrux)** | Architectural measurement | Real-time codebase quality signal (5 root-cause metrics, MCP integration) | If you want continuous architectural quality feedback. **Composes** with prusik via `behavior_regression.command = "sentrux gate ."` |
231
+ | **[helmor](https://github.com/dohooo/helmor)** | Local desktop UI | Tauri-based workbench wrapping Claude Code SDK + OpenAI Codex SDK; SQLite-backed sessions | If you want a GUI for managing agent sessions. Prusik is headless / hooks-based; orthogonal layer. |
232
+ | **[future-agi](https://github.com/future-agi/future-agi)** | Production observability | OTel-native tracing + 50+ eval metrics + gateway + guardrails for live agents | If you need production runtime observability. Prusik is build-time-only; future-agi is run-time. |
233
+ | **[GitHub Spec Kit](https://github.com/github/spec-kit)** | Pre-planning | Generate detailed specs and plans before writing code | If you prefer waterfall-style design-then-implement. Prusik chose the opposite posture: ship narrow on recurrence trigger, defer until evidence. |
234
+ | **Bare Claude Code** | None | Just the CLI, no harness | If your project is small / one-off and the agent works fine without enforcement. Prusik's value compounds with project complexity. |
235
+ | **[LangGraph](https://github.com/langchain-ai/langgraph) / [AutoGen](https://github.com/microsoft/autogen) / [CrewAI](https://github.com/crewAIInc/crewAI)** | Multi-agent orchestration framework | General-purpose multi-agent coordination libraries | If you're building a custom agent runtime. Prusik is opinionated for Claude Code specifically; these frameworks are agent-agnostic but require you to engineer the harness yourself. |
236
+
237
+ **Prusik's strength:** opinionated, discipline-first, multi-agent decomposition with critic-actor separation, recurrence-trigger framework that prevents speculative complexity. Phase FSM + schema-validated artifacts + ungameable signal design.
238
+
239
+ **Prusik's gaps (honest):**
240
+ - **Claude Code-coupled.** Hooks contract is CC-specific. Codex / Cursor / other agent runtimes need a different harness.
241
+ - **Single-active-sprint.** `.sprint/state.json` assumes one developer-with-AI per checkout. Multiple developers running parallel agent sessions on the same repo isn't modeled.
242
+ - **Python-AST-privileged.** First-class discovery for Python; regex-based for JS/TS/Go; unsupported for Rust/Java/Ruby (until tree-sitter discovery lands, planned but recurrence-gated).
243
+ - **No UI.** Prusik is CLI + hooks. If you need a visual treemap or session browser, pair with helmor or sentrux.
244
+ - **No production runtime.** Prusik's job ends at sprint-complete. Production observability is future-agi's job.
245
+
246
+ **The composition story:** prusik's `behavior_regression` and `project_policy` blocks (v0.7.1, v0.8.0) explicitly invoke arbitrary commands during reviewing. This is the integration point with sentrux (`sentrux gate .`), with project pre-commit pipelines (`pre-commit run --all-files`), with browser smoke (`pytest -m browser_smoke`), and with anything else that exits non-zero on failure. **Prusik doesn't replace these; it consumes them.**
247
+
248
+ If you're not sure which layer you need, run `prusik doctor` after `prusik init` — it scores your harness across five subsystems and points at the lowest one with a concrete next step.
249
+
250
+ ## Design limits (honest)
251
+
252
+ - **Depth is not gateable.** Schemas catch structural issues; they can't catch shallow thinking. Reviewer roles (`brief-critic`, `scope-critic`, `plan-critic`, `conventions-enforcer`) add judgment in isolated context windows, but a human reviews `design/` weekly.
253
+ - **Experimental surface.** `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` is still experimental; prusik pairs teams with worktrees and treats teams as ephemeral sprints, not long-running processes.
254
+ - **Non-Python dep graphs are regex-based.** Good-enough for scoping; not a real parser. Replace with tree-sitter per language if accuracy matters.
255
+ - **Watchdog runs out-of-band.** Prusik ships the command; installation (via `/schedule`, cron, or a polling terminal) is left to the adopter to match their environment.
256
+ - **Linear plugin is a stub.** Implement `prusik/issue_plugins/linear.py` with the Linear GraphQL API when you need it.
257
+
258
+ ## Self-hosting
259
+
260
+ Prusik develops itself with prusik. `.claude/settings.json` and `.claude/sprint-config.yaml` at repo root wire hooks for work on prusik source. The self-host config includes extra writable paths for `prusik/**` and `tests/**` during `solo_execute`/`building` phases — so prusik-on-prusik development doesn't fight its own gates.
261
+
262
+ ## Repository layout
263
+
264
+ ```
265
+ prusik/ — engine
266
+ discovery_plugins/ — per-language graph builders
267
+ issue_plugins/ — per-tracker sync
268
+ templates/ — copied into target projects by `prusik init`
269
+ .claude/ — settings, sprint-config, agents, commands, schemas
270
+ artifacts/ — brief/scope/plan/retro skeletons
271
+ .claude/ — self-host: prusik's own config
272
+ examples/greenfield/ — demo of `prusik init` against a fresh project
273
+ tests/test_smoke.py — 17 smoke tests covering every engine module
274
+ ```
275
+
276
+ ## License
277
+
278
+ Apache 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE).