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,149 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Select which /setup Step 6 mutation-tooling sections to run (#1152).
|
|
3
|
+
|
|
4
|
+
`/setup` Step 6 installs per-language mutation tooling (Stryker for JS/TS,
|
|
5
|
+
pitest for Java/Kotlin, Stryker.NET for C#/.NET). Which sections run must be
|
|
6
|
+
strictly relative to the repo's detected stack — a JS-only or Python-only
|
|
7
|
+
repo must never probe for `dotnet`, `mvn`, or `node` outside its own stack.
|
|
8
|
+
|
|
9
|
+
This helper makes that decision deterministically instead of leaving it to
|
|
10
|
+
prose the agent can skip. It reads `.claude/project-stack.json`'s `stacks`
|
|
11
|
+
array once and maps stack tokens to sections:
|
|
12
|
+
|
|
13
|
+
typescript / node -> js (Stryker)
|
|
14
|
+
java / kotlin -> java (pitest)
|
|
15
|
+
csharp / dotnet -> csharp (Stryker.NET)
|
|
16
|
+
python -> python (mutmut)
|
|
17
|
+
|
|
18
|
+
Output is a single JSON object on stdout:
|
|
19
|
+
|
|
20
|
+
{
|
|
21
|
+
"sections": ["js"], # sections to run, in canonical order
|
|
22
|
+
"stacks": ["typescript"], # the stacks array that was read
|
|
23
|
+
"ambiguous": false, # true ONLY when the stack signal is empty/missing
|
|
24
|
+
"note": null # one-line note when a stack matched no section
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
Three distinct outcomes:
|
|
28
|
+
|
|
29
|
+
- Definite stack that maps to sections -> run ONLY those sections
|
|
30
|
+
(`ambiguous` false, `note` null).
|
|
31
|
+
- Definite stack that maps to NO section (e.g. Ruby, Elixir — no mutation
|
|
32
|
+
tool wired in for that stack) -> `sections` empty, `ambiguous` false,
|
|
33
|
+
`note` set to `no mutation tooling for detected stack (<stacks>)`. Install
|
|
34
|
+
nothing; probe nothing.
|
|
35
|
+
- Empty / missing / stacks-less signal -> `ambiguous` true. This is the ONLY
|
|
36
|
+
outcome that authorizes the interactive "which languages?" fallback.
|
|
37
|
+
|
|
38
|
+
Usage:
|
|
39
|
+
mutation_stack_sections.py [PROJECT_DIR]
|
|
40
|
+
mutation_stack_sections.py --stacks typescript,node # for testing
|
|
41
|
+
|
|
42
|
+
PROJECT_DIR defaults to the current directory; the stack file is read from
|
|
43
|
+
`<PROJECT_DIR>/.claude/project-stack.json`.
|
|
44
|
+
|
|
45
|
+
Stdlib-only. See docs/python-hook-contract.md.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
from __future__ import annotations
|
|
49
|
+
|
|
50
|
+
import argparse
|
|
51
|
+
import json
|
|
52
|
+
import sys
|
|
53
|
+
from pathlib import Path
|
|
54
|
+
|
|
55
|
+
# Canonical section order — polyglot repos run matching sections in this order.
|
|
56
|
+
SECTION_ORDER = ["js", "java", "csharp", "python"]
|
|
57
|
+
|
|
58
|
+
# Stack token (lowercased) -> section key.
|
|
59
|
+
STACK_TO_SECTION: dict[str, str] = {
|
|
60
|
+
"typescript": "js",
|
|
61
|
+
"node": "js",
|
|
62
|
+
"javascript": "js",
|
|
63
|
+
"java": "java",
|
|
64
|
+
"kotlin": "java",
|
|
65
|
+
"csharp": "csharp",
|
|
66
|
+
"dotnet": "csharp",
|
|
67
|
+
"python": "python",
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def select_sections(stacks: list[str] | None) -> dict[str, object]:
|
|
72
|
+
"""Map a `stacks` array to the sections /setup Step 6 should run.
|
|
73
|
+
|
|
74
|
+
Returns a dict with `sections`, `stacks`, `ambiguous`, and `note`.
|
|
75
|
+
|
|
76
|
+
`stacks` None or empty -> ambiguous (the interactive fallback is allowed).
|
|
77
|
+
A non-empty `stacks` that maps to no section is NOT ambiguous — it is a
|
|
78
|
+
definite "no mutation tooling for this stack" outcome.
|
|
79
|
+
"""
|
|
80
|
+
normalized = [str(s).strip().lower() for s in (stacks or []) if str(s).strip()]
|
|
81
|
+
|
|
82
|
+
if not normalized:
|
|
83
|
+
return {
|
|
84
|
+
"sections": [],
|
|
85
|
+
"stacks": normalized,
|
|
86
|
+
"ambiguous": True,
|
|
87
|
+
"note": None,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
matched = {STACK_TO_SECTION[s] for s in normalized if s in STACK_TO_SECTION}
|
|
91
|
+
sections = [s for s in SECTION_ORDER if s in matched]
|
|
92
|
+
|
|
93
|
+
note = None
|
|
94
|
+
if not sections:
|
|
95
|
+
note = f"no mutation tooling for detected stack ({', '.join(normalized)})"
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
"sections": sections,
|
|
99
|
+
"stacks": normalized,
|
|
100
|
+
"ambiguous": False,
|
|
101
|
+
"note": note,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def read_stacks(project_dir: Path) -> list[str] | None:
|
|
106
|
+
"""Return the `stacks` array from `<project_dir>/.claude/project-stack.json`.
|
|
107
|
+
|
|
108
|
+
Returns None when the file is missing, unreadable, not valid JSON, or has
|
|
109
|
+
no `stacks` key — all of which collapse to the ambiguous outcome.
|
|
110
|
+
"""
|
|
111
|
+
stack_file = project_dir / ".claude" / "project-stack.json"
|
|
112
|
+
try:
|
|
113
|
+
data = json.loads(stack_file.read_text(encoding="utf-8"))
|
|
114
|
+
except (FileNotFoundError, OSError, ValueError):
|
|
115
|
+
return None
|
|
116
|
+
if not isinstance(data, dict):
|
|
117
|
+
return None
|
|
118
|
+
stacks = data.get("stacks")
|
|
119
|
+
if not isinstance(stacks, list):
|
|
120
|
+
return None
|
|
121
|
+
return stacks
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def main(argv: list[str]) -> int:
|
|
125
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
126
|
+
parser.add_argument(
|
|
127
|
+
"project_dir",
|
|
128
|
+
nargs="?",
|
|
129
|
+
default=".",
|
|
130
|
+
help="Project directory (default: current directory).",
|
|
131
|
+
)
|
|
132
|
+
parser.add_argument(
|
|
133
|
+
"--stacks",
|
|
134
|
+
default=None,
|
|
135
|
+
help="Comma-separated stacks to use directly, bypassing the file (testing).",
|
|
136
|
+
)
|
|
137
|
+
args = parser.parse_args(argv[1:])
|
|
138
|
+
|
|
139
|
+
if args.stacks is not None:
|
|
140
|
+
stacks: list[str] | None = [s for s in args.stacks.split(",") if s.strip()]
|
|
141
|
+
else:
|
|
142
|
+
stacks = read_stacks(Path(args.project_dir))
|
|
143
|
+
|
|
144
|
+
print(json.dumps(select_sections(stacks)))
|
|
145
|
+
return 0
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
if __name__ == "__main__":
|
|
149
|
+
raise SystemExit(main(sys.argv))
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""mutation_yield_steering.py — turn per-batch mutation yield into a live
|
|
3
|
+
Phase-5 steering signal (issue #2033).
|
|
4
|
+
|
|
5
|
+
Why this exists. Phase 5 has a mid-phase steering check for coverage (#1790,
|
|
6
|
+
``coverage_delta_steering.py``) and none for mutation. `mutation-kill` is
|
|
7
|
+
dispatched once per module batch (#1963) with ``--max-rounds 3``, and a batch
|
|
8
|
+
that yields near-zero net kills does not inform the next batch — the lane runs
|
|
9
|
+
to the end of the Story set regardless of what the earlier batches showed.
|
|
10
|
+
That is exactly the failure #1790 was written to stop, in the more expensive of
|
|
11
|
+
the two lanes: `mutation-kill` is 34.4% of thread messages in the 11-25 Aug
|
|
12
|
+
2026 corpus against 5.1% for every review lens combined.
|
|
13
|
+
|
|
14
|
+
This is a **port of #1790's mechanism, not a new one**. It shares that
|
|
15
|
+
script's status vocabulary and exit-code contract deliberately, so an operator
|
|
16
|
+
reading one already knows how to read the other, and so `/test-improve` can
|
|
17
|
+
branch on both identically.
|
|
18
|
+
|
|
19
|
+
The unit is the **batch**, not the Story. `mutation-kill` now runs per batch,
|
|
20
|
+
so a per-Story mutation check would have no observation to make on most
|
|
21
|
+
Stories — the signal only exists at a batch boundary.
|
|
22
|
+
|
|
23
|
+
Yield, per batch, is ``starting_survivors - ending_survivors``: the net
|
|
24
|
+
survivors killed. A **negative** yield counts as flat — a batch that ended
|
|
25
|
+
with more survivors than it started is certainly not progress. A batch whose
|
|
26
|
+
yield cannot be measured (either count missing or non-numeric) has yield
|
|
27
|
+
``None`` and **breaks** the streak rather than extending it: absence of
|
|
28
|
+
measurement is not evidence of flatness.
|
|
29
|
+
|
|
30
|
+
Honest score before/after is reported alongside but does **not** drive the
|
|
31
|
+
verdict. Score movement depends on the size of the file's mutant set, so a
|
|
32
|
+
batch over a large module can kill real survivors while barely moving the
|
|
33
|
+
percentage; keying the gate on it would make the check silently
|
|
34
|
+
module-size-dependent. This mirrors #1790's reason for not keying on branch
|
|
35
|
+
coverage.
|
|
36
|
+
|
|
37
|
+
Statuses (and exit codes):
|
|
38
|
+
|
|
39
|
+
- ``flat_streak`` (3) — ``--consecutive`` or more trailing batches each yielded
|
|
40
|
+
fewer than ``--min-kills``. The caller prompts; this script does not decide
|
|
41
|
+
policy.
|
|
42
|
+
- ``flat_streak_forming`` (0) — the trailing batch yielded less than the
|
|
43
|
+
minimum but the streak is still shorter than ``--consecutive``. A distinct
|
|
44
|
+
status rather than ``ok``, because "not yet a streak" is not "mutation-kill
|
|
45
|
+
is producing kills".
|
|
46
|
+
- ``insufficient_history`` (0) — fewer measurable batches than
|
|
47
|
+
``--consecutive``, or a trailing batch whose yield could not be measured at
|
|
48
|
+
all, so no streak verdict is possible yet.
|
|
49
|
+
- ``ok`` (0) — the trailing batch yielded at least the minimum.
|
|
50
|
+
- exit ``2`` — the history file is missing, unreadable, not JSON, not a JSON
|
|
51
|
+
array, or carries a non-record element; also an out-of-range
|
|
52
|
+
``--consecutive``/``--min-kills``. **Never** reported as an all-clear — the
|
|
53
|
+
same trap #1790 calls out.
|
|
54
|
+
|
|
55
|
+
Stdlib-only (ADR 0014/0015), Python 3.10+ floor (ADR 0031).
|
|
56
|
+
|
|
57
|
+
Usage:
|
|
58
|
+
python3 mutation_yield_steering.py \\
|
|
59
|
+
--history .dev-team-reports/test-improve/<slug>/data/mutation-history.json
|
|
60
|
+
python3 mutation_yield_steering.py --history <path> \\
|
|
61
|
+
--min-kills 1 --consecutive 2 --json
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
from __future__ import annotations
|
|
65
|
+
|
|
66
|
+
import argparse
|
|
67
|
+
import json
|
|
68
|
+
import sys
|
|
69
|
+
from pathlib import Path
|
|
70
|
+
|
|
71
|
+
DEFAULT_MIN_KILLS = 1
|
|
72
|
+
DEFAULT_CONSECUTIVE = 2
|
|
73
|
+
|
|
74
|
+
STATUS_FLAT = "flat_streak"
|
|
75
|
+
STATUS_FORMING = "flat_streak_forming"
|
|
76
|
+
STATUS_OK = "ok"
|
|
77
|
+
STATUS_INSUFFICIENT = "insufficient_history"
|
|
78
|
+
|
|
79
|
+
# Score movements are rounded only to kill binary-float artifacts
|
|
80
|
+
# (72.4 - 72.0 = 0.40000000000000568). Yield itself is an integer count and is
|
|
81
|
+
# never rounded. Score never decides the verdict — see the module docstring.
|
|
82
|
+
_SCORE_PRECISION = 10
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class HistoryError(ValueError):
|
|
86
|
+
"""The mutation history could not be read or is not a record array."""
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def load_history(path: Path) -> list[dict]:
|
|
90
|
+
"""Read ``mutation-history.json``, raising HistoryError on anything that is
|
|
91
|
+
not a readable JSON array of batch-record objects."""
|
|
92
|
+
if not path.is_file():
|
|
93
|
+
raise HistoryError(f"mutation history not found: {path}")
|
|
94
|
+
try:
|
|
95
|
+
payload = json.loads(path.read_text(encoding="utf-8"))
|
|
96
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
97
|
+
raise HistoryError(f"{path}: unreadable mutation history ({exc})") from exc
|
|
98
|
+
if not isinstance(payload, list):
|
|
99
|
+
raise HistoryError(
|
|
100
|
+
f"{path}: mutation history must be a JSON array of batch records, "
|
|
101
|
+
f"got {type(payload).__name__}"
|
|
102
|
+
)
|
|
103
|
+
# A non-dict element means the file is corrupt or half-rewritten. Dropping
|
|
104
|
+
# it silently would leave a corrupt history indistinguishable from a phase
|
|
105
|
+
# that simply hasn't closed enough batches yet — a clean verdict from
|
|
106
|
+
# unusable evidence, which is the one thing this gate must never produce.
|
|
107
|
+
for index, entry in enumerate(payload):
|
|
108
|
+
if not isinstance(entry, dict):
|
|
109
|
+
raise HistoryError(
|
|
110
|
+
f"{path}: mutation history entry at index {index} is a "
|
|
111
|
+
f"{type(entry).__name__}, not a batch record"
|
|
112
|
+
)
|
|
113
|
+
return list(payload)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def batch_records(history: list[dict]) -> list[dict]:
|
|
117
|
+
"""Keep only batch-attributed records — the per-batch Phase-5 dispatches.
|
|
118
|
+
|
|
119
|
+
A record with no ``batch`` is not a batch boundary (e.g. a whole-suite
|
|
120
|
+
Phase-8 measurement written into the same stream) and must not enter the
|
|
121
|
+
streak. Mirrors #1790's ``story_snapshots``.
|
|
122
|
+
"""
|
|
123
|
+
return [entry for entry in history if entry.get("batch")]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _as_number(value: object) -> float | None:
|
|
127
|
+
if isinstance(value, bool):
|
|
128
|
+
return None
|
|
129
|
+
if not isinstance(value, (int, float)):
|
|
130
|
+
return None
|
|
131
|
+
return float(value)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _yield_of(record: dict) -> int | None:
|
|
135
|
+
"""Net survivors killed by this batch, or ``None`` when unmeasurable."""
|
|
136
|
+
start = _as_number(record.get("starting_survivors"))
|
|
137
|
+
end = _as_number(record.get("ending_survivors"))
|
|
138
|
+
if start is None or end is None:
|
|
139
|
+
return None
|
|
140
|
+
return int(start - end)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _score_movement(record: dict) -> float | None:
|
|
144
|
+
before = _as_number(record.get("honest_score_before"))
|
|
145
|
+
after = _as_number(record.get("honest_score_after"))
|
|
146
|
+
if before is None or after is None:
|
|
147
|
+
return None
|
|
148
|
+
return round(after - before, _SCORE_PRECISION)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _batch_rows(records: list[dict]) -> list[dict]:
|
|
152
|
+
return [
|
|
153
|
+
{
|
|
154
|
+
"batch": record.get("batch"),
|
|
155
|
+
"module": record.get("module"),
|
|
156
|
+
"captured_at": record.get("captured_at"),
|
|
157
|
+
"starting_survivors": record.get("starting_survivors"),
|
|
158
|
+
"ending_survivors": record.get("ending_survivors"),
|
|
159
|
+
"rounds_spent": record.get("rounds_spent"),
|
|
160
|
+
"kills": _yield_of(record),
|
|
161
|
+
"score_movement": _score_movement(record),
|
|
162
|
+
}
|
|
163
|
+
for record in records
|
|
164
|
+
]
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _trailing_flat_streak(rows: list[dict], min_kills: int) -> list[dict]:
|
|
168
|
+
"""The trailing run of batches whose measured yield is below the minimum.
|
|
169
|
+
|
|
170
|
+
Stops at the first batch that yielded enough OR whose yield is
|
|
171
|
+
unmeasurable — an unmeasured batch breaks the streak rather than
|
|
172
|
+
extending it.
|
|
173
|
+
"""
|
|
174
|
+
streak: list[dict] = []
|
|
175
|
+
for row in reversed(rows):
|
|
176
|
+
kills = row["kills"]
|
|
177
|
+
if kills is None or kills >= min_kills:
|
|
178
|
+
break
|
|
179
|
+
streak.append(row)
|
|
180
|
+
streak.reverse()
|
|
181
|
+
return streak
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def evaluate(
|
|
185
|
+
records: list[dict],
|
|
186
|
+
min_kills: int = DEFAULT_MIN_KILLS,
|
|
187
|
+
consecutive: int = DEFAULT_CONSECUTIVE,
|
|
188
|
+
) -> dict:
|
|
189
|
+
"""Evaluate batch-attributed ``records`` for a flat mutation-yield streak."""
|
|
190
|
+
rows = _batch_rows(records)
|
|
191
|
+
measured = [r for r in rows if r["kills"] is not None]
|
|
192
|
+
streak = _trailing_flat_streak(rows, min_kills)
|
|
193
|
+
|
|
194
|
+
if len(streak) >= consecutive:
|
|
195
|
+
status = STATUS_FLAT
|
|
196
|
+
message = (
|
|
197
|
+
f"{len(streak)} consecutive batches killed fewer than {min_kills} "
|
|
198
|
+
"survivor(s) ("
|
|
199
|
+
+ ", ".join(f"{r['batch']}: {r['kills']:+}" for r in streak)
|
|
200
|
+
+ "). Re-read coverage-gap-ranking.json and re-order the remaining "
|
|
201
|
+
"batches before spending another mutation-kill dispatch — further "
|
|
202
|
+
"rounds on this module are not converting into kills."
|
|
203
|
+
)
|
|
204
|
+
elif len(measured) < consecutive:
|
|
205
|
+
status = STATUS_INSUFFICIENT
|
|
206
|
+
message = (
|
|
207
|
+
f"{len(measured)} batch yield(s) measured; {consecutive} are needed "
|
|
208
|
+
"before a flat-yield streak can be judged."
|
|
209
|
+
)
|
|
210
|
+
elif rows[-1]["kills"] is None:
|
|
211
|
+
# The trailing batch carries no usable survivor counts, so its yield
|
|
212
|
+
# could not be measured. Neither `ok` nor `flat_streak` is honest here.
|
|
213
|
+
status = STATUS_INSUFFICIENT
|
|
214
|
+
message = (
|
|
215
|
+
f"The latest batch ({rows[-1]['batch']}) could not be measured — "
|
|
216
|
+
"its record carries no comparable survivor counts, so no yield "
|
|
217
|
+
"verdict is possible for it."
|
|
218
|
+
)
|
|
219
|
+
elif streak:
|
|
220
|
+
# Below the streak threshold but still not killing: reporting this as
|
|
221
|
+
# `ok` would claim "mutation-kill is producing kills" about a batch
|
|
222
|
+
# that killed less than the minimum — the false all-clear this gate
|
|
223
|
+
# exists to prevent. Exit code stays 0; only the wording and status
|
|
224
|
+
# carry the warning.
|
|
225
|
+
status = STATUS_FORMING
|
|
226
|
+
message = (
|
|
227
|
+
f"The latest {len(streak)} batch/batches killed fewer than "
|
|
228
|
+
f"{min_kills} survivor(s) ({len(streak)} of {consecutive} needed "
|
|
229
|
+
"for a flat-yield streak). Watch the next batch's yield before "
|
|
230
|
+
"spending more of the phase on this module."
|
|
231
|
+
)
|
|
232
|
+
else:
|
|
233
|
+
status = STATUS_OK
|
|
234
|
+
message = (
|
|
235
|
+
f"Latest batch killed {rows[-1]['kills']} survivor(s) — "
|
|
236
|
+
"mutation-kill is converting rounds into kills."
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
average = (
|
|
240
|
+
round(sum(r["kills"] for r in measured) / len(measured), 2) if measured else None
|
|
241
|
+
)
|
|
242
|
+
return {
|
|
243
|
+
"status": status,
|
|
244
|
+
"batches_evaluated": len(rows),
|
|
245
|
+
"batches_measured": len(measured),
|
|
246
|
+
"min_kills": min_kills,
|
|
247
|
+
"consecutive_threshold": consecutive,
|
|
248
|
+
"streak": len(streak),
|
|
249
|
+
"flat_batches": streak,
|
|
250
|
+
"running_average_kills": average,
|
|
251
|
+
"batches": rows,
|
|
252
|
+
"message": message,
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def render_text(result: dict) -> str:
|
|
257
|
+
lines = [
|
|
258
|
+
f"Mutation-yield steering: {result['status']}",
|
|
259
|
+
result["message"],
|
|
260
|
+
"",
|
|
261
|
+
(
|
|
262
|
+
f"{'batch':<24} {'start':>6} {'end':>6} {'kills':>6} "
|
|
263
|
+
f"{'rounds':>6} {'Δ score':>8}"
|
|
264
|
+
),
|
|
265
|
+
]
|
|
266
|
+
for row in result["batches"]:
|
|
267
|
+
kills = row["kills"]
|
|
268
|
+
move = row["score_movement"]
|
|
269
|
+
lines.append(
|
|
270
|
+
f"{row['batch']!s:<24} "
|
|
271
|
+
f"{row['starting_survivors'] if row['starting_survivors'] is not None else '-':>6} "
|
|
272
|
+
f"{row['ending_survivors'] if row['ending_survivors'] is not None else '-':>6} "
|
|
273
|
+
f"{kills if kills is not None else '-':>6} "
|
|
274
|
+
f"{row['rounds_spent'] if row['rounds_spent'] is not None else '-':>6} "
|
|
275
|
+
f"{move if move is not None else '-':>8}"
|
|
276
|
+
)
|
|
277
|
+
lines.append("")
|
|
278
|
+
lines.append(f"running average kills per batch: {result['running_average_kills']}")
|
|
279
|
+
return "\n".join(lines)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def main(argv: list[str] | None = None) -> int:
|
|
283
|
+
parser = argparse.ArgumentParser(
|
|
284
|
+
prog="mutation_yield_steering.py",
|
|
285
|
+
description=(
|
|
286
|
+
"Flag several consecutive mutation-kill batches whose net yield is "
|
|
287
|
+
"near zero, so Phase-1 targeting can be re-checked mid-phase."
|
|
288
|
+
),
|
|
289
|
+
)
|
|
290
|
+
parser.add_argument(
|
|
291
|
+
"--history",
|
|
292
|
+
type=Path,
|
|
293
|
+
required=True,
|
|
294
|
+
help="Path to mutation-history.json.",
|
|
295
|
+
)
|
|
296
|
+
parser.add_argument(
|
|
297
|
+
"--min-kills",
|
|
298
|
+
type=int,
|
|
299
|
+
default=DEFAULT_MIN_KILLS,
|
|
300
|
+
help=(
|
|
301
|
+
"Minimum expected net survivors killed per batch "
|
|
302
|
+
f"(default: {DEFAULT_MIN_KILLS})."
|
|
303
|
+
),
|
|
304
|
+
)
|
|
305
|
+
parser.add_argument(
|
|
306
|
+
"--consecutive",
|
|
307
|
+
type=int,
|
|
308
|
+
default=DEFAULT_CONSECUTIVE,
|
|
309
|
+
help=(
|
|
310
|
+
"How many consecutive below-minimum batches constitute a flat "
|
|
311
|
+
f"streak (default: {DEFAULT_CONSECUTIVE})."
|
|
312
|
+
),
|
|
313
|
+
)
|
|
314
|
+
parser.add_argument("--json", action="store_true", help="machine-readable output")
|
|
315
|
+
args = parser.parse_args(argv)
|
|
316
|
+
|
|
317
|
+
# An out-of-range threshold must fail loudly rather than produce a nonsense
|
|
318
|
+
# verdict: `--consecutive 0` makes `len(streak) >= consecutive` trivially
|
|
319
|
+
# true for any history (including an empty one), and `--min-kills 0` makes
|
|
320
|
+
# every batch — including one that ADDED survivors — count as progress.
|
|
321
|
+
if args.consecutive < 1:
|
|
322
|
+
parser.error("--consecutive must be >= 1")
|
|
323
|
+
if args.min_kills < 1:
|
|
324
|
+
parser.error("--min-kills must be >= 1")
|
|
325
|
+
|
|
326
|
+
try:
|
|
327
|
+
history = load_history(args.history)
|
|
328
|
+
except HistoryError as exc:
|
|
329
|
+
if args.json:
|
|
330
|
+
print(json.dumps({"error": str(exc)}, indent=2))
|
|
331
|
+
else:
|
|
332
|
+
print(f"ERROR: {exc}", file=sys.stderr)
|
|
333
|
+
return 2
|
|
334
|
+
|
|
335
|
+
result = evaluate(
|
|
336
|
+
batch_records(history),
|
|
337
|
+
min_kills=args.min_kills,
|
|
338
|
+
consecutive=args.consecutive,
|
|
339
|
+
)
|
|
340
|
+
print(json.dumps(result, indent=2) if args.json else render_text(result))
|
|
341
|
+
return 3 if result["status"] == STATUS_FLAT else 0
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
if __name__ == "__main__": # pragma: no cover
|
|
345
|
+
sys.exit(main())
|