@accelerationguy/accel 1.0.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/CLAUDE.md +19 -0
- package/LICENSE +33 -0
- package/README.md +275 -0
- package/bin/install.js +661 -0
- package/docs/getting-started.md +164 -0
- package/docs/module-guide.md +139 -0
- package/modules/drive/LICENSE +21 -0
- package/modules/drive/PAUL-VS-GSD.md +171 -0
- package/modules/drive/README.md +555 -0
- package/modules/drive/assets/terminal.svg +67 -0
- package/modules/drive/bin/install.js +210 -0
- package/modules/drive/integration.js +76 -0
- package/modules/drive/package.json +38 -0
- package/modules/drive/src/commands/add-phase.md +36 -0
- package/modules/drive/src/commands/apply.md +83 -0
- package/modules/drive/src/commands/assumptions.md +37 -0
- package/modules/drive/src/commands/audit.md +57 -0
- package/modules/drive/src/commands/complete-milestone.md +36 -0
- package/modules/drive/src/commands/config.md +175 -0
- package/modules/drive/src/commands/consider-issues.md +41 -0
- package/modules/drive/src/commands/discover.md +48 -0
- package/modules/drive/src/commands/discuss-milestone.md +33 -0
- package/modules/drive/src/commands/discuss.md +34 -0
- package/modules/drive/src/commands/flows.md +73 -0
- package/modules/drive/src/commands/handoff.md +201 -0
- package/modules/drive/src/commands/help.md +525 -0
- package/modules/drive/src/commands/init.md +54 -0
- package/modules/drive/src/commands/map-codebase.md +34 -0
- package/modules/drive/src/commands/milestone.md +34 -0
- package/modules/drive/src/commands/pause.md +44 -0
- package/modules/drive/src/commands/plan-fix.md +216 -0
- package/modules/drive/src/commands/plan.md +36 -0
- package/modules/drive/src/commands/progress.md +138 -0
- package/modules/drive/src/commands/register.md +29 -0
- package/modules/drive/src/commands/remove-phase.md +37 -0
- package/modules/drive/src/commands/research-phase.md +209 -0
- package/modules/drive/src/commands/research.md +47 -0
- package/modules/drive/src/commands/resume.md +49 -0
- package/modules/drive/src/commands/status.md +78 -0
- package/modules/drive/src/commands/unify.md +87 -0
- package/modules/drive/src/commands/verify.md +60 -0
- package/modules/drive/src/references/checkpoints.md +234 -0
- package/modules/drive/src/references/context-management.md +219 -0
- package/modules/drive/src/references/git-strategy.md +206 -0
- package/modules/drive/src/references/loop-phases.md +254 -0
- package/modules/drive/src/references/plan-format.md +263 -0
- package/modules/drive/src/references/quality-principles.md +152 -0
- package/modules/drive/src/references/research-quality-control.md +247 -0
- package/modules/drive/src/references/sonarqube-integration.md +244 -0
- package/modules/drive/src/references/specialized-workflow-integration.md +186 -0
- package/modules/drive/src/references/subagent-criteria.md +179 -0
- package/modules/drive/src/references/tdd.md +219 -0
- package/modules/drive/src/references/work-units.md +161 -0
- package/modules/drive/src/rules/commands.md +108 -0
- package/modules/drive/src/rules/references.md +107 -0
- package/modules/drive/src/rules/style.md +123 -0
- package/modules/drive/src/rules/templates.md +51 -0
- package/modules/drive/src/rules/workflows.md +133 -0
- package/modules/drive/src/templates/CONTEXT.md +88 -0
- package/modules/drive/src/templates/DEBUG.md +164 -0
- package/modules/drive/src/templates/DISCOVERY.md +148 -0
- package/modules/drive/src/templates/HANDOFF.md +77 -0
- package/modules/drive/src/templates/ISSUES.md +93 -0
- package/modules/drive/src/templates/MILESTONES.md +167 -0
- package/modules/drive/src/templates/PLAN.md +328 -0
- package/modules/drive/src/templates/PROJECT.md +219 -0
- package/modules/drive/src/templates/RESEARCH.md +130 -0
- package/modules/drive/src/templates/ROADMAP.md +328 -0
- package/modules/drive/src/templates/SPECIAL-FLOWS.md +70 -0
- package/modules/drive/src/templates/STATE.md +210 -0
- package/modules/drive/src/templates/SUMMARY.md +221 -0
- package/modules/drive/src/templates/UAT-ISSUES.md +139 -0
- package/modules/drive/src/templates/codebase/architecture.md +259 -0
- package/modules/drive/src/templates/codebase/concerns.md +329 -0
- package/modules/drive/src/templates/codebase/conventions.md +311 -0
- package/modules/drive/src/templates/codebase/integrations.md +284 -0
- package/modules/drive/src/templates/codebase/stack.md +190 -0
- package/modules/drive/src/templates/codebase/structure.md +287 -0
- package/modules/drive/src/templates/codebase/testing.md +484 -0
- package/modules/drive/src/templates/config.md +181 -0
- package/modules/drive/src/templates/milestone-archive.md +236 -0
- package/modules/drive/src/templates/milestone-context.md +190 -0
- package/modules/drive/src/templates/paul-json.md +147 -0
- package/modules/drive/src/vector-config/PAUL +26 -0
- package/modules/drive/src/vector-config/PAUL.manifest +11 -0
- package/modules/drive/src/workflows/apply-phase.md +393 -0
- package/modules/drive/src/workflows/audit-plan.md +344 -0
- package/modules/drive/src/workflows/complete-milestone.md +479 -0
- package/modules/drive/src/workflows/configure-special-flows.md +283 -0
- package/modules/drive/src/workflows/consider-issues.md +172 -0
- package/modules/drive/src/workflows/create-milestone.md +268 -0
- package/modules/drive/src/workflows/debug.md +292 -0
- package/modules/drive/src/workflows/discovery.md +187 -0
- package/modules/drive/src/workflows/discuss-milestone.md +245 -0
- package/modules/drive/src/workflows/discuss-phase.md +231 -0
- package/modules/drive/src/workflows/init-project.md +698 -0
- package/modules/drive/src/workflows/map-codebase.md +459 -0
- package/modules/drive/src/workflows/pause-work.md +259 -0
- package/modules/drive/src/workflows/phase-assumptions.md +181 -0
- package/modules/drive/src/workflows/plan-phase.md +385 -0
- package/modules/drive/src/workflows/quality-gate.md +263 -0
- package/modules/drive/src/workflows/register-manifest.md +107 -0
- package/modules/drive/src/workflows/research.md +241 -0
- package/modules/drive/src/workflows/resume-project.md +200 -0
- package/modules/drive/src/workflows/roadmap-management.md +334 -0
- package/modules/drive/src/workflows/transition-phase.md +368 -0
- package/modules/drive/src/workflows/unify-phase.md +290 -0
- package/modules/drive/src/workflows/verify-work.md +241 -0
- package/modules/forge/README.md +281 -0
- package/modules/forge/bin/install.js +200 -0
- package/modules/forge/package.json +32 -0
- package/modules/forge/skillsmith/rules/checklists-rules.md +42 -0
- package/modules/forge/skillsmith/rules/context-rules.md +43 -0
- package/modules/forge/skillsmith/rules/entry-point-rules.md +44 -0
- package/modules/forge/skillsmith/rules/frameworks-rules.md +43 -0
- package/modules/forge/skillsmith/rules/tasks-rules.md +52 -0
- package/modules/forge/skillsmith/rules/templates-rules.md +43 -0
- package/modules/forge/skillsmith/skillsmith.md +82 -0
- package/modules/forge/skillsmith/tasks/audit.md +277 -0
- package/modules/forge/skillsmith/tasks/discover.md +145 -0
- package/modules/forge/skillsmith/tasks/distill.md +276 -0
- package/modules/forge/skillsmith/tasks/scaffold.md +349 -0
- package/modules/forge/specs/checklists.md +193 -0
- package/modules/forge/specs/context.md +223 -0
- package/modules/forge/specs/entry-point.md +320 -0
- package/modules/forge/specs/frameworks.md +228 -0
- package/modules/forge/specs/rules.md +245 -0
- package/modules/forge/specs/tasks.md +344 -0
- package/modules/forge/specs/templates.md +335 -0
- package/modules/forge/terminal.svg +70 -0
- package/modules/ignition/README.md +245 -0
- package/modules/ignition/bin/install.js +184 -0
- package/modules/ignition/checklists/planning-quality.md +55 -0
- package/modules/ignition/data/application/config.md +21 -0
- package/modules/ignition/data/application/guide.md +51 -0
- package/modules/ignition/data/application/skill-loadout.md +11 -0
- package/modules/ignition/data/campaign/config.md +18 -0
- package/modules/ignition/data/campaign/guide.md +36 -0
- package/modules/ignition/data/campaign/skill-loadout.md +10 -0
- package/modules/ignition/data/client/config.md +18 -0
- package/modules/ignition/data/client/guide.md +36 -0
- package/modules/ignition/data/client/skill-loadout.md +11 -0
- package/modules/ignition/data/utility/config.md +18 -0
- package/modules/ignition/data/utility/guide.md +31 -0
- package/modules/ignition/data/utility/skill-loadout.md +8 -0
- package/modules/ignition/data/workflow/config.md +19 -0
- package/modules/ignition/data/workflow/guide.md +41 -0
- package/modules/ignition/data/workflow/skill-loadout.md +10 -0
- package/modules/ignition/integration.js +54 -0
- package/modules/ignition/package.json +35 -0
- package/modules/ignition/seed.md +81 -0
- package/modules/ignition/tasks/add-type.md +164 -0
- package/modules/ignition/tasks/graduate.md +182 -0
- package/modules/ignition/tasks/ideate.md +221 -0
- package/modules/ignition/tasks/launch.md +137 -0
- package/modules/ignition/tasks/status.md +71 -0
- package/modules/ignition/templates/planning-application.md +193 -0
- package/modules/ignition/templates/planning-campaign.md +138 -0
- package/modules/ignition/templates/planning-client.md +149 -0
- package/modules/ignition/templates/planning-utility.md +112 -0
- package/modules/ignition/templates/planning-workflow.md +125 -0
- package/modules/ignition/terminal.svg +74 -0
- package/modules/mission-control/CONTEXT-CONTINUITY-SPEC.md +293 -0
- package/modules/mission-control/CONTEXT-ENGINEERING-GUIDE.md +282 -0
- package/modules/mission-control/README.md +91 -0
- package/modules/mission-control/assets/terminal.svg +80 -0
- package/modules/mission-control/examples/entities.example.json +133 -0
- package/modules/mission-control/examples/projects.example.json +318 -0
- package/modules/mission-control/examples/state.example.json +183 -0
- package/modules/mission-control/examples/vector.example.json +245 -0
- package/modules/mission-control/mission-control/checklists/install-verification.md +46 -0
- package/modules/mission-control/mission-control/frameworks/framework-registry.md +83 -0
- package/modules/mission-control/mission-control/mission-control.md +83 -0
- package/modules/mission-control/mission-control/tasks/insights.md +73 -0
- package/modules/mission-control/mission-control/tasks/install.md +194 -0
- package/modules/mission-control/mission-control/tasks/status.md +125 -0
- package/modules/mission-control/schemas/entities.schema.json +89 -0
- package/modules/mission-control/schemas/projects.schema.json +221 -0
- package/modules/mission-control/schemas/state.schema.json +108 -0
- package/modules/mission-control/schemas/vector.schema.json +200 -0
- package/modules/momentum/README.md +678 -0
- package/modules/momentum/bin/install.js +563 -0
- package/modules/momentum/integration.js +131 -0
- package/modules/momentum/package.json +42 -0
- package/modules/momentum/schemas/entities.schema.json +89 -0
- package/modules/momentum/schemas/projects.schema.json +221 -0
- package/modules/momentum/schemas/state.schema.json +108 -0
- package/modules/momentum/src/commands/audit-claude-md.md +31 -0
- package/modules/momentum/src/commands/audit.md +33 -0
- package/modules/momentum/src/commands/groom.md +35 -0
- package/modules/momentum/src/commands/history.md +27 -0
- package/modules/momentum/src/commands/pulse.md +33 -0
- package/modules/momentum/src/commands/scaffold.md +33 -0
- package/modules/momentum/src/commands/status.md +28 -0
- package/modules/momentum/src/commands/surface-convert.md +35 -0
- package/modules/momentum/src/commands/surface-create.md +34 -0
- package/modules/momentum/src/commands/surface-list.md +27 -0
- package/modules/momentum/src/commands/vector-hygiene.md +33 -0
- package/modules/momentum/src/framework/context/momentum-principles.md +71 -0
- package/modules/momentum/src/framework/frameworks/audit-strategies.md +53 -0
- package/modules/momentum/src/framework/frameworks/satellite-registration.md +44 -0
- package/modules/momentum/src/framework/tasks/audit-claude-md.md +68 -0
- package/modules/momentum/src/framework/tasks/audit.md +64 -0
- package/modules/momentum/src/framework/tasks/groom.md +164 -0
- package/modules/momentum/src/framework/tasks/history.md +34 -0
- package/modules/momentum/src/framework/tasks/pulse.md +83 -0
- package/modules/momentum/src/framework/tasks/scaffold.md +202 -0
- package/modules/momentum/src/framework/tasks/status.md +35 -0
- package/modules/momentum/src/framework/tasks/surface-convert.md +143 -0
- package/modules/momentum/src/framework/tasks/surface-create.md +184 -0
- package/modules/momentum/src/framework/tasks/surface-list.md +42 -0
- package/modules/momentum/src/framework/tasks/vector-hygiene.md +160 -0
- package/modules/momentum/src/framework/templates/workspace-json.md +96 -0
- package/modules/momentum/src/hooks/_template.py +129 -0
- package/modules/momentum/src/hooks/active-hook.py +178 -0
- package/modules/momentum/src/hooks/backlog-hook.py +115 -0
- package/modules/momentum/src/hooks/mission-control-insights.py +169 -0
- package/modules/momentum/src/hooks/momentum-pulse-check.py +351 -0
- package/modules/momentum/src/hooks/operator.py +53 -0
- package/modules/momentum/src/hooks/psmm-injector.py +67 -0
- package/modules/momentum/src/hooks/satellite-detection.py +248 -0
- package/modules/momentum/src/packages/momentum-mcp/index.js +119 -0
- package/modules/momentum/src/packages/momentum-mcp/package.json +10 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/entities.js +226 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/operator.js +106 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/projects.js +322 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/psmm.js +206 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/state.js +199 -0
- package/modules/momentum/src/packages/momentum-mcp/tools/surfaces.js +404 -0
- package/modules/momentum/src/skill/momentum.md +111 -0
- package/modules/momentum/src/tasks/groom.md +164 -0
- package/modules/momentum/src/templates/operator.json +66 -0
- package/modules/momentum/src/templates/workspace.json +111 -0
- package/modules/momentum/terminal.svg +77 -0
- package/modules/radar/README.md +1552 -0
- package/modules/radar/commands/audit.md +233 -0
- package/modules/radar/commands/guardrails.md +194 -0
- package/modules/radar/commands/init.md +207 -0
- package/modules/radar/commands/playbook.md +176 -0
- package/modules/radar/commands/remediate.md +156 -0
- package/modules/radar/commands/report.md +172 -0
- package/modules/radar/commands/resume.md +176 -0
- package/modules/radar/commands/status.md +148 -0
- package/modules/radar/commands/transform.md +205 -0
- package/modules/radar/commands/validate.md +177 -0
- package/modules/radar/docs/ARCHITECTURE.md +336 -0
- package/modules/radar/docs/GETTING-STARTED.md +287 -0
- package/modules/radar/docs/standards/agents.md +197 -0
- package/modules/radar/docs/standards/commands.md +250 -0
- package/modules/radar/docs/standards/domains.md +191 -0
- package/modules/radar/docs/standards/personas.md +211 -0
- package/modules/radar/docs/standards/rules.md +218 -0
- package/modules/radar/docs/standards/runtime.md +445 -0
- package/modules/radar/docs/standards/schemas.md +269 -0
- package/modules/radar/docs/standards/tools.md +273 -0
- package/modules/radar/docs/standards/workflows.md +254 -0
- package/modules/radar/docs/terminal.svg +72 -0
- package/modules/radar/docs/validation/convention-compliance-report.md +183 -0
- package/modules/radar/docs/validation/cross-reference-report.md +195 -0
- package/modules/radar/docs/validation/validation-summary.md +118 -0
- package/modules/radar/docs/validation/version-manifest.yaml +363 -0
- package/modules/radar/install.sh +711 -0
- package/modules/radar/integration.js +53 -0
- package/modules/radar/src/core/agents/architect.md +25 -0
- package/modules/radar/src/core/agents/compliance-officer.md +25 -0
- package/modules/radar/src/core/agents/data-engineer.md +25 -0
- package/modules/radar/src/core/agents/devils-advocate.md +22 -0
- package/modules/radar/src/core/agents/performance-engineer.md +25 -0
- package/modules/radar/src/core/agents/principal-engineer.md +23 -0
- package/modules/radar/src/core/agents/reality-gap-analyst.md +22 -0
- package/modules/radar/src/core/agents/security-engineer.md +25 -0
- package/modules/radar/src/core/agents/senior-app-engineer.md +25 -0
- package/modules/radar/src/core/agents/sre.md +25 -0
- package/modules/radar/src/core/agents/staff-engineer.md +23 -0
- package/modules/radar/src/core/agents/test-engineer.md +25 -0
- package/modules/radar/src/core/personas/architect.md +111 -0
- package/modules/radar/src/core/personas/compliance-officer.md +104 -0
- package/modules/radar/src/core/personas/data-engineer.md +113 -0
- package/modules/radar/src/core/personas/devils-advocate.md +105 -0
- package/modules/radar/src/core/personas/performance-engineer.md +119 -0
- package/modules/radar/src/core/personas/principal-engineer.md +119 -0
- package/modules/radar/src/core/personas/reality-gap-analyst.md +111 -0
- package/modules/radar/src/core/personas/security-engineer.md +108 -0
- package/modules/radar/src/core/personas/senior-app-engineer.md +111 -0
- package/modules/radar/src/core/personas/sre.md +117 -0
- package/modules/radar/src/core/personas/staff-engineer.md +109 -0
- package/modules/radar/src/core/personas/test-engineer.md +109 -0
- package/modules/radar/src/core/workflows/disagreement-resolution.md +183 -0
- package/modules/radar/src/core/workflows/phase-0-context.md +148 -0
- package/modules/radar/src/core/workflows/phase-1-reconnaissance.md +169 -0
- package/modules/radar/src/core/workflows/phase-2-domain-audits.md +190 -0
- package/modules/radar/src/core/workflows/phase-3-cross-domain.md +177 -0
- package/modules/radar/src/core/workflows/phase-4-adversarial-review.md +165 -0
- package/modules/radar/src/core/workflows/phase-5-report.md +189 -0
- package/modules/radar/src/core/workflows/phase-checkpoint.md +222 -0
- package/modules/radar/src/core/workflows/session-handoff.md +152 -0
- package/modules/radar/src/domains/00-context.md +201 -0
- package/modules/radar/src/domains/01-architecture.md +248 -0
- package/modules/radar/src/domains/02-data.md +224 -0
- package/modules/radar/src/domains/03-correctness.md +230 -0
- package/modules/radar/src/domains/04-security.md +274 -0
- package/modules/radar/src/domains/05-compliance.md +228 -0
- package/modules/radar/src/domains/06-testing.md +228 -0
- package/modules/radar/src/domains/07-reliability.md +246 -0
- package/modules/radar/src/domains/08-performance.md +247 -0
- package/modules/radar/src/domains/09-maintainability.md +271 -0
- package/modules/radar/src/domains/10-operability.md +250 -0
- package/modules/radar/src/domains/11-change-risk.md +246 -0
- package/modules/radar/src/domains/12-team-risk.md +221 -0
- package/modules/radar/src/domains/13-risk-synthesis.md +202 -0
- package/modules/radar/src/rules/agent-boundaries.md +78 -0
- package/modules/radar/src/rules/disagreement-protocol.md +76 -0
- package/modules/radar/src/rules/epistemic-hygiene.md +78 -0
- package/modules/radar/src/schemas/confidence.md +185 -0
- package/modules/radar/src/schemas/disagreement.md +238 -0
- package/modules/radar/src/schemas/finding.md +287 -0
- package/modules/radar/src/schemas/report-section.md +150 -0
- package/modules/radar/src/schemas/signal.md +108 -0
- package/modules/radar/src/tools/checkov.md +463 -0
- package/modules/radar/src/tools/git-history.md +581 -0
- package/modules/radar/src/tools/gitleaks.md +447 -0
- package/modules/radar/src/tools/grype.md +611 -0
- package/modules/radar/src/tools/semgrep.md +378 -0
- package/modules/radar/src/tools/sonarqube.md +550 -0
- package/modules/radar/src/tools/syft.md +539 -0
- package/modules/radar/src/tools/trivy.md +439 -0
- package/modules/radar/src/transform/agents/change-risk-modeler.md +24 -0
- package/modules/radar/src/transform/agents/execution-validator.md +24 -0
- package/modules/radar/src/transform/agents/guardrail-generator.md +24 -0
- package/modules/radar/src/transform/agents/pedagogy-agent.md +24 -0
- package/modules/radar/src/transform/agents/remediation-architect.md +24 -0
- package/modules/radar/src/transform/personas/change-risk-modeler.md +95 -0
- package/modules/radar/src/transform/personas/execution-validator.md +95 -0
- package/modules/radar/src/transform/personas/guardrail-generator.md +103 -0
- package/modules/radar/src/transform/personas/pedagogy-agent.md +105 -0
- package/modules/radar/src/transform/personas/remediation-architect.md +95 -0
- package/modules/radar/src/transform/rules/change-risk-rules.md +87 -0
- package/modules/radar/src/transform/rules/safety-governance.md +87 -0
- package/modules/radar/src/transform/schemas/change-risk.md +139 -0
- package/modules/radar/src/transform/schemas/intervention-level.md +207 -0
- package/modules/radar/src/transform/schemas/playbook.md +205 -0
- package/modules/radar/src/transform/schemas/verification-plan.md +134 -0
- package/modules/radar/src/transform/workflows/phase-6-remediation.md +148 -0
- package/modules/radar/src/transform/workflows/phase-7-risk-validation.md +161 -0
- package/modules/radar/src/transform/workflows/phase-8-execution-planning.md +159 -0
- package/modules/radar/src/transform/workflows/transform-safety.md +158 -0
- package/modules/vector/.vector-template/sessions/.gitkeep +0 -0
- package/modules/vector/.vector-template/vector.json +72 -0
- package/modules/vector/AUDIT-CLAUDEMD.md +154 -0
- package/modules/vector/INSTALL.md +185 -0
- package/modules/vector/LICENSE +21 -0
- package/modules/vector/README.md +409 -0
- package/modules/vector/VECTOR-BLOCK.md +57 -0
- package/modules/vector/assets/terminal.svg +68 -0
- package/modules/vector/bin/install.js +455 -0
- package/modules/vector/bin/migrate-v1-to-v2.sh +492 -0
- package/modules/vector/commands/help.md +46 -0
- package/modules/vector/hooks/vector-hook.py +775 -0
- package/modules/vector/mcp/index.js +118 -0
- package/modules/vector/mcp/package.json +10 -0
- package/modules/vector/mcp/tools/decisions.js +269 -0
- package/modules/vector/mcp/tools/domains.js +361 -0
- package/modules/vector/mcp/tools/staging.js +252 -0
- package/modules/vector/mcp/tools/vector-json.js +647 -0
- package/modules/vector/package.json +38 -0
- package/modules/vector/schemas/vector.schema.json +237 -0
- package/package.json +39 -0
- package/shared/branding/branding.js +70 -0
- package/shared/config/defaults.json +59 -0
- package/shared/events/README.md +175 -0
- package/shared/events/event-bus.js +134 -0
- package/shared/events/event_bus.py +255 -0
- package/shared/events/integrations.js +161 -0
- package/shared/events/schemas/audit-complete.schema.json +21 -0
- package/shared/events/schemas/phase-progress.schema.json +23 -0
- package/shared/events/schemas/plan-created.schema.json +21 -0
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: git-history
|
|
3
|
+
name: Git History Miner
|
|
4
|
+
type: history_mining
|
|
5
|
+
domains_fed: ["11", "12"]
|
|
6
|
+
install_required: false
|
|
7
|
+
install_command: "N/A — uses git, assumed present in any development environment"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Purpose
|
|
11
|
+
|
|
12
|
+
Mines git repository history using native git commands to produce signals about change patterns, ownership concentration, code churn, file age, hotspot detection, and knowledge distribution. Feeds Change Risk & Evolvability (11) and Team, Ownership & Knowledge Risk (12) — the two domains most dependent on longitudinal evidence rather than point-in-time static analysis.
|
|
13
|
+
|
|
14
|
+
Unlike every other Radar tool, Git History Miner requires no installation. Git is assumed present in any development environment where Radar is run. Analysis is performed entirely with standard git CLI commands (`git log`, `git shortlog`, `git diff --stat`, `git blame`).
|
|
15
|
+
|
|
16
|
+
This tool is the primary signal source for Radar Transform's Change Risk Modeler. It produces four Transform-specific inputs: blast radius (via churn), regression probability (via bus factor), coupling risk (via dependency count), and architectural tension (via complexity proxy). The change-risk normalization section is mandatory for Radar Transform integration.
|
|
17
|
+
|
|
18
|
+
Signals are NOT findings. Git History Miner produces evidence that agents interpret within domain context.
|
|
19
|
+
|
|
20
|
+
## Configuration
|
|
21
|
+
|
|
22
|
+
### Time Window Parameters
|
|
23
|
+
|
|
24
|
+
Git history analysis is time-window-sensitive. Shorter windows surface recent velocity; longer windows surface structural patterns. Configure per analysis goal:
|
|
25
|
+
|
|
26
|
+
| Window | Use Case | Command Flag |
|
|
27
|
+
|--------|----------|-------------|
|
|
28
|
+
| 3 months | Sprint-level churn, recent instability | `--since="3 months ago"` |
|
|
29
|
+
| 6 months | Default for most audits | `--since="6 months ago"` |
|
|
30
|
+
| 1 year | Structural ownership patterns | `--since="1 year ago"` |
|
|
31
|
+
| All time | Full history bus factor, total churn | Omit `--since` entirely |
|
|
32
|
+
|
|
33
|
+
**Default configuration for Radar audits:** 6-month window for churn analysis, all-time for bus factor and ownership.
|
|
34
|
+
|
|
35
|
+
### Exclusion Patterns
|
|
36
|
+
|
|
37
|
+
Exclude noise-generating paths before computing churn metrics:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Recommended exclusions via pathspec (append to git log commands)
|
|
41
|
+
-- ':!package-lock.json' ':!yarn.lock' ':!*.lock' ':!dist/' ':!build/' ':!vendor/' ':!node_modules/' ':!*.min.js' ':!*.min.css'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Lock files and generated build artifacts produce false churn signals and must be excluded from hotspot analysis.
|
|
45
|
+
|
|
46
|
+
### Churn Thresholds
|
|
47
|
+
|
|
48
|
+
Configure thresholds per repository size. Defaults assume a medium-sized codebase (20k-100k LOC, 1-5 years of history):
|
|
49
|
+
|
|
50
|
+
| Metric | Low | Medium | High | Critical |
|
|
51
|
+
|--------|-----|--------|------|----------|
|
|
52
|
+
| File modification count (6mo) | <10 | 10-30 | 31-60 | >60 |
|
|
53
|
+
| Unique authors per file (all time) | ≥4 | 3 | 2 | 1 |
|
|
54
|
+
| Co-change coupling ratio | <0.2 | 0.2-0.4 | 0.4-0.7 | >0.7 |
|
|
55
|
+
| Days since last modification | <30 | 30-180 | 181-365 | >365 |
|
|
56
|
+
|
|
57
|
+
Adjust thresholds for large monorepos (higher churn is normal) and new codebases (shorter history reduces confidence).
|
|
58
|
+
|
|
59
|
+
### Output Directory
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Create output directory before running
|
|
63
|
+
mkdir -p {target_path}/.radar/signals/git-history/
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Execution
|
|
67
|
+
|
|
68
|
+
### Prerequisites
|
|
69
|
+
|
|
70
|
+
Git History Miner uses only native git commands. No installation is required beyond git itself.
|
|
71
|
+
|
|
72
|
+
**Verify git availability:**
|
|
73
|
+
```bash
|
|
74
|
+
git --version
|
|
75
|
+
# Required: git 2.20 or later (for --format=format: support and pathspec exclusions)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Verify repository access:**
|
|
79
|
+
```bash
|
|
80
|
+
git -C {target_path} log --oneline -1
|
|
81
|
+
# Must return at least one commit. Bare repositories are not supported.
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Primary Execution Commands
|
|
85
|
+
|
|
86
|
+
**Mode 1: File Churn Analysis**
|
|
87
|
+
|
|
88
|
+
Counts how many times each file was modified in the past 6 months. High-churn files are hotspot candidates.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
git -C {target_path} log \
|
|
92
|
+
--format=format: \
|
|
93
|
+
--name-only \
|
|
94
|
+
--since="6 months ago" \
|
|
95
|
+
-- ':!package-lock.json' ':!yarn.lock' ':!*.lock' ':!dist/' ':!build/' \
|
|
96
|
+
| sort \
|
|
97
|
+
| uniq -c \
|
|
98
|
+
| sort -rn \
|
|
99
|
+
| head -50 \
|
|
100
|
+
> {output_dir}/churn-by-file.txt
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Mode 2: Author Concentration Per File (Bus Factor)**
|
|
104
|
+
|
|
105
|
+
Counts unique authors who have touched each file across all history. Single-author files are knowledge silos.
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Run per file — pipe file list from churn analysis or directory scan
|
|
109
|
+
git -C {target_path} log \
|
|
110
|
+
--format='%aN' \
|
|
111
|
+
-- {file_path} \
|
|
112
|
+
| sort \
|
|
113
|
+
| uniq -c \
|
|
114
|
+
| sort -rn \
|
|
115
|
+
> {output_dir}/authors-{file_slug}.txt
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
For bulk bus factor analysis across top files:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Generate per-file author counts for top 50 files by churn
|
|
122
|
+
git -C {target_path} log \
|
|
123
|
+
--format='%aN %H' \
|
|
124
|
+
--name-only \
|
|
125
|
+
--since="1 year ago" \
|
|
126
|
+
| awk '/^$/{next} /^[a-f0-9]{40}/{author=$1; next} {print author, $0}' \
|
|
127
|
+
| sort -k2 \
|
|
128
|
+
| uniq \
|
|
129
|
+
| awk '{counts[$2]++} END {for(f in counts) print counts[f], f}' \
|
|
130
|
+
| sort -rn \
|
|
131
|
+
> {output_dir}/bus-factor-all-files.txt
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Mode 3: Commit Frequency by File (All Time)**
|
|
135
|
+
|
|
136
|
+
Top 50 most-committed files regardless of recency — surfaces structurally volatile files.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
git -C {target_path} log \
|
|
140
|
+
--pretty=format: \
|
|
141
|
+
--name-only \
|
|
142
|
+
-- ':!package-lock.json' ':!yarn.lock' ':!*.lock' ':!dist/' ':!build/' \
|
|
143
|
+
| sort \
|
|
144
|
+
| uniq -c \
|
|
145
|
+
| sort -rn \
|
|
146
|
+
| head -50 \
|
|
147
|
+
> {output_dir}/commit-frequency-all-time.txt
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Mode 4: Code Age (Last Modified Date Per File)**
|
|
151
|
+
|
|
152
|
+
Identifies stale files (not touched in >1 year) that may contain outdated logic, deprecated patterns, or forgotten technical debt.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Last modification date for every tracked file
|
|
156
|
+
git -C {target_path} ls-files \
|
|
157
|
+
| while read f; do
|
|
158
|
+
last_mod=$(git -C {target_path} log -1 --format="%ai" -- "$f" 2>/dev/null)
|
|
159
|
+
echo "$last_mod $f"
|
|
160
|
+
done \
|
|
161
|
+
| sort \
|
|
162
|
+
> {output_dir}/file-age.txt
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Mode 5: Change Coupling (Co-Change Analysis)**
|
|
166
|
+
|
|
167
|
+
Files modified together in the same commit more than a threshold percentage of the time are implicitly coupled. High coupling between distant files signals hidden dependencies.
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Extract per-commit file sets (last 6 months)
|
|
171
|
+
git -C {target_path} log \
|
|
172
|
+
--format='COMMIT:%H' \
|
|
173
|
+
--name-only \
|
|
174
|
+
--since="6 months ago" \
|
|
175
|
+
-- ':!package-lock.json' ':!yarn.lock' ':!dist/' ':!build/' \
|
|
176
|
+
> {output_dir}/per-commit-files.txt
|
|
177
|
+
|
|
178
|
+
# Post-process in Python to compute pair co-change frequency
|
|
179
|
+
python3 - <<'EOF'
|
|
180
|
+
from collections import defaultdict
|
|
181
|
+
from itertools import combinations
|
|
182
|
+
|
|
183
|
+
commits = []
|
|
184
|
+
current = []
|
|
185
|
+
|
|
186
|
+
with open("{output_dir}/per-commit-files.txt") as f:
|
|
187
|
+
for line in f:
|
|
188
|
+
line = line.strip()
|
|
189
|
+
if line.startswith("COMMIT:"):
|
|
190
|
+
if current:
|
|
191
|
+
commits.append(current)
|
|
192
|
+
current = []
|
|
193
|
+
elif line:
|
|
194
|
+
current.append(line)
|
|
195
|
+
if current:
|
|
196
|
+
commits.append(current)
|
|
197
|
+
|
|
198
|
+
pair_counts = defaultdict(int)
|
|
199
|
+
file_counts = defaultdict(int)
|
|
200
|
+
|
|
201
|
+
for files in commits:
|
|
202
|
+
for f in files:
|
|
203
|
+
file_counts[f] += 1
|
|
204
|
+
for a, b in combinations(sorted(files), 2):
|
|
205
|
+
pair_counts[(a, b)] += 1
|
|
206
|
+
|
|
207
|
+
results = []
|
|
208
|
+
for (a, b), count in pair_counts.items():
|
|
209
|
+
min_appearances = min(file_counts[a], file_counts[b])
|
|
210
|
+
if min_appearances > 0:
|
|
211
|
+
coupling = count / min_appearances
|
|
212
|
+
if coupling >= 0.3 and count >= 3:
|
|
213
|
+
results.append((coupling, count, a, b))
|
|
214
|
+
|
|
215
|
+
results.sort(reverse=True)
|
|
216
|
+
for coupling, count, a, b in results[:30]:
|
|
217
|
+
print(f"{coupling:.2f}\t{count}\t{a}\t{b}")
|
|
218
|
+
EOF
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Mode 6: Bus Factor Score Per Directory**
|
|
222
|
+
|
|
223
|
+
Aggregates unique contributor counts at directory level for team ownership mapping.
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
git -C {target_path} log \
|
|
227
|
+
--format='%aN' \
|
|
228
|
+
--name-only \
|
|
229
|
+
--since="1 year ago" \
|
|
230
|
+
-- ':!package-lock.json' ':!yarn.lock' ':!dist/' ':!build/' \
|
|
231
|
+
| awk '
|
|
232
|
+
/^$/ { next }
|
|
233
|
+
/^[A-Z]/ { author=$0; next }
|
|
234
|
+
{ print $0, author }
|
|
235
|
+
' \
|
|
236
|
+
| awk '{dir=$1; sub(/\/[^\/]*$/, "", dir); print dir, $2}' \
|
|
237
|
+
| sort -u \
|
|
238
|
+
| awk '{counts[$1]++} END {for(d in counts) print counts[d], d}' \
|
|
239
|
+
| sort -rn \
|
|
240
|
+
> {output_dir}/bus-factor-by-directory.txt
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Docker Execution Variant
|
|
244
|
+
|
|
245
|
+
For containerized or CI environments where git is not available in the execution context, mount the repository into a minimal Alpine image with git installed:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
docker run --rm \
|
|
249
|
+
-v {target_path}:/repo:ro \
|
|
250
|
+
-v {output_dir}:/output \
|
|
251
|
+
alpine/git:latest \
|
|
252
|
+
sh -c '
|
|
253
|
+
cd /repo &&
|
|
254
|
+
echo "=== CHURN ANALYSIS ===" &&
|
|
255
|
+
git log --format=format: --name-only --since="6 months ago" \
|
|
256
|
+
-- ":!package-lock.json" ":!yarn.lock" ":!dist/" ":!build/" \
|
|
257
|
+
| sort | uniq -c | sort -rn | head -50 > /output/churn-by-file.txt &&
|
|
258
|
+
echo "=== COMMIT FREQUENCY ALL TIME ===" &&
|
|
259
|
+
git log --pretty=format: --name-only \
|
|
260
|
+
-- ":!package-lock.json" ":!yarn.lock" ":!dist/" ":!build/" \
|
|
261
|
+
| sort | uniq -c | sort -rn | head -50 > /output/commit-frequency-all-time.txt &&
|
|
262
|
+
echo "=== FILE AGE ===" &&
|
|
263
|
+
git ls-files | while read f; do
|
|
264
|
+
last=$(git log -1 --format="%ai" -- "$f" 2>/dev/null); echo "$last $f"
|
|
265
|
+
done | sort > /output/file-age.txt &&
|
|
266
|
+
echo "Done."
|
|
267
|
+
'
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Note: The co-change coupling analysis (Mode 5) requires Python and is not included in the Docker variant above. Run it separately or use a Python-enabled image (`python:3.11-slim` with git installed).
|
|
271
|
+
|
|
272
|
+
### Execution Parameters
|
|
273
|
+
|
|
274
|
+
| Parameter | Description | Default |
|
|
275
|
+
|-----------|-------------|---------|
|
|
276
|
+
| `--since` | Start of analysis window | "6 months ago" |
|
|
277
|
+
| `--until` | End of analysis window | HEAD (current) |
|
|
278
|
+
| `--format` | Output format for log | varies by mode |
|
|
279
|
+
| `--name-only` | Include file names in log | required for churn modes |
|
|
280
|
+
| `head -N` | Limit results to top N files | 50 |
|
|
281
|
+
| Coupling threshold | Minimum co-change ratio to report | 0.3 |
|
|
282
|
+
| Coupling min-count | Minimum shared commits to report | 3 |
|
|
283
|
+
| Bus factor threshold | Author count considered a silo | 1 |
|
|
284
|
+
|
|
285
|
+
### Runtime Characteristics
|
|
286
|
+
|
|
287
|
+
- **File churn (6 months):** 5-30 seconds for most repositories
|
|
288
|
+
- **File age (all files):** 30 seconds-5 minutes depending on file count (one git command per file)
|
|
289
|
+
- **Bus factor (per-file):** 10-60 seconds per file; 5-20 minutes for bulk all-files analysis
|
|
290
|
+
- **Co-change coupling:** 30 seconds-3 minutes for the git extraction; Python processing adds 5-30 seconds
|
|
291
|
+
- **Large monorepos (>500k commits):** All modes scale linearly with commit count; full history bus factor may take 30+ minutes
|
|
292
|
+
|
|
293
|
+
**Performance note:** File age analysis (Mode 4) runs one `git log -1` per tracked file. For repositories with tens of thousands of files, pipe through `xargs` with parallel execution or limit scope to a subdirectory.
|
|
294
|
+
|
|
295
|
+
## Output Format
|
|
296
|
+
|
|
297
|
+
Git history commands produce plain text. Radar normalizes raw command output into aggregated JSON signal records for consumption by domain agents. The following structure represents the canonical aggregated output after all six analysis modes complete:
|
|
298
|
+
|
|
299
|
+
```json
|
|
300
|
+
{
|
|
301
|
+
"analysis_metadata": {
|
|
302
|
+
"repository": "/srv/projects/payments-api",
|
|
303
|
+
"analysis_date": "2026-02-18T09:14:33Z",
|
|
304
|
+
"git_commit_head": "a7f3d91c4e2b58da0f6c9e3b1a4d7f2e5c8b0a3d",
|
|
305
|
+
"history_window_churn": "6 months",
|
|
306
|
+
"history_window_ownership": "all time",
|
|
307
|
+
"total_commits_analyzed": 2847,
|
|
308
|
+
"total_files_tracked": 1423,
|
|
309
|
+
"excluded_patterns": ["package-lock.json", "yarn.lock", "*.lock", "dist/", "build/"]
|
|
310
|
+
},
|
|
311
|
+
"churn_hotspots": [
|
|
312
|
+
{
|
|
313
|
+
"file": "src/services/paymentProcessor.ts",
|
|
314
|
+
"modification_count_6mo": 87,
|
|
315
|
+
"modification_count_all_time": 234,
|
|
316
|
+
"risk_tier": "critical"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"file": "src/api/handlers/orderHandler.ts",
|
|
320
|
+
"modification_count_6mo": 63,
|
|
321
|
+
"modification_count_all_time": 181,
|
|
322
|
+
"risk_tier": "high"
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
"file": "src/utils/validation.ts",
|
|
326
|
+
"modification_count_6mo": 41,
|
|
327
|
+
"modification_count_all_time": 97,
|
|
328
|
+
"risk_tier": "high"
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"file": "src/models/user.ts",
|
|
332
|
+
"modification_count_6mo": 22,
|
|
333
|
+
"modification_count_all_time": 58,
|
|
334
|
+
"risk_tier": "medium"
|
|
335
|
+
}
|
|
336
|
+
],
|
|
337
|
+
"bus_factor_analysis": [
|
|
338
|
+
{
|
|
339
|
+
"file": "src/services/paymentProcessor.ts",
|
|
340
|
+
"unique_authors": 1,
|
|
341
|
+
"primary_author": "marcus.chen@example.com",
|
|
342
|
+
"author_commit_share": 1.0,
|
|
343
|
+
"bus_factor_score": "critical",
|
|
344
|
+
"last_non_primary_commit": null
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"file": "src/core/authEngine.ts",
|
|
348
|
+
"unique_authors": 2,
|
|
349
|
+
"primary_author": "sarah.okonkwo@example.com",
|
|
350
|
+
"author_commit_share": 0.89,
|
|
351
|
+
"bus_factor_score": "high",
|
|
352
|
+
"last_non_primary_commit": "2025-04-12T11:22:00Z"
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"file": "src/utils/validation.ts",
|
|
356
|
+
"unique_authors": 4,
|
|
357
|
+
"primary_author": "team-wide",
|
|
358
|
+
"author_commit_share": null,
|
|
359
|
+
"bus_factor_score": "low",
|
|
360
|
+
"last_non_primary_commit": null
|
|
361
|
+
}
|
|
362
|
+
],
|
|
363
|
+
"ownership_by_directory": [
|
|
364
|
+
{
|
|
365
|
+
"directory": "src/services/",
|
|
366
|
+
"unique_contributors_1yr": 2,
|
|
367
|
+
"primary_owner": "marcus.chen@example.com",
|
|
368
|
+
"ownership_concentration": 0.84,
|
|
369
|
+
"bus_factor_score": "critical"
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
"directory": "src/api/handlers/",
|
|
373
|
+
"unique_contributors_1yr": 5,
|
|
374
|
+
"primary_owner": null,
|
|
375
|
+
"ownership_concentration": 0.31,
|
|
376
|
+
"bus_factor_score": "low"
|
|
377
|
+
}
|
|
378
|
+
],
|
|
379
|
+
"change_coupling_pairs": [
|
|
380
|
+
{
|
|
381
|
+
"file_a": "src/services/paymentProcessor.ts",
|
|
382
|
+
"file_b": "src/models/transaction.ts",
|
|
383
|
+
"shared_commits": 52,
|
|
384
|
+
"coupling_ratio": 0.79,
|
|
385
|
+
"risk_tier": "critical",
|
|
386
|
+
"interpretation": "Modified together in 79% of commits — implicit structural coupling"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"file_a": "src/api/handlers/orderHandler.ts",
|
|
390
|
+
"file_b": "src/services/inventoryService.ts",
|
|
391
|
+
"shared_commits": 28,
|
|
392
|
+
"coupling_ratio": 0.44,
|
|
393
|
+
"risk_tier": "high",
|
|
394
|
+
"interpretation": "Frequent co-change suggests hidden dependency not reflected in imports"
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"file_a": "src/config/database.ts",
|
|
398
|
+
"file_b": "src/models/user.ts",
|
|
399
|
+
"shared_commits": 11,
|
|
400
|
+
"coupling_ratio": 0.31,
|
|
401
|
+
"risk_tier": "medium",
|
|
402
|
+
"interpretation": "Moderate co-change, may reflect schema migration coupling"
|
|
403
|
+
}
|
|
404
|
+
],
|
|
405
|
+
"stale_files": [
|
|
406
|
+
{
|
|
407
|
+
"file": "src/legacy/xmlParser.ts",
|
|
408
|
+
"last_modified": "2022-11-03T08:44:12Z",
|
|
409
|
+
"days_since_modified": 837,
|
|
410
|
+
"risk_tier": "high",
|
|
411
|
+
"interpretation": "Not modified in 27+ months — possible abandoned code or fossilized dependency"
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"file": "src/utils/legacyCrypto.ts",
|
|
415
|
+
"last_modified": "2023-03-15T14:22:55Z",
|
|
416
|
+
"days_since_modified": 705,
|
|
417
|
+
"risk_tier": "high",
|
|
418
|
+
"interpretation": "Crypto utility not updated in 23+ months — verify algorithm currency"
|
|
419
|
+
}
|
|
420
|
+
],
|
|
421
|
+
"summary_metrics": {
|
|
422
|
+
"total_hotspot_files": 4,
|
|
423
|
+
"single_author_files": 23,
|
|
424
|
+
"two_author_files": 41,
|
|
425
|
+
"high_coupling_pairs": 8,
|
|
426
|
+
"stale_files_over_1yr": 17,
|
|
427
|
+
"knowledge_silo_risk_score": "high"
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
## Normalization
|
|
433
|
+
|
|
434
|
+
### Standard Signal Normalization
|
|
435
|
+
|
|
436
|
+
Radar transforms aggregated git history output into normalized signal records using the following field mapping:
|
|
437
|
+
|
|
438
|
+
| Raw Git Metric | Radar Field | Transformation |
|
|
439
|
+
|----------------|-------------|----------------|
|
|
440
|
+
| File modification count (6mo) | `source_rule` | `"churn-hotspot"` for high churn, `"churn-normal"` for low |
|
|
441
|
+
| File + modification count | `location` | `{file_path}` (file-level signal, no line number) |
|
|
442
|
+
| Churn count + bus factor combined | `raw_output` | JSON object with all computed metrics for the file |
|
|
443
|
+
| — | `source_tool` | Static: `"git-history"` |
|
|
444
|
+
| — | `signal_id` | Pattern: `S-GH-{NNN}` (sequential) |
|
|
445
|
+
|
|
446
|
+
**Severity mapping** (based on primary risk indicator):
|
|
447
|
+
|
|
448
|
+
| Condition | Severity |
|
|
449
|
+
|-----------|----------|
|
|
450
|
+
| Single-author file (bus factor = 1) | high |
|
|
451
|
+
| High churn (>30 modifications/6mo) + low test coverage correlation | high |
|
|
452
|
+
| High coupling ratio (>0.5) between non-adjacent modules | high |
|
|
453
|
+
| File stale >1 year + in critical path | high |
|
|
454
|
+
| Two-author file with 80%+ ownership concentration | medium |
|
|
455
|
+
| Moderate churn (10-30 modifications/6mo) | medium |
|
|
456
|
+
| File stale 6mo-1yr | medium |
|
|
457
|
+
| Low churn (<10 modifications/6mo), distributed authorship | low |
|
|
458
|
+
|
|
459
|
+
**Confidence estimate mapping** (based on history depth):
|
|
460
|
+
|
|
461
|
+
| History Available | Confidence | Rationale |
|
|
462
|
+
|-------------------|------------|-----------|
|
|
463
|
+
| >1 year of commits for this file | high | Sufficient sample to establish pattern |
|
|
464
|
+
| 6 months-1 year of commits | medium | Pattern visible but may be incomplete |
|
|
465
|
+
| <6 months of commits | low | Insufficient history — new codebase or file |
|
|
466
|
+
| File added in last 30 days | low | No meaningful history baseline |
|
|
467
|
+
|
|
468
|
+
**Blast radius mapping** (based on import graph and coupling):
|
|
469
|
+
|
|
470
|
+
| File Characteristics | Blast Radius |
|
|
471
|
+
|----------------------|--------------|
|
|
472
|
+
| Highly imported by many modules (import graph indicates hub) | widespread |
|
|
473
|
+
| High change-coupling ratio with critical-path files | widespread |
|
|
474
|
+
| Internal-only module, low coupling, limited dependents | localized |
|
|
475
|
+
| Shared utility, library, or middleware | moderate |
|
|
476
|
+
| Configuration files with cross-system impact | widespread |
|
|
477
|
+
|
|
478
|
+
**Domain relevance mapping:**
|
|
479
|
+
|
|
480
|
+
| Signal Type | Domain Relevance |
|
|
481
|
+
|-------------|-----------------|
|
|
482
|
+
| File churn, change coupling, stale code | ["11"] (Change Risk & Evolvability) |
|
|
483
|
+
| Bus factor, ownership concentration, knowledge silos | ["12"] (Team, Ownership & Knowledge Risk) |
|
|
484
|
+
| High-churn single-author file (both dimensions) | ["11", "12"] |
|
|
485
|
+
| Change coupling between non-obvious modules | ["11"] |
|
|
486
|
+
|
|
487
|
+
### Change-Risk Normalization
|
|
488
|
+
|
|
489
|
+
This section is required because Git History Miner is the primary data source for Radar Transform's Change Risk Modeler. The following table maps raw git signals to the four Transform change-risk input dimensions.
|
|
490
|
+
|
|
491
|
+
| Raw Signal | Change Risk Signal | Transformation |
|
|
492
|
+
|------------|-------------------|----------------|
|
|
493
|
+
| File modification frequency (churn) | `blast_radius_input` | High churn = file is frequently changed = many dependents affected across each change cycle. Churn >60/6mo → blast_radius_input: high. Churn 20-60 → medium. Churn <20 → low. |
|
|
494
|
+
| Author count per file (bus factor) | `regression_probability_input` | Single author = knowledge silo = higher probability of regression when that author is unavailable or makes a change in unfamiliar territory after gap. 1 author → regression_probability_input: high. 2 authors with 80%+ concentration → medium. ≥3 authors distributed → low. |
|
|
495
|
+
| Import/dependency count (coupling to file) | `coupling_risk_input` | More modules importing a file = more downstream breakage potential per change. Determined via static analysis cross-reference or co-change coupling ratio. Coupling ratio >0.5 → coupling_risk_input: high. 0.2-0.5 → medium. <0.2 → low. |
|
|
496
|
+
| Cyclomatic complexity proxy (file size + churn) | `architectural_tension_input` | Large files (>500 LOC proxy via git diff --stat) that also have high churn are harder to change safely — the file contains too much logic and is modified too often for confident refactoring. Files in top 10% by both size and churn → architectural_tension_input: high. Top 25% on either dimension → medium. Below both thresholds → low. |
|
|
497
|
+
|
|
498
|
+
**Change-risk normalization rules:**
|
|
499
|
+
|
|
500
|
+
1. **Blast radius input from churn** is computed per file over the 6-month window. Files excluded from the churn analysis (lock files, build artifacts) receive a blast_radius_input of `null` — they are excluded from Transform modeling.
|
|
501
|
+
|
|
502
|
+
2. **Regression probability input from bus factor** uses all-time history, not the 6-month window. Ownership patterns change slowly; recent-only data understates silo risk for mature files.
|
|
503
|
+
|
|
504
|
+
3. **Coupling risk input** is a two-source signal. Prefer static import graph data (from SonarQube or Semgrep) when available. Fall back to co-change coupling ratio from git history when static analysis is not available. When both are available, take the higher of the two for conservative risk estimation.
|
|
505
|
+
|
|
506
|
+
4. **Architectural tension input** is a proxy metric. Git history does not provide actual cyclomatic complexity — use `git diff --stat` to extract approximate line-count per file as a size proxy, then cross with churn frequency. This is intentionally conservative: a large frequently-changed file warrants investigation regardless of actual complexity.
|
|
507
|
+
|
|
508
|
+
5. **Transform agents consuming these inputs** should treat all four dimensions as directional signals, not precise measurements. The purpose is risk-ranking candidate files for change-safety assessment, not absolute scoring.
|
|
509
|
+
|
|
510
|
+
**Change-risk output signal format:**
|
|
511
|
+
|
|
512
|
+
```json
|
|
513
|
+
{
|
|
514
|
+
"signal_id": "S-GH-017",
|
|
515
|
+
"source_tool": "git-history",
|
|
516
|
+
"source_rule": "churn-hotspot-silo",
|
|
517
|
+
"file_path": "src/services/paymentProcessor.ts",
|
|
518
|
+
"severity": "high",
|
|
519
|
+
"confidence_estimate": "high",
|
|
520
|
+
"blast_radius": "widespread",
|
|
521
|
+
"domain_relevance": ["11", "12"],
|
|
522
|
+
"change_risk_inputs": {
|
|
523
|
+
"blast_radius_input": "high",
|
|
524
|
+
"regression_probability_input": "high",
|
|
525
|
+
"coupling_risk_input": "high",
|
|
526
|
+
"architectural_tension_input": "high"
|
|
527
|
+
},
|
|
528
|
+
"raw_output": {
|
|
529
|
+
"modification_count_6mo": 87,
|
|
530
|
+
"unique_authors_all_time": 1,
|
|
531
|
+
"primary_author": "marcus.chen@example.com",
|
|
532
|
+
"author_commit_share": 1.0,
|
|
533
|
+
"coupling_ratio_max": 0.79,
|
|
534
|
+
"coupled_file": "src/models/transaction.ts",
|
|
535
|
+
"approx_loc_proxy": 847,
|
|
536
|
+
"history_depth_days": 712
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
## Limitations
|
|
542
|
+
|
|
543
|
+
### Cannot Detect
|
|
544
|
+
|
|
545
|
+
1. **Intent behind changes**: High churn means frequent modification — it does not indicate whether those changes were improvements, regressions, or panic fixes. Churn is a risk proxy, not a quality verdict. Agent interpretation of surrounding context (PR descriptions, commit messages) is required.
|
|
546
|
+
|
|
547
|
+
2. **Hidden external ownership**: Developers who review and approve changes without committing (reviewers, leads, pair-programming partners) are invisible in git history. Bus factor scores undercount actual knowledge distribution when review-heavy workflows are in use.
|
|
548
|
+
|
|
549
|
+
3. **Semantic coupling across repositories**: Change coupling detection is scoped to a single repository. Microservices that change together due to API contract updates, schema migrations, or shared library upgrades will not show coupling in per-repo analysis.
|
|
550
|
+
|
|
551
|
+
4. **Submodule and subtree contents**: Git history mining operates on the parent repository. Changes within git submodules or subtrees that are committed externally are not included in churn, bus factor, or coupling analysis unless the parent repository has its own commit log.
|
|
552
|
+
|
|
553
|
+
5. **Squash-merged history**: Teams using squash merges lose commit granularity — a single squash commit replacing 40 feature commits appears as one modification event. Churn metrics will be systematically underestimated in squash-heavy workflows.
|
|
554
|
+
|
|
555
|
+
6. **Automated commit attribution**: CI/CD bots, automated dependency update tools (Dependabot, Renovate), and code generation pipelines commit under service account identities. These inflate churn counts and dilute true human bus factor. Exclude bot authors from bus factor analysis by filtering known bot email patterns.
|
|
556
|
+
|
|
557
|
+
### Known False Positives
|
|
558
|
+
|
|
559
|
+
1. **Churn in actively developed new features**: A file under active feature development for 6 months will show extreme churn that correctly reflects current activity but does not indicate instability risk — it reflects normal development velocity. Churn signals should be downweighted for files with consistently increasing LOC (growth pattern vs. oscillating rewrites).
|
|
560
|
+
|
|
561
|
+
2. **Single-author files that are intentionally siloed**: Some modules (security-sensitive cryptographic implementations, compliance-critical data access layers) are deliberately maintained by one specialist. High bus factor risk score correctly fires but may not represent an actual knowledge-gap threat if the single author is the designated owner.
|
|
562
|
+
|
|
563
|
+
3. **High coupling in test files paired with their source**: Test files are expected to change with their corresponding source files. `src/services/paymentProcessor.ts` and `tests/services/paymentProcessor.test.ts` should co-change — this is correct behavior, not hidden coupling. Exclude `tests/` and `spec/` paths from coupling analysis or treat test-source pairs as expected coupling.
|
|
564
|
+
|
|
565
|
+
4. **Stale files that are deliberately stable**: Foundational modules (abstract base classes, core type definitions, constants) may not change for years precisely because they are stable and correct. Age alone is not a risk signal — cross-reference against churn in dependent files to distinguish stable foundations from forgotten code.
|
|
566
|
+
|
|
567
|
+
5. **Ownership concentration in small teams**: On a three-person team, every file will show high ownership concentration for one author. Bus factor thresholds calibrated for large teams will generate excessive high-severity signals in small-team contexts. Normalize bus factor expectations against team size when known.
|
|
568
|
+
|
|
569
|
+
### Known False Negatives
|
|
570
|
+
|
|
571
|
+
1. **Knowledge silos in pull request reviewers**: Developers who informally own a module by virtue of always reviewing and approving changes are not captured in commit history. The actual bus factor may be lower than git-measured bus factor if the sole committer is not the sole knowledge holder.
|
|
572
|
+
|
|
573
|
+
2. **Hidden coupling via shared data stores**: Two services that both write to the same database schema are implicitly coupled but will show no co-change signal if they are in separate repositories. Cross-repository coupling mediated by shared infrastructure is invisible to single-repo history mining.
|
|
574
|
+
|
|
575
|
+
3. **Coupling in configuration and infrastructure files**: Application code coupling is well-captured, but coupling between application code and deployment configuration (Helm charts, Terraform, CI pipelines) that lives in a separate infrastructure repository will not appear in change coupling analysis of the application repository.
|
|
576
|
+
|
|
577
|
+
4. **Risk in stable files with recent ownership turnover**: A file that has had 5 different owners historically but has only been touched by one new engineer in the last 3 months is a hidden knowledge silo — the all-time bus factor appears healthy but current effective bus factor is 1. The tool computes historical bus factor only; recency-weighted ownership concentration requires custom analysis.
|
|
578
|
+
|
|
579
|
+
5. **Complexity risk in low-churn high-complexity files**: A 3000-line file that has not been modified in 18 months will receive low churn-based risk scores. If that file is central to system operation and a future change is required, the accumulated complexity and unfamiliarity risk is severe. The architectural tension proxy (churn x size) misses frozen-but-fragile files. Cross-reference with SonarQube complexity metrics to surface these cases.
|
|
580
|
+
|
|
581
|
+
6. **Language-specific commit patterns**: Some language ecosystems (Jupyter notebooks, Protocol Buffers, generated gRPC stubs) produce commits that do not reflect human authorship patterns. Generated file commits inflate churn and distort bus factor measurements for the files that trigger regeneration.
|