@zigrivers/scaffold 2.1.2 → 2.38.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/README.md +505 -119
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +94 -14
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/build.test.js +30 -5
- package/dist/cli/commands/build.test.js.map +1 -1
- package/dist/cli/commands/check.d.ts +12 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +311 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/check.test.d.ts +2 -0
- package/dist/cli/commands/check.test.d.ts.map +1 -0
- package/dist/cli/commands/check.test.js +412 -0
- package/dist/cli/commands/check.test.js.map +1 -0
- package/dist/cli/commands/complete.d.ts +12 -0
- package/dist/cli/commands/complete.d.ts.map +1 -0
- package/dist/cli/commands/complete.js +101 -0
- package/dist/cli/commands/complete.js.map +1 -0
- package/dist/cli/commands/complete.test.d.ts +2 -0
- package/dist/cli/commands/complete.test.d.ts.map +1 -0
- package/dist/cli/commands/complete.test.js +133 -0
- package/dist/cli/commands/complete.test.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +12 -8
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +4 -0
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +6 -2
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/knowledge.test.js +16 -11
- package/dist/cli/commands/knowledge.test.js.map +1 -1
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +41 -13
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/next.test.js +3 -0
- package/dist/cli/commands/next.test.js.map +1 -1
- package/dist/cli/commands/reset.d.ts +1 -0
- package/dist/cli/commands/reset.d.ts.map +1 -1
- package/dist/cli/commands/reset.js +179 -67
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/reset.test.js +360 -0
- package/dist/cli/commands/reset.test.js.map +1 -1
- package/dist/cli/commands/rework.d.ts +20 -0
- package/dist/cli/commands/rework.d.ts.map +1 -0
- package/dist/cli/commands/rework.js +332 -0
- package/dist/cli/commands/rework.js.map +1 -0
- package/dist/cli/commands/rework.test.d.ts +2 -0
- package/dist/cli/commands/rework.test.d.ts.map +1 -0
- package/dist/cli/commands/rework.test.js +297 -0
- package/dist/cli/commands/rework.test.js.map +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +59 -31
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/run.test.js +288 -6
- package/dist/cli/commands/run.test.js.map +1 -1
- package/dist/cli/commands/skill.d.ts +12 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +123 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/commands/skill.test.d.ts +2 -0
- package/dist/cli/commands/skill.test.d.ts.map +1 -0
- package/dist/cli/commands/skill.test.js +297 -0
- package/dist/cli/commands/skill.test.js.map +1 -0
- package/dist/cli/commands/skip.d.ts +1 -1
- package/dist/cli/commands/skip.d.ts.map +1 -1
- package/dist/cli/commands/skip.js +123 -57
- package/dist/cli/commands/skip.js.map +1 -1
- package/dist/cli/commands/skip.test.js +91 -0
- package/dist/cli/commands/skip.test.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +57 -10
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/status.test.js +81 -0
- package/dist/cli/commands/status.test.js.map +1 -1
- package/dist/cli/commands/update.test.js +252 -0
- package/dist/cli/commands/update.test.js.map +1 -1
- package/dist/cli/commands/version.test.js +171 -1
- package/dist/cli/commands/version.test.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapters/adapter.d.ts +14 -0
- package/dist/core/adapters/adapter.d.ts.map +1 -1
- package/dist/core/adapters/adapter.js.map +1 -1
- package/dist/core/adapters/adapter.test.js +10 -0
- package/dist/core/adapters/adapter.test.js.map +1 -1
- package/dist/core/adapters/claude-code.d.ts.map +1 -1
- package/dist/core/adapters/claude-code.js +47 -10
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/adapters/claude-code.test.js +41 -20
- package/dist/core/adapters/claude-code.test.js.map +1 -1
- package/dist/core/adapters/codex.d.ts.map +1 -1
- package/dist/core/adapters/codex.js +5 -1
- package/dist/core/adapters/codex.js.map +1 -1
- package/dist/core/adapters/codex.test.js +5 -0
- package/dist/core/adapters/codex.test.js.map +1 -1
- package/dist/core/adapters/universal.d.ts.map +1 -1
- package/dist/core/adapters/universal.js +0 -1
- package/dist/core/adapters/universal.js.map +1 -1
- package/dist/core/adapters/universal.test.js +5 -0
- package/dist/core/adapters/universal.test.js.map +1 -1
- package/dist/core/assembly/context-gatherer.d.ts.map +1 -1
- package/dist/core/assembly/context-gatherer.js +5 -2
- package/dist/core/assembly/context-gatherer.js.map +1 -1
- package/dist/core/assembly/engine.d.ts.map +1 -1
- package/dist/core/assembly/engine.js +10 -2
- package/dist/core/assembly/engine.js.map +1 -1
- package/dist/core/assembly/engine.test.js +19 -0
- package/dist/core/assembly/engine.test.js.map +1 -1
- package/dist/core/assembly/knowledge-loader.d.ts +25 -0
- package/dist/core/assembly/knowledge-loader.d.ts.map +1 -1
- package/dist/core/assembly/knowledge-loader.js +75 -2
- package/dist/core/assembly/knowledge-loader.js.map +1 -1
- package/dist/core/assembly/knowledge-loader.test.js +388 -1
- package/dist/core/assembly/knowledge-loader.test.js.map +1 -1
- package/dist/core/assembly/meta-prompt-loader.d.ts +6 -0
- package/dist/core/assembly/meta-prompt-loader.d.ts.map +1 -1
- package/dist/core/assembly/meta-prompt-loader.js +41 -25
- package/dist/core/assembly/meta-prompt-loader.js.map +1 -1
- package/dist/core/assembly/preset-loader.d.ts +10 -0
- package/dist/core/assembly/preset-loader.d.ts.map +1 -1
- package/dist/core/assembly/preset-loader.js +26 -1
- package/dist/core/assembly/preset-loader.js.map +1 -1
- package/dist/core/assembly/preset-loader.test.js +65 -1
- package/dist/core/assembly/preset-loader.test.js.map +1 -1
- package/dist/core/assembly/update-mode.d.ts.map +1 -1
- package/dist/core/assembly/update-mode.js +10 -4
- package/dist/core/assembly/update-mode.js.map +1 -1
- package/dist/core/assembly/update-mode.test.js +47 -0
- package/dist/core/assembly/update-mode.test.js.map +1 -1
- package/dist/core/dependency/dependency.d.ts.map +1 -1
- package/dist/core/dependency/dependency.js +3 -2
- package/dist/core/dependency/dependency.js.map +1 -1
- package/dist/core/dependency/dependency.test.js +2 -0
- package/dist/core/dependency/dependency.test.js.map +1 -1
- package/dist/core/dependency/eligibility.js +3 -3
- package/dist/core/dependency/eligibility.js.map +1 -1
- package/dist/core/dependency/eligibility.test.js +2 -0
- package/dist/core/dependency/eligibility.test.js.map +1 -1
- package/dist/core/dependency/graph.d.ts.map +1 -1
- package/dist/core/dependency/graph.js +4 -0
- package/dist/core/dependency/graph.js.map +1 -1
- package/dist/core/dependency/graph.test.d.ts +2 -0
- package/dist/core/dependency/graph.test.d.ts.map +1 -0
- package/dist/core/dependency/graph.test.js +262 -0
- package/dist/core/dependency/graph.test.js.map +1 -0
- package/dist/core/rework/phase-selector.d.ts +24 -0
- package/dist/core/rework/phase-selector.d.ts.map +1 -0
- package/dist/core/rework/phase-selector.js +98 -0
- package/dist/core/rework/phase-selector.js.map +1 -0
- package/dist/core/rework/phase-selector.test.d.ts +2 -0
- package/dist/core/rework/phase-selector.test.d.ts.map +1 -0
- package/dist/core/rework/phase-selector.test.js +138 -0
- package/dist/core/rework/phase-selector.test.js.map +1 -0
- package/dist/dashboard/generator.d.ts +48 -17
- package/dist/dashboard/generator.d.ts.map +1 -1
- package/dist/dashboard/generator.js +75 -5
- package/dist/dashboard/generator.js.map +1 -1
- package/dist/dashboard/generator.test.js +213 -5
- package/dist/dashboard/generator.test.js.map +1 -1
- package/dist/dashboard/template.d.ts +1 -1
- package/dist/dashboard/template.d.ts.map +1 -1
- package/dist/dashboard/template.js +755 -114
- package/dist/dashboard/template.js.map +1 -1
- package/dist/e2e/knowledge.test.js +4 -3
- package/dist/e2e/knowledge.test.js.map +1 -1
- package/dist/e2e/pipeline.test.js +2 -0
- package/dist/e2e/pipeline.test.js.map +1 -1
- package/dist/e2e/rework.test.d.ts +6 -0
- package/dist/e2e/rework.test.d.ts.map +1 -0
- package/dist/e2e/rework.test.js +226 -0
- package/dist/e2e/rework.test.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/project/adopt.test.js +2 -0
- package/dist/project/adopt.test.js.map +1 -1
- package/dist/project/claude-md.js +2 -2
- package/dist/project/claude-md.js.map +1 -1
- package/dist/project/claude-md.test.js +4 -4
- package/dist/project/claude-md.test.js.map +1 -1
- package/dist/project/detector.d.ts.map +1 -1
- package/dist/project/detector.js +4 -1
- package/dist/project/detector.js.map +1 -1
- package/dist/project/frontmatter.d.ts.map +1 -1
- package/dist/project/frontmatter.js +54 -15
- package/dist/project/frontmatter.js.map +1 -1
- package/dist/project/frontmatter.test.js +2 -2
- package/dist/project/frontmatter.test.js.map +1 -1
- package/dist/state/rework-manager.d.ts +16 -0
- package/dist/state/rework-manager.d.ts.map +1 -0
- package/dist/state/rework-manager.js +126 -0
- package/dist/state/rework-manager.js.map +1 -0
- package/dist/state/rework-manager.test.d.ts +2 -0
- package/dist/state/rework-manager.test.d.ts.map +1 -0
- package/dist/state/rework-manager.test.js +191 -0
- package/dist/state/rework-manager.test.js.map +1 -0
- package/dist/state/state-manager.d.ts +13 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +39 -2
- package/dist/state/state-manager.js.map +1 -1
- package/dist/state/state-manager.test.js +74 -1
- package/dist/state/state-manager.test.js.map +1 -1
- package/dist/state/state-migration.d.ts +23 -0
- package/dist/state/state-migration.d.ts.map +1 -0
- package/dist/state/state-migration.js +144 -0
- package/dist/state/state-migration.js.map +1 -0
- package/dist/state/state-migration.test.d.ts +2 -0
- package/dist/state/state-migration.test.d.ts.map +1 -0
- package/dist/state/state-migration.test.js +451 -0
- package/dist/state/state-migration.test.js.map +1 -0
- package/dist/types/assembly.d.ts +2 -0
- package/dist/types/assembly.d.ts.map +1 -1
- package/dist/types/dependency.d.ts +2 -2
- package/dist/types/dependency.d.ts.map +1 -1
- package/dist/types/frontmatter.d.ts +100 -7
- package/dist/types/frontmatter.d.ts.map +1 -1
- package/dist/types/frontmatter.js +89 -1
- package/dist/types/frontmatter.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/lock.d.ts +1 -1
- package/dist/types/lock.d.ts.map +1 -1
- package/dist/types/rework.d.ts +36 -0
- package/dist/types/rework.d.ts.map +1 -0
- package/dist/types/rework.js +2 -0
- package/dist/types/rework.js.map +1 -0
- package/dist/utils/errors.d.ts +1 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +8 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/fs.d.ts +6 -0
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +13 -0
- package/dist/utils/fs.js.map +1 -1
- package/dist/validation/config-validator.test.d.ts +2 -0
- package/dist/validation/config-validator.test.d.ts.map +1 -0
- package/dist/validation/config-validator.test.js +210 -0
- package/dist/validation/config-validator.test.js.map +1 -0
- package/dist/validation/dependency-validator.test.d.ts +2 -0
- package/dist/validation/dependency-validator.test.d.ts.map +1 -0
- package/dist/validation/dependency-validator.test.js +215 -0
- package/dist/validation/dependency-validator.test.js.map +1 -0
- package/dist/validation/frontmatter-validator.test.d.ts +2 -0
- package/dist/validation/frontmatter-validator.test.d.ts.map +1 -0
- package/dist/validation/frontmatter-validator.test.js +371 -0
- package/dist/validation/frontmatter-validator.test.js.map +1 -0
- package/dist/validation/state-validator.test.d.ts +2 -0
- package/dist/validation/state-validator.test.d.ts.map +1 -0
- package/dist/validation/state-validator.test.js +325 -0
- package/dist/validation/state-validator.test.js.map +1 -0
- package/dist/wizard/suggestion.test.d.ts +2 -0
- package/dist/wizard/suggestion.test.d.ts.map +1 -0
- package/dist/wizard/suggestion.test.js +115 -0
- package/dist/wizard/suggestion.test.js.map +1 -0
- package/dist/wizard/wizard.d.ts.map +1 -1
- package/dist/wizard/wizard.js +34 -1
- package/dist/wizard/wizard.js.map +1 -1
- package/knowledge/core/adr-craft.md +57 -0
- package/knowledge/core/ai-memory-management.md +246 -0
- package/knowledge/core/api-design.md +8 -0
- package/knowledge/core/automated-review-tooling.md +203 -0
- package/knowledge/core/claude-md-patterns.md +254 -0
- package/knowledge/core/coding-conventions.md +246 -0
- package/knowledge/core/database-design.md +8 -0
- package/knowledge/core/design-system-tokens.md +469 -0
- package/knowledge/core/dev-environment.md +223 -0
- package/knowledge/core/domain-modeling.md +8 -0
- package/knowledge/core/eval-craft.md +1008 -0
- package/knowledge/core/git-workflow-patterns.md +200 -0
- package/knowledge/core/multi-model-review-dispatch.md +250 -0
- package/knowledge/core/operations-runbook.md +40 -225
- package/knowledge/core/project-structure-patterns.md +231 -0
- package/knowledge/core/review-step-template.md +247 -0
- package/knowledge/core/{security-review.md → security-best-practices.md} +9 -1
- package/knowledge/core/system-architecture.md +5 -1
- package/knowledge/core/task-decomposition.md +174 -36
- package/knowledge/core/task-tracking.md +225 -0
- package/knowledge/core/tech-stack-selection.md +214 -0
- package/knowledge/core/testing-strategy.md +63 -70
- package/knowledge/core/user-stories.md +69 -60
- package/knowledge/core/user-story-innovation.md +70 -0
- package/knowledge/core/ux-specification.md +18 -148
- package/knowledge/execution/enhancement-workflow.md +201 -0
- package/knowledge/execution/task-claiming-strategy.md +130 -0
- package/knowledge/execution/tdd-execution-loop.md +172 -0
- package/knowledge/execution/worktree-management.md +205 -0
- package/knowledge/finalization/apply-fixes-and-freeze.md +177 -14
- package/knowledge/finalization/developer-onboarding.md +4 -0
- package/knowledge/finalization/implementation-playbook.md +83 -5
- package/knowledge/product/gap-analysis.md +5 -1
- package/knowledge/product/prd-craft.md +55 -34
- package/knowledge/product/prd-innovation.md +12 -0
- package/knowledge/product/vision-craft.md +213 -0
- package/knowledge/review/review-adr.md +44 -0
- package/knowledge/review/{review-api-contracts.md → review-api-design.md} +47 -1
- package/knowledge/review/{review-database-schema.md → review-database-design.md} +40 -1
- package/knowledge/review/review-domain-modeling.md +38 -1
- package/knowledge/review/review-implementation-tasks.md +108 -1
- package/knowledge/review/review-methodology.md +11 -0
- package/knowledge/review/review-operations.md +67 -0
- package/knowledge/review/review-prd.md +46 -0
- package/knowledge/review/review-security.md +65 -0
- package/knowledge/review/review-system-architecture.md +32 -2
- package/knowledge/review/review-testing-strategy.md +62 -0
- package/knowledge/review/review-user-stories.md +65 -0
- package/knowledge/review/{review-ux-spec.md → review-ux-specification.md} +50 -2
- package/knowledge/review/review-vision.md +255 -0
- package/knowledge/tools/release-management.md +222 -0
- package/knowledge/tools/session-analysis.md +215 -0
- package/knowledge/tools/version-strategy.md +200 -0
- package/knowledge/validation/critical-path-analysis.md +1 -1
- package/knowledge/validation/cross-phase-consistency.md +12 -0
- package/knowledge/validation/decision-completeness.md +13 -1
- package/knowledge/validation/dependency-validation.md +12 -0
- package/knowledge/validation/scope-management.md +12 -0
- package/knowledge/validation/traceability.md +12 -0
- package/methodology/README.md +37 -0
- package/methodology/custom-defaults.yml +44 -4
- package/methodology/deep.yml +43 -3
- package/methodology/mvp.yml +43 -3
- package/package.json +4 -3
- package/pipeline/architecture/review-architecture.md +36 -13
- package/pipeline/architecture/system-architecture.md +24 -9
- package/pipeline/build/multi-agent-resume.md +245 -0
- package/pipeline/build/multi-agent-start.md +236 -0
- package/pipeline/build/new-enhancement.md +456 -0
- package/pipeline/build/quick-task.md +381 -0
- package/pipeline/build/single-agent-resume.md +210 -0
- package/pipeline/build/single-agent-start.md +207 -0
- package/pipeline/consolidation/claude-md-optimization.md +76 -0
- package/pipeline/consolidation/workflow-audit.md +77 -0
- package/pipeline/decisions/adrs.md +21 -7
- package/pipeline/decisions/review-adrs.md +32 -11
- package/pipeline/environment/ai-memory-setup.md +76 -0
- package/pipeline/environment/automated-pr-review.md +76 -0
- package/pipeline/environment/design-system.md +75 -0
- package/pipeline/environment/dev-env-setup.md +68 -0
- package/pipeline/environment/git-workflow.md +73 -0
- package/pipeline/finalization/apply-fixes-and-freeze.md +17 -6
- package/pipeline/finalization/developer-onboarding-guide.md +23 -9
- package/pipeline/finalization/implementation-playbook.md +43 -14
- package/pipeline/foundation/beads.md +71 -0
- package/pipeline/foundation/coding-standards.md +71 -0
- package/pipeline/foundation/project-structure.md +73 -0
- package/pipeline/foundation/tdd.md +64 -0
- package/pipeline/foundation/tech-stack.md +74 -0
- package/pipeline/integration/add-e2e-testing.md +80 -0
- package/pipeline/modeling/domain-modeling.md +23 -8
- package/pipeline/modeling/review-domain-modeling.md +35 -11
- package/pipeline/parity/platform-parity-review.md +90 -0
- package/pipeline/planning/implementation-plan-review.md +67 -0
- package/pipeline/planning/implementation-plan.md +110 -0
- package/pipeline/pre/create-prd.md +34 -10
- package/pipeline/pre/innovate-prd.md +46 -15
- package/pipeline/pre/innovate-user-stories.md +47 -14
- package/pipeline/pre/review-prd.md +29 -8
- package/pipeline/pre/review-user-stories.md +34 -8
- package/pipeline/pre/user-stories.md +23 -8
- package/pipeline/quality/create-evals.md +106 -0
- package/pipeline/quality/operations.md +46 -17
- package/pipeline/quality/review-operations.md +32 -11
- package/pipeline/quality/review-security.md +34 -12
- package/pipeline/quality/review-testing.md +37 -14
- package/pipeline/quality/security.md +36 -10
- package/pipeline/quality/story-tests.md +75 -0
- package/pipeline/specification/api-contracts.md +28 -8
- package/pipeline/specification/database-schema.md +29 -8
- package/pipeline/specification/review-api.md +32 -11
- package/pipeline/specification/review-database.md +32 -11
- package/pipeline/specification/review-ux.md +34 -12
- package/pipeline/specification/ux-spec.md +35 -13
- package/pipeline/validation/critical-path-walkthrough.md +45 -11
- package/pipeline/validation/cross-phase-consistency.md +45 -11
- package/pipeline/validation/decision-completeness.md +45 -11
- package/pipeline/validation/dependency-graph-validation.md +46 -11
- package/pipeline/validation/implementability-dry-run.md +46 -11
- package/pipeline/validation/scope-creep-check.md +46 -11
- package/pipeline/validation/traceability-matrix.md +51 -11
- package/pipeline/vision/create-vision.md +267 -0
- package/pipeline/vision/innovate-vision.md +157 -0
- package/pipeline/vision/review-vision.md +149 -0
- package/skills/multi-model-dispatch/SKILL.md +326 -0
- package/skills/scaffold-pipeline/SKILL.md +210 -0
- package/skills/scaffold-runner/SKILL.md +619 -0
- package/pipeline/planning/implementation-tasks.md +0 -57
- package/pipeline/planning/review-tasks.md +0 -38
- package/pipeline/quality/testing-strategy.md +0 -42
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-tracking
|
|
3
|
+
description: Task tracking patterns including Beads methodology, task hierarchies, progress tracking, and lessons-learned workflows
|
|
4
|
+
topics: [task-management, beads, progress-tracking, lessons-learned, autonomous-work]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Task Tracking
|
|
8
|
+
|
|
9
|
+
Structured task tracking for AI agents ensures work continuity across sessions, prevents drift, and builds institutional memory. This knowledge covers the Beads methodology, task hierarchies, progress conventions, and the lessons-learned workflow that turns mistakes into permanent improvements.
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
### Beads Methodology Overview
|
|
14
|
+
|
|
15
|
+
Beads is an AI-friendly issue tracker designed for single-developer and AI-agent workflows. Unlike heavyweight project management tools (Jira, Linear), Beads stores task data in the repository itself, making it accessible to AI agents without external API integration.
|
|
16
|
+
|
|
17
|
+
Core properties:
|
|
18
|
+
- **Repository-local** — Task data lives in `.beads/`, committed alongside code
|
|
19
|
+
- **Git-hook synced** — Task state updates automatically on commit via data-sync hooks
|
|
20
|
+
- **CLI-driven** — All operations via `bd` commands (create, list, status, ready)
|
|
21
|
+
- **ID-prefixed commits** — Every commit message includes `[BD-xxx]` for traceability
|
|
22
|
+
|
|
23
|
+
### Task Hierarchy
|
|
24
|
+
|
|
25
|
+
Tasks organize into three levels:
|
|
26
|
+
|
|
27
|
+
| Level | Scope | Example | Typical Count |
|
|
28
|
+
|-------|-------|---------|---------------|
|
|
29
|
+
| **Epic** | Large feature or milestone | "User authentication system" | 3-8 per project |
|
|
30
|
+
| **Task** | Single agent session (30-90 min) | "Implement login endpoint with validation" | 10-50 per project |
|
|
31
|
+
| **Subtask** | Atomic unit within a task | "Add password hashing util" | 0-5 per task |
|
|
32
|
+
|
|
33
|
+
Epics group related tasks. Tasks are the unit of work assignment — one task per agent session. Subtasks are optional decomposition within a task, useful when a task has distinct testable steps.
|
|
34
|
+
|
|
35
|
+
### Progress Tracking
|
|
36
|
+
|
|
37
|
+
Track task status through a simple state machine:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
ready → in-progress → review → done
|
|
41
|
+
↘ blocked
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- **ready** — All dependencies met, can start immediately
|
|
45
|
+
- **in-progress** — Agent is actively working on it
|
|
46
|
+
- **review** — Implementation complete, awaiting PR merge
|
|
47
|
+
- **done** — PR merged, tests passing on main
|
|
48
|
+
- **blocked** — Cannot proceed, dependency or question unresolved
|
|
49
|
+
|
|
50
|
+
### Lessons-Learned Workflow
|
|
51
|
+
|
|
52
|
+
The `tasks/lessons.md` file captures patterns discovered during work. It has three sections:
|
|
53
|
+
|
|
54
|
+
1. **Patterns** — Approaches that worked well (reuse these)
|
|
55
|
+
2. **Anti-Patterns** — Approaches that failed (avoid these)
|
|
56
|
+
3. **Common Gotchas** — Project-specific traps (watch for these)
|
|
57
|
+
|
|
58
|
+
After ANY correction from the user, immediately update `tasks/lessons.md` with the pattern. Write the rule so that it prevents the same mistake in future sessions.
|
|
59
|
+
|
|
60
|
+
## Deep Guidance
|
|
61
|
+
|
|
62
|
+
### Beads Setup and Commands
|
|
63
|
+
|
|
64
|
+
#### Initialization
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
bd init # Creates .beads/ directory with data store and git hooks
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Initialization creates:
|
|
71
|
+
- `.beads/` — Data directory (committed to git)
|
|
72
|
+
- Git hooks for automatic data sync (these are Beads data hooks, not code-quality hooks like pre-commit linters)
|
|
73
|
+
- Initial `[BD-0]` bootstrap convention
|
|
74
|
+
|
|
75
|
+
#### Core Commands
|
|
76
|
+
|
|
77
|
+
| Command | Purpose | When to Use |
|
|
78
|
+
|---------|---------|-------------|
|
|
79
|
+
| `bd create "title"` | Create a new task | Starting new work |
|
|
80
|
+
| `bd list` | Show all tasks | Session start, planning |
|
|
81
|
+
| `bd status BD-xxx` | Check task state | Before picking up work |
|
|
82
|
+
| `bd start BD-xxx` | Mark task in-progress | Beginning work on a task |
|
|
83
|
+
| `bd done BD-xxx` | Mark task complete | After PR merged |
|
|
84
|
+
| `bd ready` | List tasks ready to start | Picking next task |
|
|
85
|
+
| `bd block BD-xxx "reason"` | Mark task blocked | When dependency is unmet |
|
|
86
|
+
|
|
87
|
+
#### Commit Message Convention
|
|
88
|
+
|
|
89
|
+
Every commit references its Beads task:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
[BD-42] feat(api): implement user registration endpoint
|
|
93
|
+
|
|
94
|
+
- Add POST /api/v1/auth/register
|
|
95
|
+
- Add input validation with zod schema
|
|
96
|
+
- Add integration tests for happy path and validation errors
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The `[BD-xxx]` prefix enables:
|
|
100
|
+
- Automatic task-to-commit traceability
|
|
101
|
+
- Progress tracking based on commit activity
|
|
102
|
+
- Session reconstruction (which commits belong to which task)
|
|
103
|
+
|
|
104
|
+
### Task Lifecycle Patterns
|
|
105
|
+
|
|
106
|
+
#### Session Start Protocol
|
|
107
|
+
|
|
108
|
+
1. Review `tasks/lessons.md` for recent patterns and corrections
|
|
109
|
+
2. Run `bd ready` to see available tasks
|
|
110
|
+
3. Pick the highest-priority ready task (or continue an in-progress task)
|
|
111
|
+
4. Run `bd start BD-xxx` to claim the task
|
|
112
|
+
5. Read the task description and acceptance criteria before writing code
|
|
113
|
+
|
|
114
|
+
#### Session End Protocol
|
|
115
|
+
|
|
116
|
+
1. Commit all work with `[BD-xxx]` prefix
|
|
117
|
+
2. If task is complete: create PR, run `bd done BD-xxx`
|
|
118
|
+
3. If task is incomplete: leave clear notes about current state and next steps
|
|
119
|
+
4. If lessons were learned: update `tasks/lessons.md`
|
|
120
|
+
|
|
121
|
+
#### Task Completion Criteria
|
|
122
|
+
|
|
123
|
+
A task is done when:
|
|
124
|
+
- All acceptance criteria from the task description are met
|
|
125
|
+
- Tests pass (`make check` or equivalent)
|
|
126
|
+
- Code follows project coding standards
|
|
127
|
+
- Changes are committed with proper `[BD-xxx]` message
|
|
128
|
+
- PR is created (or merged, depending on workflow)
|
|
129
|
+
|
|
130
|
+
Do not mark a task done based on "it seems to work." Prove it works — tests pass, logs clean, behavior verified.
|
|
131
|
+
|
|
132
|
+
### Lessons-Learned Workflow — Extended
|
|
133
|
+
|
|
134
|
+
#### When to Capture
|
|
135
|
+
|
|
136
|
+
Capture a lesson immediately when:
|
|
137
|
+
- The user corrects your approach or output
|
|
138
|
+
- A test fails due to a pattern you should have known
|
|
139
|
+
- You discover a project-specific convention by reading code
|
|
140
|
+
- A dependency or tool behaves differently than expected
|
|
141
|
+
- A workaround is needed for a known issue
|
|
142
|
+
|
|
143
|
+
#### How to Write Lessons
|
|
144
|
+
|
|
145
|
+
Each lesson should be specific, actionable, and preventive:
|
|
146
|
+
|
|
147
|
+
**Good lesson:**
|
|
148
|
+
```markdown
|
|
149
|
+
### Anti-Pattern: Using `git push -f` on shared branches
|
|
150
|
+
- **Trigger:** Pushed force to a branch with an open PR
|
|
151
|
+
- **Impact:** Overwrote collaborator's review comments
|
|
152
|
+
- **Rule:** Never force-push to branches with open PRs. Use `git push --force-with-lease` if force is truly needed.
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Bad lesson:**
|
|
156
|
+
```markdown
|
|
157
|
+
### Be careful with git
|
|
158
|
+
- Don't break things
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The lesson must contain enough detail that a future agent (or the same agent in a new session) can apply the rule without additional context.
|
|
162
|
+
|
|
163
|
+
#### Integration with CLAUDE.md
|
|
164
|
+
|
|
165
|
+
The CLAUDE.md Self-Improvement section establishes the contract:
|
|
166
|
+
|
|
167
|
+
> After ANY correction from the user: update `tasks/lessons.md` with the pattern.
|
|
168
|
+
> Write rules that prevent the same mistake recurring.
|
|
169
|
+
> Review `tasks/lessons.md` at session start before picking up work.
|
|
170
|
+
|
|
171
|
+
This creates a feedback loop: correction → lesson → rule → prevention. Each session starts by reviewing lessons, ensuring that past mistakes inform current work.
|
|
172
|
+
|
|
173
|
+
#### Cross-Session Memory
|
|
174
|
+
|
|
175
|
+
`tasks/lessons.md` is the primary cross-session learning mechanism. It persists in the repository and is loaded via CLAUDE.md references. For projects using MCP memory servers (Tier 2 memory), lessons can also be stored in the knowledge graph for structured querying — but `tasks/lessons.md` remains the canonical file. Do not duplicate entries across both systems.
|
|
176
|
+
|
|
177
|
+
### Progress Tracking Conventions
|
|
178
|
+
|
|
179
|
+
#### Status Files
|
|
180
|
+
|
|
181
|
+
For complex projects, maintain a progress summary:
|
|
182
|
+
|
|
183
|
+
```markdown
|
|
184
|
+
# Progress
|
|
185
|
+
|
|
186
|
+
## Current Sprint
|
|
187
|
+
- [x] BD-10: Database schema migration (done)
|
|
188
|
+
- [x] BD-11: Auth middleware (done)
|
|
189
|
+
- [ ] BD-12: User registration endpoint (in-progress)
|
|
190
|
+
- [ ] BD-13: Login endpoint (ready)
|
|
191
|
+
- [ ] BD-14: Profile management (blocked — needs BD-12)
|
|
192
|
+
|
|
193
|
+
## Blocked
|
|
194
|
+
- BD-14: Waiting on BD-12 (user model finalization)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### Completion Criteria Checklists
|
|
198
|
+
|
|
199
|
+
Each task should define explicit completion criteria, not vague goals:
|
|
200
|
+
|
|
201
|
+
```markdown
|
|
202
|
+
## BD-12: User registration endpoint
|
|
203
|
+
|
|
204
|
+
### Done when:
|
|
205
|
+
- [ ] POST /api/v1/auth/register endpoint exists
|
|
206
|
+
- [ ] Input validation rejects invalid email, weak password
|
|
207
|
+
- [ ] Password is hashed with bcrypt (cost factor 12)
|
|
208
|
+
- [ ] Duplicate email returns 409 Conflict
|
|
209
|
+
- [ ] Integration test covers happy path + 3 error cases
|
|
210
|
+
- [ ] `make check` passes
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Common Anti-Patterns
|
|
214
|
+
|
|
215
|
+
**Stale tasks.** Tasks created during planning but never updated as the project evolves. The task list says "implement X" but X was descoped two sessions ago. Fix: review the task list at the start of each session. Archive or close tasks that no longer apply.
|
|
216
|
+
|
|
217
|
+
**Unclear completion criteria.** "Implement the feature" with no acceptance criteria, no test requirements, no file paths. An agent starting this task has to guess what "done" means. Fix: every task specifies exact deliverables, test requirements, and a verifiable definition of done.
|
|
218
|
+
|
|
219
|
+
**Missing lessons.** The user corrects the same mistake three sessions in a row because nobody captured it in `tasks/lessons.md`. Fix: treat lesson capture as mandatory, not optional. After every correction, update the file before continuing with other work.
|
|
220
|
+
|
|
221
|
+
**Task ID drift.** Commits stop including `[BD-xxx]` prefixes partway through the project. Traceability breaks down. Fix: make task ID inclusion a habit enforced by review. If using a pre-commit hook, validate the prefix.
|
|
222
|
+
|
|
223
|
+
**Overloaded tasks.** A single task covers "implement the API, write the UI, add tests, update docs." This overflows a single session and makes progress tracking meaningless. Fix: split into tasks that each fit in one agent session (30-90 minutes).
|
|
224
|
+
|
|
225
|
+
**Lessons without rules.** A lesson says "we had trouble with X" but doesn't state a preventive rule. Future sessions read the lesson but don't know what to do differently. Fix: every lesson must include a concrete rule — "Always do Y" or "Never do Z" — not just a description of what went wrong.
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tech-stack-selection
|
|
3
|
+
description: Framework evaluation methodology, decision matrices, and technology tradeoff analysis
|
|
4
|
+
topics: [tech-stack, framework-selection, decision-matrix, tradeoffs, scalability, ecosystem]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Tech Stack Selection
|
|
8
|
+
|
|
9
|
+
Choosing a technology stack is one of the highest-leverage decisions in a project. A poor choice compounds into years of friction; a good choice becomes invisible. This knowledge covers systematic evaluation frameworks, decision matrices, and the discipline to separate signal from hype.
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
### Selection Criteria Categories
|
|
14
|
+
|
|
15
|
+
Every technology choice should be evaluated across six dimensions:
|
|
16
|
+
|
|
17
|
+
1. **Ecosystem Maturity** — Package ecosystem breadth, stability of core libraries, frequency of breaking changes, quality of documentation, Stack Overflow answer density.
|
|
18
|
+
2. **Team Expertise** — Current team proficiency, hiring pool depth in your market, ramp-up time for new developers, availability of training resources.
|
|
19
|
+
3. **Performance Characteristics** — Throughput, latency, memory footprint, startup time, concurrency model. Match to your workload profile, not benchmarks.
|
|
20
|
+
4. **Community & Support** — GitHub activity, release cadence, corporate backing stability, conference presence, number of active maintainers.
|
|
21
|
+
5. **Licensing & Cost** — License type (MIT, Apache, BSL, SSPL), commercial support costs, cloud provider pricing, vendor lock-in implications.
|
|
22
|
+
6. **Integration Fit** — Compatibility with existing systems, deployment target constraints, team tooling preferences, CI/CD compatibility.
|
|
23
|
+
|
|
24
|
+
### Decision Matrix Concept
|
|
25
|
+
|
|
26
|
+
A decision matrix scores each candidate technology against weighted criteria. Weights reflect project priorities — a startup prototype weights "time to first feature" heavily; an enterprise migration weights "long-term support" heavily. The matrix does not make the decision — it structures the conversation and forces explicit tradeoff acknowledgment. Set weights before scoring begins to prevent post-hoc rationalization of a predetermined choice.
|
|
27
|
+
|
|
28
|
+
### When to Revisit
|
|
29
|
+
|
|
30
|
+
Stack decisions should be revisited when: the team composition changes significantly, a dependency reaches end-of-life, performance requirements shift by an order of magnitude, or the licensing model changes. Do not revisit because a new framework is trending.
|
|
31
|
+
|
|
32
|
+
### The Anti-Pattern Shortlist
|
|
33
|
+
|
|
34
|
+
The most common selection failures: **Resume-Driven Development** (choosing tech the team wants to learn, not what fits), **Hype-Driven Development** (choosing what is trending, not what is proven), **Ignoring Team Skills** (a 20% perf gain is not worth a 200% productivity loss during ramp-up), and **Premature Vendor Lock-In** (building on proprietary services without abstraction layers).
|
|
35
|
+
|
|
36
|
+
### Documentation Requirement
|
|
37
|
+
|
|
38
|
+
Every stack decision must produce a written record: what was chosen, what was rejected, why, and under what conditions the decision should be revisited. This lives in `docs/tech-stack.md` or as an Architecture Decision Record (ADR). Undocumented decisions get relitigated every quarter.
|
|
39
|
+
|
|
40
|
+
## Deep Guidance
|
|
41
|
+
|
|
42
|
+
### The Evaluation Framework
|
|
43
|
+
|
|
44
|
+
#### Step 1: Define Non-Negotiable Constraints
|
|
45
|
+
|
|
46
|
+
Before evaluating options, enumerate hard constraints that eliminate candidates outright:
|
|
47
|
+
|
|
48
|
+
- **Runtime environment**: Browser, Node, Deno, Bun, JVM, native binary, embedded
|
|
49
|
+
- **Deployment target**: Serverless, containers, bare metal, edge, mobile device
|
|
50
|
+
- **Compliance requirements**: HIPAA, SOC2, FedRAMP — some libraries/services are pre-approved
|
|
51
|
+
- **Existing commitments**: Must integrate with an existing PostgreSQL database, must deploy to AWS, must support IE11
|
|
52
|
+
- **Team size and tenure**: A 2-person team cannot maintain a microservices architecture in 4 languages
|
|
53
|
+
|
|
54
|
+
Hard constraints are binary. If a technology fails any constraint, it is eliminated regardless of how well it scores on other dimensions.
|
|
55
|
+
|
|
56
|
+
#### Step 2: Weight the Criteria
|
|
57
|
+
|
|
58
|
+
Assign weights (1-5) to each criterion based on project context:
|
|
59
|
+
|
|
60
|
+
| Criterion | Startup MVP | Enterprise Migration | Performance-Critical | Open Source Tool |
|
|
61
|
+
|-----------|-------------|---------------------|---------------------|-----------------|
|
|
62
|
+
| Ecosystem Maturity | 3 | 5 | 3 | 4 |
|
|
63
|
+
| Team Expertise | 5 | 4 | 3 | 2 |
|
|
64
|
+
| Performance | 2 | 3 | 5 | 3 |
|
|
65
|
+
| Community | 4 | 3 | 2 | 5 |
|
|
66
|
+
| Licensing | 2 | 5 | 2 | 5 |
|
|
67
|
+
| Integration Fit | 3 | 5 | 4 | 3 |
|
|
68
|
+
|
|
69
|
+
These weights are examples. The team must set them for their specific context before scoring begins — otherwise weights get adjusted post-hoc to justify a predetermined choice.
|
|
70
|
+
|
|
71
|
+
#### Step 3: Score and Compare
|
|
72
|
+
|
|
73
|
+
Score each candidate 1-5 per criterion. Multiply by weight. Sum. The highest score is not automatically the winner — it is the starting point for discussion.
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
| Criterion (weight) | React (score) | Vue (score) | Svelte (score) |
|
|
77
|
+
|--------------------------|---------------|-------------|----------------|
|
|
78
|
+
| Ecosystem Maturity (5) | 5 (25) | 4 (20) | 3 (15) |
|
|
79
|
+
| Team Expertise (4) | 5 (20) | 2 (8) | 1 (4) |
|
|
80
|
+
| Performance (3) | 3 (9) | 3 (9) | 5 (15) |
|
|
81
|
+
| Community (3) | 5 (15) | 4 (12) | 3 (9) |
|
|
82
|
+
| Licensing (2) | 5 (10) | 5 (10) | 5 (10) |
|
|
83
|
+
| Integration Fit (4) | 4 (16) | 4 (16) | 3 (12) |
|
|
84
|
+
| **Total** | **95** | **75** | **65** |
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The matrix reveals where tradeoffs concentrate. In this example, Svelte wins on performance but loses on ecosystem and team expertise. The conversation is now: "Is the performance gain worth the ramp-up cost and ecosystem risk?"
|
|
88
|
+
|
|
89
|
+
### Category-Specific Evaluation
|
|
90
|
+
|
|
91
|
+
#### Frontend Frameworks
|
|
92
|
+
|
|
93
|
+
Key discriminators: bundle size, SSR support, routing model, state management ecosystem, TypeScript support quality, component library availability, build tooling maturity.
|
|
94
|
+
|
|
95
|
+
**React**: Largest ecosystem, most hiring options, most third-party libraries. Risk: meta-framework churn (Next.js vs Remix vs others). Best when: team knows React, project needs rich component library ecosystem.
|
|
96
|
+
|
|
97
|
+
**Vue**: Batteries-included official ecosystem (Vue Router, Pinia, Vite). Gentler learning curve. Smaller hiring pool in US/UK, larger in Asia-Pacific. Best when: team is learning frontend, project benefits from cohesive tooling.
|
|
98
|
+
|
|
99
|
+
**Svelte/SvelteKit**: Best runtime performance, smallest bundles, compiler-based approach. Smaller ecosystem, fewer battle-tested libraries. Best when: performance is critical, team is small and adaptable.
|
|
100
|
+
|
|
101
|
+
#### Backend Frameworks
|
|
102
|
+
|
|
103
|
+
Key discriminators: request throughput, cold start time, ORM/database tooling, middleware ecosystem, deployment model compatibility, type safety.
|
|
104
|
+
|
|
105
|
+
**Node.js (Express/Fastify/Hono)**: Same language as frontend, huge npm ecosystem, excellent serverless support. Risk: callback/async complexity at scale, single-threaded CPU bottlenecks. Best when: team is JavaScript-native, workload is I/O-bound.
|
|
106
|
+
|
|
107
|
+
**Python (FastAPI/Django)**: Strong ML/data ecosystem, excellent type hints (FastAPI), batteries-included admin (Django). Risk: GIL for CPU-bound work, slower raw throughput. Best when: project involves data processing/ML, team is Python-native.
|
|
108
|
+
|
|
109
|
+
**Go**: Excellent concurrency, fast compilation, small binaries, low memory footprint. Risk: verbose error handling, less expressive type system, smaller web framework ecosystem. Best when: high-concurrency services, CLI tools, infrastructure software.
|
|
110
|
+
|
|
111
|
+
#### Database Selection
|
|
112
|
+
|
|
113
|
+
Key discriminators: data model fit, query patterns, scalability model, operational complexity, backup/restore tooling, managed service availability.
|
|
114
|
+
|
|
115
|
+
**PostgreSQL**: Default choice for relational data. JSON support bridges document needs. Extensions ecosystem (PostGIS, pgvector, TimescaleDB). Risk: horizontal scaling requires careful planning. Best when: data is relational, you need ACID guarantees, you want one database.
|
|
116
|
+
|
|
117
|
+
**SQLite**: Zero-ops, embedded, surprisingly capable for read-heavy workloads. Litestream for replication. Risk: single-writer limitation, no built-in network access. Best when: single-server deployment, edge/embedded, development/testing.
|
|
118
|
+
|
|
119
|
+
**MongoDB**: True document model, flexible schema, built-in horizontal scaling. Risk: no joins (denormalization complexity), eventual consistency by default. Best when: data is genuinely document-shaped, schema evolves rapidly, write-heavy workload.
|
|
120
|
+
|
|
121
|
+
#### Infrastructure & Deployment
|
|
122
|
+
|
|
123
|
+
Key discriminators: operational burden, cost model, scaling characteristics, vendor lock-in degree, team DevOps expertise.
|
|
124
|
+
|
|
125
|
+
**Serverless (Lambda/Cloud Functions)**: Zero idle cost, automatic scaling, no server management. Risk: cold starts, vendor lock-in, debugging complexity, execution time limits. Best when: unpredictable traffic, many small functions, cost-sensitive.
|
|
126
|
+
|
|
127
|
+
**Containers (ECS/Cloud Run/Fly.io)**: Portable, predictable performance, good local development parity. Risk: orchestration complexity (if self-managed), persistent storage challenges. Best when: consistent workloads, need local dev parity, multi-cloud possible.
|
|
128
|
+
|
|
129
|
+
**PaaS (Railway/Render/Vercel)**: Fastest time to deploy, managed everything. Risk: cost at scale, limited customization, vendor-specific features. Best when: small team, prototype/MVP, standard web application architecture.
|
|
130
|
+
|
|
131
|
+
### Common Anti-Patterns
|
|
132
|
+
|
|
133
|
+
#### Resume-Driven Development
|
|
134
|
+
|
|
135
|
+
**Pattern**: Choosing technologies because the team wants to learn them, not because they fit the project.
|
|
136
|
+
**Signal**: "Let's use Kubernetes" for a single-server app. "Let's rewrite in Rust" for a CRUD API.
|
|
137
|
+
**Mitigation**: The decision matrix forces explicit scoring. If a technology wins only on "fun to learn," the matrix will show it.
|
|
138
|
+
|
|
139
|
+
#### Hype-Driven Development
|
|
140
|
+
|
|
141
|
+
**Pattern**: Choosing technologies because they are trending on Hacker News or have impressive benchmarks.
|
|
142
|
+
**Signal**: Citing benchmarks without mapping them to actual workload characteristics. "X is 10x faster than Y" without asking "do we need that speed?"
|
|
143
|
+
**Mitigation**: Require a concrete performance requirement before performance can be weighted heavily.
|
|
144
|
+
|
|
145
|
+
#### Ignoring Team Skills
|
|
146
|
+
|
|
147
|
+
**Pattern**: Choosing the "best" technology without accounting for team proficiency.
|
|
148
|
+
**Signal**: Picking Go for a team of Python developers because "Go is faster." The 6-month ramp-up and initial low-quality Go code will cost more than Python's slower runtime.
|
|
149
|
+
**Mitigation**: Weight team expertise appropriately. A 20% performance gain is rarely worth a 200% productivity loss during ramp-up.
|
|
150
|
+
|
|
151
|
+
#### Premature Vendor Lock-In
|
|
152
|
+
|
|
153
|
+
**Pattern**: Building on vendor-specific services without an abstraction layer, making migration prohibitively expensive.
|
|
154
|
+
**Signal**: Direct use of DynamoDB-specific APIs throughout business logic. Lambda-specific handler signatures in core code.
|
|
155
|
+
**Mitigation**: Score "portability" as part of integration fit. Use repository/adapter patterns for external services.
|
|
156
|
+
|
|
157
|
+
### Migration Cost Assessment
|
|
158
|
+
|
|
159
|
+
When evaluating a technology change mid-project, assess migration cost across five dimensions:
|
|
160
|
+
|
|
161
|
+
1. **Code rewrite volume** — What percentage of the codebase must change? API boundaries, data models, business logic, or just infrastructure wrappers?
|
|
162
|
+
2. **Data migration complexity** — Schema changes, data transformation, downtime requirements, rollback capability.
|
|
163
|
+
3. **Team retraining** — How long until the team is productive in the new technology? Count weeks, not days.
|
|
164
|
+
4. **Integration surface** — How many external systems connect to the component being replaced? Each integration point is a migration risk.
|
|
165
|
+
5. **Rollback plan** — Can you run old and new in parallel? Can you revert if the migration fails? If not, the risk multiplier is high.
|
|
166
|
+
|
|
167
|
+
A migration is justified when: the current technology is end-of-life, the current technology cannot meet a hard requirement, or the migration cost is less than the ongoing maintenance cost of staying.
|
|
168
|
+
|
|
169
|
+
### Vendor Lock-In Evaluation
|
|
170
|
+
|
|
171
|
+
Rate lock-in risk on a scale:
|
|
172
|
+
|
|
173
|
+
| Level | Description | Example | Exit Cost |
|
|
174
|
+
|-------|-------------|---------|-----------|
|
|
175
|
+
| **None** | Standard interface, multiple providers | PostgreSQL, S3-compatible storage | Low |
|
|
176
|
+
| **Low** | Portable with adapter work | Redis (managed vs self-hosted) | Medium |
|
|
177
|
+
| **Medium** | Significant API surface to abstract | Firebase Auth, Stripe Billing | High |
|
|
178
|
+
| **High** | Deep integration, no portable equivalent | DynamoDB single-table design, Vercel Edge Config | Very High |
|
|
179
|
+
| **Total** | No alternative exists | Apple Push Notifications, platform-specific APIs | Impossible |
|
|
180
|
+
|
|
181
|
+
For each dependency, document the lock-in level in `docs/tech-stack.md`. When lock-in is Medium or higher, require an abstraction layer (repository pattern, adapter interface) that isolates vendor-specific code.
|
|
182
|
+
|
|
183
|
+
### Decision Record Template
|
|
184
|
+
|
|
185
|
+
Every technology decision should produce a record:
|
|
186
|
+
|
|
187
|
+
```markdown
|
|
188
|
+
## Decision: [Technology Choice]
|
|
189
|
+
|
|
190
|
+
**Date**: YYYY-MM-DD
|
|
191
|
+
**Status**: Accepted | Superseded by [link]
|
|
192
|
+
**Deciders**: [Names]
|
|
193
|
+
|
|
194
|
+
### Context
|
|
195
|
+
What problem are we solving? What constraints exist?
|
|
196
|
+
|
|
197
|
+
### Options Considered
|
|
198
|
+
1. **[Option A]** — Brief description. Pros: ... Cons: ...
|
|
199
|
+
2. **[Option B]** — Brief description. Pros: ... Cons: ...
|
|
200
|
+
3. **[Option C]** — Brief description. Pros: ... Cons: ...
|
|
201
|
+
|
|
202
|
+
### Decision
|
|
203
|
+
We chose [Option X] because [primary reasons].
|
|
204
|
+
|
|
205
|
+
### Consequences
|
|
206
|
+
- Positive: [what we gain]
|
|
207
|
+
- Negative: [what we accept as tradeoffs]
|
|
208
|
+
- Neutral: [what doesn't change]
|
|
209
|
+
|
|
210
|
+
### Revisit Conditions
|
|
211
|
+
Revisit this decision if: [specific, measurable conditions]
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
This record prevents "nobody remembers why we chose X" six months later. It also prevents relitigating decisions without new information — if the conditions for revisiting haven't changed, the decision stands.
|