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,121 @@
|
|
|
1
|
+
Capture the objective starting point **before any file under the stack's test
|
|
2
|
+
directory is modified**. Baselines are the ground truth every downstream delta
|
|
3
|
+
compares against; running any test edit before baseline capture invalidates
|
|
4
|
+
the whole run.
|
|
5
|
+
|
|
6
|
+
**Coverage baseline.** Invoke `/coverage-baseline --workflow test-improve`
|
|
7
|
+
against the resolved repo path. `/coverage-baseline` owns its own
|
|
8
|
+
existing-baseline guard and persist step — see `../../coverage-baseline/SKILL.md`'s
|
|
9
|
+
"Existing-baseline guard" and "Persist the baseline" steps for the full
|
|
10
|
+
mechanics. The result lands directly and atomically at
|
|
11
|
+
`.dev-team-reports/test-improve/<slug>/data/baseline-coverage.json`; there is
|
|
12
|
+
no `.claude/memory/` write and no later copy step for this file — that skill
|
|
13
|
+
has no opt-in awareness of its own, and this write is **unconditional**.
|
|
14
|
+
|
|
15
|
+
This is independent of the mutation mode: a coverage baseline is persisted in
|
|
16
|
+
every mode, and the mutation baseline is written **only** in
|
|
17
|
+
`baseline+kill-loop` mode (see below).
|
|
18
|
+
|
|
19
|
+
**Coverage-gap ranking — the targeting input for Phases 1, 4, and 5 (issue
|
|
20
|
+
#1786).** As soon as `baseline-coverage.json` lands, compute the per-module
|
|
21
|
+
uncovered-line breakdown from the same report the baseline was parsed from
|
|
22
|
+
(its `raw_report` field). This runs in **every mutation mode** — it is the
|
|
23
|
+
coverage targeting input, independent of whether mutation work happens at
|
|
24
|
+
all — and it is computed by script, never estimated in prose:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
sh "${CLAUDE_PLUGIN_ROOT}/hooks/py.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/coverage_gap_ranking.py" \
|
|
28
|
+
--report <baseline raw_report> --repo-root <repo-path> \
|
|
29
|
+
--target-line-pct <line target> --target-branch-pct <branch target> \
|
|
30
|
+
--top 0 --json \
|
|
31
|
+
--out .dev-team-reports/test-improve/<slug>/data/coverage-gap-ranking.json
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Always pass `--repo-root <repo-path>`: several coverage writers (istanbul/nyc
|
|
35
|
+
`coverage-final.json` among them) emit **absolute** source paths, and without a
|
|
36
|
+
root to strip they would all bucket together — one module makes the seam
|
|
37
|
+
classification a single global comparison, so the check silently stops
|
|
38
|
+
discriminating. The script derives the shared path prefix itself as a fallback,
|
|
39
|
+
and flags `grouping_degenerate: true` whenever many files still land in one
|
|
40
|
+
bucket; treat that flag as "the ranking could not resolve modules", never as a
|
|
41
|
+
verdict.
|
|
42
|
+
|
|
43
|
+
The script buckets every source file into a package/assembly/module and ranks
|
|
44
|
+
the buckets by **uncovered lines descending**, marking each bucket's `seam`
|
|
45
|
+
as `established` (coverage at or above the seam threshold — a test-only change
|
|
46
|
+
is proven to reach it) or `absent` (near-zero coverage — nothing there is
|
|
47
|
+
proven reachable without a production-code seam). `--out` writes the payload
|
|
48
|
+
atomically (temp-file-then-rename), so `coverage-gap-ranking.json` lands in
|
|
49
|
+
the same git-tracked `data/` sibling as the baselines and is read directly
|
|
50
|
+
from there by Phase 1, Phase 4, and Phase 5.
|
|
51
|
+
|
|
52
|
+
**Mutation survivors are not an input to this ranking, and must not become
|
|
53
|
+
one.** A surviving mutant can only exist on a line a test already executes, so
|
|
54
|
+
a survivor-ordered priority list structurally *excludes* the 0%-covered layers
|
|
55
|
+
that hold most of the missing coverage. That is the failure this ranking
|
|
56
|
+
exists to prevent: a Pass-1 run spent its entire Phase 5 adding mutation-kill
|
|
57
|
+
assertions to layers already at 88-95% line coverage while the layer holding
|
|
58
|
+
~93% of the lines needed to reach the coverage target sat at 0-11% and was
|
|
59
|
+
never targeted.
|
|
60
|
+
|
|
61
|
+
**A deferred Phase-0 conflict check resolves here (issue #1787).** When
|
|
62
|
+
`phase-0.md` recorded `coverage_target_conflict: deferred` (no coverage report
|
|
63
|
+
was discoverable at Phase 0), *this* invocation is that check — now with real
|
|
64
|
+
numbers. A `verdict` of `unreachable_without_seams` (exit 3) surfaces the same
|
|
65
|
+
explicit choice Phase 0 defines, **before Phase 1 runs**, with one letter
|
|
66
|
+
changed: **`[w] waive the target / [s] stop and re-run in refactor-allowed mode
|
|
67
|
+
/ [c] continue as-is`**. Phase-0 answers are **immutable** for the rest of the
|
|
68
|
+
run, so `[s]` here **stops the run** and tells the operator to re-invoke
|
|
69
|
+
`/test-improve <repo-path>` choosing `refactor-allowed` — it must **never
|
|
70
|
+
rewrite `refactor-mode`** in `phase-0.md` mid-run. Record the outcome in
|
|
71
|
+
`phase-2.md`. A **non-interactive** run at this point follows Phase 0's rule
|
|
72
|
+
unchanged: record `coverage_target_conflict: unresolved` in `phase-2.md`, print
|
|
73
|
+
the same three options, and continue to Phase 1 — it never auto-stops and never
|
|
74
|
+
auto-waives, and Phase 8 restates the unresolved conflict.
|
|
75
|
+
|
|
76
|
+
**A missing or unparseable report is not a clean ranking.** **Exit 2** means
|
|
77
|
+
the script found nothing to rank (report absent, unrecognized, or parsed to
|
|
78
|
+
zero coverage records) — never an all-clear. Name the report path it tried and
|
|
79
|
+
resolve it (re-run `/coverage-baseline`, or point `--report` at the artifact
|
|
80
|
+
the coverage tool actually emitted) before Phase 1 runs. **Do not proceed with
|
|
81
|
+
mutation survivors as a stand-in ordering.**
|
|
82
|
+
|
|
83
|
+
**Mutation baseline (`baseline+kill-loop` only).** When `phase-0.md` recorded
|
|
84
|
+
mutation mode **`baseline+kill-loop`**, check for an existing tracked baseline
|
|
85
|
+
before invoking `/mutation-testing --baseline` — this is Phase 2's own
|
|
86
|
+
existing-baseline guard for `baseline-mutation.json`, needed here (unlike the
|
|
87
|
+
coverage case) because `/mutation-testing` owns no persistence of its own: it
|
|
88
|
+
has no `--baseline`-specific write path of its own to guard. This
|
|
89
|
+
existing-baseline guard is this phase's application of the shared
|
|
90
|
+
existing-tracked-artifact re-capture guard — the canonical definition and
|
|
91
|
+
rationale live once in `knowledge/decision-defaults.md`'s "Re-capture: keep
|
|
92
|
+
vs. overwrite an existing tracked artifact" axis; applied here:
|
|
93
|
+
|
|
94
|
+
- **No existing file, or overwrite chosen** — invoke `/mutation-testing --baseline --workflow test-improve` and persist the result (below).
|
|
95
|
+
- **Existing file, interactive session** — prompt keep/overwrite (default keep). An answer that is neither "keep" nor "overwrite" (case-insensitive) re-prompts with the identical choice — never falls back silently to either option, no retry limit, no timeout.
|
|
96
|
+
- **Existing file, non-interactive** (no usable TTY, or `DEV_TEAM_AUTO_APPROVE=1`) — keep the existing baseline automatically; both log the auto-decision and echo it to Phase 2's own progress output, naming the reused baseline's `captured_at` — reporting parity with the coverage-baseline case, not a silent reuse.
|
|
97
|
+
- **Existing file is malformed or corrupt** (fails to parse as JSON — e.g. left over from a prior interrupted write) — treat it as absent, never as a baseline to keep. Emit a warning naming why a fresh capture is happening, then invoke `/mutation-testing --baseline --workflow test-improve`.
|
|
98
|
+
- **On keep** — do not invoke `/mutation-testing --baseline`; reuse the existing file's fields and report its `captured_at` instead of a freshly captured timestamp.
|
|
99
|
+
|
|
100
|
+
Persist a freshly captured result directly and atomically (temp-file-then-rename:
|
|
101
|
+
write to `<path>.tmp` then `mv -f <path>.tmp <path>`) to
|
|
102
|
+
`.dev-team-reports/test-improve/<slug>/data/baseline-mutation.json` — never a
|
|
103
|
+
direct, non-atomic write. The file records the **honest score**: hard kills /
|
|
104
|
+
effective total, with the **timeout count reported separately** (timeouts are
|
|
105
|
+
not counted as kills).
|
|
106
|
+
|
|
107
|
+
**No-baseline modes skip (`off` and `kill-loop`).** When `phase-0.md` recorded
|
|
108
|
+
mutation mode **`off`** or **`kill-loop`**, `/mutation-testing --baseline` is
|
|
109
|
+
**not invoked** and no `baseline-mutation.json` is written — `kill-loop` runs the
|
|
110
|
+
mutant-kill loop in Phase 5 but takes no baseline first. For `off`, the Phase-8
|
|
111
|
+
mutation target is later marked "not enabled", not waived; for `kill-loop`,
|
|
112
|
+
Phase 8 reports the final-survivor count rather than a baseline delta (see
|
|
113
|
+
Phase 8).
|
|
114
|
+
|
|
115
|
+
**Go advisory marker.** When the resolved stack is Go and mutation mode is
|
|
116
|
+
`baseline+kill-loop`, the
|
|
117
|
+
mutation baseline is **advisory only** — go-mutesting is alpha-quality (see the
|
|
118
|
+
Go advisory in Phase 0). `baseline-mutation.json` is written with the
|
|
119
|
+
`advisory-only: true` marker; survivor counts are not a gate.
|
|
120
|
+
|
|
121
|
+
**Ordering invariant.** Baselines land **before any test file is modified** — no file under the stack's test directory may change between Phase 0 and the creation of `baseline-coverage.json` (and `baseline-mutation.json` when applicable). Phase 3, Phase 5, and any subsequent test edits depend on this ordering.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
Gherkin derivation is **conditional on the Phase-0 BDD rubric answer**. It
|
|
2
|
+
runs only when the operator opted in to a binding mode other than `none`.
|
|
3
|
+
|
|
4
|
+
**Binding mode `none` — skipped entirely.** When `phase-0.md` recorded binding
|
|
5
|
+
mode `none`, Phase 3 is **skipped**: `/gherkin-derive` is **not invoked**, no
|
|
6
|
+
`.feature` files are written, no runner is added. **Phase 1 follows Phase 2
|
|
7
|
+
directly** in this case — the executed sequence becomes `0 → 2 → 1 → 4 → 5 →
|
|
8
|
+
6 → 7/8 → 9` (one fewer named phase; the banner's `<position>` counter still
|
|
9
|
+
advances 1-9 monotonically).
|
|
10
|
+
|
|
11
|
+
**Binding mode `xunit-with-annotations` — .feature files without a runner.**
|
|
12
|
+
Invoke `/gherkin-derive --workflow test-improve --mode xunit-with-annotations`.
|
|
13
|
+
The skill merges scenarios into `.feature` files under gherkin-derive's
|
|
14
|
+
resolved destination (recorded in `.claude/memory/test-improve/<slug>/gherkin.md` —
|
|
15
|
+
typically `features/test-improve/`, but dynamically resolved per the repo's
|
|
16
|
+
own BDD convention, not a fixed path — see `/gherkin-derive`'s Step 2)
|
|
17
|
+
— an existing file's prior content (hand-authored, or enriched by
|
|
18
|
+
`/feature-coverage-analyzer`) is preserved; only genuinely new scenarios are
|
|
19
|
+
appended (issue #1420) — and **no runner dependency** is added to the project.
|
|
20
|
+
The corresponding xUnit tests (authored in Phase 5) will carry the scenario
|
|
21
|
+
name plus Given/When/Then leading comments that cite the `.feature` file, but
|
|
22
|
+
they run through the existing xUnit runner.
|
|
23
|
+
|
|
24
|
+
**Binding mode `bdd-runner` — native parser wired.** Invoke
|
|
25
|
+
`/gherkin-derive --workflow test-improve --mode bdd-runner`. The stack profile
|
|
26
|
+
selects the native parser (`cucumber-js` for JS/TS, `SpecFlow` / `Reqnroll` for
|
|
27
|
+
.NET, `cucumber-jvm` for Java, `godog` for Go). `/gherkin-derive`:
|
|
28
|
+
|
|
29
|
+
- adds the parser as a project dependency,
|
|
30
|
+
- generates pending step-definition stubs,
|
|
31
|
+
- merges scenarios into `.feature` files under its resolved destination
|
|
32
|
+
(same dynamic resolution as `xunit-with-annotations` mode, recorded in
|
|
33
|
+
`.claude/memory/test-improve/<slug>/gherkin.md`), preserving any existing
|
|
34
|
+
enrichment the same way that mode does (issue #1420).
|
|
35
|
+
|
|
36
|
+
**Persistence.** Record the surface inventory and (in `bdd-runner` mode) the
|
|
37
|
+
parser wiring to `.claude/memory/test-improve/<slug>/gherkin.md`.
|
|
38
|
+
|
|
39
|
+
**Human gate.** After Phase 3 produces `.feature` files (or parser wiring in
|
|
40
|
+
`bdd-runner` mode), present them to the operator for review — including
|
|
41
|
+
`gherkin_failure_path_gate.py`'s findings (issue #1420) as part of what's
|
|
42
|
+
being approved, the same reviewed-before-proceeding weight the
|
|
43
|
+
characterization-scenario call-out already carries, not an inert report
|
|
44
|
+
line. **Phase 1 does not run** until the operator approves.
|
|
45
|
+
|
|
46
|
+
**In `bdd-runner` mode with pending step definitions**, Phase 3's own
|
|
47
|
+
not-done statement (`../../gherkin-derive/SKILL.md` Step 6) and Phase 5's later
|
|
48
|
+
hard block on this same state (below) describe one fact at two checkpoints,
|
|
49
|
+
not two separate requirements — both name `/build` (Phase 5's own per-Story
|
|
50
|
+
build loop) as the remediation. Because Phase 5 already owns "what happens
|
|
51
|
+
next" for this state, `gherkin-derive`'s own proactive "continue into
|
|
52
|
+
`/build` now?" ask is suppressed here — it fires only for a genuinely
|
|
53
|
+
standalone invocation with no enclosing orchestrator.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Convert Phase 1's ordered improvement plan into actionable work items.
|
|
2
|
+
Delegate the write to
|
|
3
|
+
`/issues-from-assessment --workflow test-improve --refactor-mode <value>`
|
|
4
|
+
(`phase-0.md`'s `no-refactor` or `refactor-allowed`); the skill routes the
|
|
5
|
+
memory + plan paths under `test-improve/` (per Slice 11). Threading
|
|
6
|
+
`--refactor-mode` lets the written plan mark refactor-requiring items
|
|
7
|
+
explicitly: in `no-refactor` mode the Phase-7 `[Refactor-for-testability]`
|
|
8
|
+
work surfaces labeled **out-of-scope / skipped-in-no-refactor**, never as
|
|
9
|
+
actionable Phase-5 Stories.
|
|
10
|
+
|
|
11
|
+
Every finding lands in exactly one of three actionable **gap classes**, plus
|
|
12
|
+
one non-actionable class:
|
|
13
|
+
|
|
14
|
+
- **`NO_REFACTOR`** — fixable by test edits alone. Written as **Phase-5
|
|
15
|
+
Stories** to `.claude/plans/test-improve/` (or the configured parent tracker
|
|
16
|
+
when `--parent` was supplied at Phase 0).
|
|
17
|
+
- **`REFACTOR_REQUIRED`** — needs a production-code seam before a test can reach the behavior. REFACTOR_REQUIRED items are **deferred to Phase 7** and are **not written as Phase-5 Stories**; they surface with rationale for the operator, who decides at Phase 6 whether to enter Phase 7. Under `refactor-mode: no-refactor` they are labeled **out-of-scope (skipped-in-no-refactor)** in the plan — informational context, never an actionable Story this run will execute.
|
|
18
|
+
- **`LOW_VALUE`** — tests that are cheap to have but not worth fixing (e.g. duplicate coverage, trivial getters, dead-code assertions). LOW_VALUE findings are **advisory-only**: enumerated in the report, no PR is opened to delete a test flagged this way.
|
|
19
|
+
- **`NOT_IMPLEMENTED`** (`/test-health`'s gherkin-gap classification only) — the scenario's behavior doesn't exist in production code at all. Not a test-improve target in **any** mode: it is **not** written as a Phase-5 Story and **not** deferred to Phase 7 — Phase 7 accepts seam introductions only, and there is no seam to introduce for behavior that hasn't been written yet. It surfaces only as a feature-gap call-out in the report, same as `LOW_VALUE`'s advisory-only treatment.
|
|
20
|
+
|
|
21
|
+
**Story order follows the coverage-gap ranking (issue #1786).** When a
|
|
22
|
+
coverage percentage is a stated goal, the NO_REFACTOR Story set is written in
|
|
23
|
+
`coverage-gap-ranking.json` **rank order** — highest uncovered-line bucket
|
|
24
|
+
first — so Phase 5 spends its budget on the layer that actually holds the
|
|
25
|
+
missing coverage. Pass that order to `/issues-from-assessment` as the order to
|
|
26
|
+
preserve; it **does not re-derive an order of its own**, and neither a mutation
|
|
27
|
+
survivor count nor a finding's position in `/test-health`'s prose reorders the
|
|
28
|
+
set.
|
|
29
|
+
|
|
30
|
+
**Persistence.** Persist the classified finding set to
|
|
31
|
+
`.claude/memory/test-improve/<slug>/phase-4.md`.
|
|
32
|
+
|
|
33
|
+
**Human gate.** Present the Phase-5 Story set (NO_REFACTOR only) to the
|
|
34
|
+
operator. **Phase 5 does not run** until the operator approves the set.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
Iterate the approved Phase-5 Story set. For **each Story**:
|
|
2
|
+
|
|
3
|
+
**Never dispatch multiple Stories' build loops in parallel against one shared
|
|
4
|
+
working tree (issue #1571).** Each Story's step 1 runs `/build`, which
|
|
5
|
+
`git add`/`git commit`s as it goes — two or more concurrent dispatches
|
|
6
|
+
against the same checkout race on the index and working files, and that race
|
|
7
|
+
is real: it has produced observed data loss (reverted test files, deleted
|
|
8
|
+
`.feature` files) even when the assigned files looked disjoint, because git
|
|
9
|
+
index/commit operations aren't file-scoped the way file edits are. Process
|
|
10
|
+
Stories one at a time in this session, or — if you fan out multiple Stories
|
|
11
|
+
concurrently via the `Agent` tool — dispatch every one of them with
|
|
12
|
+
`isolation: "worktree"` so each gets its own git working tree; disjoint file
|
|
13
|
+
assignment alone is not a substitute for worktree isolation here.
|
|
14
|
+
|
|
15
|
+
1. **Build** — invoke `/build <story-id>`. `/build` inherits the **no-refactor**
|
|
16
|
+
mode from Phase 0: production-code changes are **rejected**. A Story that
|
|
17
|
+
would require a production-code change is surfaced as a REFACTOR_REQUIRED
|
|
18
|
+
deferral candidate and re-classified for Phase 6.
|
|
19
|
+
2. **Apply the Phase-0 binding mode.** If Phase 0 selected
|
|
20
|
+
`xunit-with-annotations`, the resulting test names mirror the source
|
|
21
|
+
scenario name and Given/When/Then lines appear as **leading comments**
|
|
22
|
+
citing the source `.feature` file. In `bdd-runner` mode, the step
|
|
23
|
+
definitions are filled in against the parser wired at Phase 3. In `none`
|
|
24
|
+
mode, the test is authored idiomatically for the stack without
|
|
25
|
+
feature-file citations.
|
|
26
|
+
3. **Coverage delta** — after `/build` closes the Story, invoke
|
|
27
|
+
`/coverage-delta --workflow test-improve --story <id>`. The delta is
|
|
28
|
+
appended to `.dev-team-reports/test-improve/<slug>/data/coverage-history.json`.
|
|
29
|
+
4. **Coverage-delta steering check (issue #1790).** After the delta is
|
|
30
|
+
appended — **every Story, not only at the end of the phase** — run the
|
|
31
|
+
trailing-streak check. Do not eyeball the history:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
sh "${CLAUDE_PLUGIN_ROOT}/hooks/py.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/coverage_delta_steering.py" \
|
|
35
|
+
--history .dev-team-reports/test-improve/<slug>/data/coverage-history.json \
|
|
36
|
+
--json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- **Exit 0** — continue to the mutation-kill step, but read *which* exit-0
|
|
40
|
+
status came back: `ok` means the last Story actually moved line coverage;
|
|
41
|
+
`insufficient_history` means too few Stories have closed (or the latest
|
|
42
|
+
Story's movement could not be measured) to judge a streak;
|
|
43
|
+
`flat_streak_forming` means the latest Story did **not** move coverage but
|
|
44
|
+
the streak is still short of the threshold — echo that one to the operator
|
|
45
|
+
as a watch signal rather than silently treating it as `ok`.
|
|
46
|
+
- **Exit 3** (`flat_streak`) — three or more consecutive Stories (the
|
|
47
|
+
default; `--consecutive` and `--min-line-delta` tune it) moved line
|
|
48
|
+
coverage by less than the minimum expected per-Story delta.
|
|
49
|
+
**Surface it now, mid-phase** — a run once spent its entire Phase-5
|
|
50
|
+
budget on an already-covered layer because this signal was only read at
|
|
51
|
+
the end; **never defer it to the Phase-9 report.** Print the script's
|
|
52
|
+
flat-Story list and running average, name the top `seam: absent` modules
|
|
53
|
+
from `coverage-gap-ranking.json`, and prompt **`[t] re-check Phase-1
|
|
54
|
+
targeting / [c] continue`** (shape `[t/c]` — `t` is unused elsewhere in
|
|
55
|
+
this flow, and `c` keeps the "accept and move on" meaning it already has
|
|
56
|
+
in mutation-kill's `[c/r/w/q]`):
|
|
57
|
+
- **`[t]`** — re-read `coverage-gap-ranking.json` and re-order the
|
|
58
|
+
remaining Story set into its rank order (Phase 4's rule, applied to
|
|
59
|
+
what is left) before the next Story's `/build`. A remaining Story whose
|
|
60
|
+
target module reads `seam: absent` under `refactor-mode: no-refactor` is
|
|
61
|
+
re-classified **REFACTOR_REQUIRED for Phase 6 rather than retried** —
|
|
62
|
+
retrying it under no-refactor is what produced the flat streak.
|
|
63
|
+
- **`[c]`** — continue, recording `coverage_flat_streak: <n> stories` in
|
|
64
|
+
`.claude/memory/test-improve/<slug>/phase-5.md` so Phase 8 and the
|
|
65
|
+
report read it from a durable record instead of re-deriving it.
|
|
66
|
+
- **Non-interactive runs** record the streak and continue — the same
|
|
67
|
+
**record-and-continue posture, never a silent pass**.
|
|
68
|
+
- **Exit 2** — the history file is missing or unreadable. Resolve it (the
|
|
69
|
+
Story's `/coverage-delta` did not append) rather than treating the
|
|
70
|
+
unknown as `ok`.
|
|
71
|
+
5. **Mutation-kill, once per module batch (`kill-loop` and
|
|
72
|
+
`baseline+kill-loop`; skipped when `off`).** The `mutation-kill` agent is
|
|
73
|
+
opus-tier at `effort: high`, and every dispatch re-pays its fixed priming
|
|
74
|
+
plus the mutation tool's build/instrumentation warm-up. Phase 4 writes the
|
|
75
|
+
Story set in `coverage-gap-ranking.json` rank order (#1786), so Stories
|
|
76
|
+
targeting the same module are **adjacent** — dispatching per Story paid
|
|
77
|
+
that fixed cost again for a scope that was warm one Story ago (#1963).
|
|
78
|
+
|
|
79
|
+
**Group contiguous Stories by target module, then dispatch per batch.**
|
|
80
|
+
Take the grouping from the ranking's own `modules` buckets — the artifact
|
|
81
|
+
Phase 2 already computed — never by re-deriving a module map here. A batch
|
|
82
|
+
is a maximal run of consecutive Stories in the approved order whose target
|
|
83
|
+
files fall in one bucket; a module with a single Story is a batch of one,
|
|
84
|
+
which behaves **exactly** as the per-Story dispatch did.
|
|
85
|
+
|
|
86
|
+
Steps 1-4 above still run **per Story**, unchanged — the build, the binding
|
|
87
|
+
mode, the coverage delta, and the steering check are per-Story signals and
|
|
88
|
+
batching them would blunt exactly the mid-phase steering #1790 added. Only
|
|
89
|
+
this step batches.
|
|
90
|
+
|
|
91
|
+
After the batch's **last** Story closes, invoke the **`mutation-kill`
|
|
92
|
+
agent** once with `--file <every story file in the batch> --max-rounds 3
|
|
93
|
+
--target-honest-score <the Phase-0 mutation target>`.
|
|
94
|
+
Residual survivors trigger the **`[c]ontinue / [r]etry / [w]aive /
|
|
95
|
+
[q]uit`** prompt — the shape is `[c/r/w/q]` — applied to the batch.
|
|
96
|
+
`[c]` accepts the residual and moves on; `[r]` re-runs one more
|
|
97
|
+
mutation-kill round; `[w]` waives the residual to `waivers.json`; `[q]`
|
|
98
|
+
quits Phase 5.
|
|
99
|
+
|
|
100
|
+
**Pass the Phase-0 mutation target (#2030).** Phase 8
|
|
101
|
+
(`/quality-targets-converge`) gates on that number; without
|
|
102
|
+
`--target-honest-score` the loop runs toward survivor exhaustion instead
|
|
103
|
+
and buys full-price rounds whose work cannot change the gate's verdict.
|
|
104
|
+
Threading it is risk-neutral by construction — the honest score stays the
|
|
105
|
+
only gate, Phase 8 still measures it independently against
|
|
106
|
+
`baseline-mutation.json`, and stopping *at* the threshold cannot turn a
|
|
107
|
+
pass into a fail. Omit the flag when Phase 0 recorded no mutation target;
|
|
108
|
+
the loop then behaves exactly as it did before #2030.
|
|
109
|
+
|
|
110
|
+
**A `YIELD FLOOR` line is an operator decision, not a convergence stop.**
|
|
111
|
+
When the run is invoked with `--min-kills-per-round` and a round kills
|
|
112
|
+
fewer survivors than the floor while the file is *still below target*,
|
|
113
|
+
`mutation-kill` stops that file and logs a line prefixed
|
|
114
|
+
`YIELD FLOOR —`. That is **not** a terminal stop: route it to the same
|
|
115
|
+
`[c/r/w/q]` prompt above, carrying the line's kill count and floor into
|
|
116
|
+
the prompt so the operator can price one more round. Treating it as
|
|
117
|
+
convergence would stop a below-target file on the loop's own initiative,
|
|
118
|
+
which is precisely what #2030 declined to do.
|
|
119
|
+
|
|
120
|
+
**The gate is unchanged in coverage, only in timing.** Every Story's files
|
|
121
|
+
are still mutation-processed before Phase 5 can close, at the same rounds
|
|
122
|
+
cap, behind the same prompt: **Phase 5 may not be reported closed with an
|
|
123
|
+
unprocessed batch**, exactly as it could not close with an unprocessed
|
|
124
|
+
Story. What moves is *when within the phase* a weak assertion surfaces —
|
|
125
|
+
at the batch boundary rather than immediately — which is bounded by batch
|
|
126
|
+
size and by the fact that `mutation-kill` only ever *adds* tests, so a
|
|
127
|
+
later Story in a batch cannot be invalidated by an earlier one's residual.
|
|
128
|
+
|
|
129
|
+
**Name the batches when the phase starts**, so the operator sees the
|
|
130
|
+
grouping rather than inferring it from dispatch counts: print one line per
|
|
131
|
+
batch — `Mutation-kill batch <n>: module <module>, Stories <ids>.`
|
|
132
|
+
|
|
133
|
+
**Mutation-yield steering check at the batch boundary (issue #2033).**
|
|
134
|
+
After each batch's `mutation-kill` dispatch returns, append one record to
|
|
135
|
+
`.dev-team-reports/test-improve/<slug>/data/mutation-history.json` — the
|
|
136
|
+
git-tracked `data/` sibling of `coverage-history.json`, written atomically
|
|
137
|
+
the way the baselines are — carrying `batch`, `module`, `captured_at`,
|
|
138
|
+
`starting_survivors`, `ending_survivors`, `honest_score_before`,
|
|
139
|
+
`honest_score_after`, and `rounds_spent`. Then run the trailing-streak
|
|
140
|
+
check. Do not eyeball the history:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
sh "${CLAUDE_PLUGIN_ROOT}/hooks/py.sh" "${CLAUDE_PLUGIN_ROOT}/scripts/mutation_yield_steering.py" \
|
|
144
|
+
--history .dev-team-reports/test-improve/<slug>/data/mutation-history.json \
|
|
145
|
+
--json
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
This is the #1790 mechanism ported to the more expensive lane, and it
|
|
149
|
+
shares that script's status vocabulary and exit-code contract exactly, so
|
|
150
|
+
read the exit codes the same way:
|
|
151
|
+
|
|
152
|
+
- **Exit 0** — continue to the next batch, but read *which* exit-0 status
|
|
153
|
+
came back: `ok` means the last batch actually killed survivors;
|
|
154
|
+
`insufficient_history` means too few batches have closed (or the latest
|
|
155
|
+
batch's yield could not be measured) to judge a streak;
|
|
156
|
+
`flat_streak_forming` means the latest batch did **not** clear the
|
|
157
|
+
minimum but the streak is still short of the threshold — echo that one
|
|
158
|
+
to the operator as a watch signal rather than silently treating it as
|
|
159
|
+
`ok`.
|
|
160
|
+
- **Exit 2** — the history is missing, unreadable, or corrupt. **Never
|
|
161
|
+
read this as `ok`** — it is the same trap #1790 calls out. Fix the
|
|
162
|
+
history before continuing.
|
|
163
|
+
- **Exit 3** (`flat_streak`) — two or more consecutive batches (the
|
|
164
|
+
default; `--consecutive` and `--min-kills` tune it) killed fewer than
|
|
165
|
+
the minimum net survivors. **Surface it now, at the batch boundary** —
|
|
166
|
+
per-Story would be meaningless because `mutation-kill` runs per batch.
|
|
167
|
+
Print the script's flat-batch list and running average, then prompt
|
|
168
|
+
**`[t] re-check Phase-1 targeting / [c] continue`** — the same `[t/c]`
|
|
169
|
+
shape the coverage check uses:
|
|
170
|
+
- **`[t]`** — re-read `coverage-gap-ranking.json` and re-order the
|
|
171
|
+
remaining batches into its rank order before the next dispatch.
|
|
172
|
+
- **`[c]`** — continue, recording
|
|
173
|
+
`mutation_flat_streak: <n> batches` in the phase's progress file so
|
|
174
|
+
the Phase-9 report carries the accepted signal rather than losing it.
|
|
175
|
+
6. **Go mutation-kill is advisory.** On Go stacks, `mutation-kill` logs
|
|
176
|
+
survivors but makes **no commit** — the operator is instructed to apply
|
|
177
|
+
changes manually. Advisory-only handling matches the Phase-0 Go advisory,
|
|
178
|
+
and applies per batch exactly as it applied per Story.
|
|
179
|
+
|
|
180
|
+
#### Pending-stub gate (`bdd-runner` mode only, issue #1391)
|
|
181
|
+
|
|
182
|
+
After **all Phase-5 Stories have closed**, and only when Phase 0 selected
|
|
183
|
+
`bdd-runner` binding mode, run the completion gate before Phase 5 may be
|
|
184
|
+
reported closed — a hard gate, not prose:
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/gherkin_stub_gate.py" --dir <step-definitions-dir>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
(`<step-definitions-dir>` is wherever test-improve's own Phase 3 —
|
|
191
|
+
`/gherkin-derive`'s Step 4 (stub generation) / Step 5 (output paths) — wrote
|
|
192
|
+
step-definition files, recorded in `.claude/memory/test-improve/<slug>/gherkin.md`.)
|
|
193
|
+
|
|
194
|
+
- **Exit 0 (no pending stubs)** — Phase 5 proceeds to the end-of-phase review
|
|
195
|
+
loop below.
|
|
196
|
+
- **Non-zero (pending stubs remain)** — Phase 5 is **not done**. Surface the
|
|
197
|
+
gate's listed `file:line` pending step definitions to the operator; do not
|
|
198
|
+
report the phase closed. Route each remaining stub back into the per-Story
|
|
199
|
+
build loop (step 2 above — fill in the step definition against the parser
|
|
200
|
+
wired at Phase 3) rather than silently leaving it pending.
|
|
201
|
+
- Skip entirely when binding mode is `none` or `xunit-with-annotations` (no
|
|
202
|
+
step definitions exist to gate on).
|
|
203
|
+
|
|
204
|
+
#### End-of-phase review loop
|
|
205
|
+
|
|
206
|
+
After **all Phase-5 Stories have closed**, run the review loop over the
|
|
207
|
+
Phase-5 diff, writing evidence to
|
|
208
|
+
`.claude/memory/test-improve/<slug>/phase-5-review.json`:
|
|
209
|
+
|
|
210
|
+
<!-- include: references/review-loop.md -->
|
|
211
|
+
See `review-loop.md` for the single-panel dispatch, the test-lens
|
|
212
|
+
guarantee, the narrowed fix-confirmation, the escalation cap, and the
|
|
213
|
+
fixed evidence-schema fields.
|
|
214
|
+
|
|
215
|
+
**`/handoff` suggestion** (context-heavy review). Once the loop above closes, print: `Phase 5 complete. Consider running /handoff to compress context before continuing. To resume: /test-improve <repo-path> --from-phase 6 (or --from-phase with no number to auto-detect the resume point)`
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
With Phase 5 closed, present the **REFACTOR_REQUIRED** list deferred at
|
|
2
|
+
Phase 4. Each item is shown with three columns:
|
|
3
|
+
|
|
4
|
+
- **seam-needed** — the production-code seam the test would need (e.g.
|
|
5
|
+
interface extraction, dependency injection, virtual method).
|
|
6
|
+
- **behavior-gained** — the untested behavior a Phase-7 refactor would
|
|
7
|
+
unlock coverage for.
|
|
8
|
+
- **estimated-risk** — a qualitative risk marker (low / medium / high) for
|
|
9
|
+
the specific refactor.
|
|
10
|
+
|
|
11
|
+
**Phase 6 branches on the Phase-0 `refactor-mode`.** Read `refactor-mode`
|
|
12
|
+
from `.claude/memory/test-improve/<slug>/phase-0.md` **before** rendering any prompt.
|
|
13
|
+
Entering Phase 7 *is* refactoring, so the choice made at Phase 0 governs
|
|
14
|
+
whether Phase 6 is a branch point at all.
|
|
15
|
+
|
|
16
|
+
**`refactor-mode: no-refactor` (the default) — informational, not a branch
|
|
17
|
+
point.** The operator declined refactoring at Phase 0, so the **`[y] enter
|
|
18
|
+
Phase 7` option does not exist** in this mode. Present the REFACTOR_REQUIRED
|
|
19
|
+
list as *"the following require refactoring and are out of scope in
|
|
20
|
+
no-refactor mode"* — the seam-needed / behavior-gained / estimated-risk
|
|
21
|
+
columns still render, so the operator sees the coverage and behavior left on
|
|
22
|
+
the table. Then **auto-backlog** every item to
|
|
23
|
+
`.dev-team-reports/test-improve/<slug>/refactor-backlog.md` (or update the parent
|
|
24
|
+
tracker when `--parent` was passed) and **continue to Phase 8** with the
|
|
25
|
+
current Phase-5 test suite as the target. The prompt collapses to a single
|
|
26
|
+
**acknowledge/continue** step (equivalent to today's `[b]`); when no operator
|
|
27
|
+
is attached, run it **non-interactively** — no keystroke is required and none
|
|
28
|
+
enters Phase 7. The sanctioned way to actually perform these refactors is the
|
|
29
|
+
Phase-8 coverage-below-90% re-run prompt, which offers a fresh
|
|
30
|
+
`refactor-allowed` invocation the operator explicitly opts into.
|
|
31
|
+
|
|
32
|
+
**`refactor-mode: refactor-allowed` — full decision prompt.** Prompt the
|
|
33
|
+
operator with **`[y] enter Phase 7 / [b] backlog and skip to Phase 8 /
|
|
34
|
+
[q] quit`** (shape `[y/b/q]`). The letter `y` was chosen deliberately
|
|
35
|
+
over `r` — `[r]` is already claimed by mutation-kill's `[c/r/w/q]` (retry) and
|
|
36
|
+
the review-loop's `[r/w/q]` (revise); a third `[r]` at the
|
|
37
|
+
highest-consequence prompt would confuse operators.
|
|
38
|
+
|
|
39
|
+
- **`[y]`** — advances to **Phase 7** (refactor-for-testability).
|
|
40
|
+
- **`[b]`** — writes the REFACTOR_REQUIRED items to
|
|
41
|
+
`.dev-team-reports/test-improve/<slug>/refactor-backlog.md` (or updates the parent
|
|
42
|
+
tracker when `--parent` was passed); **skips Phase 7** and runs **Phase 8**
|
|
43
|
+
directly with the current Phase-5 test suite as the target.
|
|
44
|
+
- **`[q]`** — **quits** before Phase 8. No further phase runs; the final
|
|
45
|
+
report reflects Phase-5 state only.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Phase 7 runs **only when the operator picked `[y]` at Phase 6**. If Phase 6
|
|
2
|
+
returned `[b]` (backlog) or `[q]` (quit), Phase 7 is **skipped**.
|
|
3
|
+
|
|
4
|
+
**Hard mode gate — Phase 7 refuses to run under `no-refactor`.** Before any
|
|
5
|
+
Phase-7 work begins, `/test-improve` re-reads `refactor-mode` from
|
|
6
|
+
`.claude/memory/test-improve/<slug>/phase-0.md`. When it records
|
|
7
|
+
`refactor-mode: no-refactor`, Phase 7 **refuses to run** and is skipped —
|
|
8
|
+
**even if `[y]` is somehow reached**. Phase 6 offers no `[y]` in this mode,
|
|
9
|
+
so this gate is a defense-in-depth backstop: Phase 7 executes production-code
|
|
10
|
+
refactors the `no-refactor` operator declined at Phase 0, and the mode — not
|
|
11
|
+
the keystroke — is the final authority. Only `refactor-mode: refactor-allowed`
|
|
12
|
+
permits Phase 7 to execute.
|
|
13
|
+
|
|
14
|
+
**Seam-only production code changes.** `/build` in Phase 7 accepts **seam
|
|
15
|
+
introductions only** — interface extractions, dependency injection points,
|
|
16
|
+
virtual method promotions, factory wrapping. Any change beyond a seam is
|
|
17
|
+
rejected. Behavior modifications, refactors that alter semantics, and
|
|
18
|
+
opportunistic clean-ups are all out of scope.
|
|
19
|
+
|
|
20
|
+
**Existing tests are immutable.** Phase 7 **may not modify or remove existing tests** — `/build` rejects deletions and edits to any file under the stack's test directory that existed before Phase 7 started. The pre-Phase-7 suite must stay green throughout; a red pre-Phase-7 test halts the phase.
|
|
21
|
+
|
|
22
|
+
**Phase-5 precondition-check.** Each Phase-7 Story is paired with the
|
|
23
|
+
corresponding Phase-5 baseline Story that could not close under no-refactor.
|
|
24
|
+
Before `/build` runs a Phase-7 Story, `/test-improve` **verifies the paired
|
|
25
|
+
Phase-5 Story is closed and green**. A missing or failing Phase-5 baseline
|
|
26
|
+
halts that Story until the operator resolves it.
|
|
27
|
+
|
|
28
|
+
**Phase 5's parallel-dispatch warning (issue #1571) applies equally here** —
|
|
29
|
+
Phase 7 runs the same per-Story `/build` loop against the same shared
|
|
30
|
+
working tree, so **never dispatch multiple Phase-7 Stories' build loops
|
|
31
|
+
concurrently without `isolation: "worktree"` on every dispatch**; see
|
|
32
|
+
`phase-5-improve.md` for why the race is unsafe.
|
|
33
|
+
|
|
34
|
+
**End-of-phase review loop.** After all Phase-7 Stories close, run the
|
|
35
|
+
**same review loop as Phase 5**, writing evidence to
|
|
36
|
+
`.claude/memory/test-improve/<slug>/phase-7-review.json` using the same
|
|
37
|
+
fixed schema:
|
|
38
|
+
|
|
39
|
+
<!-- include: references/review-loop.md -->
|
|
40
|
+
See `review-loop.md` for the single-panel dispatch, the test-lens
|
|
41
|
+
guarantee, the narrowed fix-confirmation, the escalation cap, and the
|
|
42
|
+
fixed evidence-schema fields.
|
|
43
|
+
|
|
44
|
+
**`/handoff` suggestion** (same rationale as Phase 5). Once the loop above closes, print: `Phase 7 complete. Consider running /handoff to compress context before continuing. To resume: /test-improve <repo-path> --from-phase 8 (or --from-phase with no number to auto-detect the resume point)`
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Verify the improved suite meets the Phase-0 quality targets. Delegate to
|
|
2
|
+
`/quality-targets-converge --workflow test-improve --refactor-mode <value>`
|
|
3
|
+
(`phase-0.md`'s `no-refactor` or `refactor-allowed`) — the skill routes
|
|
4
|
+
memory and plan paths under `test-improve/` (per Slice 11), and threading
|
|
5
|
+
the flag keeps the operator's no-refactor choice enforced past Phase 6 via
|
|
6
|
+
its own dispatch-table gating.
|
|
7
|
+
|
|
8
|
+
**Mutation target per mode.** The mutation target reads differently for each
|
|
9
|
+
Phase-0 mutation mode:
|
|
10
|
+
|
|
11
|
+
- **`off` — skipped (not waived).** The mutation target is **skipped** and marked
|
|
12
|
+
"not enabled for this run" — it is **not waived**. Skipping and waiving are
|
|
13
|
+
distinct outcomes: a waiver signals a target failed and the operator accepted
|
|
14
|
+
the gap; a skip signals the target was never in scope for this run.
|
|
15
|
+
- **`kill-loop` — final-survivor-only.** No Phase-2 baseline was taken, so there is
|
|
16
|
+
no before/after delta; the target reports the **final surviving-mutant count**
|
|
17
|
+
from the Phase-5 kill loop.
|
|
18
|
+
- **`baseline+kill-loop` — baseline-delta.** The target reports the
|
|
19
|
+
**baseline-to-achieved mutation delta** against `baseline-mutation.json`.
|
|
20
|
+
|
|
21
|
+
**Go mutation advisory.** When the resolved stack is Go and mutation is not `off`,
|
|
22
|
+
the mutation target is **advisory-only** (survivor count is not a gate). The
|
|
23
|
+
target reads with the "advisory only — go-mutesting is alpha" footnote and
|
|
24
|
+
the run may pass regardless of mutation numbers.
|
|
25
|
+
|
|
26
|
+
**Branch-scoped mutation validation (issue #1208).** `/quality-targets-converge`
|
|
27
|
+
scopes its Phase-8 mutation measurement to the **branch-vs-base cumulative
|
|
28
|
+
changed set** — the production source exercised by the tests this branch
|
|
29
|
+
changed across all its sessions — never the whole repo. It still reports a
|
|
30
|
+
whole-repo score by splicing the freshly-measured changed files over the
|
|
31
|
+
**persisted** Phase-2 baseline (`baseline-mutation.json`), and reports any
|
|
32
|
+
module it could not measure (OOM/timeout) as **held at baseline** rather than
|
|
33
|
+
omitting it. No extra flag is threaded through the delegation above — the
|
|
34
|
+
worker resolves the branch base itself using the same idiom as `/build`'s
|
|
35
|
+
Farley-Score step. The whole-repo splice relies on the
|
|
36
|
+
`.dev-team-reports/test-improve/<slug>/data/baseline-mutation.json` that
|
|
37
|
+
Phase 2 persisted directly and unconditionally (see
|
|
38
|
+
`phase-2-baseline.md`) — always
|
|
39
|
+
available for this same run; there is no separate copy to fall back on or
|
|
40
|
+
diverge from.
|
|
41
|
+
|
|
42
|
+
**Coverage < 90% in no-refactor mode.** When Phase 8 closes with coverage
|
|
43
|
+
below 90% and Phase 0 recorded `refactor-mode: no-refactor`,
|
|
44
|
+
`/test-improve` surfaces a **re-run prompt** shaped **`[y/n]`**: *"Coverage is
|
|
45
|
+
below 90% in no-refactor mode. Re-run in refactor-allowed mode to close the
|
|
46
|
+
gap? `[y/n]`"*. The prompt names the **backlogged REFACTOR_REQUIRED items**
|
|
47
|
+
that would close the gap (drawn from `.dev-team-reports/test-improve/<slug>/refactor-backlog.md`
|
|
48
|
+
when `[b]` was picked at Phase 6, or from the Phase-4 deferred list when
|
|
49
|
+
Phase 6 was not reached). Whenever shown, `phase-8.md` records `coverage_reprompt_fired: true` plus the answer — the durable source Phase 9's close-out prompt reads to avoid re-asking (see `phase-9-close-out-prompt.md`).
|
|
50
|
+
|
|
51
|
+
**Evidence.** Persist target outcomes to
|
|
52
|
+
`.claude/memory/test-improve/<slug>/phase-8.md`.
|
|
53
|
+
|
|
54
|
+
**Test-count-by-type recount.** Alongside the target-outcome persistence
|
|
55
|
+
above, perform the **identical** classification pass Phase 1's
|
|
56
|
+
"Test-count-by-type snapshot" defined — same six-type criteria, same
|
|
57
|
+
tie-break rule, same repo-path scope Phase 1 used (not a re-scoped or
|
|
58
|
+
differently-scoped recount) — and persist
|
|
59
|
+
`.dev-team-reports/test-improve/<slug>/data/test-counts-after.json` — written
|
|
60
|
+
directly to the same git-tracked `data/` sibling as `test-counts-before.json`
|
|
61
|
+
(same no-other-consumer rationale) — in the identical shape as
|
|
62
|
+
`test-counts-before.json` (same six keys, same order, zero-count keys
|
|
63
|
+
present). See Phase 1's own instruction for the full classification
|
|
64
|
+
mechanism; this pass does not restate it.
|
|
65
|
+
|
|
66
|
+
**`/handoff` suggestion** (context-heavy re-measurement). Once the recount above is persisted, print: `Phase 8 complete. Consider running /handoff to compress context before continuing. To resume: /test-improve <repo-path> --from-phase 9 (or --from-phase with no number to auto-detect the resume point)`
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
**No prompt** when: `.dev-team-reports/test-improve/<slug>/refactor-backlog.md` does not exist (no `REFACTOR_REQUIRED` items were ever backlogged), the file exists but has zero entries (treated the same as absent), `phase-8.md` records `coverage_reprompt_fired: true` (Phase 8's own coverage-driven `[y/n]` already fired this run — no repeating the same question twice), or `phase-0.md` recorded `refactor-mode: refactor-allowed` (a Phase-6 `[b]` backlog entry under `refactor-allowed` mode is the operator's deliberate deferral, not a no-refactor constraint to lift — re-asking "re-run with refactor-allowed mode now?" would be nonsensical when that's the mode already in use).
|
|
2
|
+
|
|
3
|
+
**Otherwise** (backlog file has ≥1 entry, Phase 8 never fired its prompt,
|
|
4
|
+
and `phase-0.md` recorded `refactor-mode: no-refactor`), prompt **`[y/n]`**
|
|
5
|
+
— distinct from Phase 8's coverage-driven, mid-run prompt, this one is
|
|
6
|
+
backlog-driven and fires at close-out: *"N REFACTOR_REQUIRED items remain
|
|
7
|
+
backlogged. Re-run with refactor-allowed mode now? `[y/n]`"* (N = entry
|
|
8
|
+
count). `[n]` leaves the backlog as-is. `[y]` — Phase-0 answers are
|
|
9
|
+
immutable per-run, so tell the operator to re-run `/test-improve
|
|
10
|
+
<repo-path>` fresh, choosing `refactor-allowed`; this is a new invocation,
|
|
11
|
+
not `--from-phase`.
|