pi-dev-team 0.2.0
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.
- package/LICENSE +21 -0
- package/PORTING.md +134 -0
- package/README.md +207 -0
- package/UPSTREAM.json +64 -0
- package/agents/Explore.md +15 -0
- package/agents/a11y-review.md +118 -0
- package/agents/adr-author.md +70 -0
- package/agents/ai-provenance-review.md +120 -0
- package/agents/angular-reactivity-review.md +95 -0
- package/agents/arch-review.md +135 -0
- package/agents/architect.md +78 -0
- package/agents/autoship-batch-proposer.md +69 -0
- package/agents/claude-setup-review.md +136 -0
- package/agents/codebase-recon.md +184 -0
- package/agents/component-architecture-review.md +119 -0
- package/agents/concurrency-review.md +109 -0
- package/agents/correctness-review.md +290 -0
- package/agents/data-flow-tracer.md +120 -0
- package/agents/doc-review.md +165 -0
- package/agents/domain-review.md +136 -0
- package/agents/general-purpose.md +10 -0
- package/agents/gherkin-quality-critic.md +113 -0
- package/agents/js-fp-review.md +114 -0
- package/agents/mutation-kill.md +684 -0
- package/agents/naming-review.md +142 -0
- package/agents/orchestrator.md +339 -0
- package/agents/performance-review.md +105 -0
- package/agents/plan-review-acceptance.md +115 -0
- package/agents/plan-review-design.md +90 -0
- package/agents/plan-review-parallelization.md +84 -0
- package/agents/plan-review-strategic.md +96 -0
- package/agents/plan-review-ux.md +110 -0
- package/agents/platform-engineer.md +64 -0
- package/agents/product-manager.md +68 -0
- package/agents/progress-guardian.md +79 -0
- package/agents/qa-engineer.md +289 -0
- package/agents/quality-reviewer.md +132 -0
- package/agents/react-reactivity-review.md +102 -0
- package/agents/refactor-opportunity-review.md +128 -0
- package/agents/security-engineer.md +60 -0
- package/agents/security-review.md +218 -0
- package/agents/session-analysis.md +95 -0
- package/agents/software-engineer.md +105 -0
- package/agents/spec-compliance-review.md +100 -0
- package/agents/spec-reviewer.md +114 -0
- package/agents/structure-review.md +146 -0
- package/agents/tech-writer.md +84 -0
- package/agents/test-review.md +246 -0
- package/agents/test-smell-review.md +188 -0
- package/agents/token-efficiency-review.md +139 -0
- package/agents/ui-ux-designer.md +54 -0
- package/agents/vue-reactivity-review.md +95 -0
- package/bin/__pycache__/claudecpython-314.pyc +0 -0
- package/bin/claude +258 -0
- package/docs/upstream/.pages +1 -0
- package/docs/upstream/CHANGELOG.md +2586 -0
- package/docs/upstream/README.md +155 -0
- package/docs/upstream/agent-architecture.md +214 -0
- package/docs/upstream/agent_info.md +187 -0
- package/docs/upstream/artifact-migration.md +124 -0
- package/docs/upstream/code-intelligence-nudge.md +149 -0
- package/docs/upstream/code-review-process.md +294 -0
- package/docs/upstream/concurrent-use.md +73 -0
- package/docs/upstream/context-management.md +111 -0
- package/docs/upstream/developer-notes.md +280 -0
- package/docs/upstream/diagrams/architecture-overview.svg +101 -0
- package/docs/upstream/diagrams/review-dispatch.svg +139 -0
- package/docs/upstream/diagrams/team-agents.svg +128 -0
- package/docs/upstream/diagrams/test-improve-flow.svg +166 -0
- package/docs/upstream/diagrams/workflow-linear.svg +66 -0
- package/docs/upstream/diagrams/workflow-three-phase.svg +200 -0
- package/docs/upstream/eval-maintenance.md +95 -0
- package/docs/upstream/eval-running-guide.md +147 -0
- package/docs/upstream/eval-system.md +291 -0
- package/docs/upstream/session-review-oss-complements.md +75 -0
- package/docs/upstream/session-review.md +212 -0
- package/docs/upstream/skills.md +188 -0
- package/docs/upstream/team-structure.md +21 -0
- package/docs/upstream/telemetry-ci-access.md +129 -0
- package/docs/upstream/telemetry-repo-security.md +120 -0
- package/docs/upstream/test-evaluation.md +277 -0
- package/docs/upstream/test-improve.md +154 -0
- package/docs/upstream/triage-workflow.md +282 -0
- package/docs/upstream/workflows.md +289 -0
- package/extensions/dev-team/index.ts +539 -0
- package/extensions/dev-team/lib/agents.ts +272 -0
- package/extensions/dev-team/lib/ai-credits.ts +92 -0
- package/extensions/dev-team/lib/autocompact.ts +81 -0
- package/extensions/dev-team/lib/child-run.ts +102 -0
- package/extensions/dev-team/lib/config.ts +236 -0
- package/extensions/dev-team/lib/gh-command.ts +103 -0
- package/extensions/dev-team/lib/github-style.ts +307 -0
- package/extensions/dev-team/lib/hooks.ts +350 -0
- package/extensions/dev-team/lib/metrics.ts +115 -0
- package/extensions/dev-team/lib/safe-read.ts +49 -0
- package/extensions/dev-team/lib/session-files.ts +57 -0
- package/extensions/dev-team/lib/session-spend.ts +123 -0
- package/extensions/dev-team/lib/shell-scan.ts +205 -0
- package/extensions/dev-team/lib/skills.ts +213 -0
- package/extensions/dev-team/lib/subagent-render.ts +245 -0
- package/extensions/dev-team/lib/subagent-types.ts +164 -0
- package/extensions/dev-team/lib/subagent.ts +596 -0
- package/extensions/dev-team/lib/terminal-text.ts +54 -0
- package/extensions/dev-team/lib/tools-misc.ts +152 -0
- package/extensions/dev-team/lib/transcript.ts +110 -0
- package/extensions/dev-team/lib/trust.ts +52 -0
- package/extensions/dev-team/lib/usage-breakdown.ts +176 -0
- package/extensions/dev-team/lib/usage-chart.ts +153 -0
- package/extensions/dev-team/lib/usage-command.ts +107 -0
- package/extensions/dev-team/lib/usage-history.ts +203 -0
- package/extensions/dev-team/lib/usage-render.ts +225 -0
- package/extensions/dev-team/lib/usage-split-bar.ts +127 -0
- package/extensions/dev-team/lib/usage-state.ts +116 -0
- package/extensions/dev-team/lib/usage-text.ts +159 -0
- package/extensions/dev-team/lib/usage-view.ts +109 -0
- package/hooks/__pycache__/refactor_test_freeze_guard.cpython-314.pyc +0 -0
- package/hooks/agent_dispatch_ledger.py +190 -0
- package/hooks/autocompact_setup_nudge.py +99 -0
- package/hooks/bash_retry_guard.py +228 -0
- package/hooks/boundary_events_write_guard.py +352 -0
- package/hooks/code_intelligence_nudge.py +293 -0
- package/hooks/code_intelligence_turn_mark.py +317 -0
- package/hooks/codegraph_bootstrap.py +139 -0
- package/hooks/contract_version_guard.py +362 -0
- package/hooks/cost_meter.py +106 -0
- package/hooks/destructive-commands.json +62 -0
- package/hooks/destructive_guard.py +477 -0
- package/hooks/eval_compliance_check.py +440 -0
- package/hooks/guards.json +17 -0
- package/hooks/hooks.json +323 -0
- package/hooks/internal_double_gate.py +296 -0
- package/hooks/js_fp_review.py +212 -0
- package/hooks/knowledge_index.py +119 -0
- package/hooks/lib/__pycache__/artifact_paths.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/atomic_state.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/autocompact_config.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/boundary_events.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/doc_classification.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/gh_pr_create_detect.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/git_safe_diff.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/instrument_log.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/metrics_query.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/plugin_version.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/pre_commit_doc_classifier.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_agent_registry.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_gate_corroboration.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_gate_hash.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/review_verdicts.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/stdin_json.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/stryker_invocation.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/telemetry_consent.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/test_file_classify.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/token_efficiency_limits.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/verify_guard_state.cpython-314.pyc +0 -0
- package/hooks/lib/__pycache__/xunit_v3_operator_gate.cpython-314.pyc +0 -0
- package/hooks/lib/agent_skill_hints.py +74 -0
- package/hooks/lib/artifact_paths.py +263 -0
- package/hooks/lib/atomic_state.py +557 -0
- package/hooks/lib/autocompact_config.py +103 -0
- package/hooks/lib/autoship_log.py +106 -0
- package/hooks/lib/banned_scripts_policy.py +51 -0
- package/hooks/lib/boundary_events.py +436 -0
- package/hooks/lib/build_knowledge_index.py +504 -0
- package/hooks/lib/build_skills_index.py +361 -0
- package/hooks/lib/build_state.py +116 -0
- package/hooks/lib/classify_ship_outcome.py +126 -0
- package/hooks/lib/config_changelog_schema.py +115 -0
- package/hooks/lib/cost_meter.py +955 -0
- package/hooks/lib/doc_classification.py +116 -0
- package/hooks/lib/gh_pr_create_detect.py +136 -0
- package/hooks/lib/git_safe_diff.py +123 -0
- package/hooks/lib/instrument_log.py +66 -0
- package/hooks/lib/iteration_journal_gate.py +197 -0
- package/hooks/lib/knowledge_index_paths.py +88 -0
- package/hooks/lib/mcp_json_repowise.py +177 -0
- package/hooks/lib/metrics_query.py +202 -0
- package/hooks/lib/minimal_yaml.py +434 -0
- package/hooks/lib/plugin_version.py +142 -0
- package/hooks/lib/pre_commit_detect.py +537 -0
- package/hooks/lib/pre_commit_doc_classifier.py +126 -0
- package/hooks/lib/pricing.py +118 -0
- package/hooks/lib/report_pdf.py +371 -0
- package/hooks/lib/review_agent_registry.py +142 -0
- package/hooks/lib/review_dispatch_ledger.py +101 -0
- package/hooks/lib/review_gate_corroboration.py +521 -0
- package/hooks/lib/review_gate_hash.py +252 -0
- package/hooks/lib/review_gate_normalized_hash.py +1115 -0
- package/hooks/lib/review_verdicts.py +301 -0
- package/hooks/lib/run_report.py +160 -0
- package/hooks/lib/skill_categories.yaml +125 -0
- package/hooks/lib/stdin_json.py +57 -0
- package/hooks/lib/stryker_invocation.py +102 -0
- package/hooks/lib/telemetry_consent.py +41 -0
- package/hooks/lib/telemetry_report.py +108 -0
- package/hooks/lib/test_file_classify.py +160 -0
- package/hooks/lib/token_efficiency_limits.py +51 -0
- package/hooks/lib/turn_identity.py +77 -0
- package/hooks/lib/verify_guard_state.py +110 -0
- package/hooks/lib/workflow_state.py +206 -0
- package/hooks/lib/xunit_v3_operator_gate.py +596 -0
- package/hooks/mcp_json_repowise_nudge.py +74 -0
- package/hooks/mutation_adapters/__init__.py +7 -0
- package/hooks/mutation_adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/lib.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/mutmut.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/pitest.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/stryker.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/__pycache__/stryker_net.cpython-314.pyc +0 -0
- package/hooks/mutation_adapters/lib.py +478 -0
- package/hooks/mutation_adapters/mutmut.py +188 -0
- package/hooks/mutation_adapters/pitest.py +266 -0
- package/hooks/mutation_adapters/stryker.py +157 -0
- package/hooks/mutation_adapters/stryker_net.py +264 -0
- package/hooks/mutation_gate.py +193 -0
- package/hooks/mutation_testing_smoke_gate.py +371 -0
- package/hooks/pending_review_notify.py +121 -0
- package/hooks/phase_marker.py +138 -0
- package/hooks/post_compact_state_reinject.py +180 -0
- package/hooks/post_format.py +115 -0
- package/hooks/pre_commit_knowledge_index.py +128 -0
- package/hooks/pre_commit_review.py +66 -0
- package/hooks/pre_pr_review.py +694 -0
- package/hooks/pre_tool_guard.py +405 -0
- package/hooks/py.sh +73 -0
- package/hooks/refactor-bash-write-patterns.json +29 -0
- package/hooks/refactor_test_bash_guard.py +253 -0
- package/hooks/refactor_test_freeze_guard.py +139 -0
- package/hooks/refactor_test_revert_guard.py +186 -0
- package/hooks/repo_review_nudge.py +287 -0
- package/hooks/review_verdict_recorder.py +464 -0
- package/hooks/scan_bash_command_for_banned_scripts.py +428 -0
- package/hooks/scan_worktree_for_banned_scripts.py +238 -0
- package/hooks/session_learning_trigger.py +248 -0
- package/hooks/skills_index.py +126 -0
- package/hooks/stryker_xunit_shim_guard.py +571 -0
- package/hooks/subagent_completion_guard.py +309 -0
- package/hooks/subagent_skill_context.py +139 -0
- package/hooks/task_completion_metrics.py +216 -0
- package/hooks/tdd_guard.py +229 -0
- package/hooks/telemetry.py +341 -0
- package/hooks/token_efficiency_review.py +194 -0
- package/hooks/verify_guard.py +183 -0
- package/hooks/verify_guard_edit_marker.py +73 -0
- package/hooks/version_check.py +173 -0
- package/knowledge/accepted-risks-schema.md +98 -0
- package/knowledge/adr-decision-criteria.md +64 -0
- package/knowledge/adversarial-review-protocol.md +139 -0
- package/knowledge/agent-registry.md +228 -0
- package/knowledge/agent-review-methodology.md +80 -0
- package/knowledge/ai-friendly-repo-guidelines.md +67 -0
- package/knowledge/architecture-assessment.md +96 -0
- package/knowledge/artifact-lifecycle.md +57 -0
- package/knowledge/cd-maturity-model.md +82 -0
- package/knowledge/cd-test-architecture.md +190 -0
- package/knowledge/ci-cd-file-scope.md +24 -0
- package/knowledge/codegraph-vs-graphify.md +192 -0
- package/knowledge/component-test-patterns.md +139 -0
- package/knowledge/database-change-management.md +80 -0
- package/knowledge/database-test-patterns.md +79 -0
- package/knowledge/decision-defaults.md +88 -0
- package/knowledge/dependency-breaking-techniques.md +116 -0
- package/knowledge/deployment-pipeline.md +86 -0
- package/knowledge/design-smells.md +122 -0
- package/knowledge/directory-enumeration.md +38 -0
- package/knowledge/domain-modeling.md +123 -0
- package/knowledge/evidence-bundle.md +90 -0
- package/knowledge/exploratory-testing-field-guide.md +122 -0
- package/knowledge/failure-routing.md +28 -0
- package/knowledge/fixture-construction.md +56 -0
- package/knowledge/frontend-component-architecture.md +139 -0
- package/knowledge/gherkin-quality-review-dispatch.md +135 -0
- package/knowledge/index.json +6766 -0
- package/knowledge/internal-collaborator-doubling.md +101 -0
- package/knowledge/legacy-test-strategy.md +71 -0
- package/knowledge/long-run-waiting.md +66 -0
- package/knowledge/microservice-testing.md +71 -0
- package/knowledge/model-pricing.json +23 -0
- package/knowledge/mutation-score-formulas.md +60 -0
- package/knowledge/object-calisthenics.md +147 -0
- package/knowledge/oracle-provenance.md +94 -0
- package/knowledge/orchestrator-script-implementation.md +185 -0
- package/knowledge/owasp-detection.md +148 -0
- package/knowledge/plan-review-rubric.md +56 -0
- package/knowledge/proxy-connectivity.md +62 -0
- package/knowledge/reactive-effect-patterns.md +73 -0
- package/knowledge/recon-inventory-excludes.txt +32 -0
- package/knowledge/references/bdd-value-guide.md +61 -0
- package/knowledge/references/csharp-http-client-testing.md +264 -0
- package/knowledge/release-strategies.md +74 -0
- package/knowledge/report-output-location.md +117 -0
- package/knowledge/report-pdf-integration.md +63 -0
- package/knowledge/report-print.css +129 -0
- package/knowledge/report-template.md +114 -0
- package/knowledge/report-to-pdf.md +69 -0
- package/knowledge/request-processing-flow.md +63 -0
- package/knowledge/result-verification.md +52 -0
- package/knowledge/review-agent-output-contract.md +121 -0
- package/knowledge/review-lens-classification.md +113 -0
- package/knowledge/review-rubric.md +62 -0
- package/knowledge/review-template.md +104 -0
- package/knowledge/rule-fixtures/A02.insecure-random-js/negative.js +1 -0
- package/knowledge/rule-fixtures/A02.insecure-random-js/positive.js +1 -0
- package/knowledge/rule-fixtures/A02.weak-hashing-md5/negative.py +1 -0
- package/knowledge/rule-fixtures/A02.weak-hashing-md5/positive.py +1 -0
- package/knowledge/rule-fixtures/A03.command-injection/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.command-injection/positive.js +1 -0
- package/knowledge/rule-fixtures/A03.sql-injection/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.sql-injection/positive.js +1 -0
- package/knowledge/rule-fixtures/A03.xss-innerhtml/negative.js +1 -0
- package/knowledge/rule-fixtures/A03.xss-innerhtml/positive.js +1 -0
- package/knowledge/rule-fixtures/A05.cors-wildcard/negative.js +1 -0
- package/knowledge/rule-fixtures/A05.cors-wildcard/positive.js +1 -0
- package/knowledge/rule-fixtures/A05.default-credentials/negative.js +1 -0
- package/knowledge/rule-fixtures/A05.default-credentials/positive.js +1 -0
- package/knowledge/rule-fixtures/A07.jwt-alg-none/negative.js +1 -0
- package/knowledge/rule-fixtures/A07.jwt-alg-none/positive.js +1 -0
- package/knowledge/rule-fixtures/A08.binary-formatter/negative.cs +1 -0
- package/knowledge/rule-fixtures/A08.binary-formatter/positive.cs +1 -0
- package/knowledge/rule-fixtures/A08.js-eval/negative.js +1 -0
- package/knowledge/rule-fixtures/A08.js-eval/positive.js +1 -0
- package/knowledge/rule-fixtures/A08.object-input-stream/negative.java +1 -0
- package/knowledge/rule-fixtures/A08.object-input-stream/positive.java +1 -0
- package/knowledge/schemas/disposition-register-v1.json +65 -0
- package/knowledge/schemas/recon-envelope-v1.json +198 -0
- package/knowledge/schemas/unified-finding-v1.json +72 -0
- package/knowledge/security-primitives-contract.md +301 -0
- package/knowledge/security-review-rule-map.yaml +107 -0
- package/knowledge/skills-registry.md +72 -0
- package/knowledge/task-size-classifier.md +103 -0
- package/knowledge/telemetry-schema.md +881 -0
- package/knowledge/test-automation-maturity.md +56 -0
- package/knowledge/test-automation-principles.md +71 -0
- package/knowledge/test-cadence-tradeoffs.md +68 -0
- package/knowledge/test-doubles.md +105 -0
- package/knowledge/test-file-indicators.md +22 -0
- package/knowledge/test-layer-gates.md +35 -0
- package/knowledge/test-matrix-examples/django-batch.md +24 -0
- package/knowledge/test-matrix-examples/dotnet-grpc-fronting-api.md +90 -0
- package/knowledge/test-matrix-examples/dotnet-http-consumer.md +131 -0
- package/knowledge/test-matrix-examples/react-node-spa.md +24 -0
- package/knowledge/test-matrix-examples/spring-boot-service.md +25 -0
- package/knowledge/test-matrix-examples/ssr-htmx.md +24 -0
- package/knowledge/test-organization.md +70 -0
- package/knowledge/test-pyramid.md +84 -0
- package/knowledge/test-refactoring.md +67 -0
- package/knowledge/test-review-division-of-labor.md +85 -0
- package/knowledge/test-smells.md +80 -0
- package/knowledge/test-stack-profiles/bdd-frameworks.md +235 -0
- package/knowledge/test-stack-profiles/django.md +13 -0
- package/knowledge/test-stack-profiles/dotnet.md +18 -0
- package/knowledge/test-stack-profiles/go.md +16 -0
- package/knowledge/test-stack-profiles/node.md +16 -0
- package/knowledge/test-stack-profiles/react.md +12 -0
- package/knowledge/test-stack-profiles/spring-boot.md +16 -0
- package/knowledge/test-stack-profiles/ssr-htmx.md +14 -0
- package/knowledge/test-stack-profiles/vue.md +12 -0
- package/knowledge/test-strategy.md +70 -0
- package/knowledge/testability-patterns.md +240 -0
- package/knowledge/testing-quadrants.md +44 -0
- package/knowledge/testing-techniques/approval.md +15 -0
- package/knowledge/testing-techniques/chaos.md +17 -0
- package/knowledge/testing-techniques/fuzz.md +15 -0
- package/knowledge/testing-techniques/property-based.md +15 -0
- package/knowledge/testing-techniques/schema-validation.md +15 -0
- package/knowledge/testing-techniques/screenshot.md +15 -0
- package/knowledge/three-phase-workflow.md +198 -0
- package/knowledge/value-patterns.md +55 -0
- package/knowledge/verification-mode.md +116 -0
- package/knowledge/virtual-service-libraries.md +75 -0
- package/knowledge/wave-consolidation-guidance.md +21 -0
- package/overrides/agents/Explore.md +15 -0
- package/overrides/agents/general-purpose.md +10 -0
- package/overrides/notes/autoship.md +6 -0
- package/overrides/notes/issues-from-assessment.md +3 -0
- package/overrides/notes/issues-from-plan.md +3 -0
- package/overrides/notes/mutation-night-watch.md +3 -0
- package/overrides/notes/mutation-testing.md +3 -0
- package/overrides/notes/pr.md +7 -0
- package/overrides/notes/project-init.md +6 -0
- package/overrides/notes/setup.md +13 -0
- package/overrides/notes/specs.md +3 -0
- package/overrides/skills/headless-run/SKILL.md +45 -0
- package/overrides/skills/upgrade/SKILL.md +30 -0
- package/overrides/skills/version/SKILL.md +25 -0
- package/package.json +36 -0
- package/scripts/authoring_digest.py +93 -0
- package/scripts/autoship_discover.py +121 -0
- package/scripts/autoship_group.py +409 -0
- package/scripts/autoship_proposals.py +494 -0
- package/scripts/autoship_queue.py +291 -0
- package/scripts/autoship_reclaim.py +495 -0
- package/scripts/build_jobs.py +108 -0
- package/scripts/build_rollback_point.py +240 -0
- package/scripts/build_slice_scope.py +157 -0
- package/scripts/build_wave.py +109 -0
- package/scripts/build_wave_reconcile.py +252 -0
- package/scripts/build_worktree_baseref.py +113 -0
- package/scripts/check_agent_scope.py +117 -0
- package/scripts/check_agent_tool_mapping.py +213 -0
- package/scripts/check_review_agent_mcp_tools.py +317 -0
- package/scripts/check_security_assessment_mcp_tools.py +165 -0
- package/scripts/checkpoint_abort.py +502 -0
- package/scripts/claude_setup_review.py +438 -0
- package/scripts/codebase_recon.py +556 -0
- package/scripts/coverage_config.py +623 -0
- package/scripts/coverage_delta_steering.py +330 -0
- package/scripts/coverage_discovery_dotnet.py +315 -0
- package/scripts/coverage_discovery_java.py +742 -0
- package/scripts/coverage_discovery_js.py +546 -0
- package/scripts/coverage_gap_ranking.py +556 -0
- package/scripts/coverage_readiness.py +455 -0
- package/scripts/coverage_report_parse.py +521 -0
- package/scripts/detect_bdd_convention.py +252 -0
- package/scripts/eval_ablation.py +376 -0
- package/scripts/gherkin_analysis_coverage_gate.py +306 -0
- package/scripts/gherkin_cross_feature_duplicate_titles_gate.py +173 -0
- package/scripts/gherkin_effectiveness_rollup.py +238 -0
- package/scripts/gherkin_failure_path_gate.py +206 -0
- package/scripts/gherkin_feature_merge.py +720 -0
- package/scripts/gherkin_stub_gate.py +163 -0
- package/scripts/gherkin_stub_merge.py +479 -0
- package/scripts/git_origin_host.py +88 -0
- package/scripts/install-java-static-analysis.py +110 -0
- package/scripts/issue_deps.py +74 -0
- package/scripts/lib/_bdd_markers.py +28 -0
- package/scripts/lib/_gherkin_text.py +93 -0
- package/scripts/lib/_vendored_tree.py +70 -0
- package/scripts/lib/autoship_state.py +397 -0
- package/scripts/lib/claude_md_guard.py +226 -0
- package/scripts/lib/deterministic_recon.py +446 -0
- package/scripts/lib/mcp_tool_grants.py +211 -0
- package/scripts/lib/plan_parse.py +386 -0
- package/scripts/lib/review_result.py +84 -0
- package/scripts/lib/review_roster.py +86 -0
- package/scripts/lib/session_log/__init__.py +34 -0
- package/scripts/lib/session_log/__pycache__/__init__.cpython-314.pyc +0 -0
- package/scripts/lib/session_log/__pycache__/records.cpython-314.pyc +0 -0
- package/scripts/lib/session_log/classify.py +231 -0
- package/scripts/lib/session_log/corrections.py +194 -0
- package/scripts/lib/session_log/discovery.py +108 -0
- package/scripts/lib/session_log/records.py +218 -0
- package/scripts/lib/session_log/redact.py +76 -0
- package/scripts/lib/session_log/signals.py +373 -0
- package/scripts/lib/session_report_downstream.py +614 -0
- package/scripts/lib/session_report_maintainer.py +1273 -0
- package/scripts/lib/session_report_shared.py +262 -0
- package/scripts/lib/settings_hook_guard.py +157 -0
- package/scripts/lib/slug.py +33 -0
- package/scripts/lib/stub_extractors/__init__.py +82 -0
- package/scripts/lib/stub_extractors/_common.py +328 -0
- package/scripts/lib/stub_extractors/csharp.py +19 -0
- package/scripts/lib/stub_extractors/go.py +173 -0
- package/scripts/lib/stub_extractors/java.py +18 -0
- package/scripts/lib/stub_extractors/jsts.py +126 -0
- package/scripts/mutation_stack_sections.py +149 -0
- package/scripts/mutation_yield_steering.py +345 -0
- package/scripts/orchestrator.py +895 -0
- package/scripts/plan_gherkin_export.py +227 -0
- package/scripts/plan_waves.py +208 -0
- package/scripts/pr_close_keyword_lint.py +108 -0
- package/scripts/progress_guardian.py +888 -0
- package/scripts/recon_inventory.py +273 -0
- package/scripts/review_findings_log.py +93 -0
- package/scripts/run_invariants.py +124 -0
- package/scripts/select_lenses.py +640 -0
- package/scripts/session_report.py +486 -0
- package/scripts/set_autocompact_env.py +221 -0
- package/scripts/ship_resume_guard.py +135 -0
- package/scripts/ship_review_gate.py +63 -0
- package/scripts/specs_convention_marker.py +103 -0
- package/scripts/test_improve_resume.py +277 -0
- package/scripts/test_review_mechanics.py +958 -0
- package/scripts/token_efficiency_review.py +322 -0
- package/scripts/verdict_scope.py +285 -0
- package/scripts/verify_gherkin_quality_critic_isolation.py +296 -0
- package/scripts/verify_tier.py +157 -0
- package/skills/adr-tools/SKILL.md +118 -0
- package/skills/agent-readiness/SKILL.md +105 -0
- package/skills/agent-readiness/ai_friendly_analyzers.py +326 -0
- package/skills/agent-readiness/scanner.py +441 -0
- package/skills/agent-readiness/scorecard.yaml +88 -0
- package/skills/api-design/SKILL.md +115 -0
- package/skills/apply-fixes/SKILL.md +171 -0
- package/skills/apply-test-doubles/SKILL.md +321 -0
- package/skills/artifact-lifecycle/SKILL.md +127 -0
- package/skills/autoship/SKILL.md +1124 -0
- package/skills/benchmark/SKILL.md +105 -0
- package/skills/branch-workflow/SKILL.md +89 -0
- package/skills/browse/SKILL.md +184 -0
- package/skills/browser-testing/SKILL.md +62 -0
- package/skills/browser-testing/references/playwright-patterns.md +216 -0
- package/skills/build/SKILL.md +422 -0
- package/skills/build/references/static-self-heal.md +245 -0
- package/skills/careful/SKILL.md +72 -0
- package/skills/cd-test-architecture/SKILL.md +371 -0
- package/skills/ci-debugging/SKILL.md +105 -0
- package/skills/co-evolution-audit/SKILL.md +269 -0
- package/skills/code-review/SKILL.md +1015 -0
- package/skills/code-review/examples/aggregated-sample.json +56 -0
- package/skills/code-review/examples/sample-report.md +41 -0
- package/skills/code-review/output-format.md +478 -0
- package/skills/code-review/scripts/activation.py +86 -0
- package/skills/code-review/scripts/change_impact.py +357 -0
- package/skills/code-review/scripts/change_shape.py +372 -0
- package/skills/code-review/scripts/change_size.py +212 -0
- package/skills/code-review/scripts/changed_file_list.py +141 -0
- package/skills/code-review/scripts/closing_pass.py +187 -0
- package/skills/code-review/scripts/consolidate.py +277 -0
- package/skills/code-review/scripts/contract_failure_report.py +185 -0
- package/skills/code-review/scripts/dispatch_reconcile.py +66 -0
- package/skills/code-review/scripts/dispatch_waves.py +164 -0
- package/skills/code-review/scripts/finding_signature.py +446 -0
- package/skills/code-review/scripts/ledger.py +283 -0
- package/skills/code-review/scripts/partition.py +169 -0
- package/skills/code-review/scripts/render_tiered_findings.py +274 -0
- package/skills/code-review/scripts/repo_invariants.py +1066 -0
- package/skills/code-review/scripts/review_context_pack.py +306 -0
- package/skills/code-review/scripts/review_round_log.py +345 -0
- package/skills/code-review/scripts/review_value_coverage.py +297 -0
- package/skills/code-review/scripts/validate_review_output.py +467 -0
- package/skills/code-review/sliced-mode.md +205 -0
- package/skills/competitive-analysis/SKILL.md +191 -0
- package/skills/context-loading-protocol/SKILL.md +157 -0
- package/skills/continue/SKILL.md +90 -0
- package/skills/cost-report/SKILL.md +178 -0
- package/skills/coverage-baseline/SKILL.md +335 -0
- package/skills/coverage-baseline/references/multi-project-discovery.md +202 -0
- package/skills/coverage-delta/SKILL.md +181 -0
- package/skills/coverage-delta/references/mutation-gate.md +70 -0
- package/skills/design-doc/SKILL.md +95 -0
- package/skills/design-interrogation/SKILL.md +89 -0
- package/skills/design-it-twice/SKILL.md +91 -0
- package/skills/docker-image-audit/SKILL.md +108 -0
- package/skills/docker-image-audit/references/install-guide.md +64 -0
- package/skills/docker-image-audit/references/report-template.md +73 -0
- package/skills/docker-image-create/SKILL.md +185 -0
- package/skills/domain-analysis/SKILL.md +183 -0
- package/skills/domain-driven-design/SKILL.md +194 -0
- package/skills/exploratory-testing/SKILL.md +108 -0
- package/skills/explore/SKILL.md +51 -0
- package/skills/farley-score/SKILL.md +165 -0
- package/skills/feature-file-validation/SKILL.md +78 -0
- package/skills/feature-file-validation/references/validation-rules.md +115 -0
- package/skills/feedback-learning/SKILL.md +414 -0
- package/skills/fix/SKILL.md +450 -0
- package/skills/freeze/SKILL.md +68 -0
- package/skills/frontend-architecture/SKILL.md +113 -0
- package/skills/gherkin-derive/SKILL.md +630 -0
- package/skills/gherkin-public/SKILL.md +266 -0
- package/skills/governance-compliance/SKILL.md +150 -0
- package/skills/guard/SKILL.md +75 -0
- package/skills/handoff/SKILL.md +139 -0
- package/skills/handoff/references/summary-templates.md +242 -0
- package/skills/harness-audit/SKILL.md +751 -0
- package/skills/harness-audit/scripts/lesson_validate.py +386 -0
- package/skills/harness-audit/scripts/redundancy_criterion.py +188 -0
- package/skills/headless-run/SKILL.md +45 -0
- package/skills/headless-run/scripts/isolated_dispatch.py +381 -0
- package/skills/help/SKILL.md +72 -0
- package/skills/hexagonal-architecture/SKILL.md +85 -0
- package/skills/human-oversight-protocol/SKILL.md +224 -0
- package/skills/issues-from-assessment/SKILL.md +223 -0
- package/skills/issues-from-plan/SKILL.md +133 -0
- package/skills/legacy-code/SKILL.md +132 -0
- package/skills/mermaid-diagramming/SKILL.md +120 -0
- package/skills/mutation-night-watch/SKILL.md +154 -0
- package/skills/mutation-night-watch/references/scheduling.md +135 -0
- package/skills/mutation-testing/SKILL.md +396 -0
- package/skills/mutation-testing/references/languages/csharp-stryker-net.md +676 -0
- package/skills/mutation-testing/references/languages/go-go-mutesting.md +95 -0
- package/skills/mutation-testing/references/languages/java-pitest.md +77 -0
- package/skills/mutation-testing/references/languages/javascript-stryker.md +188 -0
- package/skills/mutation-testing/references/languages/python-mutmut.md +97 -0
- package/skills/mutation-testing/references/time-estimation.md +34 -0
- package/skills/mutation-testing/references/tool-detection.md +15 -0
- package/skills/mutation-testing/references/workflow-callers.md +23 -0
- package/skills/mutation-testing/scripts/__pycache__/xunit_v3_feature_detector.cpython-314.pyc +0 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_slice_runner.py +635 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_status_loop.py +525 -0
- package/skills/mutation-testing/scripts/csharp_stryker_net_wrapper.py +681 -0
- package/skills/mutation-testing/scripts/mutation_baseline_reuse.py +292 -0
- package/skills/mutation-testing/scripts/mutation_exclude_policy.py +268 -0
- package/skills/mutation-testing/scripts/mutation_feasibility_gate.py +463 -0
- package/skills/mutation-testing/scripts/mutation_kill_headless.py +331 -0
- package/skills/mutation-testing/scripts/mutation_kill_insert.py +199 -0
- package/skills/mutation-testing/scripts/mutation_kill_insert_python.py +150 -0
- package/skills/mutation-testing/scripts/mutation_kill_loop.py +869 -0
- package/skills/mutation-testing/scripts/mutation_kill_loop_python.py +949 -0
- package/skills/mutation-testing/scripts/mutation_kill_retry.py +592 -0
- package/skills/mutation-testing/scripts/mutation_kill_shared.py +620 -0
- package/skills/mutation-testing/scripts/mutation_nightwatch.py +462 -0
- package/skills/mutation-testing/scripts/mutation_nightwatch_stacks.py +425 -0
- package/skills/mutation-testing/scripts/mutation_report.py +743 -0
- package/skills/mutation-testing/scripts/mutation_report_cli.py +175 -0
- package/skills/mutation-testing/scripts/mutation_safety_gate.py +69 -0
- package/skills/mutation-testing/scripts/stryker_shard_pipeline.py +847 -0
- package/skills/mutation-testing/scripts/stryker_shard_setup.py +440 -0
- package/skills/mutation-testing/scripts/stryker_timeout_retry.py +142 -0
- package/skills/mutation-testing/scripts/xunit_v3_feature_detector.py +341 -0
- package/skills/performance-benchmark/SKILL.md +174 -0
- package/skills/performance-benchmark/examples/report-format.md +43 -0
- package/skills/performance-benchmark/references/benchmark-script.md +169 -0
- package/skills/performance-metrics/SKILL.md +265 -0
- package/skills/plan/SKILL.md +199 -0
- package/skills/plan/references/gherkin-persistence.md +43 -0
- package/skills/plan/references/plan-template.md +182 -0
- package/skills/pr/SKILL.md +289 -0
- package/skills/pr/scripts/gate_retry_state.py +368 -0
- package/skills/project-init/README.md +141 -0
- package/skills/project-init/SKILL.md +1197 -0
- package/skills/project-init/evals/evals.json +200 -0
- package/skills/project-init/references/capability-tools.md +55 -0
- package/skills/project-init/references/configs.md +221 -0
- package/skills/property-based-testing/SKILL.md +121 -0
- package/skills/property-based-testing/fixtures/invariant_fixture.py +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/README.md +42 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/LICENSE +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/README.md +263 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.js +12147 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/package.json +3 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/types57/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.js +12011 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/rolldown-runtime-D7D4PA-g.js +13 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/types57/fast-check.d.ts +5165 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/package.json +94 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/LICENSE +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/README.md +168 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/RandomGenerator-DcXj09Ch.d.ts +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.js +38 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.js +18 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.js +22 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.js +134 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/RandomGenerator-DcXj09Ch.d.ts +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.js +37 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.js +17 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.js +21 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.d.ts +15 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.js +133 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.js +44 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.js +90 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.js +80 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.js +78 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/package.json +3 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.d.ts +16 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.d.ts +2 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.js +8 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.d.ts +12 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.js +9 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.js +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.js +46 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.js +92 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.js +82 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.d.ts +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.js +80 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.d.ts +16 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.d.ts +2 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.js +0 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.js +9 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.d.ts +12 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.js +10 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.d.ts +6 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.js +7 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/package.json +133 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/package-lock.json +1179 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/package.json +14 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.js +29 -0
- package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.properties.test.js +16 -0
- package/skills/property-based-testing/fixtures/no_property_fixture.py +10 -0
- package/skills/property-based-testing/fixtures/roundtrip_fixture.py +16 -0
- package/skills/property-based-testing/references/languages/javascript.md +54 -0
- package/skills/property-based-testing/scripts/detect_and_dispatch.py +80 -0
- package/skills/property-based-testing/scripts/hypothesis_scaffold.py +276 -0
- package/skills/proxy-resilience/SKILL.md +84 -0
- package/skills/quality-gate-pipeline/SKILL.md +184 -0
- package/skills/quality-targets-converge/SKILL.md +254 -0
- package/skills/repo-review/SKILL.md +159 -0
- package/skills/report-pdf/SKILL.md +66 -0
- package/skills/review/SKILL.md +47 -0
- package/skills/review-agent/SKILL.md +152 -0
- package/skills/review-summary/SKILL.md +73 -0
- package/skills/run-report/SKILL.md +70 -0
- package/skills/semantic-duplication-scan/SKILL.md +337 -0
- package/skills/semantic-scan/SKILL.md +53 -0
- package/skills/semgrep-analyze/SKILL.md +139 -0
- package/skills/setup/SKILL.md +1122 -0
- package/skills/ship/SKILL.md +240 -0
- package/skills/source-verification/SKILL.md +210 -0
- package/skills/source-verification/scripts/claim_extractor.py +155 -0
- package/skills/specs/.size-baseline.json +4 -0
- package/skills/specs/SKILL.md +243 -0
- package/skills/specs/references/completeness-checklist.md +83 -0
- package/skills/specs/references/extraction.md +58 -0
- package/skills/specs/references/glossary.md +59 -0
- package/skills/specs/references/persistence.md +115 -0
- package/skills/specs/references/predictability-check.md +77 -0
- package/skills/static-analysis-integration/SKILL.md +235 -0
- package/skills/static-analysis-integration/adapters/_envelope.py +26 -0
- package/skills/static-analysis-integration/adapters/jscpd-adapter.py +66 -0
- package/skills/static-analysis-integration/adapters/lizard-adapter.py +81 -0
- package/skills/static-analysis-integration/adapters/mypy-adapter.py +50 -0
- package/skills/static-analysis-integration/adapters/mypy-src-layout.py +93 -0
- package/skills/static-analysis-integration/adapters/security-review-adapter.py +212 -0
- package/skills/static-analysis-integration/maintenance.md +23 -0
- package/skills/static-analysis-integration/references/language-setup.md +228 -0
- package/skills/static-analysis-integration/references/sarif-parser.md +124 -0
- package/skills/static-analysis-integration/references/security-review-adapter.md +118 -0
- package/skills/static-analysis-integration/references/tool-configs.md +617 -0
- package/skills/static-analysis-integration/rulesets/pmd-quickstart.xml +24 -0
- package/skills/stryker-xunit-v2-shim/SKILL.md +274 -0
- package/skills/stryker-xunit-v2-shim/references/shim-howto.md +256 -0
- package/skills/stryker-xunit-v2-shim/scripts/generate_shim.py +143 -0
- package/skills/systematic-debugging/SKILL.md +130 -0
- package/skills/telemetry/SKILL.md +75 -0
- package/skills/test-audit-disable/SKILL.md +129 -0
- package/skills/test-design/SKILL.md +177 -0
- package/skills/test-design/scripts/__pycache__/internal_double_detector.cpython-314.pyc +0 -0
- package/skills/test-design/scripts/internal_double_detector.py +631 -0
- package/skills/test-design-advisor/SKILL.md +166 -0
- package/skills/test-driven-development/SKILL.md +169 -0
- package/skills/test-health/SKILL.md +262 -0
- package/skills/test-improve/SKILL.md +239 -0
- package/skills/test-improve/references/phase-0-approach-contract.md +228 -0
- package/skills/test-improve/references/phase-1-analyze.md +131 -0
- package/skills/test-improve/references/phase-2-baseline.md +121 -0
- package/skills/test-improve/references/phase-3-derive-gherkin.md +53 -0
- package/skills/test-improve/references/phase-4-plan-fixes.md +34 -0
- package/skills/test-improve/references/phase-5-improve.md +215 -0
- package/skills/test-improve/references/phase-6-refactor-decision.md +45 -0
- package/skills/test-improve/references/phase-7-refactor.md +44 -0
- package/skills/test-improve/references/phase-8-validate.md +66 -0
- package/skills/test-improve/references/phase-9-close-out-prompt.md +11 -0
- package/skills/test-improve/references/phase-9-report.md +62 -0
- package/skills/test-improve/references/review-loop.md +92 -0
- package/skills/test-improve/templates/executive-summary.md +123 -0
- package/skills/threat-modeling/SKILL.md +108 -0
- package/skills/triage/SKILL.md +211 -0
- package/skills/ubiquitous-language/SKILL.md +192 -0
- package/skills/ubiquitous-language/scripts/collect_domain_signals.py +300 -0
- package/skills/unfreeze/SKILL.md +37 -0
- package/skills/upgrade/SKILL.md +31 -0
- package/skills/upgrade/scripts/check_version_drift.py +113 -0
- package/skills/upgrade/scripts/enable_autoupdate.py +149 -0
- package/skills/version/SKILL.md +25 -0
- package/sync/__pycache__/sync_upstream.cpython-314.pyc +0 -0
- package/sync/sync_upstream.py +293 -0
- package/templates/ACCEPTED-RISKS.md.tmpl +46 -0
- package/templates/agents/agent-template.md +151 -0
- package/templates/agents/angular-testing.md +66 -0
- package/templates/agents/csharp-quality.md +63 -0
- package/templates/agents/esm-enforcer.md +52 -0
- package/templates/agents/front-end-testing.md +65 -0
- package/templates/agents/go-quality.md +65 -0
- package/templates/agents/python-quality.md +62 -0
- package/templates/agents/react-testing.md +61 -0
- package/templates/agents/ts-enforcer.md +60 -0
- package/templates/agents/twelve-factor-audit.md +49 -0
- package/tools/entropy-check.py +250 -0
- package/tools/model-hash-verify.py +213 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validated-outcome weighting for feedback-learning lessons (#866).
|
|
3
|
+
|
|
4
|
+
Reads `metrics/config-changelog.jsonl` (written by `/feedback-learning`) and
|
|
5
|
+
`metrics/session-digest.jsonl` (written by `/session-review`) and, for every
|
|
6
|
+
adopted lesson that carries a structured `evidence` field and whose
|
|
7
|
+
observation window has elapsed, compares the watched metric before vs. after
|
|
8
|
+
adoption and records a verdict:
|
|
9
|
+
|
|
10
|
+
validated watched metric moved in the expected `direction`
|
|
11
|
+
neutral window elapsed, adequate data, no meaningful movement
|
|
12
|
+
harmful watched metric moved against the expected `direction`
|
|
13
|
+
insufficient data fewer than `window_sessions` digest records exist on
|
|
14
|
+
either side of adoption — never reported as `neutral`
|
|
15
|
+
|
|
16
|
+
Lessons whose `evidence` is the literal string `"unmeasurable"`, or that
|
|
17
|
+
predate the `evidence` field entirely (legacy), are counted but never
|
|
18
|
+
assigned a verdict and never proposed for rollback on evidence grounds.
|
|
19
|
+
|
|
20
|
+
This module is a pure library + a thin CLI. `/harness-audit` is report-only
|
|
21
|
+
(it does not modify agents or configuration) — this script mirrors that: it
|
|
22
|
+
can *append* new `type: "validation"` entries to the changelog (append-only,
|
|
23
|
+
mirroring how rollbacks are already logged as new entries), but it never
|
|
24
|
+
rewrites or deletes an existing line, and a `harmful` verdict only ever
|
|
25
|
+
produces a rollback *proposal* for a human to action via `/feedback-learning`
|
|
26
|
+
— never an automatic rollback.
|
|
27
|
+
|
|
28
|
+
Usage:
|
|
29
|
+
lesson_validate.py --changelog metrics/config-changelog.jsonl \
|
|
30
|
+
--digest metrics/session-digest.jsonl \
|
|
31
|
+
[--apply] [-o report.json]
|
|
32
|
+
|
|
33
|
+
--apply append `type: "validation"` entries for every newly-judged
|
|
34
|
+
lesson to the changelog file (still append-only). Without
|
|
35
|
+
--apply, the report is computed but nothing is written.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from __future__ import annotations
|
|
39
|
+
|
|
40
|
+
import argparse
|
|
41
|
+
import json
|
|
42
|
+
import statistics
|
|
43
|
+
import sys
|
|
44
|
+
from datetime import datetime, timezone
|
|
45
|
+
from pathlib import Path
|
|
46
|
+
from typing import Any
|
|
47
|
+
|
|
48
|
+
LESSON_TYPES = {"amend", "learn", "remember"}
|
|
49
|
+
DEFAULT_WINDOW_SESSIONS = 10
|
|
50
|
+
DEFAULT_METRIC = "rework"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# ---------------------------------------------------------------------------
|
|
54
|
+
# I/O helpers
|
|
55
|
+
# ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def read_jsonl(path: Path) -> list[dict[str, Any]]:
|
|
59
|
+
"""Read a JSONL file, skipping blank/malformed lines. Missing file -> []."""
|
|
60
|
+
if not path.exists():
|
|
61
|
+
return []
|
|
62
|
+
records = []
|
|
63
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
64
|
+
line = line.strip()
|
|
65
|
+
if not line:
|
|
66
|
+
continue
|
|
67
|
+
try:
|
|
68
|
+
records.append(json.loads(line))
|
|
69
|
+
except json.JSONDecodeError:
|
|
70
|
+
continue
|
|
71
|
+
return records
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def append_jsonl(path: Path, records: list[dict[str, Any]]) -> None:
|
|
75
|
+
"""Append records to a JSONL file. Never truncates or rewrites — the file
|
|
76
|
+
is opened in append mode only, so every pre-existing byte is preserved."""
|
|
77
|
+
if not records:
|
|
78
|
+
return
|
|
79
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
80
|
+
with path.open("a", encoding="utf-8") as f:
|
|
81
|
+
for record in records:
|
|
82
|
+
f.write(json.dumps(record, sort_keys=True) + "\n")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _parse_ts(ts: str) -> datetime:
|
|
86
|
+
return datetime.fromisoformat(ts.replace("Z", "+00:00"))
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _now_iso() -> str:
|
|
90
|
+
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# ---------------------------------------------------------------------------
|
|
94
|
+
# Evidence field validation (Acceptance Criterion: "declare evidence or opt out")
|
|
95
|
+
# ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def has_valid_evidence(entry: dict[str, Any]) -> bool:
|
|
99
|
+
"""True if a lesson-type entry's `evidence` field is either the literal
|
|
100
|
+
string "unmeasurable" or a structured object with metrics/direction/
|
|
101
|
+
window_sessions. False if absent or malformed."""
|
|
102
|
+
if "evidence" not in entry:
|
|
103
|
+
return False
|
|
104
|
+
evidence = entry["evidence"]
|
|
105
|
+
if evidence == "unmeasurable":
|
|
106
|
+
return True
|
|
107
|
+
if isinstance(evidence, dict):
|
|
108
|
+
return (
|
|
109
|
+
isinstance(evidence.get("metrics"), list)
|
|
110
|
+
and evidence.get("metrics")
|
|
111
|
+
and evidence.get("direction") in ("increase", "decrease")
|
|
112
|
+
and isinstance(evidence.get("window_sessions"), int)
|
|
113
|
+
)
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def default_evidence(metrics: list[str] | None = None) -> dict[str, Any]:
|
|
118
|
+
"""The default structured evidence block when a lesson author names a
|
|
119
|
+
metric but not a window, or names nothing at all (maintainer-resolved
|
|
120
|
+
default: metric=rework, window=10 — see issue #866 Ambiguity Log)."""
|
|
121
|
+
return {
|
|
122
|
+
"metrics": metrics or [DEFAULT_METRIC],
|
|
123
|
+
"direction": "decrease",
|
|
124
|
+
"window_sessions": DEFAULT_WINDOW_SESSIONS,
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
# ---------------------------------------------------------------------------
|
|
129
|
+
# Classification: structured evidence / unmeasurable / legacy
|
|
130
|
+
# ---------------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def classify_changelog_entries(
|
|
134
|
+
entries: list[dict[str, Any]],
|
|
135
|
+
) -> tuple[list[dict], list[dict], list[dict]]:
|
|
136
|
+
"""Split lesson-type changelog entries into (structured, unmeasurable,
|
|
137
|
+
legacy). Only `amend`/`learn`/`remember` entries are lessons; `rollback`
|
|
138
|
+
and `validation` entries are ignored here."""
|
|
139
|
+
structured: list[dict] = []
|
|
140
|
+
unmeasurable: list[dict] = []
|
|
141
|
+
legacy: list[dict] = []
|
|
142
|
+
for entry in entries:
|
|
143
|
+
if entry.get("type") not in LESSON_TYPES:
|
|
144
|
+
continue
|
|
145
|
+
evidence = entry.get("evidence")
|
|
146
|
+
if "evidence" not in entry:
|
|
147
|
+
legacy.append(entry)
|
|
148
|
+
elif evidence == "unmeasurable":
|
|
149
|
+
unmeasurable.append(entry)
|
|
150
|
+
elif isinstance(evidence, dict) and has_valid_evidence(entry):
|
|
151
|
+
structured.append(entry)
|
|
152
|
+
else:
|
|
153
|
+
# Malformed evidence value — treat conservatively as legacy
|
|
154
|
+
# (surfaced, never judged) rather than guessing a verdict.
|
|
155
|
+
legacy.append(entry)
|
|
156
|
+
return structured, unmeasurable, legacy
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
# ---------------------------------------------------------------------------
|
|
160
|
+
# Metric resolution over session-digest.jsonl records
|
|
161
|
+
# ---------------------------------------------------------------------------
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def resolve_metric(record: dict[str, Any], metric_name: str) -> float | None:
|
|
165
|
+
"""Resolve a metric name to a numeric value on a session-digest record.
|
|
166
|
+
Supports the named aggregate aliases plus a dotted-path fallback (e.g.
|
|
167
|
+
"rework.failed_edits")."""
|
|
168
|
+
if metric_name == "rework":
|
|
169
|
+
rework = record.get("rework")
|
|
170
|
+
if not isinstance(rework, dict):
|
|
171
|
+
return None
|
|
172
|
+
values = [v for v in rework.values() if isinstance(v, (int, float))]
|
|
173
|
+
return float(sum(values)) if values else None
|
|
174
|
+
if metric_name == "accuracy":
|
|
175
|
+
accuracy = record.get("accuracy")
|
|
176
|
+
if not isinstance(accuracy, dict):
|
|
177
|
+
return None
|
|
178
|
+
val = accuracy.get("tool_error_rate")
|
|
179
|
+
return float(val) if isinstance(val, (int, float)) else None
|
|
180
|
+
if metric_name == "cost_usd":
|
|
181
|
+
val = record.get("cost_usd")
|
|
182
|
+
return float(val) if isinstance(val, (int, float)) else None
|
|
183
|
+
|
|
184
|
+
node: Any = record
|
|
185
|
+
for part in metric_name.split("."):
|
|
186
|
+
if not isinstance(node, dict) or part not in node:
|
|
187
|
+
return None
|
|
188
|
+
node = node[part]
|
|
189
|
+
return float(node) if isinstance(node, (int, float)) else None
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
# ---------------------------------------------------------------------------
|
|
193
|
+
# Verdict computation
|
|
194
|
+
# ---------------------------------------------------------------------------
|
|
195
|
+
|
|
196
|
+
INSUFFICIENT_DATA = "insufficient data"
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def validate_lesson(
|
|
200
|
+
entry: dict[str, Any], digest_records: list[dict[str, Any]]
|
|
201
|
+
) -> dict[str, Any]:
|
|
202
|
+
"""Compute a verdict for one structured-evidence lesson entry against the
|
|
203
|
+
session-digest stream. Direction-only comparison of window means (v1 —
|
|
204
|
+
no significance testing, per the issue's Ambiguity Log)."""
|
|
205
|
+
evidence = entry["evidence"]
|
|
206
|
+
metric_name = evidence["metrics"][0]
|
|
207
|
+
direction = evidence["direction"]
|
|
208
|
+
window = evidence["window_sessions"]
|
|
209
|
+
adoption_ts = _parse_ts(entry["timestamp"])
|
|
210
|
+
|
|
211
|
+
dated = []
|
|
212
|
+
for record in digest_records:
|
|
213
|
+
ts = record.get("recorded_at")
|
|
214
|
+
if not ts:
|
|
215
|
+
continue
|
|
216
|
+
try:
|
|
217
|
+
dated.append((_parse_ts(ts), record))
|
|
218
|
+
except ValueError:
|
|
219
|
+
continue
|
|
220
|
+
dated.sort(key=lambda pair: pair[0])
|
|
221
|
+
|
|
222
|
+
before = [record for ts, record in dated if ts < adoption_ts]
|
|
223
|
+
after = [record for ts, record in dated if ts >= adoption_ts]
|
|
224
|
+
|
|
225
|
+
# Small-N honesty: fewer records than the declared window on either side
|
|
226
|
+
# is a data condition, never a "neutral" judgment.
|
|
227
|
+
if len(before) < window or len(after) < window:
|
|
228
|
+
return {
|
|
229
|
+
"verdict": INSUFFICIENT_DATA,
|
|
230
|
+
"references_timestamp": entry["timestamp"],
|
|
231
|
+
"metric": metric_name,
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
before_window = before[-window:]
|
|
235
|
+
after_window = after[:window]
|
|
236
|
+
|
|
237
|
+
before_vals = [
|
|
238
|
+
v for v in (resolve_metric(r, metric_name) for r in before_window) if v is not None
|
|
239
|
+
]
|
|
240
|
+
after_vals = [
|
|
241
|
+
v for v in (resolve_metric(r, metric_name) for r in after_window) if v is not None
|
|
242
|
+
]
|
|
243
|
+
|
|
244
|
+
if len(before_vals) < window or len(after_vals) < window:
|
|
245
|
+
return {
|
|
246
|
+
"verdict": INSUFFICIENT_DATA,
|
|
247
|
+
"references_timestamp": entry["timestamp"],
|
|
248
|
+
"metric": metric_name,
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
before_mean = statistics.fmean(before_vals)
|
|
252
|
+
after_mean = statistics.fmean(after_vals)
|
|
253
|
+
|
|
254
|
+
if after_mean == before_mean:
|
|
255
|
+
verdict = "neutral"
|
|
256
|
+
elif direction == "decrease":
|
|
257
|
+
verdict = "validated" if after_mean < before_mean else "harmful"
|
|
258
|
+
else: # direction == "increase"
|
|
259
|
+
verdict = "validated" if after_mean > before_mean else "harmful"
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
"verdict": verdict,
|
|
263
|
+
"references_timestamp": entry["timestamp"],
|
|
264
|
+
"metric": metric_name,
|
|
265
|
+
"direction": direction,
|
|
266
|
+
"before_mean": before_mean,
|
|
267
|
+
"after_mean": after_mean,
|
|
268
|
+
"window_sessions": window,
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def build_validation_entry(
|
|
273
|
+
entry: dict[str, Any], result: dict[str, Any], *, now: str | None = None
|
|
274
|
+
) -> dict[str, Any]:
|
|
275
|
+
"""Build a new `type: "validation"` changelog entry for a verdict. This is
|
|
276
|
+
always a *new* entry — callers must append it, never edit history."""
|
|
277
|
+
return {
|
|
278
|
+
"timestamp": now or _now_iso(),
|
|
279
|
+
"type": "validation",
|
|
280
|
+
"trigger": "system",
|
|
281
|
+
"description": (
|
|
282
|
+
f"Lesson validation for entry {entry['timestamp']}: "
|
|
283
|
+
f"{result['verdict']}"
|
|
284
|
+
),
|
|
285
|
+
"references_timestamp": entry["timestamp"],
|
|
286
|
+
"verdict": result["verdict"],
|
|
287
|
+
"metric": result.get("metric"),
|
|
288
|
+
"before_mean": result.get("before_mean"),
|
|
289
|
+
"after_mean": result.get("after_mean"),
|
|
290
|
+
"approved_by": "system",
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def build_rollback_proposal(entry: dict[str, Any], result: dict[str, Any]) -> dict[str, Any]:
|
|
295
|
+
"""Build a rollback *proposal* for a harmful verdict. Carries everything
|
|
296
|
+
`/feedback-learning`'s existing rollback flow needs, but this is never
|
|
297
|
+
applied automatically — a human must approve it."""
|
|
298
|
+
return {
|
|
299
|
+
"proposal": "rollback",
|
|
300
|
+
"verdict": "harmful",
|
|
301
|
+
"references_timestamp": entry["timestamp"],
|
|
302
|
+
"timestamp": entry.get("timestamp"),
|
|
303
|
+
"file_modified": entry.get("file_modified"),
|
|
304
|
+
"section_modified": entry.get("section_modified"),
|
|
305
|
+
"previous_value": entry.get("previous_value"),
|
|
306
|
+
"requires_human_approval": True,
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
# ---------------------------------------------------------------------------
|
|
311
|
+
# Report assembly
|
|
312
|
+
# ---------------------------------------------------------------------------
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def build_report(
|
|
316
|
+
changelog_entries: list[dict[str, Any]], digest_records: list[dict[str, Any]]
|
|
317
|
+
) -> dict[str, Any]:
|
|
318
|
+
structured, unmeasurable, legacy = classify_changelog_entries(changelog_entries)
|
|
319
|
+
|
|
320
|
+
verdicts = []
|
|
321
|
+
new_validation_entries = []
|
|
322
|
+
rollback_proposals = []
|
|
323
|
+
for entry in structured:
|
|
324
|
+
result = validate_lesson(entry, digest_records)
|
|
325
|
+
verdicts.append({"entry": entry, "result": result})
|
|
326
|
+
new_validation_entries.append(build_validation_entry(entry, result))
|
|
327
|
+
if result["verdict"] == "harmful":
|
|
328
|
+
rollback_proposals.append(build_rollback_proposal(entry, result))
|
|
329
|
+
|
|
330
|
+
return {
|
|
331
|
+
"verdicts": verdicts,
|
|
332
|
+
"new_validation_entries": new_validation_entries,
|
|
333
|
+
"rollback_proposals": rollback_proposals,
|
|
334
|
+
"unmeasurable_count": len(unmeasurable),
|
|
335
|
+
"legacy_count": len(legacy),
|
|
336
|
+
"structured_count": len(structured),
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
# ---------------------------------------------------------------------------
|
|
341
|
+
# CLI
|
|
342
|
+
# ---------------------------------------------------------------------------
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def main(argv: list[str] | None = None) -> int:
|
|
346
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
347
|
+
parser.add_argument("--changelog", required=True, type=Path)
|
|
348
|
+
parser.add_argument("--digest", required=True, type=Path)
|
|
349
|
+
parser.add_argument("--apply", action="store_true", help="Append validation entries")
|
|
350
|
+
parser.add_argument("-o", "--output", type=Path, help="Write JSON report here")
|
|
351
|
+
args = parser.parse_args(argv)
|
|
352
|
+
|
|
353
|
+
changelog_entries = read_jsonl(args.changelog)
|
|
354
|
+
digest_records = read_jsonl(args.digest)
|
|
355
|
+
report = build_report(changelog_entries, digest_records)
|
|
356
|
+
|
|
357
|
+
if args.apply:
|
|
358
|
+
append_jsonl(args.changelog, report["new_validation_entries"])
|
|
359
|
+
|
|
360
|
+
output_json = json.dumps(
|
|
361
|
+
{
|
|
362
|
+
"structured_count": report["structured_count"],
|
|
363
|
+
"unmeasurable_count": report["unmeasurable_count"],
|
|
364
|
+
"legacy_count": report["legacy_count"],
|
|
365
|
+
"verdicts": [
|
|
366
|
+
{
|
|
367
|
+
"references_timestamp": v["result"].get("references_timestamp"),
|
|
368
|
+
"verdict": v["result"]["verdict"],
|
|
369
|
+
"metric": v["result"].get("metric"),
|
|
370
|
+
}
|
|
371
|
+
for v in report["verdicts"]
|
|
372
|
+
],
|
|
373
|
+
"rollback_proposals": report["rollback_proposals"],
|
|
374
|
+
},
|
|
375
|
+
indent=2,
|
|
376
|
+
sort_keys=True,
|
|
377
|
+
)
|
|
378
|
+
if args.output:
|
|
379
|
+
args.output.write_text(output_json + "\n", encoding="utf-8")
|
|
380
|
+
else:
|
|
381
|
+
print(output_json)
|
|
382
|
+
return 0
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
if __name__ == "__main__":
|
|
386
|
+
sys.exit(main())
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Agent-vs-tool redundancy criterion for /harness-audit (#1983 Part 2).
|
|
3
|
+
|
|
4
|
+
The spike behind this issue found a seam: `/harness-audit` measures review
|
|
5
|
+
agents against *usage* data (fix rates, finding rates — Step 4), but has no
|
|
6
|
+
criterion that catches "this lens is redundant with a deterministic tool
|
|
7
|
+
that already covers the same lines." This module is that criterion, made
|
|
8
|
+
computable rather than left as intuition.
|
|
9
|
+
|
|
10
|
+
The criterion, precisely: a lens is a **redundancy candidate** for a round
|
|
11
|
+
when every one of its *applied* findings that round falls within
|
|
12
|
+
`tolerance` lines of a finding the deterministic static-analysis pre-pass
|
|
13
|
+
(`skills/static-analysis-integration/SKILL.md`, including its lizard/jscpd
|
|
14
|
+
adapters — #1974) already reported for the same file, in the same round. A
|
|
15
|
+
round where the lens found *nothing* is not evidence either way (a quiet
|
|
16
|
+
lens might just have had nothing to find) and is excluded from both the
|
|
17
|
+
redundant and non-redundant counts, mirroring `/harness-audit` Step 4's own
|
|
18
|
+
"exclude read-only rows" and "state the sample size" small-N honesty rules.
|
|
19
|
+
|
|
20
|
+
## Data sources — read this before wiring a caller
|
|
21
|
+
|
|
22
|
+
`review-value.jsonl` rows alone CANNOT drive this criterion. Its own schema
|
|
23
|
+
doc is explicit: rows carry "counts and outcomes only, never code or file
|
|
24
|
+
content" (`knowledge/telemetry-schema.md` -> `review-value.jsonl`) — there
|
|
25
|
+
is no `file`/`line` on a row to compare against anything. This criterion
|
|
26
|
+
instead needs, for the SAME round:
|
|
27
|
+
|
|
28
|
+
1. **A lens's applied findings** (`file`, `line` pairs) — from
|
|
29
|
+
`/code-review --json`'s aggregated payload, `agents[].issues[]`
|
|
30
|
+
(`skills/code-review/output-format.md`). Today this is only available
|
|
31
|
+
from a **saved raw artifact** of a `--json` dispatch — e.g. a
|
|
32
|
+
`code-review-benchmark` harness run's `results/raw/*.txt`
|
|
33
|
+
(`evals/code-review-benchmark/README.md`), or a `--json` capture an
|
|
34
|
+
operator saved by hand. It is NOT persisted by any committed metrics
|
|
35
|
+
stream today.
|
|
36
|
+
2. **The deterministic pre-pass envelope for that same round** — the
|
|
37
|
+
unified finding envelope `static-analysis-integration`'s Step 6 returns
|
|
38
|
+
(`findings[]`, each `{file, line, rule_id, metadata: {source}}` —
|
|
39
|
+
`knowledge/security-primitives-contract.md`). Also not persisted; it is
|
|
40
|
+
the return value of the pre-pass step that ran alongside the round in
|
|
41
|
+
question.
|
|
42
|
+
|
|
43
|
+
So this criterion runs against **saved-or-live per-round artifacts**, not a
|
|
44
|
+
`jq` query over a committed JSONL file the way the rest of this skill's
|
|
45
|
+
Step 4 does. Until (if ever) a caller persists both of those per round,
|
|
46
|
+
"run `/harness-audit`'s Step 4c" means: collect a handful of real rounds'
|
|
47
|
+
raw `/code-review --json` output plus their pre-pass envelope (the
|
|
48
|
+
code-review-benchmark harness's `raw/` directory is the most direct source
|
|
49
|
+
today), then feed them to `classify_lens_redundancy()`.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
from __future__ import annotations
|
|
53
|
+
|
|
54
|
+
import argparse
|
|
55
|
+
import json
|
|
56
|
+
import sys
|
|
57
|
+
from pathlib import Path
|
|
58
|
+
from typing import Any
|
|
59
|
+
|
|
60
|
+
DEFAULT_TOLERANCE = 3
|
|
61
|
+
DEFAULT_MIN_ROUNDS = 5
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _finding_is_covered(
|
|
65
|
+
finding: dict[str, Any],
|
|
66
|
+
pretool_findings: list[dict[str, Any]],
|
|
67
|
+
tolerance: int,
|
|
68
|
+
) -> bool:
|
|
69
|
+
"""True when some pre-pass finding names the same file within
|
|
70
|
+
`tolerance` lines of `finding`. A finding with no `file`/`line` can
|
|
71
|
+
never be covered — fail-safe toward "not redundant"."""
|
|
72
|
+
f_file = finding.get("file")
|
|
73
|
+
f_line = finding.get("line")
|
|
74
|
+
if f_file is None or f_line is None:
|
|
75
|
+
return False
|
|
76
|
+
for pt in pretool_findings:
|
|
77
|
+
if pt.get("file") != f_file:
|
|
78
|
+
continue
|
|
79
|
+
pt_line = pt.get("line")
|
|
80
|
+
if pt_line is None:
|
|
81
|
+
continue
|
|
82
|
+
try:
|
|
83
|
+
if abs(int(f_line) - int(pt_line)) <= tolerance:
|
|
84
|
+
return True
|
|
85
|
+
except (TypeError, ValueError):
|
|
86
|
+
continue
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def is_round_redundant(
|
|
91
|
+
applied_findings: list[dict[str, Any]],
|
|
92
|
+
pretool_findings: list[dict[str, Any]],
|
|
93
|
+
tolerance: int = DEFAULT_TOLERANCE,
|
|
94
|
+
) -> bool | None:
|
|
95
|
+
"""One round's subset-redundancy verdict for one lens.
|
|
96
|
+
|
|
97
|
+
Returns `True` when every applied finding is covered by the pre-pass
|
|
98
|
+
envelope (a fully-subsumed round — a candidate data point for
|
|
99
|
+
redundancy), `False` when at least one applied finding is NOT covered
|
|
100
|
+
(the lens found something the tool didn't — direct evidence AGAINST
|
|
101
|
+
redundancy), and `None` when the lens applied no findings this round
|
|
102
|
+
(a no-op round proves nothing about redundancy either way, so it is
|
|
103
|
+
excluded rather than silently counted as "redundant" — the same
|
|
104
|
+
"no-op is not evidence" discipline Step 4's fix-rate exclusions apply).
|
|
105
|
+
"""
|
|
106
|
+
if not applied_findings:
|
|
107
|
+
return None
|
|
108
|
+
return all(
|
|
109
|
+
_finding_is_covered(f, pretool_findings, tolerance) for f in applied_findings
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def classify_lens_redundancy(
|
|
114
|
+
rounds: list[dict[str, Any]],
|
|
115
|
+
tolerance: int = DEFAULT_TOLERANCE,
|
|
116
|
+
min_rounds: int = DEFAULT_MIN_ROUNDS,
|
|
117
|
+
) -> dict[str, Any]:
|
|
118
|
+
"""Aggregate one lens's per-round subset-redundancy verdicts.
|
|
119
|
+
|
|
120
|
+
`rounds`: a list of `{"applied_findings": [...], "pretool_findings":
|
|
121
|
+
[...]}` dicts, one per round this lens ran in, for a single lens.
|
|
122
|
+
|
|
123
|
+
Verdicts:
|
|
124
|
+
- `insufficient-data` — fewer than `min_rounds` rounds where the lens
|
|
125
|
+
found anything at all (the only kind of round this criterion can
|
|
126
|
+
judge). Never a redundancy claim on too little evidence — mirrors
|
|
127
|
+
Step 4's own "N >= 5" drop-candidate floor.
|
|
128
|
+
- `redundant-candidate` — every judged round was fully subsumed by
|
|
129
|
+
the pre-pass tool.
|
|
130
|
+
- `not-redundant` — at least one judged round found something the
|
|
131
|
+
pre-pass tool did not.
|
|
132
|
+
"""
|
|
133
|
+
verdicts = [
|
|
134
|
+
is_round_redundant(r["applied_findings"], r["pretool_findings"], tolerance)
|
|
135
|
+
for r in rounds
|
|
136
|
+
]
|
|
137
|
+
judged = [v for v in verdicts if v is not None]
|
|
138
|
+
no_op_rounds = len(verdicts) - len(judged)
|
|
139
|
+
redundant_rounds = sum(1 for v in judged if v)
|
|
140
|
+
|
|
141
|
+
if len(judged) < min_rounds:
|
|
142
|
+
verdict = "insufficient-data"
|
|
143
|
+
elif redundant_rounds == len(judged):
|
|
144
|
+
verdict = "redundant-candidate"
|
|
145
|
+
else:
|
|
146
|
+
verdict = "not-redundant"
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
"verdict": verdict,
|
|
150
|
+
"rounds_total": len(rounds),
|
|
151
|
+
"rounds_with_findings": len(judged),
|
|
152
|
+
"rounds_no_op": no_op_rounds,
|
|
153
|
+
"rounds_fully_subsumed": redundant_rounds,
|
|
154
|
+
"tolerance": tolerance,
|
|
155
|
+
"min_rounds": min_rounds,
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def main(argv: list[str] | None = None) -> int:
|
|
160
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
161
|
+
parser.add_argument(
|
|
162
|
+
"--rounds",
|
|
163
|
+
required=True,
|
|
164
|
+
help=(
|
|
165
|
+
"Path to a JSON file: a list of {\"applied_findings\": [...], "
|
|
166
|
+
"\"pretool_findings\": [...]} round records for ONE lens."
|
|
167
|
+
),
|
|
168
|
+
)
|
|
169
|
+
parser.add_argument("--tolerance", type=int, default=DEFAULT_TOLERANCE)
|
|
170
|
+
parser.add_argument("--min-rounds", type=int, default=DEFAULT_MIN_ROUNDS)
|
|
171
|
+
args = parser.parse_args(argv)
|
|
172
|
+
|
|
173
|
+
rounds_path = Path(args.rounds)
|
|
174
|
+
try:
|
|
175
|
+
rounds = json.loads(rounds_path.read_text(encoding="utf-8"))
|
|
176
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
177
|
+
print(f"redundancy_criterion: cannot read {rounds_path}: {exc}", file=sys.stderr)
|
|
178
|
+
return 1
|
|
179
|
+
|
|
180
|
+
result = classify_lens_redundancy(
|
|
181
|
+
rounds, tolerance=args.tolerance, min_rounds=args.min_rounds
|
|
182
|
+
)
|
|
183
|
+
print(json.dumps(result, indent=2, sort_keys=True))
|
|
184
|
+
return 0
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
if __name__ == "__main__":
|
|
188
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: headless-run
|
|
3
|
+
description: >-
|
|
4
|
+
Run a dev-team skill or prompt headlessly in an isolated pi subprocess
|
|
5
|
+
(fresh session, JSON result, timeout). Use for scripted one-shot invocations
|
|
6
|
+
and benchmark-harness cases, e.g. running /code-review once per case.
|
|
7
|
+
argument-hint: "<prompt-or-slash-command> [--cwd DIR] [--model MODEL] [--timeout SECS]"
|
|
8
|
+
user-invocable: true
|
|
9
|
+
allowed-tools: Read, Bash
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Headless Run
|
|
13
|
+
|
|
14
|
+
Role: worker. Runs one prompt in a separate, non-interactive pi process and
|
|
15
|
+
returns its JSON result. It does not review, plan or edit by itself.
|
|
16
|
+
|
|
17
|
+
Arguments: `$ARGUMENTS`
|
|
18
|
+
|
|
19
|
+
## Isolation
|
|
20
|
+
|
|
21
|
+
- New process, `--no-session` (nothing is written to the session store and the
|
|
22
|
+
parent's session id is not reused).
|
|
23
|
+
- Non-interactive: `DEV_TEAM_INTERACTIVE` is unset, so every human gate takes
|
|
24
|
+
its documented non-interactive default.
|
|
25
|
+
- Same packages and credentials as the parent (pi's auth store is read from
|
|
26
|
+
`~/.pi/agent`), so the run uses the same providers.
|
|
27
|
+
|
|
28
|
+
## Steps
|
|
29
|
+
|
|
30
|
+
1. Parse `--cwd` (default: current directory), `--model` (default: the
|
|
31
|
+
current `PI_PROVIDER/PI_MODEL`), `--timeout` (default 1800 seconds). The rest
|
|
32
|
+
is the prompt. A leading `/name` is a dev-team command; pass it through
|
|
33
|
+
unchanged, pi expands it in the child.
|
|
34
|
+
2. Run:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
cd "<cwd>" && timeout <secs> env -u DEV_TEAM_INTERACTIVE \
|
|
38
|
+
pi --mode json -p --no-session --model "<model>" "<prompt>" > "$TMPDIR/headless-run-$$.jsonl"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
3. Extract the result: the last `agent_end` event's final assistant text, its
|
|
42
|
+
`stopReason`, and the summed `usage` of all `message_end` assistant events.
|
|
43
|
+
Print one JSON object:
|
|
44
|
+
`{"is_error": <bool>, "result": "<text>", "stop_reason": "...", "usage": {...}, "total_cost_usd": <n>, "log": "<path>"}`.
|
|
45
|
+
Exit status 124 from `timeout` → `is_error: true, "result": "timeout"`.
|