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.
- prusik-0.197.3/CHANGELOG.md +18 -0
- prusik-0.197.3/LICENSE +201 -0
- prusik-0.197.3/MANIFEST.in +21 -0
- prusik-0.197.3/NOTICE +6 -0
- prusik-0.197.3/PKG-INFO +278 -0
- prusik-0.197.3/README.md +251 -0
- prusik-0.197.3/prusik/__init__.py +1 -0
- prusik-0.197.3/prusik/__main__.py +1097 -0
- prusik-0.197.3/prusik/absence.py +199 -0
- prusik-0.197.3/prusik/affected.py +141 -0
- prusik-0.197.3/prusik/agents_doctor.py +146 -0
- prusik-0.197.3/prusik/artifact_variants.py +187 -0
- prusik-0.197.3/prusik/baseline.py +277 -0
- prusik-0.197.3/prusik/binding_check.py +297 -0
- prusik-0.197.3/prusik/binding_detect.py +210 -0
- prusik-0.197.3/prusik/binding_detect_js.py +324 -0
- prusik-0.197.3/prusik/blast_plan.py +572 -0
- prusik-0.197.3/prusik/bridge.py +394 -0
- prusik-0.197.3/prusik/brief_lint.py +399 -0
- prusik-0.197.3/prusik/calibration.py +389 -0
- prusik-0.197.3/prusik/capture_diagnose.py +123 -0
- prusik-0.197.3/prusik/catch_quality.py +379 -0
- prusik-0.197.3/prusik/ci_comment.py +348 -0
- prusik-0.197.3/prusik/consistency.py +875 -0
- prusik-0.197.3/prusik/convergence.py +101 -0
- prusik-0.197.3/prusik/criterion.py +116 -0
- prusik-0.197.3/prusik/critic_recall.py +218 -0
- prusik-0.197.3/prusik/cross_builder.py +358 -0
- prusik-0.197.3/prusik/detect.py +542 -0
- prusik-0.197.3/prusik/detectors/__init__.py +78 -0
- prusik-0.197.3/prusik/detectors/base.py +55 -0
- prusik-0.197.3/prusik/detectors/binding.py +37 -0
- prusik-0.197.3/prusik/detectors/test_reach.py +35 -0
- prusik-0.197.3/prusik/discovery.py +250 -0
- prusik-0.197.3/prusik/discovery_plugins/__init__.py +43 -0
- prusik-0.197.3/prusik/discovery_plugins/go.py +24 -0
- prusik-0.197.3/prusik/discovery_plugins/javascript.py +43 -0
- prusik-0.197.3/prusik/discovery_plugins/python.py +29 -0
- prusik-0.197.3/prusik/doctor.py +1301 -0
- prusik-0.197.3/prusik/effort.py +198 -0
- prusik-0.197.3/prusik/eval.py +544 -0
- prusik-0.197.3/prusik/evidence.py +222 -0
- prusik-0.197.3/prusik/feedback.py +392 -0
- prusik-0.197.3/prusik/feedback_store.py +308 -0
- prusik-0.197.3/prusik/findings.py +378 -0
- prusik-0.197.3/prusik/fix_round.py +452 -0
- prusik-0.197.3/prusik/gate.py +2833 -0
- prusik-0.197.3/prusik/infra_check.py +131 -0
- prusik-0.197.3/prusik/init.py +409 -0
- prusik-0.197.3/prusik/injection.py +174 -0
- prusik-0.197.3/prusik/issue_plugins/__init__.py +35 -0
- prusik-0.197.3/prusik/issue_plugins/github.py +57 -0
- prusik-0.197.3/prusik/issue_plugins/linear.py +17 -0
- prusik-0.197.3/prusik/issues.py +74 -0
- prusik-0.197.3/prusik/ledger.py +222 -0
- prusik-0.197.3/prusik/manifest.py +259 -0
- prusik-0.197.3/prusik/metrics.py +177 -0
- prusik-0.197.3/prusik/narrative_claim.py +164 -0
- prusik-0.197.3/prusik/pause.py +128 -0
- prusik-0.197.3/prusik/permissions.py +193 -0
- prusik-0.197.3/prusik/phases.py +325 -0
- prusik-0.197.3/prusik/platform_adapter.py +112 -0
- prusik-0.197.3/prusik/preflight.py +70 -0
- prusik-0.197.3/prusik/prove.py +106 -0
- prusik-0.197.3/prusik/refresh.py +496 -0
- prusik-0.197.3/prusik/refresh_merge.py +316 -0
- prusik-0.197.3/prusik/report.py +292 -0
- prusik-0.197.3/prusik/roles.py +64 -0
- prusik-0.197.3/prusik/scan.py +280 -0
- prusik-0.197.3/prusik/schema.py +857 -0
- prusik-0.197.3/prusik/serve.py +204 -0
- prusik-0.197.3/prusik/showcase.py +270 -0
- prusik-0.197.3/prusik/sprint_cli.py +137 -0
- prusik-0.197.3/prusik/suite_baseline.py +55 -0
- prusik-0.197.3/prusik/suite_delta.py +163 -0
- prusik-0.197.3/prusik/templates/.claude/agents/backend-builder.md +47 -0
- prusik-0.197.3/prusik/templates/.claude/agents/brief-critic.md +38 -0
- prusik-0.197.3/prusik/templates/.claude/agents/cartographer.md +29 -0
- prusik-0.197.3/prusik/templates/.claude/agents/conventions-enforcer.md +138 -0
- prusik-0.197.3/prusik/templates/.claude/agents/conventions-scribe.md +26 -0
- prusik-0.197.3/prusik/templates/.claude/agents/feature-planner.md +31 -0
- prusik-0.197.3/prusik/templates/.claude/agents/frontend-builder.md +47 -0
- prusik-0.197.3/prusik/templates/.claude/agents/integrator.md +86 -0
- prusik-0.197.3/prusik/templates/.claude/agents/plan-critic.md +85 -0
- prusik-0.197.3/prusik/templates/.claude/agents/pr-composer.md +43 -0
- prusik-0.197.3/prusik/templates/.claude/agents/regression-sentinel.md +227 -0
- prusik-0.197.3/prusik/templates/.claude/agents/scope-critic.md +71 -0
- prusik-0.197.3/prusik/templates/.claude/agents/scoping.md +47 -0
- prusik-0.197.3/prusik/templates/.claude/agents/test-writer.md +42 -0
- prusik-0.197.3/prusik/templates/.claude/commands/brief-form.md +12 -0
- prusik-0.197.3/prusik/templates/.claude/commands/brief-new.md +27 -0
- prusik-0.197.3/prusik/templates/.claude/commands/issues-sync.md +12 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-advance.md +39 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-complete.md +23 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-pause.md +13 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-resume.md +8 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-run.md +290 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-start.md +64 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-status.md +8 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-triage.md +13 -0
- prusik-0.197.3/prusik/templates/.claude/commands/sprint-watchdog.md +15 -0
- prusik-0.197.3/prusik/templates/.claude/schemas/brief-schema.yaml +50 -0
- prusik-0.197.3/prusik/templates/.claude/schemas/plan-schema.yaml +38 -0
- prusik-0.197.3/prusik/templates/.claude/schemas/scope-schema.yaml +44 -0
- prusik-0.197.3/prusik/templates/.claude/settings.json +125 -0
- prusik-0.197.3/prusik/templates/.claude/sprint-config-presets/fastapi-postgres.yaml +114 -0
- prusik-0.197.3/prusik/templates/.claude/sprint-config.yaml +377 -0
- prusik-0.197.3/prusik/templates/artifacts/brief.md +14 -0
- prusik-0.197.3/prusik/templates/artifacts/plan.md +26 -0
- prusik-0.197.3/prusik/templates/artifacts/retro.md +14 -0
- prusik-0.197.3/prusik/templates/artifacts/scope.md +31 -0
- prusik-0.197.3/prusik/test_reach.py +311 -0
- prusik-0.197.3/prusik/test_suggestion.py +183 -0
- prusik-0.197.3/prusik/toggle.py +59 -0
- prusik-0.197.3/prusik/triage.py +152 -0
- prusik-0.197.3/prusik/trust_report.py +480 -0
- prusik-0.197.3/prusik/ts_resolve.py +197 -0
- prusik-0.197.3/prusik/ui_coverage.py +146 -0
- prusik-0.197.3/prusik/uninstall.py +168 -0
- prusik-0.197.3/prusik/update_cmd.py +124 -0
- prusik-0.197.3/prusik/verify_loop.py +353 -0
- prusik-0.197.3/prusik/version_check.py +163 -0
- prusik-0.197.3/prusik/watchdog.py +123 -0
- prusik-0.197.3/prusik/worktree_setup.py +128 -0
- prusik-0.197.3/prusik.egg-info/PKG-INFO +278 -0
- prusik-0.197.3/prusik.egg-info/SOURCES.txt +231 -0
- prusik-0.197.3/prusik.egg-info/dependency_links.txt +1 -0
- prusik-0.197.3/prusik.egg-info/entry_points.txt +2 -0
- prusik-0.197.3/prusik.egg-info/requires.txt +2 -0
- prusik-0.197.3/prusik.egg-info/top_level.txt +1 -0
- prusik-0.197.3/pyproject.toml +111 -0
- prusik-0.197.3/setup.cfg +4 -0
- prusik-0.197.3/tests/test_absence.py +147 -0
- prusik-0.197.3/tests/test_affected.py +102 -0
- prusik-0.197.3/tests/test_artifact_variants.py +124 -0
- prusik-0.197.3/tests/test_b26.py +517 -0
- prusik-0.197.3/tests/test_baseline.py +143 -0
- prusik-0.197.3/tests/test_baseline_clock_caveat.py +100 -0
- prusik-0.197.3/tests/test_behavior_verify_scope.py +98 -0
- prusik-0.197.3/tests/test_binding.py +411 -0
- prusik-0.197.3/tests/test_blast_plan.py +266 -0
- prusik-0.197.3/tests/test_blast_recall.py +86 -0
- prusik-0.197.3/tests/test_blast_verify.py +96 -0
- prusik-0.197.3/tests/test_blocked_criterion.py +57 -0
- prusik-0.197.3/tests/test_boundary_worktree.py +73 -0
- prusik-0.197.3/tests/test_bridge.py +253 -0
- prusik-0.197.3/tests/test_bridge_status_reslug.py +48 -0
- prusik-0.197.3/tests/test_brief.py +1105 -0
- prusik-0.197.3/tests/test_brief_critic_guards.py +30 -0
- prusik-0.197.3/tests/test_brief_measurability_numeric.py +59 -0
- prusik-0.197.3/tests/test_calibration.py +314 -0
- prusik-0.197.3/tests/test_capture_diagnose.py +84 -0
- prusik-0.197.3/tests/test_capture_env_guard.py +81 -0
- prusik-0.197.3/tests/test_capture_reset_clear.py +48 -0
- prusik-0.197.3/tests/test_capture_shell_wrapper_guard.py +95 -0
- prusik-0.197.3/tests/test_capture_worktree_canonical.py +125 -0
- prusik-0.197.3/tests/test_catch_quality.py +260 -0
- prusik-0.197.3/tests/test_ci_comment.py +280 -0
- prusik-0.197.3/tests/test_ci_shaped_criteria.py +58 -0
- prusik-0.197.3/tests/test_convergence.py +117 -0
- prusik-0.197.3/tests/test_convergence_noop_success.py +108 -0
- prusik-0.197.3/tests/test_criterion.py +77 -0
- prusik-0.197.3/tests/test_critic_outcome.py +116 -0
- prusik-0.197.3/tests/test_critic_recall.py +119 -0
- prusik-0.197.3/tests/test_cross_builder.py +225 -0
- prusik-0.197.3/tests/test_detector_precision.py +76 -0
- prusik-0.197.3/tests/test_detectors.py +391 -0
- prusik-0.197.3/tests/test_deviations_reconcile.py +108 -0
- prusik-0.197.3/tests/test_doctor.py +419 -0
- prusik-0.197.3/tests/test_effort.py +148 -0
- prusik-0.197.3/tests/test_eslint_clean_evidence.py +62 -0
- prusik-0.197.3/tests/test_eval.py +209 -0
- prusik-0.197.3/tests/test_eval_scorecard.py +72 -0
- prusik-0.197.3/tests/test_evidence.py +426 -0
- prusik-0.197.3/tests/test_evidence_hash_gitignore.py +101 -0
- prusik-0.197.3/tests/test_false_clean_diagnosis.py +61 -0
- prusik-0.197.3/tests/test_fanout_lane.py +79 -0
- prusik-0.197.3/tests/test_feedback.py +64 -0
- prusik-0.197.3/tests/test_feedback_store.py +172 -0
- prusik-0.197.3/tests/test_field_worktree_fixes.py +72 -0
- prusik-0.197.3/tests/test_findings.py +274 -0
- prusik-0.197.3/tests/test_fingerprint_auto_refresh.py +71 -0
- prusik-0.197.3/tests/test_fix_round_auto.py +98 -0
- prusik-0.197.3/tests/test_fixround_reassembly.py +216 -0
- prusik-0.197.3/tests/test_full_suite_gate.py +126 -0
- prusik-0.197.3/tests/test_infra_check.py +154 -0
- prusik-0.197.3/tests/test_init_refresh.py +1677 -0
- prusik-0.197.3/tests/test_injection.py +142 -0
- prusik-0.197.3/tests/test_ledger_read_cache.py +42 -0
- prusik-0.197.3/tests/test_lint.py +57 -0
- prusik-0.197.3/tests/test_lint_evidence_primitive.py +94 -0
- prusik-0.197.3/tests/test_map_freshness_drift.py +96 -0
- prusik-0.197.3/tests/test_merge_hooks.py +175 -0
- prusik-0.197.3/tests/test_metrics.py +131 -0
- prusik-0.197.3/tests/test_misc.py +1926 -0
- prusik-0.197.3/tests/test_moat_marker_integrity.py +90 -0
- prusik-0.197.3/tests/test_narrative_claim.py +112 -0
- prusik-0.197.3/tests/test_permissions_add.py +95 -0
- prusik-0.197.3/tests/test_phase_gate_outcome.py +89 -0
- prusik-0.197.3/tests/test_phases.py +3633 -0
- prusik-0.197.3/tests/test_plan_modules_exclusion_subsection.py +62 -0
- prusik-0.197.3/tests/test_platform_adapter.py +90 -0
- prusik-0.197.3/tests/test_preflight.py +114 -0
- prusik-0.197.3/tests/test_prove.py +220 -0
- prusik-0.197.3/tests/test_prove_flaky.py +71 -0
- prusik-0.197.3/tests/test_prove_ts.py +124 -0
- prusik-0.197.3/tests/test_refresh_merge_dragged_comment.py +67 -0
- prusik-0.197.3/tests/test_report.py +204 -0
- prusik-0.197.3/tests/test_reviewer_snapshot_stability.py +78 -0
- prusik-0.197.3/tests/test_roles.py +70 -0
- prusik-0.197.3/tests/test_scan.py +179 -0
- prusik-0.197.3/tests/test_scope_modules_parsing.py +68 -0
- prusik-0.197.3/tests/test_serve.py +174 -0
- prusik-0.197.3/tests/test_showcase.py +171 -0
- prusik-0.197.3/tests/test_suite_delta.py +103 -0
- prusik-0.197.3/tests/test_template_skew.py +66 -0
- prusik-0.197.3/tests/test_test_reach.py +175 -0
- prusik-0.197.3/tests/test_test_suggestion.py +216 -0
- prusik-0.197.3/tests/test_thrash_advisory.py +43 -0
- prusik-0.197.3/tests/test_triage_size_gate.py +39 -0
- prusik-0.197.3/tests/test_trust_report.py +91 -0
- prusik-0.197.3/tests/test_ts_prove_detect.py +70 -0
- prusik-0.197.3/tests/test_ts_resolve.py +99 -0
- prusik-0.197.3/tests/test_ui_coverage.py +114 -0
- prusik-0.197.3/tests/test_ui_sprint_conventions.py +57 -0
- prusik-0.197.3/tests/test_uninstall_settings.py +108 -0
- prusik-0.197.3/tests/test_update_whats_new.py +63 -0
- prusik-0.197.3/tests/test_verify_loop.py +297 -0
- prusik-0.197.3/tests/test_version_check.py +76 -0
- prusik-0.197.3/tests/test_worktree_env_files.py +73 -0
- prusik-0.197.3/tests/test_worktree_hash_derived_dirs.py +49 -0
- prusik-0.197.3/tests/test_worktree_setup.py +71 -0
- 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
prusik-0.197.3/PKG-INFO
ADDED
|
@@ -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).
|