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,192 @@
|
|
|
1
|
+
# CodeGraph, Repowise, and Graphify
|
|
2
|
+
|
|
3
|
+
Three optional, complementary code-intelligence tools may show up in a
|
|
4
|
+
project this plugin operates on. None is required — a project may have any
|
|
5
|
+
subset (including none), and nothing in the plugin assumes any of them
|
|
6
|
+
exists. When present, they let agents read verified skeletons, resolved call
|
|
7
|
+
graphs, modification risk, and decision rationale instead of re-reading whole
|
|
8
|
+
files and grepping for callers — cheaper and more accurate. When absent, the
|
|
9
|
+
grant is inert and agents fall back to `Read`/`Grep`/`Glob`.
|
|
10
|
+
|
|
11
|
+
## What each tool is
|
|
12
|
+
|
|
13
|
+
### CodeGraph
|
|
14
|
+
|
|
15
|
+
Third-party tool (<https://github.com/colbymchenry/codegraph>). Builds a
|
|
16
|
+
tree-sitter AST index of source code into a local SQLite database
|
|
17
|
+
(`.codegraph/codegraph.db`). Code-symbols-only — it indexes functions,
|
|
18
|
+
classes, and call relationships, not prose or non-code artifacts. Queries
|
|
19
|
+
(callers, callees, impact analysis) run sub-millisecond against the local
|
|
20
|
+
index. It has no knowledge of documentation, schemas, or infrastructure
|
|
21
|
+
files.
|
|
22
|
+
|
|
23
|
+
### Repowise
|
|
24
|
+
|
|
25
|
+
A codebase-documentation / wiki engine (`repowise` on PyPI) that indexes a
|
|
26
|
+
repository into a queryable knowledge base and exposes it as an **MCP
|
|
27
|
+
server**. Its tools answer *contextual* questions about the code rather than
|
|
28
|
+
raw structural ones: `get_overview` returns an architecture-level summary of
|
|
29
|
+
the whole workspace; `get_context` / `get_symbol` return documented context
|
|
30
|
+
and verified skeletons for a file, module, or symbol; `search_codebase` is
|
|
31
|
+
semantic (natural-language) search; `get_answer` answers a free-form question
|
|
32
|
+
against the indexed wiki; `get_risk` estimates the modification risk of a
|
|
33
|
+
change; `get_why` surfaces the recorded architectural-decision rationale
|
|
34
|
+
behind a piece of code; `get_health` reports code-health signals (churn,
|
|
35
|
+
complexity, coverage-adjacent risk) and `get_dead_code` flags unreferenced
|
|
36
|
+
code — both workspace-scoped rather than file-scoped, so they run over the
|
|
37
|
+
whole indexed repo instead of a single symbol. It can index without any LLM
|
|
38
|
+
API key (a keyless index), writing its store under `.repowise/`. Because it
|
|
39
|
+
layers documentation, risk, rationale, and workspace-wide health signals on
|
|
40
|
+
top of structure, it complements CodeGraph's pure call-graph view.
|
|
41
|
+
|
|
42
|
+
### Graphify
|
|
43
|
+
|
|
44
|
+
A knowledge-graph tool (`graphifyy` on PyPI) that is multi-modal: it ingests
|
|
45
|
+
code *and* docs, PDFs, schemas, infra files, images, and video into one
|
|
46
|
+
graph, using both semantic (embedding-based) and structural (AST/reference)
|
|
47
|
+
extraction. Output is a queryable graph (`graphify-out/graph.json`) plus a
|
|
48
|
+
plain-language `GRAPH_REPORT.md` and an interactive HTML view, with
|
|
49
|
+
community detection to surface cross-document relationships. Because it
|
|
50
|
+
spans code and non-code content, it is the better tool for
|
|
51
|
+
architecture-level and onboarding questions, not just "what calls this
|
|
52
|
+
function."
|
|
53
|
+
|
|
54
|
+
## How each is installed and invoked here
|
|
55
|
+
|
|
56
|
+
### CodeGraph
|
|
57
|
+
|
|
58
|
+
- Offered opt-in during `/project-init`'s Step 4c
|
|
59
|
+
([`skills/project-init/SKILL.md`](../skills/project-init/SKILL.md)) as part
|
|
60
|
+
of the keyless CodeGraph + Repowise all-or-none pair (Graphify is a separate
|
|
61
|
+
opt-in — see below): the skill checks `command -v codegraph` and the
|
|
62
|
+
presence of `.codegraph/`, and when the pair
|
|
63
|
+
is accepted **installs the CLI keylessly** (`npm install -g
|
|
64
|
+
@colbymchenry/codegraph`) and builds the index non-interactively
|
|
65
|
+
(`codegraph init .`, no `-i`), recording the choice in
|
|
66
|
+
`.claude/init-state.json` (issue #1134).
|
|
67
|
+
- **Strictly personal, user-level tooling — never committed.** Once
|
|
68
|
+
initialized, the skill prints the manual command
|
|
69
|
+
(`claude mcp add codegraph -- codegraph serve --mcp`) for the user to
|
|
70
|
+
register the `codegraph` MCP server at **user scope**, exposing a single
|
|
71
|
+
tool, `codegraph_explore` (`mcp__codegraph__explore`), to Claude Code
|
|
72
|
+
sessions on that machine. One call returns the verbatim source of the
|
|
73
|
+
relevant symbols grouped by file, the call path among them, and a
|
|
74
|
+
blast-radius summary of what depends on them — Read-equivalent output, but
|
|
75
|
+
with structure attached. Nothing is written to a project-tracked
|
|
76
|
+
`.mcp.json`, and `.codegraph/` is never committed — only
|
|
77
|
+
`.codegraph/codegraph.db` stays gitignored and machine-local, per project.
|
|
78
|
+
- `hooks/code_intelligence_nudge.py` (PreToolUse on `Read`/`Grep`/`Glob`)
|
|
79
|
+
recommends `codegraph_explore` over multi-file Read/Grep/Glob exploration
|
|
80
|
+
whenever `.codegraph/` exists and no CodeGraph tool has been used yet in
|
|
81
|
+
the current turn; see
|
|
82
|
+
[`docs/code-intelligence-nudge.md`](../docs/code-intelligence-nudge.md)
|
|
83
|
+
for the full sentinel mechanism. `hooks/codegraph_bootstrap.py`
|
|
84
|
+
(SessionStart) rebuilds the local `.db` on a fresh clone when
|
|
85
|
+
`.codegraph/` is committed but the machine-local database is missing.
|
|
86
|
+
|
|
87
|
+
### Repowise
|
|
88
|
+
|
|
89
|
+
- Offered opt-in during `/project-init`'s Step 4c
|
|
90
|
+
([`skills/project-init/SKILL.md`](../skills/project-init/SKILL.md)),
|
|
91
|
+
alongside CodeGraph as one **all-or-none** keyless pair (Graphify is a
|
|
92
|
+
separate opt-in, offered after this pair — see below).
|
|
93
|
+
- Installed keyless (`uv`/`pipx`/`pip`), it indexes without prompting for an
|
|
94
|
+
LLM API key and stores its index under `.repowise/`, which is gitignored so
|
|
95
|
+
the index never clutters the repo.
|
|
96
|
+
- Registered as an MCP server, it exposes
|
|
97
|
+
`mcp__plugin_repowise_repowise__{get_overview,get_context,get_symbol,search_codebase,get_answer,get_risk,get_why,get_health,get_dead_code}`
|
|
98
|
+
(and more) to Claude Code sessions.
|
|
99
|
+
- **Server-name coupling caveat.** The tool names agents grant use the literal
|
|
100
|
+
server prefix `mcp__plugin_repowise_repowise__*`. If a given install exposes
|
|
101
|
+
Repowise under a different MCP server name, those grants are **inert** — no
|
|
102
|
+
error, agents just fall back to `Read`/`Grep`/`Glob`. Keep the fallback in
|
|
103
|
+
mind wherever a Repowise tool is assumed.
|
|
104
|
+
|
|
105
|
+
### Graphify
|
|
106
|
+
|
|
107
|
+
- A repo-level tool with its own native `/graphify` skill
|
|
108
|
+
(`.claude/skills/graphify/SKILL.md` in this repo), not part of the
|
|
109
|
+
`dev-team` plugin's shipped skill set.
|
|
110
|
+
- Also offered opt-in during `/project-init`'s Step 4c, after the keyless
|
|
111
|
+
CodeGraph + Repowise pair. **Only Graphify's AST pass builds keyless** —
|
|
112
|
+
`graphify extract .` is full extraction (AST + semantic LLM pass) and is the
|
|
113
|
+
target invocation, producing the `graph.json` the agents traverse (issue
|
|
114
|
+
#1224); a model/API key with a working backend is required for the semantic
|
|
115
|
+
pass, which is what indexes docs and images, not just community names and
|
|
116
|
+
inferred edges (issue #1483). Without a working backend, use
|
|
117
|
+
`graphify extract . --code-only` instead — a degraded, code-only graph, not
|
|
118
|
+
the full multi-modal index. When accepted, the skill runs full extraction
|
|
119
|
+
when a key/backend is available (or `graphify update .` when a graph already
|
|
120
|
+
exists), falling back to `--code-only` when it is not, and offers the
|
|
121
|
+
further label/`--mode deep` enrichment add-ons only on top of a successful
|
|
122
|
+
full extraction; when graphify is absent, consuming agents fall back to
|
|
123
|
+
`Read`/`Grep`/`Glob`.
|
|
124
|
+
- Build a graph with `graphify extract .` (or the full `/graphify` pipeline),
|
|
125
|
+
which writes `graphify-out/graph.json` (gitignored) plus
|
|
126
|
+
`graphify-out/GRAPH_REPORT.md` and an HTML visualization.
|
|
127
|
+
- Query the graph with `graphify query "<question>"` (broad, BFS-style
|
|
128
|
+
context), `graphify path "<A>" "<B>"` (shortest path between two
|
|
129
|
+
concepts), and `graphify explain "<concept>"` (plain-language explanation
|
|
130
|
+
of a single node).
|
|
131
|
+
- PreToolUse nudge hooks in `.claude/settings.json` (this repo's own,
|
|
132
|
+
separate from the plugin's `code-intelligence-nudge`) steer codebase
|
|
133
|
+
questions toward `graphify query` when `graphify-out/graph.json` already
|
|
134
|
+
exists.
|
|
135
|
+
- Keep the graph current after edits with `graphify update .`
|
|
136
|
+
(incremental, AST-only, no LLM cost).
|
|
137
|
+
|
|
138
|
+
## When to use which
|
|
139
|
+
|
|
140
|
+
- **CodeGraph** for fast structural queries while editing — callers,
|
|
141
|
+
callees, impact analysis, sub-millisecond lookups against a local SQLite
|
|
142
|
+
index of code symbols.
|
|
143
|
+
- **Repowise** for *contextual* code questions — documented context and
|
|
144
|
+
verified skeletons (`get_context`/`get_symbol`), semantic search
|
|
145
|
+
(`search_codebase`), modification risk (`get_risk`), decision rationale
|
|
146
|
+
(`get_why`), and workspace-wide code health/dead-code signals
|
|
147
|
+
(`get_health`/`get_dead_code`). Reach for it when the question is "what
|
|
148
|
+
does this do / why does it exist / how risky is changing it / how healthy
|
|
149
|
+
is this area," not "who calls it."
|
|
150
|
+
- **Graphify** for architecture and onboarding questions that span code
|
|
151
|
+
*and* docs, schemas, and infrastructure — anything broader than "who
|
|
152
|
+
calls this function."
|
|
153
|
+
|
|
154
|
+
### Routing precedence
|
|
155
|
+
|
|
156
|
+
This is guidance for the *model* choosing which tool to reach for — it is
|
|
157
|
+
not hook-enforced logic; nothing in `code_intelligence_nudge.py` inspects
|
|
158
|
+
the question text, since only the model sees the natural-language task
|
|
159
|
+
behind a Read/Grep/Glob call. When more than one tool is indexed, prefer in
|
|
160
|
+
this order:
|
|
161
|
+
|
|
162
|
+
1. **Non-code content** (docs, schemas, infra, cross-artifact questions) →
|
|
163
|
+
**Graphify**.
|
|
164
|
+
2. **Risk, rationale, code health, or dead code** → **Repowise**.
|
|
165
|
+
3. **Pure structure or call-graph** (who calls this, what does this affect)
|
|
166
|
+
→ **CodeGraph**.
|
|
167
|
+
|
|
168
|
+
The three overlap only lightly: CodeGraph is the fastest for pure call
|
|
169
|
+
graphs, Repowise adds documentation/risk/rationale over structure, and
|
|
170
|
+
Graphify is the widest net across non-code artifacts. Prefer whichever is
|
|
171
|
+
present for the question at hand; use more than one when they're all indexed.
|
|
172
|
+
|
|
173
|
+
## None is guaranteed to be present
|
|
174
|
+
|
|
175
|
+
All three are optional and independently adopted per project:
|
|
176
|
+
|
|
177
|
+
- CodeGraph requires an explicit `/project-init` opt-in and a successful
|
|
178
|
+
`codegraph init`; a project can decline both the install and the init
|
|
179
|
+
prompts and never have `.codegraph/`.
|
|
180
|
+
- Repowise requires the `/project-init` code-lookup-tools opt-in and a
|
|
181
|
+
keyless index; a project can decline it and never have `.repowise/` or the MCP
|
|
182
|
+
server registered — and even when installed, the grant is inert if the
|
|
183
|
+
server name differs (see the coupling caveat above).
|
|
184
|
+
- Graphify requires someone to run `/graphify` (or `graphify extract`) at
|
|
185
|
+
least once; a project can go its entire life without `graphify-out/`.
|
|
186
|
+
|
|
187
|
+
Plugin behavior must not assume any of the three exists. The
|
|
188
|
+
`code-intelligence-nudge` hook already fails open when none of the three
|
|
189
|
+
are present, Repowise/CodeGraph MCP grants are inert when their servers are
|
|
190
|
+
absent, and no shipped `dev-team` skill or agent depends on
|
|
191
|
+
`graphify-out/` being present. `Read`/`Grep`/`Glob` is the always-available
|
|
192
|
+
fallback.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Component Test Patterns
|
|
2
|
+
|
|
3
|
+
Reference file for the `cd-test-architecture` skill. Per-component-type testing patterns for a CD pipeline. Builds on `cd-test-architecture.md` (the six test types, the pre-merge determinism rule, the adapter rule, and double validation) — read that first.
|
|
4
|
+
|
|
5
|
+
Source: MinimumCD Applied Testing Strategies — component patterns (beyond.minimumcd.org/docs/testing/applied-testing-strategies/patterns/). These are recommended starting points, not mandates: drop items that don't apply, add what a component clearly needs.
|
|
6
|
+
|
|
7
|
+
Core principle for every pattern: **assemble the real component, double only the systems the team doesn't control, drive through the public interface, assert observable outcomes.** — and, at or below the component layer, no *internal* collaborator either, per the full blocker rule in `internal-collaborator-doubling.md`. Everything below is a specialization of that.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Identify the Component's Pattern
|
|
12
|
+
|
|
13
|
+
| If the component… | Pattern | Group |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| renders data and accepts user interaction against backend APIs | **User Interface** | UI |
|
|
16
|
+
| exposes endpoints and owns its data store, no outbound internal calls | **API Provider** | Services |
|
|
17
|
+
| exposes endpoints **and** calls upstream services | **API Consumer** | Services |
|
|
18
|
+
| consumes messages from a broker | **Event Consumer** | Services |
|
|
19
|
+
| publishes messages to a broker | **Event Producer** | Services |
|
|
20
|
+
| holds long-lived in-memory state (cache, aggregate, coordinator, websocket gateway) | **Stateful Service** | Services |
|
|
21
|
+
| is a binary/package invoked via CLI or imported API | **CLI / Library** | Services |
|
|
22
|
+
| is triggered by cron/queue/scheduler to process data and write output | **Scheduled Job** | Batch |
|
|
23
|
+
|
|
24
|
+
A real system is often several of these; test each surface by its pattern.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## UI
|
|
29
|
+
|
|
30
|
+
### User Interface
|
|
31
|
+
|
|
32
|
+
Renders data and accepts interaction against backend APIs.
|
|
33
|
+
|
|
34
|
+
- **Coverage layers:** pure rendering (solitary unit) → component composition (sociable unit) → feature behavior in the DOM (component tests in a real browser, backend stubbed at the network layer) → backend HTTP client (consumer-side contract tests) → a small set of E2E happy paths against real backends (post-deploy).
|
|
35
|
+
- **Isolation (run without the backend configured):** drive the UI in a real browser engine; stub the backend **at the network layer** (e.g. Playwright `page.route`). The same fixtures later serve E2E smoke. Do **not** use an in-memory DOM shim (JSDOM) for feature tests — it trades accuracy for false positives on layout/event timing.
|
|
36
|
+
- **Success scenarios:** critical flows via keyboard + mouse; valid input submits; loading states; empty/populated/overflow states; i18n (long translations, RTL); responsive breakpoints.
|
|
37
|
+
- **Failure modes:** every API call's 4xx/5xx/network/timeout; validation messages (screen-reader announced); token expiry mid-session → re-auth; permission denied; stale data after cross-tab deletes; slow (3G) network; concurrent-edit/optimistic-lock UX; back-button nav; automated WCAG scan.
|
|
38
|
+
- **Double validation:** backend stubs must match real endpoints — pin them with contract tests pre-merge, then run **scheduled verification of those contracts against the real backend in a test environment** to detect drift when it happens (not at your next deploy). If the backend is the same team's, provider-side verification in its pipeline is a bonus; don't depend on it for backends you don't control. Post-deploy E2E smoke catches drift the contracts didn't pin.
|
|
39
|
+
- **Pipeline:** unit + component (headless browser) + consumer contract tests in Stage 1; visual regression Stage 1/2; E2E smoke post-deploy (blocks rollout, not build); RUM + synthetics in prod.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Services
|
|
44
|
+
|
|
45
|
+
### API Provider
|
|
46
|
+
|
|
47
|
+
Exposes endpoints, owns its data store, no outbound internal calls.
|
|
48
|
+
|
|
49
|
+
- **Coverage layers:** HTTP/API surface (component + provider contract) → domain logic (solitary/sociable unit + component) → persistence adapter (sociable unit + adapter integration + component) → external database (doubled in component; real engine in adapter integration).
|
|
50
|
+
- **Isolation:** assemble the full app with an **in-memory repository** and in-memory event bus; drive through HTTP handlers; assert status, persisted state, emitted events.
|
|
51
|
+
- **Success scenarios:** documented endpoints return expected shape/status for valid input; auth succeeds for valid creds/tokens; pagination/filter/sort; idempotent ops idempotent, non-idempotent create exactly one; success-path side effects (events, audit).
|
|
52
|
+
- **Failure modes:** malformed input (bad JSON, missing/extra fields, type errors); out-of-range/unicode; authz failures (missing/expired token, insufficient scope, cross-tenant); not-found returns 404 not 500; concurrency conflicts with correct status; persistence failure without partial commit; rate-limit/size enforcement; idempotency under retry.
|
|
53
|
+
- **Double validation:** adapter integration tests run against a real instance of the **production database engine** via testcontainers (matching version + extensions) — never an SQLite shim for a Postgres prod; provider contract verification confirms the API still satisfies every consumer expectation.
|
|
54
|
+
- **Pipeline:** unit + sociable unit pre-commit/Stage 1; component Stage 1; adapter integration out-of-band on a schedule, regardless of ownership; provider contract verification in CD contract/boundary stage.
|
|
55
|
+
|
|
56
|
+
### API Consumer
|
|
57
|
+
|
|
58
|
+
Exposes endpoints **and** calls upstream services. The most failure-prone distributed pattern — give it the most attention.
|
|
59
|
+
|
|
60
|
+
- **Coverage layers:** inbound HTTP surface → domain/orchestration (composes calls) → **resilience policy** (retry, circuit breaker, timeout, fallback) → outbound HTTP client (request build, response parse, headers, deadlines) → persistence adapter → external DB (doubled/real) → downstream service (doubled in pipeline, real out-of-band).
|
|
61
|
+
- **Isolation (run without the upstream configured):** wrap the upstream client in a **team-owned thin adapter**; double the adapter in component tests. Drive each failure through the client double.
|
|
62
|
+
- **Success scenarios:** constructs right URL/headers/body/auth/timeout; parses success incl. optional/unknown fields; composes multiple downstream calls (sequence/parallel); caching within TTL + refresh after expiry; trace-context propagation.
|
|
63
|
+
- **Failure modes:** **timeout** (deadline enforces, caller gets documented response e.g. 504, no partial commit); connection refused (retry count + backoff → fallback/error); 5xx retried only when retryable; 4xx mapped to documented behavior, generally not retried, 429 respects `Retry-After`; malformed/drifted response per Postel's Law; circuit breaker opens under sustained failure, fast-fails, recovers on half-open probe; partial multi-call failure → compensation/rollback/documented partial success.
|
|
64
|
+
- **Double validation (do not depend on provider cooperation):** assume the provider can break the contract without versioning and that you won't know until an incident. (1) consumer-side contract tests pin request + response shape, block the build; (2) **scheduled provider-contract verification in a test environment** — *you* run your pinned contract against the provider's real non-prod endpoint on a schedule, out-of-band, decoupled from your deploys — this is the primary defense, attributing a break to the provider when it happens rather than to your next unrelated change; (3) adapter integration tests exercise the real outbound client against controlled states (testcontainers) — asserts the *adapter*, not the dependency; (4) resilience component tests (above) prove the consumer **survives** a broken contract, not just detects it. Provider-side verification of your contract is a bonus *if* they offer it — never relied upon.
|
|
65
|
+
- **Anti-pattern:** mocking the third-party SDK directly instead of wrapping + doubling an owned adapter.
|
|
66
|
+
- **Pipeline:** consumer contract + resilience component tests (fault injection) Stage 1; adapter integration out-of-band on a schedule, decoupled from deploys — regardless of whether the dependency is in-house or third-party/other-team, never in-band; post-deploy checks scheduled.
|
|
67
|
+
- **Stack-specific mechanics — .NET:** the canonical pre-merge seam is `HttpMessageHandler` (stubbed + wired via `IHttpClientFactory.ConfigurePrimaryHttpMessageHandler`); WireMock.Net is the preferred implementation of that seam when installed, with the hand-rolled stub kept as backup. See `references/csharp-http-client-testing.md` and the worked matrix in `test-matrix-examples/dotnet-http-consumer.md`. (Other stacks: Node / Nock preferred, MSW as a documented fallback; JVM / WireMock; Python / VCR.py preferred, `responses`/`httpx` mock as a documented fallback. `virtual-service-libraries.md` is the single source of truth for the per-stack preferred/backup catalog — cite it rather than restating tool names here; add to a stack profile as needed.)
|
|
68
|
+
|
|
69
|
+
### Event Consumer
|
|
70
|
+
|
|
71
|
+
Consumes messages from a broker (Kafka/SQS/RabbitMQ/PubSub).
|
|
72
|
+
|
|
73
|
+
- **Coverage layers:** message handler (solitary unit) → idempotency & ordering (component) → dead-letter / poison-message (component) → backpressure (resilience component) → broker client (adapter integration vs real broker container) → external broker & schema registry (doubled in component; contract + post-deploy synthetic publish).
|
|
74
|
+
- **Isolation (run without the broker):** replace the broker with a double; drive the handler with messages directly.
|
|
75
|
+
- **Success scenarios:** well-formed message → expected state change + documented downstream event; batch policy honored; replay from offset reproduces identical end state; documented schema versions accepted.
|
|
76
|
+
- **Failure modes:** poison message → DLQ with correlation id, consumer survives; duplicate delivery → exactly one record (idempotency); out-of-order per documented policy; mid-batch failure → offsets uncommitted, no data loss; schema skew per version policy; backpressure (slow, don't OOM); rebalancing strands no in-flight messages.
|
|
77
|
+
- **Double validation:** adapter integration tests vs a real broker container the team controls (Docker Kafka, ElasticMQ, Redpanda) assert the adapter speaks the protocol (not broker ordering — that's the broker's job); schema-registry doubles validated via contract tests + post-deploy checks vs the real registry.
|
|
78
|
+
- **Pipeline:** handler unit + component Stage 1; adapter integration out-of-band on a schedule — regardless of whether the broker is team-controlled or managed/third-party; post-deploy synthetic publishes out-of-band.
|
|
79
|
+
|
|
80
|
+
### Event Producer
|
|
81
|
+
|
|
82
|
+
Publishes messages to a broker (often paired with a consumer in the same service).
|
|
83
|
+
|
|
84
|
+
- **Coverage layers:** publish logic (unit) → publish contract (contract test pins message schema) → broker client adapter (adapter integration) → external broker (doubled; post-deploy synthetic).
|
|
85
|
+
- **Isolation:** double the broker adapter; assert the message that *would* be published (shape, key, headers, idempotency).
|
|
86
|
+
- **Success/failure:** correct schema/partition-key/headers on the happy path; publish failure → documented retry/outbox behavior, no silent drop; transactional outbox prevents loss on crash between state-write and publish.
|
|
87
|
+
- **Double validation:** message schema pinned by contract (consumers verify); adapter integration vs real broker container; post-deploy synthetic publish.
|
|
88
|
+
- **Pipeline:** unit + contract Stage 1; adapter integration out-of-band on a schedule, regardless of ownership; post-deploy synthetic.
|
|
89
|
+
|
|
90
|
+
### Stateful Service
|
|
91
|
+
|
|
92
|
+
Long-lived in-memory state: caches, aggregates, coordinators, websocket gateways, real-time engines.
|
|
93
|
+
|
|
94
|
+
- **Coverage layers:** state-machine logic (solitary unit) → persistence & recovery (component with doubled persistence) → single-node concurrency (component) → replication & leader election (cluster tests with real consensus library) → memory bounds (soak) → connection lifecycle (component) → external persistence engine (doubled in component; real engine in adapter integration, out-of-band).
|
|
95
|
+
- **Isolation:** double persistence; control time and event ordering to make concurrency deterministic.
|
|
96
|
+
- **Success scenarios:** transitions follow documented state machine; state rebuilds identically after restart; replication lag within budget.
|
|
97
|
+
- **Failure modes:** crash mid-write → consistent state on restart, no torn writes; concurrent mutations serialize without lost updates; network partition → minority steps down with documented reconciliation; memory pressure → evicts per policy, no OOM; idle connections close cleanly with documented reconnect.
|
|
98
|
+
- **Double validation:** persistence doubles validated by adapter integration against the real persistence engine, out-of-band; consensus doubles validated by cluster testcontainer tests, out-of-band.
|
|
99
|
+
- **Pipeline:** unit + component Stage 1; adapter integration (persistence recovery) out-of-band on a schedule, regardless of ownership; cluster tests out-of-band on a schedule, regardless of ownership; soak + chaos out-of-pipeline vs deployed instances.
|
|
100
|
+
|
|
101
|
+
### CLI / Library
|
|
102
|
+
|
|
103
|
+
Binary or package consumed via CLI or an exported API.
|
|
104
|
+
|
|
105
|
+
- **Coverage layers:** public-interface behavior (unit/component invoking the real surface) → process startup for a CLI (deployed-binary test invoking the real artifact) → any external deps via owned adapters.
|
|
106
|
+
- **Isolation:** test through the public invocation surface (args/stdin/stdout/exit codes for a CLI; exported functions for a library); double external deps via adapters.
|
|
107
|
+
- **Success/failure:** documented commands/flags produce documented output + exit code; bad args → documented error + non-zero exit; stdin/stdout/stderr contracts; backward-compatible public API (the consumer's contract).
|
|
108
|
+
- **Double validation:** a small set of deployed-binary tests invoke the real built artifact to catch packaging/startup gaps unit tests miss. Unlike Scheduled Job's equivalent check (out-of-band, below), this smoke is deterministic enough to gate in-band when it exercises only the artifact itself — startup, arg parsing, exit codes — with no external system configured: any external dep it does call is already behind an owned adapter (per Isolation above), so the smoke carries none of the source/sink/scheduler coupling that pushes Scheduled Job's version out-of-band.
|
|
109
|
+
- **Pipeline:** unit + component Stage 1; deployed-binary smoke Stage 1/2.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Batch
|
|
114
|
+
|
|
115
|
+
### Scheduled Job
|
|
116
|
+
|
|
117
|
+
Triggered by cron/queue/scheduler to process data and write output/state.
|
|
118
|
+
|
|
119
|
+
- **Coverage layers:** pure transformation (solitary unit, no I/O) → job orchestration (component: idempotency, partial-failure recovery, checkpointing, time-window logic) → source/sink adapters (adapter integration vs real container or WireMock) → process startup (deployed-binary test invoking the real artifact) → scheduling integration (out-of-band vs the real scheduler in non-prod) → observability (assertions in component tests).
|
|
120
|
+
- **Isolation (run without real data stores or the scheduler):** field-level in-memory fakes for sources/sinks seeded in the test; **inject the clock** (`Clock.fixed(Instant.parse(...), ZoneOffset.UTC)`); invoke the job entrypoint directly rather than via the scheduler.
|
|
121
|
+
- **Success scenarios:** representative input → expected output (report/db update/published message); idempotency (running twice for the same logical period → same result, no duplicates); checkpoint resume without reprocessing; time-window correctness across DST and month/year boundaries; empty input → valid empty report; output conforms to documented schema.
|
|
122
|
+
- **Failure modes:** source unavailable → clean failure with documented exit code, no partial output, safely re-runnable; sink unavailable → no source state change; partial-write → idempotency keys / transactional outbox prevent duplicates on retry; slow run → alertable, locking prevents overlapping runs; malformed records → log context + configured policy (skip/dead-letter/fail); timezone bugs tested via injected clock; concurrent runs → locking/partitioning; mid-run crash → resume from consistent checkpoint.
|
|
123
|
+
- **Double validation:** one out-of-band real-clock check validates production clock wiring (catches "tests UTC, prod container-local"); source/sink contracts pin the shape, post-deploy checks confirm ongoing alignment; a real-scheduler check in non-prod confirms entrypoint discovery, cron timing, env/secret resolution, concurrency policy.
|
|
124
|
+
- **Pipeline:** unit + component + contract Stage 1; adapter integration out-of-band on a schedule, regardless of ownership; small deployed-binary set out-of-band on a schedule; real-clock + real-scheduler checks out-of-band scheduled vs non-prod; post-deploy synthetic invocation verifies it ran, processed records, met SLO.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Quick Reference: Isolation Strategy by Pattern
|
|
129
|
+
|
|
130
|
+
| Pattern | Double to run pre-merge without config | Validated by |
|
|
131
|
+
|---------|----------------------------------------|--------------|
|
|
132
|
+
| User Interface | Network-layer backend stub (real browser) | Consumer contracts + post-deploy E2E |
|
|
133
|
+
| API Provider | In-memory repository + event bus | Adapter integration (real DB container) + provider contracts |
|
|
134
|
+
| API Consumer | Owned adapter over upstream client | 4-layer: consumer contract + adapter integration + provider verify + post-deploy |
|
|
135
|
+
| Event Consumer | Broker double | Adapter integration (real broker container) + schema contracts |
|
|
136
|
+
| Event Producer | Broker adapter double | Message contract + adapter integration + post-deploy synthetic |
|
|
137
|
+
| Stateful Service | Persistence double + controlled time/ordering | Adapter integration + cluster testcontainers |
|
|
138
|
+
| CLI / Library | Adapters over external deps | Deployed-binary smoke |
|
|
139
|
+
| Scheduled Job | In-memory source/sink fakes + injected clock | Adapter integration + real-clock + real-scheduler out-of-band |
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Database Change Management
|
|
2
|
+
|
|
3
|
+
Reference for evolving a schema while keeping every release candidate
|
|
4
|
+
deployable and every change reversible. Source: *Continuous Delivery* (Humble &
|
|
5
|
+
Farley) Ch.12. This file is about **changing** the database safely in a CD
|
|
6
|
+
pipeline; for **testing** against a database see `database-test-patterns.md`.
|
|
7
|
+
|
|
8
|
+
The governing rule: **a schema change must never block a deploy or a rollback.**
|
|
9
|
+
The application and the database evolve on independent clocks, so any single
|
|
10
|
+
change must work with both the old and the new application version.
|
|
11
|
+
|
|
12
|
+
## Everything is a versioned, scripted migration
|
|
13
|
+
|
|
14
|
+
- The database has a **version** (a row in a `schema_version` / `migrations`
|
|
15
|
+
table). A migration tool (Flyway, Liquibase, `dbmate`, Rails/Alembic/EF
|
|
16
|
+
migrations) computes which scripts to apply to move from the current version to
|
|
17
|
+
the target and runs them at deploy time.
|
|
18
|
+
- Every change is a **script in version control** — initialization and each
|
|
19
|
+
migration. No manual SQL against any environment, including production. The
|
|
20
|
+
scripts provision any database in the pipeline from empty to current.
|
|
21
|
+
- Each forward (roll-forward) script has a matching **roll-back script**. Test
|
|
22
|
+
both: applying then reverting a migration must return the schema to its prior
|
|
23
|
+
shape.
|
|
24
|
+
|
|
25
|
+
## Expand / contract (the parallel-change pattern)
|
|
26
|
+
|
|
27
|
+
A change that would break the running application if applied in one step is split
|
|
28
|
+
into backward-compatible phases. This is the core technique for zero-downtime.
|
|
29
|
+
|
|
30
|
+
| Phase | What happens | Compatibility |
|
|
31
|
+
|-------|--------------|---------------|
|
|
32
|
+
| **Expand** | Add the new structure (new column/table/index) without removing the old. Backfill data. New and old code both work. | Deploy independently of the app |
|
|
33
|
+
| **Migrate** | Ship app code that writes to both old and new, reads new. Backfill completes. | Old code still works |
|
|
34
|
+
| **Contract** | Once no running app version references the old structure, drop it in a later release. | Only after the app no longer needs it |
|
|
35
|
+
|
|
36
|
+
Example — rename `qty` → `quantity`: add `quantity` (expand) → dual-write and
|
|
37
|
+
backfill → switch reads → drop `qty` in a subsequent release (contract). The
|
|
38
|
+
rename is never a single `ALTER ... RENAME` that breaks the deployed app.
|
|
39
|
+
|
|
40
|
+
## Make changes reversible without data loss
|
|
41
|
+
|
|
42
|
+
| Change | Reversible approach |
|
|
43
|
+
|--------|---------------------|
|
|
44
|
+
| Drop column/table | Copy data to a temp/archive table first (preserve keys + constraints); the roll-back restores from it. Never drop in the same release that stops using it. |
|
|
45
|
+
| Narrow a type / add NOT NULL | Add nullable, backfill, enforce in a later release once data is clean |
|
|
46
|
+
| Add a constraint | Validate existing data first; add as `NOT VALID` then validate, so the lock is short |
|
|
47
|
+
| Destructive data fix | Snapshot affected rows before the change so the roll-back script can replay them |
|
|
48
|
+
|
|
49
|
+
For zero-downtime where transactions are in flight, prefer **cache-and-replay**
|
|
50
|
+
or a blue-green database (backup/restore on the standby) over an in-place
|
|
51
|
+
destructive change.
|
|
52
|
+
|
|
53
|
+
## Decouple database change from application change
|
|
54
|
+
|
|
55
|
+
- Design the app so the database can migrate **independently** of the app upgrade
|
|
56
|
+
— the schema is at a version the current *and* next app version both accept.
|
|
57
|
+
- Let the data owner (DBA or the owning team) evolve the schema incrementally;
|
|
58
|
+
the app does not assume the two deploy atomically.
|
|
59
|
+
- For shared or orchestrated databases, rehearse the change in a production-like
|
|
60
|
+
(SIT) environment before production.
|
|
61
|
+
|
|
62
|
+
## Detection — flag these in review
|
|
63
|
+
|
|
64
|
+
| Signal | Risk | Fix direction |
|
|
65
|
+
|--------|------|---------------|
|
|
66
|
+
| A migration that `DROP`s or `RENAME`s a column/table referenced by the same release's app code | Breaks running app during rollout; blocks rollback | Split into expand/contract across releases |
|
|
67
|
+
| A roll-forward script with no roll-back script | Cannot roll back the release | Author the paired reversal; test it |
|
|
68
|
+
| `NOT NULL` / new constraint added without a backfill step | Migration fails or locks on real data | Add nullable → backfill → enforce later |
|
|
69
|
+
| App code and schema assumed to deploy atomically (read of a column added in the same deploy) | Old app instances error mid-rollout | Make the change backward-compatible (expand first) |
|
|
70
|
+
| Manual SQL in a runbook instead of a versioned script | No audit trail, not reproducible, drifts across environments | Move into a migration script in version control |
|
|
71
|
+
|
|
72
|
+
## How this connects to the rest of the toolkit
|
|
73
|
+
|
|
74
|
+
- **`database-test-patterns.md`** — how to *test* against a database (isolation,
|
|
75
|
+
teardown, real-vs-fake); this file is how to *change* one safely.
|
|
76
|
+
- **`release-strategies.md`** — expand/contract is the data-tier counterpart of
|
|
77
|
+
decoupling deploy from release; blue-green and canary assume the schema is
|
|
78
|
+
compatible across the versions running side by side.
|
|
79
|
+
- **`deployment-pipeline.md`** — migrations run as an automated, scripted step of
|
|
80
|
+
the same deploy process in every environment.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Database Test Patterns
|
|
2
|
+
|
|
3
|
+
Reference file for the `cd-test-architecture` and `test-design-advisor` skills and the `test-smell-review` agent. Tests that touch a real database are the most common source of Erratic Tests, Test Run Wars, and Slow Tests — and the hardest to make safe for a CD pipeline. This file covers how to **isolate**, **tear down**, and **avoid** database state so persistence tests stay independent and repeatable.
|
|
4
|
+
|
|
5
|
+
Source: Gerard Meszaros, *xUnit Test Patterns* (xunitpatterns.com) — Ch. 13 *Testing with Databases* and Ch. 25 *Database Patterns*. Language- and engine-agnostic.
|
|
6
|
+
|
|
7
|
+
Core principle: **a database test must leave the world exactly as it found it, and must not collide with any other test or test run.** State that leaks across tests creates order-dependence (Interacting Tests); state shared across concurrent runs creates Test Run Wars. The whole game is isolation + reliable teardown — or removing the database from the test entirely.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## First question: does this test need a real database at all?
|
|
12
|
+
|
|
13
|
+
Most logic that *uses* data does not need to test the *database engine*. Push the decision down:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
What is actually under test?
|
|
17
|
+
├─ Business logic that happens to read/write data
|
|
18
|
+
│ └─ Replace persistence with a Fake (in-memory repository / In-Memory Database).
|
|
19
|
+
│ Fast, deterministic, pre-merge-gate safe. This is the default. (see test-doubles.md)
|
|
20
|
+
│
|
|
21
|
+
├─ The mapping/queries themselves (ORM config, SQL, schema constraints)
|
|
22
|
+
│ └─ A real database IS the SUT — use the isolation + teardown patterns below.
|
|
23
|
+
│
|
|
24
|
+
└─ Stored procedures / DB-side logic
|
|
25
|
+
└─ Stored Procedure Test against a real engine, isolated per run.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
A suite that spins up the whole database to test ordinary domain logic is the **Slow Tests** smell with a side of fragility. Reserve real-DB tests for the cases where the persistence layer itself is the thing being verified.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Isolation: keep test runs from colliding
|
|
33
|
+
|
|
34
|
+
| Pattern | What it does | Trade-off |
|
|
35
|
+
|---------|-------------|-----------|
|
|
36
|
+
| **Database Sandbox** | Each developer / CI runner gets its **own** database, so no two runs share rows | The baseline. Without it, concurrent runs cause Test Run Wars |
|
|
37
|
+
| → *Dedicated Database Sandbox* | A separate lightweight DB instance per user/runner | Most flexible (schema changes allowed); needs a per-runner instance |
|
|
38
|
+
| → *DB Schema per Test Runner* | One engine, a separate **schema** per runner; an Immutable Shared Fixture can live in a common schema | Cheaper; users can't diverge the structure |
|
|
39
|
+
|
|
40
|
+
A Sandbox separates *runs* from each other; it does **not** make the tests *within* a run independent — that still requires a Fresh Fixture per test plus the teardown below.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Teardown: undo what the test did
|
|
45
|
+
|
|
46
|
+
Pick the cheapest teardown that fully restores state. Prefer rollback; fall back to truncation.
|
|
47
|
+
|
|
48
|
+
| Pattern | How it cleans up | Use when | Caveats |
|
|
49
|
+
|---------|------------------|----------|---------|
|
|
50
|
+
| **Transaction Rollback Teardown** | Run the whole test in a transaction; roll back at the end so nothing commits | A Fresh-Fixture test on an engine with rollback; **fastest** and schema-change-proof | The SUT must **never commit** — it must run inside a transaction owned by a *Humble Transaction Controller* (`testability-patterns.md`). A stray commit silently defeats it |
|
|
51
|
+
| **Table Truncation Teardown** | Delete/truncate the tables the test populated | The SUT commits, or rollback isn't usable | Must truncate in FK-safe order; more teardown code to maintain |
|
|
52
|
+
| **Delete-by-key / scoped cleanup** | Remove just the rows this test created (often via *Automated Teardown* tracking inserted keys) | Targeted cleanup in a shared schema | Easy to miss a table → leaked state |
|
|
53
|
+
|
|
54
|
+
Rule of thumb: **Transaction Rollback Teardown** when the design permits it (and design *toward* permitting it via a Humble Transaction Controller); **Table Truncation Teardown** when commits are unavoidable.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Stored Procedure Test
|
|
59
|
+
|
|
60
|
+
When logic lives in the database (procedures, triggers, functions), it still deserves a test: arrange inputs in tables/parameters, invoke the procedure, verify the returned result set or the resulting table state, then tear down (rollback or truncation). Treat the procedure as the SUT and apply the same isolation. Note that DB-side logic is harder to keep under the pyramid's fast layers — prefer moving non-trivial logic *out* of the database where the team's primary tooling can test it (*Ensure Commensurate Effort*, `test-automation-principles.md`).
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## CD pipeline placement
|
|
65
|
+
|
|
66
|
+
- A real database makes a test roughly **an order of magnitude slower** than an in-memory equivalent — Meszaros cites ~50× for round-trips. That cost decides pipeline stage.
|
|
67
|
+
- **Pre-merge gate:** Fake/in-memory persistence (deterministic, no external config). This is where the bulk of data-touching tests belong.
|
|
68
|
+
- **Later stage:** the narrow band of real-DB tests that verify mapping/schema/procedures, running against a per-runner Sandbox with rollback or truncation teardown.
|
|
69
|
+
- A database test that needs a human to seed data or reset state is the **Manual Intervention** smell and cannot gate a pipeline — automate the setup or it doesn't ship. See `cd-test-architecture.md` for the determinism→stage rule this feeds into.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## How this connects to the rest of the toolkit
|
|
74
|
+
|
|
75
|
+
- **`cd-test-architecture.md`** — owns the determinism→pipeline-stage decision; this file supplies the persistence-specific isolation/teardown that makes a DB test gate-eligible.
|
|
76
|
+
- **`test-doubles.md`** — the Fake Object (in-memory DB/repository) that lets most data-logic tests avoid a real database entirely.
|
|
77
|
+
- **`testability-patterns.md`** — the *Humble Transaction Controller* (a Humble Object) that Transaction Rollback Teardown depends on.
|
|
78
|
+
- **`test-smells.md`** — Erratic Test (Test Run War, Interacting Tests), Slow Tests, Manual Intervention: the smells unmanaged database state produces.
|
|
79
|
+
- **`test-strategy.md` / `fixture-construction.md`** — Fresh vs. Shared Fixture and Automated Teardown, the general machinery this specializes for databases.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Decision Defaults
|
|
2
|
+
|
|
3
|
+
High-reversal-cost decision axes that recur across tasks and, when guessed wrong,
|
|
4
|
+
force an interrupt and rework. For each axis: the trigger that raises it, the default
|
|
5
|
+
stance, and what to confirm before committing. Screen every non-trivial request
|
|
6
|
+
against this list during discovery; surface any ambiguous axis in a single upfront
|
|
7
|
+
batch — **each with its recommended default attached** — rather than guessing and
|
|
8
|
+
being corrected later. A surfaced axis with no recommended default is incomplete: it
|
|
9
|
+
makes the user do the deciding from a blank, which is the menu anti-pattern this list
|
|
10
|
+
exists to prevent. State your best answer for each axis and let the user override it.
|
|
11
|
+
|
|
12
|
+
These are defaults, not laws — an explicit user instruction always wins. The point is
|
|
13
|
+
to resolve the axis *before* building, not to relitigate it mid-stream.
|
|
14
|
+
|
|
15
|
+
**Non-interactive runs.** When no human can answer the upfront batch (headless
|
|
16
|
+
`/plan`/`/build`, `--yes`, `DEV_TEAM_AUTO_APPROVE=1`), surfacing degrades to
|
|
17
|
+
recording: take the recommended default for every ambiguous axis, state each axis and
|
|
18
|
+
stance in the plan (and, via `/pr`, the PR body) — and **never take a non-default
|
|
19
|
+
stance on any axis without an explicit user instruction**. A non-default stance with
|
|
20
|
+
nobody present to confirm it is a guess, not a decision; if the task appears to
|
|
21
|
+
require one, that is an escalation, not an assumption.
|
|
22
|
+
|
|
23
|
+
## Destructive shape: replace vs. merge
|
|
24
|
+
|
|
25
|
+
Trigger: a request writes config, settings, dotfiles, or installer output where prior
|
|
26
|
+
content may exist. Default: **recommend merge — preserve existing content** — because
|
|
27
|
+
it is the reversible option; a clean replace discards prior settings and is hard to
|
|
28
|
+
undo. Surface the choice before acting, but always with that merge default attached —
|
|
29
|
+
never a bare "merge or replace?". Confirm: does the user want existing content
|
|
30
|
+
preserved (merge, the recommended default) or overwritten (replace)? When unstated and
|
|
31
|
+
the target is non-trivial, surface the choice with the merge default and proceed once
|
|
32
|
+
it is resolved; do not silently act in either direction.
|
|
33
|
+
|
|
34
|
+
## Format fidelity: preserve the native format
|
|
35
|
+
|
|
36
|
+
Trigger: handling a vector or structured asset (SVG, source diagram, lossless data).
|
|
37
|
+
Default: preserve the native, lossless form; do not down-convert (for example, SVG to
|
|
38
|
+
PNG) for convenience. Confirm: if a conversion seems necessary, name the reason and
|
|
39
|
+
get agreement before doing it.
|
|
40
|
+
|
|
41
|
+
## Evolution: migrate vs. edit a stub in place
|
|
42
|
+
|
|
43
|
+
Trigger: a target has been renamed, deprecated, or replaced by a successor (a plugin,
|
|
44
|
+
module, or file with a forwarding stub). Default: migrate to the current target rather
|
|
45
|
+
than editing the deprecated stub in place. Confirm: verify which artifact is canonical
|
|
46
|
+
before changing it — a stub edit that looks done can leave the real target untouched.
|
|
47
|
+
|
|
48
|
+
## Integration: auto-merge vs. direct-to-trunk
|
|
49
|
+
|
|
50
|
+
Trigger: landing changes on a shared branch. Default: open a PR and use auto-merge
|
|
51
|
+
gated on green checks rather than merging directly to trunk. Confirm: only merge
|
|
52
|
+
directly when the user has asked for it; a direct merge can bypass checks and lose work.
|
|
53
|
+
|
|
54
|
+
## Scope: touch only what was requested
|
|
55
|
+
|
|
56
|
+
Trigger: a request names specific files, slides, or targets. Default: change only
|
|
57
|
+
those; do not expand scope to adjacent items. Confirm: if neighboring changes seem
|
|
58
|
+
warranted, propose them separately rather than folding them in unasked.
|
|
59
|
+
|
|
60
|
+
## Re-capture: keep vs. overwrite an existing tracked artifact
|
|
61
|
+
|
|
62
|
+
Trigger: a worker is about to re-run an expensive capture for an artifact that
|
|
63
|
+
already has a tracked copy for the same key (e.g. a coverage baseline, a mutation
|
|
64
|
+
history entry, a benchmark snapshot). Default: **keep** — recommend reuse of the
|
|
65
|
+
existing tracked artifact, and confirm before discarding what may be a comparison
|
|
66
|
+
baseline. Overwriting without confirmation risks silently invalidating the
|
|
67
|
+
baseline every later phase measures against.
|
|
68
|
+
|
|
69
|
+
Mechanics:
|
|
70
|
+
|
|
71
|
+
- **Interactive**: prompt keep/overwrite with default keep. An unrecognized answer
|
|
72
|
+
(anything other than "keep" or "overwrite", case-insensitive) re-prompts with the
|
|
73
|
+
identical choice — never silently falls back to either option. There is no retry
|
|
74
|
+
limit and no timeout; the guard keeps re-prompting until it receives "keep" or
|
|
75
|
+
"overwrite".
|
|
76
|
+
- **Non-interactive** (no usable TTY, or `DEV_TEAM_AUTO_APPROVE=1`): keep the
|
|
77
|
+
existing tracked artifact automatically, without prompting. The auto-decision is
|
|
78
|
+
both **logged** (to the worker's own record/audit trail) **and echoed** to run
|
|
79
|
+
output — a decision recorded only to a file the operator never sees is not an
|
|
80
|
+
auto-decision the operator can trust.
|
|
81
|
+
- **Existing file is malformed or corrupt**: if the existing tracked artifact fails to parse
|
|
82
|
+
(e.g. invalid JSON from a prior interrupted write), treat it as absent — never
|
|
83
|
+
silently keep a file that cannot be read back. Emit a warning naming why a fresh
|
|
84
|
+
capture is happening.
|
|
85
|
+
|
|
86
|
+
Confirm: on overwrite, replace the tracked artifact with the fresh capture; on keep
|
|
87
|
+
(or an equivalent non-interactive default), skip the expensive capture entirely and
|
|
88
|
+
reuse the existing artifact's recorded values.
|