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,143 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Scaffold a xunit.v2 Stryker shim beside a real xunit.v3 test project.
|
|
3
|
+
|
|
4
|
+
The shim is a second test project that recompiles the SAME test sources under
|
|
5
|
+
xunit.v2 (classic VSTest), which Stryker.NET can observe — xunit.v3 runs on the
|
|
6
|
+
Microsoft Testing Platform and yields a false ~0% mutation score (stryker-net
|
|
7
|
+
issues 3237/3629/3094). This script performs the mechanical part of the howto
|
|
8
|
+
(references/shim-howto.md, step 3 + step 6): it reads the real test .csproj and
|
|
9
|
+
emits the shim .csproj and a stryker-config.json.
|
|
10
|
+
|
|
11
|
+
It deliberately does NOT port v3-only source constructs (step 4) — that needs
|
|
12
|
+
judgment. Run the scope probe first (see SKILL.md) and port anything it flags in
|
|
13
|
+
the REAL test project's sources before building the shim.
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
python3 generate_shim.py <path-to-real-test.csproj> [--mutate-exclude GLOB ...]
|
|
17
|
+
|
|
18
|
+
Writes <real-dir>/../<Name>.Mutation/<Name>.Mutation.csproj and stryker-config.json,
|
|
19
|
+
then prints the next steps. Stdlib only.
|
|
20
|
+
"""
|
|
21
|
+
import argparse
|
|
22
|
+
import json
|
|
23
|
+
import os
|
|
24
|
+
import re
|
|
25
|
+
import sys
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def read(path):
|
|
29
|
+
with open(path, encoding="utf-8", errors="ignore") as fh:
|
|
30
|
+
return fh.read()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def main():
|
|
34
|
+
ap = argparse.ArgumentParser(description="Scaffold a xunit.v2 Stryker shim.")
|
|
35
|
+
ap.add_argument("csproj", help="path to the real xunit.v3 test .csproj")
|
|
36
|
+
ap.add_argument("--mutate-exclude", action="append", default=[],
|
|
37
|
+
help="extra mutate exclude glob (repeatable), e.g. '**/gRPC/**/*.cs'")
|
|
38
|
+
ap.add_argument("--compile-exclude", action="append", default=[],
|
|
39
|
+
help="operator-selected v3-feature test file to drop from the shim's "
|
|
40
|
+
"<Compile> set (repeatable), from the #1160 always-ask gate. Path "
|
|
41
|
+
"relative to the real project, e.g. '..\\Foo.Tests\\ExplicitTests.cs'")
|
|
42
|
+
args = ap.parse_args()
|
|
43
|
+
|
|
44
|
+
real = os.path.abspath(args.csproj)
|
|
45
|
+
if not os.path.isfile(real):
|
|
46
|
+
sys.exit(f"error: no such file: {real}")
|
|
47
|
+
xml = read(real)
|
|
48
|
+
if "xunit.v3" not in xml:
|
|
49
|
+
sys.exit("error: this .csproj does not reference xunit.v3 — a shim is only needed "
|
|
50
|
+
"for xunit.v3 projects. Nothing to do.")
|
|
51
|
+
|
|
52
|
+
real_dir = os.path.dirname(real)
|
|
53
|
+
name = os.path.splitext(os.path.basename(real))[0]
|
|
54
|
+
shim_dir = os.path.join(os.path.dirname(real_dir), name + ".Mutation")
|
|
55
|
+
shim_csproj = os.path.join(shim_dir, name + ".Mutation.csproj")
|
|
56
|
+
|
|
57
|
+
tfm = (re.search(r"<TargetFramework>([^<]+)</TargetFramework>", xml) or [None, "net10.0"])[1]
|
|
58
|
+
ns = (re.search(r"<RootNamespace>([^<]+)</RootNamespace>", xml) or [None, name])[1]
|
|
59
|
+
|
|
60
|
+
pkgs = re.findall(r"<PackageReference\b[^>]*?/>|<PackageReference\b.*?</PackageReference>",
|
|
61
|
+
xml, re.DOTALL)
|
|
62
|
+
# Keep every non-xunit dependency verbatim; the xunit stack + Test.Sdk are replaced below.
|
|
63
|
+
kept = [p for p in pkgs if "xunit" not in p.lower() and "Microsoft.NET.Test.Sdk" not in p]
|
|
64
|
+
projrefs = re.findall(r"<ProjectReference\b[^>]*?/>|<ProjectReference\b.*?</ProjectReference>",
|
|
65
|
+
xml, re.DOTALL)
|
|
66
|
+
if not projrefs:
|
|
67
|
+
print("warning: the real test .csproj has no <ProjectReference> to the product — "
|
|
68
|
+
"add the product reference to the shim manually.", file=sys.stderr)
|
|
69
|
+
|
|
70
|
+
lines = ['<Project Sdk="Microsoft.NET.Sdk">', "",
|
|
71
|
+
f" <!-- xunit.v2 Stryker shim of {name}. Keep out of the .sln and CI test discovery.",
|
|
72
|
+
" Delete once stryker-net fixes MTP mutation observation (issues 3237/3629/3094). -->", "",
|
|
73
|
+
" <PropertyGroup>",
|
|
74
|
+
f" <TargetFramework>{tfm}</TargetFramework>",
|
|
75
|
+
" <IsPackable>false</IsPackable>",
|
|
76
|
+
f" <RootNamespace>{ns}</RootNamespace>",
|
|
77
|
+
f" <AssemblyName>{name}.Mutation</AssemblyName>",
|
|
78
|
+
" <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>",
|
|
79
|
+
" <NoWarn>$(NoWarn);IDE0028;RCS1163;CS8032;NU1701</NoWarn>",
|
|
80
|
+
" <GenerateProgramFile>true</GenerateProgramFile>",
|
|
81
|
+
" </PropertyGroup>", "",
|
|
82
|
+
" <ItemGroup>",
|
|
83
|
+
' <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />',
|
|
84
|
+
' <PackageReference Include="xunit" Version="2.9.2" />',
|
|
85
|
+
' <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">',
|
|
86
|
+
" <PrivateAssets>all</PrivateAssets>",
|
|
87
|
+
" <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>",
|
|
88
|
+
" </PackageReference>"]
|
|
89
|
+
lines += [" " + " ".join(p.split()) for p in kept]
|
|
90
|
+
lines += [" </ItemGroup>", ""]
|
|
91
|
+
if projrefs:
|
|
92
|
+
lines += [" <ItemGroup>"]
|
|
93
|
+
lines += [" " + " ".join(pr.split()) for pr in projrefs]
|
|
94
|
+
lines += [" </ItemGroup>", ""]
|
|
95
|
+
# Always exclude build output; append operator-selected v3-feature files
|
|
96
|
+
# (#1160) so the shim compiles without the constructs that break under v2.
|
|
97
|
+
compile_excludes = [f"..\\{name}\\obj\\**\\*.cs", f"..\\{name}\\bin\\**\\*.cs"]
|
|
98
|
+
compile_excludes += [g.strip() for g in args.compile_exclude if g.strip()]
|
|
99
|
+
exclude_attr = ";".join(compile_excludes)
|
|
100
|
+
lines += [" <ItemGroup>",
|
|
101
|
+
f' <Compile Include="..\\{name}\\**\\*.cs"',
|
|
102
|
+
f' Exclude="{exclude_attr}">',
|
|
103
|
+
" <Link>Linked\\%(RecursiveDir)%(FileName)%(Extension)</Link>",
|
|
104
|
+
" </Compile>",
|
|
105
|
+
" </ItemGroup>", "", "</Project>", ""]
|
|
106
|
+
|
|
107
|
+
os.makedirs(shim_dir, exist_ok=True)
|
|
108
|
+
with open(shim_csproj, "w", encoding="utf-8") as fh:
|
|
109
|
+
fh.write("\n".join(lines))
|
|
110
|
+
|
|
111
|
+
mutate = ["**/*.cs", "!obj/**/*.cs"] + [f"!{g}" for g in args.mutate_exclude]
|
|
112
|
+
# Pin test-projects to the shim and deliberately set NO SolutionPath: with
|
|
113
|
+
# both set, Stryker enumerates the solution and prefers the real xunit.v3
|
|
114
|
+
# project over the shim (the SolutionPath trap, #557/#1156) — so the shim's
|
|
115
|
+
# kills never register. test-projects alone keeps Stryker on the shim.
|
|
116
|
+
config = {"stryker-config": {
|
|
117
|
+
"test-projects": [f"{name}.Mutation.csproj"],
|
|
118
|
+
"mutate": mutate,
|
|
119
|
+
"mutation-level": "Standard",
|
|
120
|
+
"coverage-analysis": "perTest",
|
|
121
|
+
"additional-timeout": 30000,
|
|
122
|
+
"target-framework": tfm,
|
|
123
|
+
"reporters": ["html", "json", "progress"],
|
|
124
|
+
"thresholds": {"high": 80, "low": 60, "break": 0},
|
|
125
|
+
}}
|
|
126
|
+
config_path = os.path.join(shim_dir, "stryker-config.json")
|
|
127
|
+
with open(config_path, "w", encoding="utf-8") as fh:
|
|
128
|
+
json.dump(config, fh, indent=2)
|
|
129
|
+
|
|
130
|
+
rel = os.path.relpath(shim_dir)
|
|
131
|
+
print(f"Wrote {os.path.relpath(shim_csproj)}")
|
|
132
|
+
print(f"Wrote {os.path.relpath(config_path)}")
|
|
133
|
+
print()
|
|
134
|
+
print("Next (see SKILL.md / references/shim-howto.md):")
|
|
135
|
+
print(f' 1. If the product uses InternalsVisibleTo, add [assembly: InternalsVisibleTo("{name}.Mutation")].')
|
|
136
|
+
print(f" 2. Green baseline: dotnet build {rel} -c Release && dotnet test {rel} -c Release --no-build")
|
|
137
|
+
print(f" (expect the SAME test count as {name}, 0 failed)")
|
|
138
|
+
print(f" 3. Kills-register gate: scope mutate to one small covered file, then cd {rel} && dotnet-stryker")
|
|
139
|
+
print(f" 4. Widen mutate, then run the full mutation FROM the shim dir: cd {rel} && dotnet-stryker")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
if __name__ == "__main__":
|
|
143
|
+
main()
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: systematic-debugging
|
|
3
|
+
description: Four-phase debugging protocol (reproduce, investigate, root-cause, fix) that prevents guess-and-fix thrashing. Use this skill whenever a test fails, a bug is reported, an error occurs during implementation, or any unexpected behavior is encountered. Prevents the common LLM failure mode of guessing at fixes without understanding the problem.
|
|
4
|
+
role: worker
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Systematic Debugging
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
When LLMs hit failures, they tend to guess at fixes — changing code, re-running, changing more code. This thrashing wastes context and often makes things worse. This skill enforces a four-phase protocol that requires understanding before action. Systematic debugging resolves issues in 15-30 minutes; guess-and-fix typically takes 2-3 hours with a 40% first-attempt success rate vs 95% systematic.
|
|
13
|
+
|
|
14
|
+
## Iron Law
|
|
15
|
+
|
|
16
|
+
**Find root cause before attempting fixes. Symptom fixes are failure.** No fixes without root cause investigation first.
|
|
17
|
+
|
|
18
|
+
## Constraints
|
|
19
|
+
- Do not change code until you have a root cause hypothesis
|
|
20
|
+
- Do not apply more than one fix at a time
|
|
21
|
+
- Do not skip the reproduction step — a bug you can't reproduce is a bug you can't verify as fixed
|
|
22
|
+
- Do not guess. Investigate.
|
|
23
|
+
- After 3+ failed fix attempts, question the architecture — stop patching
|
|
24
|
+
|
|
25
|
+
## The Four Phases
|
|
26
|
+
|
|
27
|
+
### Phase 1: Reproduce
|
|
28
|
+
**Goal**: See the failure with your own eyes (tool output).
|
|
29
|
+
|
|
30
|
+
1. Run the failing test or trigger the error condition
|
|
31
|
+
2. Read error messages thoroughly — don't skim. Stack traces contain line numbers, file paths, and often the solution.
|
|
32
|
+
3. Identify the minimal reproduction — strip away everything unrelated
|
|
33
|
+
4. Determine if the issue is consistent or intermittent
|
|
34
|
+
5. **Gate**: paste the reproduction output. If you can't reproduce it, gather more data — don't speculate.
|
|
35
|
+
|
|
36
|
+
### Phase 2: Investigate & Pattern Analysis
|
|
37
|
+
**Goal**: Gather facts and find working reference points.
|
|
38
|
+
|
|
39
|
+
**Investigate** (use as many techniques as needed):
|
|
40
|
+
- **Read the error**: Parse the stack trace. What file, line, and function? What's the actual error type?
|
|
41
|
+
- **Trace the data flow**: Follow the input from entry point to failure point. Where does the actual value diverge from the expected value?
|
|
42
|
+
- **Graph-assisted tracing**: prefer CodeGraph/Repowise over hand-walking the codebase to trace the call path from symptom to source — see [`knowledge/codegraph-vs-graphify.md`](../../knowledge/codegraph-vs-graphify.md) for tool selection and the fallback contract.
|
|
43
|
+
- **Check recent changes**: What changed since this last worked? (`git diff`, `git log`)
|
|
44
|
+
- **Add observation points**: Temporary logging or print statements at key points to see actual values
|
|
45
|
+
- **Multi-component systems**: Add diagnostics at each component boundary — log data entering and exiting each layer to find which layer fails
|
|
46
|
+
- **Bisect**: If the failure surface is large, narrow it down by testing midpoints
|
|
47
|
+
|
|
48
|
+
**Pattern Analysis**:
|
|
49
|
+
- **Find working examples**: Locate similar functioning code in the same codebase
|
|
50
|
+
- **Compare against references**: Read reference implementations completely — don't skim
|
|
51
|
+
- **Identify differences**: List every distinction between working and broken code, no matter how minor
|
|
52
|
+
- **Understand dependencies**: What components, settings, and assumptions are required?
|
|
53
|
+
|
|
54
|
+
**Gate**: state what you know and don't know. List the facts, not guesses.
|
|
55
|
+
|
|
56
|
+
### Phase 3: Root Cause Hypothesis
|
|
57
|
+
**Goal**: Identify the single underlying cause using the scientific method.
|
|
58
|
+
|
|
59
|
+
1. Form a single hypothesis: "I think X is the root cause because Y"
|
|
60
|
+
2. Predict what you would see if the hypothesis is correct (a test you haven't run yet)
|
|
61
|
+
3. Run that prediction test — make the smallest possible change, one variable at a time
|
|
62
|
+
4. If the prediction fails, your hypothesis is wrong — return to Phase 2 with new information
|
|
63
|
+
5. Do not compound fixes — test one hypothesis at a time
|
|
64
|
+
6. **Gate**: state the root cause in one sentence. If you can't, you don't have it yet.
|
|
65
|
+
|
|
66
|
+
### Phase 4: Fix
|
|
67
|
+
**Goal**: Make the smallest change that addresses the root cause.
|
|
68
|
+
|
|
69
|
+
**Iron Law of Phase 4: no fix without a failing test that reproduces the defect first.** This is a hard gate, not the advisory test-driven-development skill's opt-in discipline — it applies to every defect fix regardless of the build's cadence.
|
|
70
|
+
|
|
71
|
+
1. Write or modify a test that captures the bug (it should fail now) — do not write fix code before this test exists and fails for the right reason
|
|
72
|
+
2. Apply the fix — one change, targeting the root cause
|
|
73
|
+
3. Run the test — it should pass
|
|
74
|
+
4. Run the full suite — no regressions
|
|
75
|
+
5. **Gate**: paste the test output showing the fix works and nothing else broke
|
|
76
|
+
|
|
77
|
+
**If the fix doesn't work**: Stop and reassess. After fewer than 3 attempts, return to Phase 1. After 3+ failures, question the architecture itself — when each fix reveals new problems elsewhere, the bug is architectural, not local. Discuss fundamentals with the human before attempting more fixes.
|
|
78
|
+
|
|
79
|
+
### After the fix: capture the pattern (Improve)
|
|
80
|
+
|
|
81
|
+
A bug class you had to debug once should be cheaper next time — this is the "improve" step of the ownership loop. When a root cause reflects a recurring pattern (a timezone helper, a boundary off-by-one, a shared-state leak), leave the loop better than you found it: the regression test from Phase 4 pins it, and if the pattern is likely to recur, note it where the next engineer will see it — a comment at the fault site, or a `learn:`/`remember:` via [Feedback & Learning](../feedback-learning/SKILL.md). Skipping this means re-discovering the same bug.
|
|
82
|
+
|
|
83
|
+
## Red Flags Requiring Process Restart
|
|
84
|
+
|
|
85
|
+
Stop immediately and return to Phase 1 if you notice:
|
|
86
|
+
- Planning "quick fix for now, investigate later"
|
|
87
|
+
- Attempting changes without understanding why they'd work
|
|
88
|
+
- Adding multiple modifications simultaneously
|
|
89
|
+
- Skipping testing in favor of "just checking manually"
|
|
90
|
+
- Fixing without investigation
|
|
91
|
+
- Not understanding something but proceeding anyway
|
|
92
|
+
- Adapting patterns differently than reference implementations
|
|
93
|
+
- Proposing solutions before tracing data flow
|
|
94
|
+
- Attempting a fourth or subsequent fix on the same issue
|
|
95
|
+
- Each fix revealing new problems in different locations
|
|
96
|
+
|
|
97
|
+
## Rationalization Prevention
|
|
98
|
+
|
|
99
|
+
| Excuse | Reality |
|
|
100
|
+
|--------|---------|
|
|
101
|
+
| "I think I know what's wrong, let me just try this" | That's guessing. Investigate first — it takes less time than three wrong guesses. |
|
|
102
|
+
| "The fix is obvious from the error message" | Then it'll be fast to verify your hypothesis before coding. Do it. |
|
|
103
|
+
| "I'll just try a few things and see what sticks" | Each attempt burns context and may introduce new bugs. One investigated fix beats five guesses. |
|
|
104
|
+
| "This is probably a race condition / timing issue" | "Probably" isn't a root cause. Add observation points and prove it. |
|
|
105
|
+
| "Let me revert everything and start over" | You'll hit the same bug again. Understand it first, then decide whether to revert. |
|
|
106
|
+
| "It's a simple issue, I don't need the full process" | Root causes exist in simple bugs too. The process handles simple issues quickly — just do it. |
|
|
107
|
+
| "We're under time pressure, just fix it fast" | Systematic debugging actually beats guess-and-check even under time pressure. |
|
|
108
|
+
| "Try fixing first, investigate if it doesn't work" | How you start establishes the pattern. Start correctly. |
|
|
109
|
+
| "Multiple simultaneous fixes save time" | You can't isolate what worked. You'll create new bugs. One fix at a time. |
|
|
110
|
+
| "I can see the problem, the cause is obvious" | Symptoms differ from root causes. What you see is the symptom. Investigate the cause. |
|
|
111
|
+
|
|
112
|
+
## Success Indicators
|
|
113
|
+
|
|
114
|
+
| Phase | You're Doing It Right When... |
|
|
115
|
+
|-------|-------------------------------|
|
|
116
|
+
| Reproduce | You have consistent reproduction with exact error output |
|
|
117
|
+
| Investigate | You can list facts (not guesses) about what's happening and have working reference code |
|
|
118
|
+
| Root Cause | You have a confirmed or revised hypothesis with prediction test results |
|
|
119
|
+
| Fix | Issue is resolved with a passing test and no regressions |
|
|
120
|
+
|
|
121
|
+
## When to Use This Skill
|
|
122
|
+
- A test that was passing now fails
|
|
123
|
+
- An error occurs during implementation
|
|
124
|
+
- Unexpected behavior is observed
|
|
125
|
+
- A bug report comes in
|
|
126
|
+
- A fix you applied didn't work (re-enter at Phase 2)
|
|
127
|
+
- You're under time pressure (especially then)
|
|
128
|
+
|
|
129
|
+
## Output
|
|
130
|
+
Root cause analysis with evidence: reproduction output, investigation findings, root cause statement, fix applied, and verification output showing the fix works without regressions.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: telemetry
|
|
3
|
+
description: >-
|
|
4
|
+
Manage and report the opt-in, privacy-clean usage telemetry beacon. Use when
|
|
5
|
+
the user asks to "enable/disable telemetry", "show telemetry", "usage stats",
|
|
6
|
+
"which commands do I use", or "how often is the commit gate bypassed".
|
|
7
|
+
argument-hint: "[on|off|status|report]"
|
|
8
|
+
user-invocable: true
|
|
9
|
+
allowed-tools: >-
|
|
10
|
+
Bash(python3 *, jq *, cat *, mkdir *, ls *), Read, Write
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Telemetry (#106, #1405)
|
|
14
|
+
|
|
15
|
+
Role: worker. Manages consent for and reports the local, opt-in telemetry
|
|
16
|
+
beacon. The beacon (`hooks/telemetry.py`) records MINIMAL events — a command
|
|
17
|
+
NAME, a skill NAME (including agent-/auto-invoked skills), a gate name +
|
|
18
|
+
outcome, and the plugin version — to `~/.claude/metrics/telemetry.jsonl`. No
|
|
19
|
+
prompts, paths, code, or payloads are ever recorded, and there is **no network
|
|
20
|
+
egress**: everything stays local.
|
|
21
|
+
|
|
22
|
+
Telemetry is **OFF by default**. It activates only when the user-level
|
|
23
|
+
`~/.claude/telemetry.json` contains `{"enabled": true}`. This is a
|
|
24
|
+
config-file-only, home-scoped switch: it is read and written at this one path
|
|
25
|
+
regardless of which project directory the command runs from.
|
|
26
|
+
|
|
27
|
+
## Scope — keep this small (#106)
|
|
28
|
+
|
|
29
|
+
This beacon is intentionally a **cheap, always-on local counter**: which
|
|
30
|
+
commands/skills run, how often the commit gate is bypassed. It is **not** the
|
|
31
|
+
self-improvement loop and must not grow into one. The loop is `/session-review`,
|
|
32
|
+
whose digest already extracts a superset of these signals (token, rework,
|
|
33
|
+
accuracy, utilization) from transcripts and routes suggestions to governed
|
|
34
|
+
machinery. Cross-machine aggregation also belongs to the **session-digest**
|
|
35
|
+
(Delta D / #178), not this beacon. If you find yourself adding analysis or
|
|
36
|
+
network egress here, that work belongs in `/session-review` instead.
|
|
37
|
+
|
|
38
|
+
## Argument: $ARGUMENTS
|
|
39
|
+
|
|
40
|
+
- `status` (default): report whether telemetry is enabled and what's collected.
|
|
41
|
+
- `on`: enable by writing `~/.claude/telemetry.json` with `{"enabled": true}`
|
|
42
|
+
(confirm with the user first — this starts local recording).
|
|
43
|
+
- `off`: disable by writing `{"enabled": false}` (recording stops; the existing
|
|
44
|
+
log is left in place for the user to inspect or delete).
|
|
45
|
+
- `report`: print the usage summary.
|
|
46
|
+
|
|
47
|
+
## Steps
|
|
48
|
+
|
|
49
|
+
1. **status** — check `~/.claude/telemetry.json`; state on/off, and list
|
|
50
|
+
exactly what is and isn't collected (events: command/skill name, gate
|
|
51
|
+
fired/bypassed, plugin version; never: prompt text, paths, code, network).
|
|
52
|
+
|
|
53
|
+
2. **on / off** — write `~/.claude/telemetry.json`:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{ "enabled": true }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
For `on`, confirm consent first. Recording is local-only; the event log
|
|
60
|
+
`~/.claude/metrics/telemetry.jsonl` lives outside any project directory so
|
|
61
|
+
it can never be committed.
|
|
62
|
+
|
|
63
|
+
3. **report** — summarize the event log:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/lib/telemetry_report.py" \
|
|
67
|
+
--log "$HOME/.claude/metrics/telemetry.jsonl"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Shows command usage, skill usage (including agent-/auto-invoked skills,
|
|
71
|
+
counted distinctly from user-typed commands), and the pre-commit review
|
|
72
|
+
gate's bypass rate. If the log doesn't exist, the report says telemetry is
|
|
73
|
+
off and nothing has left the machine.
|
|
74
|
+
|
|
75
|
+
Report exactly what the tool emits; do not invent counts.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-audit-disable
|
|
3
|
+
description: >-
|
|
4
|
+
Standalone worker. Audits the existing test suite for
|
|
5
|
+
tests that cannot fail — no assertions, assertions on constants, expect-true,
|
|
6
|
+
swallowed exceptions, self-equality — and disables each one by skip-and-tag
|
|
7
|
+
(never deletes). Records each disabled test plus its reason in a JSON log
|
|
8
|
+
under `.claude/memory/<workflow>/<slug>/` so a later phase can repair them. Pairs with
|
|
9
|
+
`/coverage-baseline` to produce a true baseline coverage number.
|
|
10
|
+
argument-hint: "<repo-path> [--repo-slug <slug>] [--dry-run]"
|
|
11
|
+
user-invocable: true
|
|
12
|
+
allowed-tools: Read, Glob, Grep, Bash, Edit, Write
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Test Audit + Disable
|
|
16
|
+
|
|
17
|
+
Role: worker. Identifies tests that cannot fail and disables them so the next coverage run measures a true baseline, not a false positive inflated by tautologies. Tests are skipped + tagged, never deleted — Phase 4 repairs them.
|
|
18
|
+
|
|
19
|
+
You have been invoked with the `/test-audit-disable` command.
|
|
20
|
+
|
|
21
|
+
## Parse Arguments
|
|
22
|
+
|
|
23
|
+
Arguments: $ARGUMENTS
|
|
24
|
+
|
|
25
|
+
- Positional: `<repo-path>` — the repo under modernization.
|
|
26
|
+
- `--repo-slug <slug>` — namespace under `.claude/memory/<workflow>/`. Defaults to the last path segment.
|
|
27
|
+
- `--dry-run` — print the cannot-fail list and exit without disabling.
|
|
28
|
+
|
|
29
|
+
## Steps
|
|
30
|
+
|
|
31
|
+
### 1. Detect language + test framework
|
|
32
|
+
|
|
33
|
+
Probe the repo root for the test stack. Take the first match:
|
|
34
|
+
|
|
35
|
+
- `package.json` → JS/TS — `jest`, `vitest`, `mocha`, `playwright`. Skip helpers per framework: `it.skip` / `test.skip` / `xit` / `xdescribe`.
|
|
36
|
+
- `pyproject.toml` / `setup.py` / `setup.cfg` → Python — `pytest`, `unittest`. Skip helpers: `@pytest.mark.skip(reason=...)`, `@unittest.skip(...)`.
|
|
37
|
+
- `pom.xml` / `build.gradle*` → JVM — `JUnit5`, `JUnit4`, `TestNG`, `Kotest`. Skip helpers: `@Disabled("...")`, `@Ignore("...")`, `@Test(enabled=false)`.
|
|
38
|
+
- `*.csproj` → .NET — `xunit`, `nunit`, `mstest`. Skip: `[Fact(Skip="…")]`, `[Test, Ignore("…")]`.
|
|
39
|
+
- `Cargo.toml` → Rust — `#[ignore = "…"]`.
|
|
40
|
+
- `go.mod` → Go — `t.Skip("…")`.
|
|
41
|
+
|
|
42
|
+
If multiple stacks are present, process each. If none, ask the operator which to use.
|
|
43
|
+
|
|
44
|
+
### 2. Detect cannot-fail tests
|
|
45
|
+
|
|
46
|
+
For each test file, search for the cannot-fail patterns. The set is language-agnostic conceptually but the regex differs per framework — use these signal patterns:
|
|
47
|
+
|
|
48
|
+
| Pattern | Example | Reason |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| No assertion at all | `it('does X', () => { service.doX(); })` | nothing to fail on |
|
|
51
|
+
| Assertion on a literal | `expect(1).toBe(1)`, `assertEquals(true, true)` | self-evaluating |
|
|
52
|
+
| Expect-truthy on a constant | `expect(true).toBeTruthy()` | tautology |
|
|
53
|
+
| Self-equality | `expect(x).toBe(x)`, `assertEquals(obj, obj)` | always true |
|
|
54
|
+
| Swallowed exception with no assertion in the catch | `try { … } catch { }` | masks failures |
|
|
55
|
+
| Assertion only inside a never-entered branch | `if (false) { assert … }` | dead test |
|
|
56
|
+
| `expect.anything()` / `expect.any(*)` as the only assertion | | matches anything |
|
|
57
|
+
| Negative assertion on a never-thrown error | `expect(() => fn()).not.toThrow()` with no throw path | tautology unless fn can throw |
|
|
58
|
+
|
|
59
|
+
For Python add: `assert True`, `self.assertTrue(True)`, `self.assertIsNotNone(self)`. For JVM add: `assertTrue(true)`, `assertEquals(x, x)`. For Go add: `if err != nil { t.Errorf(…) }` blocks with no error-path coverage and `t.Log` as the only call.
|
|
60
|
+
|
|
61
|
+
A finding requires **file path + line + snippet + reason**. Use `Grep` (ripgrep) with file globs scoped to the framework's test conventions.
|
|
62
|
+
|
|
63
|
+
**Graph-assisted lookup.** Prefer CodeGraph/Repowise over raw `Grep` for locating
|
|
64
|
+
test files and confirming a suspect assertion has no real call path behind it
|
|
65
|
+
(e.g. a swallowed-exception catch block that never reaches production error
|
|
66
|
+
handling) — see [`knowledge/codegraph-vs-graphify.md`](../../knowledge/codegraph-vs-graphify.md)
|
|
67
|
+
for tool selection and the fallback contract.
|
|
68
|
+
|
|
69
|
+
### 3. Build the cannot-fail list
|
|
70
|
+
|
|
71
|
+
Collect all findings into a JSON array:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
[
|
|
75
|
+
{
|
|
76
|
+
"file": "src/widget/widget.test.ts",
|
|
77
|
+
"line": 42,
|
|
78
|
+
"test": "renders without crashing",
|
|
79
|
+
"snippet": "it('renders without crashing', () => { render(<Widget/>) });",
|
|
80
|
+
"reason": "no-assertion"
|
|
81
|
+
},
|
|
82
|
+
…
|
|
83
|
+
]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 4. Preview + confirm
|
|
87
|
+
|
|
88
|
+
Print the count by reason and the first ~20 entries. Ask:
|
|
89
|
+
|
|
90
|
+
> Disable these N cannot-fail tests? (yes / no / show all)
|
|
91
|
+
|
|
92
|
+
If `--dry-run`, print and exit zero without modifying anything.
|
|
93
|
+
|
|
94
|
+
### 5. Disable in place
|
|
95
|
+
|
|
96
|
+
For each finding, use `Edit` to insert the framework's skip helper at the matching test boundary, with the reason as the skip message:
|
|
97
|
+
|
|
98
|
+
- JS/TS: `it(...)` → `it.skip(...)` and add a leading comment `// disabled by /test-audit-disable: <reason> — repair in Phase 4`.
|
|
99
|
+
- Python: prepend `@pytest.mark.skip(reason="cannot-fail: <reason> — repair in Phase 4")`.
|
|
100
|
+
- JVM: prepend `@Disabled("cannot-fail: <reason> — repair in Phase 4")`.
|
|
101
|
+
- .NET: change `[Fact]` → `[Fact(Skip="cannot-fail: <reason> — repair in Phase 4")]`.
|
|
102
|
+
- Rust: prepend `#[ignore = "cannot-fail: <reason> — repair in Phase 4"]`.
|
|
103
|
+
- Go: insert `t.Skip("cannot-fail: <reason> — repair in Phase 4")` at the top of the test body.
|
|
104
|
+
|
|
105
|
+
**Never** delete the test body. Phase 4 needs the original implementation to repair against the public-interface Gherkin.
|
|
106
|
+
|
|
107
|
+
### 6. Persist phase-3 progress + the disabled-tests log
|
|
108
|
+
|
|
109
|
+
Write:
|
|
110
|
+
|
|
111
|
+
- `.claude/memory/<workflow>/<slug>/disabled-tests.json` — the array from Step 3, augmented with the disabling tag inserted at each site.
|
|
112
|
+
- `.claude/memory/<workflow>/<slug>/phase-3-audit.md` — counts by reason, framework, file. Lists any test files the worker could not parse (call out as "needs hand-audit").
|
|
113
|
+
|
|
114
|
+
The orchestrator's Phase-3 progress file is owned by `/coverage-baseline`, which runs immediately after this worker.
|
|
115
|
+
|
|
116
|
+
### 7. Report
|
|
117
|
+
|
|
118
|
+
Print:
|
|
119
|
+
|
|
120
|
+
- Total tests disabled, broken down by reason.
|
|
121
|
+
- The first ~10 disabled tests (file + line) for sanity-check.
|
|
122
|
+
- Any files flagged for hand-audit.
|
|
123
|
+
- The log path.
|
|
124
|
+
|
|
125
|
+
## Notes
|
|
126
|
+
|
|
127
|
+
- The disabled tag carries the reason and the "repair in Phase 4" hint so the operator can see the audit history in source control, not only in `.claude/memory/`.
|
|
128
|
+
- Test-file detection follows framework conventions; configurable extensions / patterns can be added later, but the defaults cover the matrix above.
|
|
129
|
+
- Tests that pass for the wrong reason but DO assert (e.g. brittle snapshot tests, over-mocked tests with no real-behavior assertion) are out of scope here — those land in Phase 5 `[Re-scope]` Stories, not the cannot-fail audit.
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-design
|
|
3
|
+
description: >-
|
|
4
|
+
Deep test-design review and forward-design advisor. Dispatches test-review
|
|
5
|
+
(tactical quality) and test-smell-review (xUnit smells, double selection,
|
|
6
|
+
pyramid placement) in parallel, and runs the test-design-advisor worker
|
|
7
|
+
to recommend how to test hard-to-test code. Use when the user says "review
|
|
8
|
+
my tests", "how should I test this", "is this testable", "design tests for
|
|
9
|
+
this", "what's the right test for X", "test design review", or before
|
|
10
|
+
writing a suite for an untested module. For a single unit, pass
|
|
11
|
+
--advise --path <file>. Advisory — it recommends, it does not edit.
|
|
12
|
+
argument-hint: "[--path <dir>] [--since <ref>] [--advise]"
|
|
13
|
+
role: orchestrator
|
|
14
|
+
user-invocable: true
|
|
15
|
+
allowed-tools: Read, Grep, Glob, Bash(git diff *), Skill, Agent
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Test Design
|
|
19
|
+
|
|
20
|
+
Role: orchestrator. This command dispatches the two test review agents as
|
|
21
|
+
sub-agents and the test-design-advisor skill, then aggregates one report. It
|
|
22
|
+
does not review files itself — it coordinates.
|
|
23
|
+
|
|
24
|
+
This command is executed under orchestrator direction. Dispatch each agent with
|
|
25
|
+
its `model:`/`effort:` frontmatter as declared — the harness resolves both
|
|
26
|
+
fields natively before dispatch, per Model/Effort Resolution in
|
|
27
|
+
`agents/orchestrator.md` (ADR 0026).
|
|
28
|
+
|
|
29
|
+
## Orchestrator constraints
|
|
30
|
+
|
|
31
|
+
1. **Advisory only.** Aggregate findings and recommendations. Do not edit
|
|
32
|
+
production code or write test files. Hand actionable fixes to `/apply-fixes`
|
|
33
|
+
or `/build`.
|
|
34
|
+
2. **Dispatch in parallel.** `test-review` and `test-smell-review` are
|
|
35
|
+
independent — spawn them in one batch for context isolation; each returns
|
|
36
|
+
structured JSON, not file dumps.
|
|
37
|
+
3. **No double-reporting.** Apply `knowledge/test-review-division-of-labor.md`:
|
|
38
|
+
when the same line appears in both `test-review` and `test-smell-review`,
|
|
39
|
+
keep the design-level framing and drop the duplicate — record every such
|
|
40
|
+
drop in the report's `### Suppressed duplicates` section (see step 6).
|
|
41
|
+
For `test-smell-review` and `test-design-advisor`, no de-duplication is
|
|
42
|
+
required: per the "test-smell-review ↔ test-design-advisor — remedy
|
|
43
|
+
division" section of the knowledge doc, the smell agent cites the remedy
|
|
44
|
+
family (via `remedyFamily`) and the advisor names the specific remedy
|
|
45
|
+
pattern and refactor sequence — smell rows and advisor rows join
|
|
46
|
+
structurally on `remedyFamily`, not by prose match.
|
|
47
|
+
4. **Be concise.** One aggregated report. Issue messages one sentence;
|
|
48
|
+
recommendations map to a concrete next edit.
|
|
49
|
+
5. **MinimumCD vocabulary.** Layer labels in the aggregated report use the
|
|
50
|
+
MinimumCD six test types (static analysis / unit / component / contract /
|
|
51
|
+
integration / E2E) from `knowledge/cd-test-architecture.md`. Prefer
|
|
52
|
+
"contract test" over "narrow integration test"; if you must use the
|
|
53
|
+
alias, gloss it once: `contract test (also called narrow integration
|
|
54
|
+
test)`. Define each test type on first use (one-line gloss inline or
|
|
55
|
+
a "Test type definitions used in this report" block at the top).
|
|
56
|
+
6. **No target-shape tables.** Per
|
|
57
|
+
`knowledge/cd-test-architecture.md#the-pyramid-is-a-cost-heuristic-not-a-target-shape`,
|
|
58
|
+
do not emit "current shape vs recommended shape" tables or per-layer target
|
|
59
|
+
counts; the aggregated report carries the advisor's per-behavior placement
|
|
60
|
+
table, not a silhouette target.
|
|
61
|
+
7. **E2E justification gate.** Forward the advisor's four-condition E2E verdict
|
|
62
|
+
verbatim (the gate is canonical in
|
|
63
|
+
`knowledge/cd-test-architecture.md#the-e2e-justification-gate`). Never
|
|
64
|
+
recommend E2E in the rollup without it.
|
|
65
|
+
|
|
66
|
+
## Parse Arguments
|
|
67
|
+
|
|
68
|
+
Arguments: $ARGUMENTS
|
|
69
|
+
|
|
70
|
+
Optional:
|
|
71
|
+
|
|
72
|
+
- `--path <dir>`: target directory (default: current working directory)
|
|
73
|
+
- `--since <ref>`: target files changed since a git ref (`git diff --name-only <ref>...HEAD`)
|
|
74
|
+
- `--advise`: also run the test-design-advisor skill for forward-looking design (default on when the target has untested production code or few/no test files, **or when the target resolves to a single production file** — via `--path <file>` or a `--since` diff that touches exactly one production file; this is the path for forward-design on a single unit — the `test-design-advisor` skill has no user-facing slash command)
|
|
75
|
+
|
|
76
|
+
## Steps
|
|
77
|
+
|
|
78
|
+
### 1. Determine target files
|
|
79
|
+
|
|
80
|
+
Same auto-scope logic as `/code-review`: uncommitted changes if present, else
|
|
81
|
+
all source files; honor `--since` and `--path`. Identify test files and the
|
|
82
|
+
production code they cover.
|
|
83
|
+
|
|
84
|
+
**Single-file → auto-`--advise`.** If the resolved target is exactly one
|
|
85
|
+
production file (`--path <file>` pointing at a production source file, or a
|
|
86
|
+
`--since` diff whose production set has one file), set `--advise` on for this
|
|
87
|
+
run and record it in the report header. This is the entry path for
|
|
88
|
+
forward-design on a single unit (the `test-design-advisor` worker skill has
|
|
89
|
+
no user-facing slash command).
|
|
90
|
+
|
|
91
|
+
### 2. Dispatch review agents (parallel)
|
|
92
|
+
|
|
93
|
+
Spawn both as sub-agents in one batch:
|
|
94
|
+
|
|
95
|
+
- `test-review` — tactical quality gate (assertions, hygiene, non-determinism mechanics, testability blockers)
|
|
96
|
+
- `test-smell-review` — xUnit smells, test-double selection, pyramid-layer placement
|
|
97
|
+
|
|
98
|
+
Each returns its standard JSON (`status`/`issues`/`summary`). If no test files
|
|
99
|
+
exist, both skip — proceed to Step 4 with `--advise`.
|
|
100
|
+
|
|
101
|
+
### 3. Score the in-scope tests (Farley Score)
|
|
102
|
+
|
|
103
|
+
Using the file set already resolved in Step 1 (Step 1 is the single
|
|
104
|
+
scope-resolution authority in this skill), invoke `Skill(farley-score ...)`
|
|
105
|
+
to produce the Farley Score, rating, and distribution. Label the score with
|
|
106
|
+
the scope it was computed over:
|
|
107
|
+
|
|
108
|
+
- No `--path` / no `--since` → every test file in the repository (test-file
|
|
109
|
+
indicators in `knowledge/test-file-indicators.md`); label `all tests`.
|
|
110
|
+
- `--path <dir>` → tests under `<dir>` or covering production code under
|
|
111
|
+
`<dir>`; label `under <dir>`.
|
|
112
|
+
- `--since <ref>` → tests touched in the diff plus tests covering production
|
|
113
|
+
files touched in the diff; label `changed since <ref>`.
|
|
114
|
+
- `--path <dir>` and `--since <ref>` together → tests under `<dir>` that are
|
|
115
|
+
also touched (directly or via covered production code) since `<ref>` — the
|
|
116
|
+
intersection of both sets; label `under <dir>, changed since <ref>`.
|
|
117
|
+
- Empty in-scope test set → skip the score and print `no in-scope test files`
|
|
118
|
+
in the report instead of a number.
|
|
119
|
+
|
|
120
|
+
### 4. Run the advisor (when applicable)
|
|
121
|
+
|
|
122
|
+
If `--advise` is set (or auto-triggered), use the Skill tool (`Skill(test-design-advisor ...)`) on the production code to produce testability assessment, pyramid
|
|
123
|
+
placement, double strategy, and a behavior-preserving refactor sequence for
|
|
124
|
+
any untestable units.
|
|
125
|
+
|
|
126
|
+
### 5. Aggregate and de-duplicate
|
|
127
|
+
|
|
128
|
+
Merge findings. Resolve overlaps per constraint 3. Group by file. Rank:
|
|
129
|
+
behavior/project smells and testability blockers first (they undermine the
|
|
130
|
+
whole suite), then fragile/obscure smells, then suggestions.
|
|
131
|
+
|
|
132
|
+
### 6. Report
|
|
133
|
+
|
|
134
|
+
Produce one report (chat for a small target; `.dev-team-reports/test-design-<date>.md`
|
|
135
|
+
for a module):
|
|
136
|
+
|
|
137
|
+
```markdown
|
|
138
|
+
## Test Design Review — <target>
|
|
139
|
+
|
|
140
|
+
**Health**: <pass|attention|critical> **Test files**: N **Findings**: N
|
|
141
|
+
**Farley Score (<scope>)**: <score> (<rating>) — Exemplary N · Good N · Adequate N · Poor N
|
|
142
|
+
|
|
143
|
+
`<scope>` is the label produced by Step 3; render it verbatim. Concrete
|
|
144
|
+
forms: `Farley Score (all tests)`, `Farley Score (under <dir>)`,
|
|
145
|
+
`Farley Score (changed since <ref>)`, `Farley Score (under <dir>, changed since <ref>)`.
|
|
146
|
+
When the in-scope set was empty, replace the whole line with
|
|
147
|
+
`**Farley Score**: no in-scope test files`.
|
|
148
|
+
|
|
149
|
+
### Test type definitions used in this report
|
|
150
|
+
<one-line glosses for MinimumCD terms appearing below; verbatim from
|
|
151
|
+
`knowledge/cd-test-architecture.md` § The Six Test Types — at minimum
|
|
152
|
+
the terms actually used in the report>
|
|
153
|
+
|
|
154
|
+
### Findings (by severity)
|
|
155
|
+
| File:line | Smell / Issue | Severity | Source | Suggested fix |
|
|
156
|
+
|
|
157
|
+
### Design recommendations (advisor)
|
|
158
|
+
<testability table · pyramid placement (per-behavior, two-direction
|
|
159
|
+
justification, NO target counts) · double strategy · refactor sequence ·
|
|
160
|
+
E2E justification (only when E2E is recommended)>
|
|
161
|
+
|
|
162
|
+
### Suppressed duplicates
|
|
163
|
+
<Every drop constraint 3 performed at aggregation time. Each entry cites the
|
|
164
|
+
finding's `file:line`, what was dropped (which agent's finding, keyed by
|
|
165
|
+
smell/message), and the reason (e.g. "mechanics duplicate of Assertion
|
|
166
|
+
Roulette owned by test-smell-review"). test-smell-review ↔ test-design-advisor
|
|
167
|
+
overlaps are never listed here — they are joined structurally on
|
|
168
|
+
`remedyFamily`, not dropped. Emit `_None._` when nothing was dropped.>
|
|
169
|
+
|
|
170
|
+
### Next steps
|
|
171
|
+
- Mechanical fixes → /apply-fixes
|
|
172
|
+
- Refactor sequence → /plan or /build
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Surface only what's actionable. If everything is clean, say so in one line.
|
|
176
|
+
Do NOT include a "current shape vs recommended shape" table — see Orchestrator
|
|
177
|
+
constraint #6.
|