@khoavu882/doflow 0.0.0-stage → 2.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +132 -2
- package/bin/doflow.js +44 -0
- package/core/.antigravity-plugin/hooks.json +39 -0
- package/core/.antigravity-plugin/mcp_config.json +18 -0
- package/core/.antigravity-plugin/plugin.json +31 -0
- package/core/.claude-plugin/marketplace.json +20 -0
- package/core/.claude-plugin/plugin.json +21 -0
- package/core/.codex-plugin/marketplace.json +20 -0
- package/core/.codex-plugin/plugin.json +35 -0
- package/core/.plugin/plugin.json +19 -0
- package/core/harnesses/antigravity/hooks/pre-implementation-gate.sh +9 -0
- package/core/harnesses/antigravity/hooks/stop-check.sh +10 -0
- package/core/harnesses/claude/hooks/lib.sh +304 -0
- package/core/harnesses/claude/hooks/mcp-tool-guard.sh +20 -0
- package/core/harnesses/claude/hooks/permission-audit.sh +47 -0
- package/core/harnesses/claude/hooks/post-compact.sh +74 -0
- package/core/harnesses/claude/hooks/post-edit-lint.sh +36 -0
- package/core/harnesses/claude/hooks/post-tool-failure.sh +47 -0
- package/core/harnesses/claude/hooks/pre-bash-guard.sh +20 -0
- package/core/harnesses/claude/hooks/pre-compact.sh +43 -0
- package/core/harnesses/claude/hooks/pre-implement-gate.sh +21 -0
- package/core/harnesses/claude/hooks/session-end.sh +89 -0
- package/core/harnesses/claude/hooks/session-start.sh +5 -0
- package/core/harnesses/claude/hooks/skill-config-audit.sh +39 -0
- package/core/harnesses/claude/hooks/stop-check.sh +5 -0
- package/core/harnesses/claude/hooks/subagent-audit.sh +7 -0
- package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -0
- package/core/harnesses/claude/settings/keybindings.json +20 -0
- package/core/harnesses/claude/settings/settings.json +201 -0
- package/core/harnesses/claude/statusline/doflow-statusline.sh +49 -0
- package/core/harnesses/codex/agents/core-implementer.toml +7 -0
- package/core/harnesses/codex/agents/quality-guardian.toml +8 -0
- package/core/harnesses/codex/agents/research-writer.toml +8 -0
- package/core/harnesses/codex/agents/spec-analyst.toml +8 -0
- package/core/harnesses/codex/agents/system-architect.toml +9 -0
- package/core/harnesses/codex/config/config.toml +10 -0
- package/core/harnesses/codex/hooks/hooks.json +122 -0
- package/core/harnesses/codex/hooks/lib.sh +335 -0
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +18 -0
- package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +52 -0
- package/core/harnesses/codex/hooks/post-edit-lint.sh +6 -0
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +18 -0
- package/core/harnesses/codex/hooks/pre-compact.impl.sh +46 -0
- package/core/harnesses/codex/hooks/pre-compact.sh +9 -0
- package/core/harnesses/codex/hooks/pre-implement-gate.sh +19 -0
- package/core/harnesses/codex/hooks/session-end.impl.sh +92 -0
- package/core/harnesses/codex/hooks/session-end.sh +5 -0
- package/core/harnesses/codex/hooks/session-start.sh +5 -0
- package/core/harnesses/codex/hooks/stop-check.sh +8 -0
- package/core/harnesses/codex/hooks/subagent-audit.sh +8 -0
- package/core/harnesses/codex/hooks/user-prompt-submit.sh +6 -0
- package/core/harnesses/gemini/hooks/hooks.json +77 -0
- package/core/harnesses/gemini/hooks/lib.sh +302 -0
- package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +21 -0
- package/core/harnesses/gemini/hooks/post-edit-lint.sh +39 -0
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +21 -0
- package/core/harnesses/gemini/hooks/pre-compact.sh +38 -0
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +22 -0
- package/core/harnesses/gemini/hooks/session-end.impl.sh +89 -0
- package/core/harnesses/gemini/hooks/session-end.sh +5 -0
- package/core/harnesses/gemini/hooks/session-start.sh +5 -0
- package/core/harnesses/gemini/settings/adapter-defaults.json +4 -0
- package/core/harnesses/kiro/agents/doflow.json +58 -0
- package/core/harnesses/kiro/hooks/doflow.json +53 -0
- package/core/harnesses/kiro/hooks/lib.sh +324 -0
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +9 -0
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +9 -0
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +9 -0
- package/core/harnesses/kiro/hooks/session-start.sh +9 -0
- package/core/harnesses/kiro/hooks/stop-check.sh +43 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +39 -0
- package/core/harnesses/shared/hooks/adapters/antigravity.js +111 -0
- package/core/harnesses/shared/hooks/adapters/arg-fields.js +19 -0
- package/core/harnesses/shared/hooks/adapters/gemini.js +114 -0
- package/core/harnesses/shared/hooks/hooks.json +47 -0
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +91 -0
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +97 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +29 -0
- package/core/harnesses/shared/hooks/policies/lib.sh +501 -0
- package/core/harnesses/shared/hooks/policies/mcp-policy.conf +21 -0
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +91 -0
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +328 -0
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +496 -0
- package/core/harnesses/shared/hooks/policies/prompt-nudge.jq +131 -0
- package/core/harnesses/shared/hooks/policies/session-context.sh +141 -0
- package/core/harnesses/shared/hooks/policies/stop-check.sh +264 -0
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +46 -0
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +235 -0
- package/core/harnesses/shared/hooks/stream-hook-runner.js +590 -0
- package/core/harnesses/shared/locator/doflow-run +87 -0
- package/core/registry/advice.json +101 -0
- package/core/registry/assets.json +792 -0
- package/core/registry/capabilities.json +120 -0
- package/core/registry/contracts.json +189 -0
- package/core/registry/external-tools.json +191 -0
- package/core/registry/harnesses.json +2062 -0
- package/core/registry/lifecycle.json +231 -0
- package/core/registry/mcp.json +18 -0
- package/core/registry/models.json +79 -0
- package/core/registry/readiness-templates.json +118 -0
- package/core/registry/routes.json +47 -0
- package/core/registry/storage.json +1061 -0
- package/core/registry/verification.json +258 -0
- package/core/registry/workflows.json +790 -0
- package/core/shared/agent-specs/core-implementer.md +73 -0
- package/core/shared/agent-specs/quality-guardian.md +28 -0
- package/core/shared/agent-specs/research-writer.md +31 -0
- package/core/shared/agent-specs/spec-analyst.md +33 -0
- package/core/shared/agent-specs/system-architect.md +29 -0
- package/core/shared/guidance/DOFLOW_CORE.md +8 -0
- package/core/shared/guidance/FLAGS.md +25 -0
- package/core/shared/guidance/PRINCIPLES.md +61 -0
- package/core/shared/guidance/VERSION +1 -0
- package/core/shared/guidance/mcp/MCP_Context7.md +18 -0
- package/core/shared/guidance/mcp/MCP_Sequential.md +17 -0
- package/core/shared/guidance/modes/MODE_Brainstorming.md +46 -0
- package/core/shared/guidance/modes/MODE_DeepResearch.md +69 -0
- package/core/shared/guidance/modes/MODE_Introspection.md +33 -0
- package/core/shared/guidance/modes/MODE_Orchestration.md +57 -0
- package/core/shared/guidance/modes/MODE_Task_Management.md +74 -0
- package/core/shared/guidance/pointers/claude-gemini.md +2 -0
- package/core/shared/guidance/pointers/codex.md +6 -0
- package/core/shared/guidance/references/ARTIFACT_FORMAT.md +373 -0
- package/core/shared/guidance/references/ARTIFACT_VOICE.md +104 -0
- package/core/shared/guidance/references/CONSTITUTION_BASE.md +47 -0
- package/core/shared/guidance/references/DIAGRAM_GUIDE.md +161 -0
- package/core/shared/guidance/references/DOFLOW_CHAIN.md +87 -0
- package/core/shared/guidance/references/EVIDENCE_LEDGER.md +93 -0
- package/core/shared/guidance/references/MODEL_SELECTION.md +74 -0
- package/core/shared/guidance/references/ORCHESTRATION.md +36 -0
- package/core/shared/guidance/references/RESEARCH_CONFIG.md +21 -0
- package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +81 -0
- package/core/shared/guidance/rules/RULE_01_SAFETY.md +25 -0
- package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +23 -0
- package/core/shared/guidance/rules/RULE_03_QUALITY.md +14 -0
- package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +46 -0
- package/core/shared/scripts/doflow/assets/mermaid-theme.json +46 -0
- package/core/shared/scripts/doflow/bash/do-exec-paths.sh +167 -0
- package/core/shared/scripts/doflow/bash/do-git-state.sh +546 -0
- package/core/shared/scripts/doflow/bash/do-parallel-check.sh +208 -0
- package/core/shared/scripts/doflow/bash/do-paths.sh +347 -0
- package/core/shared/scripts/doflow/bash/do-prereqs.sh +66 -0
- package/core/shared/scripts/doflow/bash/do-review-package.sh +127 -0
- package/core/shared/scripts/doflow/bash/do-task-brief.sh +698 -0
- package/core/shared/scripts/doflow/bash/render-audit.sh +224 -0
- package/core/shared/scripts/doflow/bash/render-diagrams.sh +177 -0
- package/core/shared/scripts/doflow/bash/render-puml.sh +223 -0
- package/core/shared/scripts/doflow/bash/sync-context.sh +66 -0
- package/core/shared/scripts/doflow/bash/validate-artifacts.sh +526 -0
- package/core/shared/scripts/doflow/bin/doflow-run +592 -0
- package/core/shared/skills/do/SKILL.md +128 -0
- package/core/shared/skills/do/references/estimation.md +13 -0
- package/core/shared/skills/do/references/pm_routing.md +25 -0
- package/core/shared/skills/do/references/tool_matrix.md +52 -0
- package/core/shared/skills/do-brainstorm/SKILL.md +252 -0
- package/core/shared/skills/do-code-review/README.md +49 -0
- package/core/shared/skills/do-code-review/SKILL.md +333 -0
- package/core/shared/skills/do-code-review/assets/sample_c_clean.c +71 -0
- package/core/shared/skills/do-code-review/assets/sample_c_smells.c +66 -0
- package/core/shared/skills/do-code-review/assets/sample_cpp_shift.cpp +19 -0
- package/core/shared/skills/do-code-review/assets/sample_csharp_clean.cs +100 -0
- package/core/shared/skills/do-code-review/assets/sample_csharp_smells.cs +78 -0
- package/core/shared/skills/do-code-review/assets/sample_java_clean.java +55 -0
- package/core/shared/skills/do-code-review/assets/sample_java_smells.java +56 -0
- package/core/shared/skills/do-code-review/assets/sample_json_clean.json +7 -0
- package/core/shared/skills/do-code-review/assets/sample_markdown_clean.md +30 -0
- package/core/shared/skills/do-code-review/assets/sample_markdown_smells.md +29 -0
- package/core/shared/skills/do-code-review/assets/sample_shell_heredoc.sh +38 -0
- package/core/shared/skills/do-code-review/assets/sample_shell_smells.sh +15 -0
- package/core/shared/skills/do-code-review/assets/sample_typescript_strings.ts +36 -0
- package/core/shared/skills/do-code-review/assets/sample_yaml_smells.yaml +6 -0
- package/core/shared/skills/do-code-review/content-types/config.md +83 -0
- package/core/shared/skills/do-code-review/content-types/markdown.md +132 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_c_clean_quality.json +79 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_c_smells_quality.json +169 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_cpp_shift_quality.json +49 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_clean_quality.json +149 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_smells_quality.json +157 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_java_clean_quality.json +67 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_java_smells_quality.json +97 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_json_clean_quality.json +33 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_clean_quality.json +1 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_smells_quality.json +16 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_shell_heredoc_quality.json +54 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_shell_smells_quality.json +91 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_typescript_strings_quality.json +60 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_yaml_smells_quality.json +46 -0
- package/core/shared/skills/do-code-review/languages/c.md +103 -0
- package/core/shared/skills/do-code-review/languages/cpp.md +103 -0
- package/core/shared/skills/do-code-review/languages/csharp.md +97 -0
- package/core/shared/skills/do-code-review/languages/dart.md +108 -0
- package/core/shared/skills/do-code-review/languages/go.md +92 -0
- package/core/shared/skills/do-code-review/languages/java.md +103 -0
- package/core/shared/skills/do-code-review/languages/kotlin.md +88 -0
- package/core/shared/skills/do-code-review/languages/php.md +109 -0
- package/core/shared/skills/do-code-review/languages/python.md +94 -0
- package/core/shared/skills/do-code-review/languages/ruby.md +105 -0
- package/core/shared/skills/do-code-review/languages/rust.md +99 -0
- package/core/shared/skills/do-code-review/languages/shell.md +90 -0
- package/core/shared/skills/do-code-review/languages/swift.md +88 -0
- package/core/shared/skills/do-code-review/languages/typescript.md +97 -0
- package/core/shared/skills/do-code-review/review-policy.json +47 -0
- package/core/shared/skills/do-code-review/rules/universal.md +49 -0
- package/core/shared/skills/do-code-review/scripts/code_quality_checker.py +1696 -0
- package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +532 -0
- package/core/shared/skills/do-code-review/scripts/pr_analyzer.py +620 -0
- package/core/shared/skills/do-code-review/scripts/review_report_generator.py +505 -0
- package/core/shared/skills/do-constitution/SKILL.md +72 -0
- package/core/shared/skills/do-design/SKILL.md +212 -0
- package/core/shared/skills/do-diagnose/SKILL.md +156 -0
- package/core/shared/skills/do-diagnose/references/code_audit.md +15 -0
- package/core/shared/skills/do-diagnose/references/refactoring.md +12 -0
- package/core/shared/skills/do-diagnose/references/root_cause.md +17 -0
- package/core/shared/skills/do-document/SKILL.md +81 -0
- package/core/shared/skills/do-document/references/api-reference.md +42 -0
- package/core/shared/skills/do-document/references/deep_research.md +18 -0
- package/core/shared/skills/do-document/references/embedded-research.md +11 -0
- package/core/shared/skills/do-document/references/implementation-flow.md +105 -0
- package/core/shared/skills/do-document/references/index_generator.md +9 -0
- package/core/shared/skills/do-document/references/user-guide.md +22 -0
- package/core/shared/skills/do-execute-plan/SKILL.md +261 -0
- package/core/shared/skills/do-execute-plan/references/handoff_record.md +57 -0
- package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +92 -0
- package/core/shared/skills/do-execute-plan/references/readiness_gate.md +155 -0
- package/core/shared/skills/do-execute-plan/references/run_position.md +63 -0
- package/core/shared/skills/do-execute-plan/references/scaffold.md +441 -0
- package/core/shared/skills/do-execute-plan/references/task_attempts.md +41 -0
- package/core/shared/skills/do-flow/SKILL.md +186 -0
- package/core/shared/skills/do-flow/references/task_classes.md +134 -0
- package/core/shared/skills/do-git/SKILL.md +115 -0
- package/core/shared/skills/do-git/references/hotfix-ritual.md +44 -0
- package/core/shared/skills/do-git/references/lifecycle-policy.md +54 -0
- package/core/shared/skills/do-git/references/release-ritual.md +64 -0
- package/core/shared/skills/do-implement/SKILL.md +222 -0
- package/core/shared/skills/do-plan/SKILL.md +219 -0
- package/core/shared/skills/do-test/SKILL.md +113 -0
- package/core/shared/templates/doflow/constitution-template.md +28 -0
- package/core/shared/templates/doflow/data-model-template.md +169 -0
- package/core/shared/templates/doflow/design-template.md +193 -0
- package/core/shared/templates/doflow/external-contract-template.md +35 -0
- package/core/shared/templates/doflow/intent-template.md +45 -0
- package/core/shared/templates/doflow/plan-template.md +151 -0
- package/core/shared/templates/doflow/question-log-template.md +51 -0
- package/core/shared/templates/doflow/requirement-template.md +126 -0
- package/core/shared/templates/doflow/specs-template.md +55 -0
- package/core/shared/templates/doflow/state-template.md +59 -0
- package/core/shared/workflows/do-flow-chain.md +17 -0
- package/package.json +48 -4
- package/src/adapters/antigravity/index.js +631 -0
- package/src/adapters/claude/index.js +548 -0
- package/src/adapters/claude/mcp.js +94 -0
- package/src/adapters/codex/agents.js +208 -0
- package/src/adapters/codex/config.js +272 -0
- package/src/adapters/codex/hooks.js +203 -0
- package/src/adapters/codex/index.js +707 -0
- package/src/adapters/codex/mcp.js +271 -0
- package/src/adapters/codex/native-projection.js +34 -0
- package/src/adapters/copilot/index.js +413 -0
- package/src/adapters/copy-tree.js +620 -0
- package/src/adapters/gemini/hooks.js +210 -0
- package/src/adapters/gemini/index.js +390 -0
- package/src/adapters/hook-commands.js +60 -0
- package/src/adapters/index.js +106 -0
- package/src/adapters/kiro/index.js +310 -0
- package/src/adapters/mcp-entries.js +331 -0
- package/src/adapters/opencode/index.js +466 -0
- package/src/adapters/pi/index.js +279 -0
- package/src/adapters/pi/json-members.js +185 -0
- package/src/adapters/pi/mcp.js +373 -0
- package/src/adapters/resolve-source.js +19 -0
- package/src/cli/commands/install.js +218 -0
- package/src/cli/commands/list-backups.js +21 -0
- package/src/cli/commands/reconcile.js +120 -0
- package/src/cli/commands/remove.js +82 -0
- package/src/cli/commands/rollback.js +172 -0
- package/src/cli/commands/self-update.js +33 -0
- package/src/cli/commands/status.js +138 -0
- package/src/cli/commands/tools.js +92 -0
- package/src/cli/commands/update.js +162 -0
- package/src/cli/index.js +568 -0
- package/src/cli/runtime-commands.js +281 -0
- package/src/cli/shared.js +218 -0
- package/src/helper/bash-helper.js +34 -0
- package/src/helper/git.js +24 -0
- package/src/helper/guardrails.js +49 -0
- package/src/helper/harness-paths.js +140 -0
- package/src/helper/marker-merge.js +116 -0
- package/src/helper/prompt.js +61 -0
- package/src/helper/repo-root.js +29 -0
- package/src/helper/settings-merge.js +151 -0
- package/src/helper/settings-scope.js +33 -0
- package/src/helper/toml.js +244 -0
- package/src/install/backup-set.js +149 -0
- package/src/install/backup.js +724 -0
- package/src/install/context.js +58 -0
- package/src/install/manifest.js +145 -0
- package/src/install/mcp.js +254 -0
- package/src/install/paths.js +84 -0
- package/src/install/targets.js +90 -0
- package/src/install/tool-lifecycle.js +151 -0
- package/src/lifecycle/bash-availability.js +25 -0
- package/src/lifecycle/index.js +812 -0
- package/src/lifecycle/mcp-index.js +28 -0
- package/src/lifecycle/policies.js +73 -0
- package/src/lifecycle/view.js +175 -0
- package/src/registry/index.js +611 -0
- package/src/release/build-package.js +91 -0
- package/src/release/changelog-section.js +70 -0
- package/src/release/sync-plugin-versions.js +66 -0
- package/src/runtime/advice/cli.js +283 -0
- package/src/runtime/advice/client.js +324 -0
- package/src/runtime/advice/config.js +189 -0
- package/src/runtime/advice/doctor.js +169 -0
- package/src/runtime/advice/endpoint-guard.js +134 -0
- package/src/runtime/advice/kinds.js +154 -0
- package/src/runtime/advice/providers/ollama-systemone.js +209 -0
- package/src/runtime/advice/record.js +166 -0
- package/src/runtime/advice/registry.js +170 -0
- package/src/runtime/advice/strength.js +66 -0
- package/src/runtime/brief-tools.js +342 -0
- package/src/runtime/c4-project.js +371 -0
- package/src/runtime/capability-router.js +484 -0
- package/src/runtime/checkouts.js +170 -0
- package/src/runtime/claims.js +468 -0
- package/src/runtime/cli-result.js +55 -0
- package/src/runtime/cli.js +678 -0
- package/src/runtime/command-detect.js +516 -0
- package/src/runtime/context-pack.js +492 -0
- package/src/runtime/decision-register.js +493 -0
- package/src/runtime/evidence-ledger.js +338 -0
- package/src/runtime/failure/capture.js +272 -0
- package/src/runtime/failure/classifier.js +68 -0
- package/src/runtime/failure/cli.js +178 -0
- package/src/runtime/failure/home.js +64 -0
- package/src/runtime/failure/store.js +226 -0
- package/src/runtime/feature-resolve.js +79 -0
- package/src/runtime/freshness.js +177 -0
- package/src/runtime/health.js +863 -0
- package/src/runtime/history-compactor.js +237 -0
- package/src/runtime/implementation-gate.js +321 -0
- package/src/runtime/inventory/coverage.js +218 -0
- package/src/runtime/inventory/identity.js +65 -0
- package/src/runtime/inventory/index.js +705 -0
- package/src/runtime/inventory/precedence.js +134 -0
- package/src/runtime/inventory/read-scopes.js +131 -0
- package/src/runtime/inventory/siblings.js +192 -0
- package/src/runtime/knowledge/chunker.js +124 -0
- package/src/runtime/knowledge/hybrid.js +149 -0
- package/src/runtime/knowledge/index-store.js +145 -0
- package/src/runtime/knowledge/retrieval.js +194 -0
- package/src/runtime/leak-scan.js +185 -0
- package/src/runtime/lifecycle/cli.js +276 -0
- package/src/runtime/lifecycle/event-store.js +340 -0
- package/src/runtime/lifecycle/fold.js +353 -0
- package/src/runtime/lifecycle/followup.js +432 -0
- package/src/runtime/lifecycle/goal.js +249 -0
- package/src/runtime/lifecycle/intent-writer.js +86 -0
- package/src/runtime/lifecycle/overview.js +292 -0
- package/src/runtime/lifecycle/release.js +241 -0
- package/src/runtime/lifecycle/report-store.js +221 -0
- package/src/runtime/lifecycle/retention.js +212 -0
- package/src/runtime/lifecycle/root.js +71 -0
- package/src/runtime/lifecycle/status.js +353 -0
- package/src/runtime/lifecycle/store-upkeep.js +393 -0
- package/src/runtime/locator-resolve.js +158 -0
- package/src/runtime/mask.js +210 -0
- package/src/runtime/mcp-consultations.js +412 -0
- package/src/runtime/mcp-reach.js +157 -0
- package/src/runtime/model-router.js +153 -0
- package/src/runtime/outcome.js +467 -0
- package/src/runtime/reach.js +148 -0
- package/src/runtime/readiness-record.js +150 -0
- package/src/runtime/readiness.js +435 -0
- package/src/runtime/recovery.js +282 -0
- package/src/runtime/research-request.js +231 -0
- package/src/runtime/retrieval-plan.js +578 -0
- package/src/runtime/scaffold/artifacts.js +217 -0
- package/src/runtime/scaffold/fingerprint.js +56 -0
- package/src/runtime/scaffold/generate.js +911 -0
- package/src/runtime/scaffold/languages.js +245 -0
- package/src/runtime/storage/cli.js +64 -0
- package/src/runtime/storage/engine.js +249 -0
- package/src/runtime/storage/registry.js +130 -0
- package/src/runtime/storage/roots.js +63 -0
- package/src/runtime/storage/rules.js +282 -0
- package/src/runtime/storage/upkeep.js +243 -0
- package/src/runtime/storage/work-status.js +326 -0
- package/src/runtime/task-attempts.js +415 -0
- package/src/runtime/task-classifier.js +550 -0
- package/src/runtime/task-scope.js +130 -0
- package/src/runtime/task-state.js +176 -0
- package/src/runtime/trace/indicators.js +235 -0
- package/src/runtime/trace/ledger.js +626 -0
- package/src/runtime/trace/render.js +76 -0
- package/src/runtime/trace/views.js +459 -0
- package/src/runtime/verification/contract-runner.js +341 -0
- package/src/runtime/verification/engine.js +1461 -0
- package/src/runtime/verification/registry.js +130 -0
- package/src/runtime/verification/scope-bound.js +418 -0
- package/src/runtime/verification/test-selection.js +172 -0
- package/src/runtime/workflow-engine.js +588 -0
- package/src/runtime/workflow-orchestrator.js +953 -0
- package/src/runtime/worktree.js +340 -0
- package/src/state/index.js +193 -0
- package/src/state/lockfile.js +136 -0
- package/src/state/run-lock.js +408 -0
- package/types/node-commonjs.d.ts +68 -0
- package/types/runtime.d.ts +91 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# Artifact Format — authoring convention for chain artifacts
|
|
2
|
+
|
|
3
|
+
How `requirement.md`, `design.md` and `plan.md` are structured so an engineer who did not write a
|
|
4
|
+
feature can learn what it contains without reading it end to end. Loaded on demand by
|
|
5
|
+
`do-brainstorm`, `do-design` and `do-plan`; not part of any always-loaded context.
|
|
6
|
+
|
|
7
|
+
Checked mechanically by `scripts/doflow/bash/validate-artifacts.sh` — advisory, never blocking.
|
|
8
|
+
`state.md`, contract docs, and `implementation-flow.md` are out of scope; the former are list-shaped, the latter narrative-only.
|
|
9
|
+
`audit.md` is out of scope too, for a different reason: it is machine-generated by `render-audit.sh`
|
|
10
|
+
and never hand-authored, so there is nothing for a consistency checker to check (see §9, "What the
|
|
11
|
+
checker does and does not do" — not the `## 9. History` inside §3's own fenced example below, which
|
|
12
|
+
illustrates an *artifact's* §9, not this document's).
|
|
13
|
+
|
|
14
|
+
## 1. Index then detail
|
|
15
|
+
|
|
16
|
+
Every enumerated, ID-bearing section opens with a table summarising its items, followed by
|
|
17
|
+
`**Detail**` and the full normative text of each one.
|
|
18
|
+
|
|
19
|
+
```markdown
|
|
20
|
+
| ID | Requirement | Priority | Status |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| FR-001 | One-line summary | P1 | Live |
|
|
23
|
+
|
|
24
|
+
**Detail**
|
|
25
|
+
|
|
26
|
+
- **FR-001:** The system MUST [full normative text, every qualifier and exception intact].
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Rules:
|
|
30
|
+
|
|
31
|
+
- The **index is navigation, not a substitute.** Detail carries the full text; a reviewer must be
|
|
32
|
+
able to rely on it alone for correctness. Adding an index never shortens what was already there.
|
|
33
|
+
- **Every index row has exactly one detail entry, and vice versa.** Orphans on either side are
|
|
34
|
+
what the validator reports first.
|
|
35
|
+
- The first column header must be literally `ID`, and the status column header literally `Status` —
|
|
36
|
+
the checker locates them by name, so a column added to the right cannot shift the check.
|
|
37
|
+
- A detail entry takes either of two forms, and both may appear in the same artifact. Neither is
|
|
38
|
+
deprecated.
|
|
39
|
+
- **Bullet form:** a line starting `- **<ID>`, where `<ID>` is the leading token inside the bold.
|
|
40
|
+
A trailing colon or a parenthetical qualifier inside the bold is fine: `- **FR-001:**` and
|
|
41
|
+
`- **NFR-002 (Backward compatible):**` both parse.
|
|
42
|
+
- **Heading form:** a line matching `#### <ID>: <text>`, which counts as a detail entry only when
|
|
43
|
+
`<ID>` also appears in the first column of that section's index table. An ID-shaped heading with
|
|
44
|
+
no matching index row is not a detail entry and is ignored, so an unrelated heading cannot
|
|
45
|
+
invent a parity finding of its own.
|
|
46
|
+
|
|
47
|
+
Two conditions bound this form, and the bullet form is the answer wherever they do not hold.
|
|
48
|
+
The index table must appear **before** the detail it pairs with, because a heading is read
|
|
49
|
+
against the rows already seen. And the index must be **ID-first**: §3's History table leads with
|
|
50
|
+
`Date`, so **History detail uses the bullet form**. Neither condition binds the bullet form,
|
|
51
|
+
which is reconciled only after the whole file is read.
|
|
52
|
+
|
|
53
|
+
Which sections take an index: `requirement.md` §3 Functional Requirements, §4 Non-Functional
|
|
54
|
+
Requirements and §8 Assumptions; `design.md` §3 Components & Boundaries, §7 Risks and §8
|
|
55
|
+
Assumptions; `plan.md` §4 Components & Changes and §6 Risks; `specs.md` §1 Interface Contracts.
|
|
56
|
+
Prose sections do not.
|
|
57
|
+
|
|
58
|
+
## 2. Status and Maturity — two closed vocabularies
|
|
59
|
+
|
|
60
|
+
### Status — the state of one indexed item
|
|
61
|
+
|
|
62
|
+
| Value | Meaning |
|
|
63
|
+
|---|---|
|
|
64
|
+
| `Live` | In force as written |
|
|
65
|
+
| `Superseded → <ref>` | Replaced; `<ref>` names what replaced it |
|
|
66
|
+
|
|
67
|
+
Nothing else is permitted — no `TBD`, `Draft`, `Done` or `WIP`. Emphasis is ignored, so
|
|
68
|
+
`**Superseded → FR-009**` reads the same as the bare form.
|
|
69
|
+
|
|
70
|
+
An item is **never silently deleted** once another artifact references its ID. Supersession is
|
|
71
|
+
recorded so a reference encountered elsewhere always resolves. An item dropped before anything
|
|
72
|
+
references it may simply be removed.
|
|
73
|
+
|
|
74
|
+
### Maturity — the state of the document
|
|
75
|
+
|
|
76
|
+
Every chain artifact's header carries `**Maturity:** <value>`, one of exactly three:
|
|
77
|
+
|
|
78
|
+
| Value | Meaning |
|
|
79
|
+
|---|---|
|
|
80
|
+
| `Draft` | Being written or revised; not yet offered for review |
|
|
81
|
+
| `In review` | Offered for review; no reviewer has ruled on it yet |
|
|
82
|
+
| `Approved` | A reviewer accepted it as it stands |
|
|
83
|
+
|
|
84
|
+
The two vocabularies are **disjoint**: no value is a member of both, so no reader and no parser has
|
|
85
|
+
to work out which one a value came from. `Maturity` describes the document as a whole; `Status`
|
|
86
|
+
describes one indexed item inside it. A document can be `Approved` while an item inside it is
|
|
87
|
+
`Superseded → <ref>`, and the two say different things.
|
|
88
|
+
|
|
89
|
+
The former header form `**Status:** Draft` is gone. A header carrying `Status` is reading the item
|
|
90
|
+
vocabulary in the wrong place, and `Draft` was never a legal member of it.
|
|
91
|
+
|
|
92
|
+
## 3. History — the live body stays current
|
|
93
|
+
|
|
94
|
+
When an item is superseded, its obsolete prose leaves the `**Detail**` block and moves to the
|
|
95
|
+
artifact's own final History section — §9 for `requirement.md`, `design.md` and `plan.md`; §2 for
|
|
96
|
+
`specs.md`. The index row stays as a tombstone. Reading the body top to bottom therefore yields
|
|
97
|
+
current truth with no historical detours, while the supersession is still visible at a glance.
|
|
98
|
+
|
|
99
|
+
Two rules bind that mechanism, and nothing else in this document states them:
|
|
100
|
+
|
|
101
|
+
- **An id is never renumbered once anything references it.** A deletion at least breaks loudly. A
|
|
102
|
+
renumber does not, because the reused id still resolves to a real item and every reference to it
|
|
103
|
+
now silently points at something else — often from another artifact, sometimes from another
|
|
104
|
+
repository's `plan.md`. When an item's content is replaced, the replacement takes a new id and the
|
|
105
|
+
old row becomes a tombstone. Ids are append-only.
|
|
106
|
+
- **Moving or reshaping an item is not, on its own, a supersession.** Regrouping detail under new
|
|
107
|
+
headings, converting a bullet-form entry to §1's heading form, or relocating a section leaves what
|
|
108
|
+
the item says unchanged, so it records nothing here. Recording such a move as a supersession is as
|
|
109
|
+
damaging as omitting a real one: it fills the record with reversals that never happened. This does
|
|
110
|
+
not touch the move described at the top of this section: prose leaving a `**Detail**` block for
|
|
111
|
+
History *because* its item was superseded is that supersession's recorded consequence, not a case
|
|
112
|
+
of this rule. The test is always whether what the item says changed, never whether its text
|
|
113
|
+
moved.
|
|
114
|
+
|
|
115
|
+
History is itself index-then-detail — a table so changes can be listed and compared, with detail
|
|
116
|
+
below so the reasoning behind a reversal is not compressed into a cell:
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
## 9. History
|
|
120
|
+
|
|
121
|
+
| Date | ID | Change | Replaced by |
|
|
122
|
+
|---|---|---|---|
|
|
123
|
+
| 2026-07-29 | FR-001 | Field renamed during design | design §4.1 |
|
|
124
|
+
|
|
125
|
+
**Detail**
|
|
126
|
+
|
|
127
|
+
- **FR-001** — [what it said before, why it changed, what is true now].
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
A new artifact writes `None — initial version.` Every ID marked `Superseded` must appear here.
|
|
131
|
+
|
|
132
|
+
**Revising an artifact updates its History.** An artifact revised after its initial write MUST
|
|
133
|
+
record the revision here. `None — initial version.` MUST NOT remain once any indexed item has been
|
|
134
|
+
added, changed or superseded — that line is a claim that the body has never moved, and leaving it
|
|
135
|
+
in place after a revision makes the artifact's own account of itself false.
|
|
136
|
+
|
|
137
|
+
A feature with a decision register compacts History mechanically; see §12.
|
|
138
|
+
|
|
139
|
+
## 4. Diagrams
|
|
140
|
+
|
|
141
|
+
> **Slot registry.** This section says which artifact carries which diagram slot. What belongs
|
|
142
|
+
> *inside* a slot — the permitted Mermaid types, the per-type complexity budget, the label,
|
|
143
|
+
> direction and `subgraph` conventions, the over-budget split rule, and the anti-patterns — is
|
|
144
|
+
> governed by `DIAGRAM_GUIDE.md`, which the authoring skills load on demand.
|
|
145
|
+
|
|
146
|
+
| Artifact | Section | Slot |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| `requirement.md` | §1 | Scope boundary `flowchart` |
|
|
149
|
+
| `design.md` | §2 | Three C4 levels, each a `flowchart` with `subgraph` boundaries |
|
|
150
|
+
| `plan.md` | §8 | Phase and task dependency `flowchart` |
|
|
151
|
+
| `data-model.md` | §1 | Conceptual domain map `flowchart`, then one `erDiagram` per bounded subdomain |
|
|
152
|
+
| `data-model.md` | §2 | Interaction `sequenceDiagram` |
|
|
153
|
+
|
|
154
|
+
### Scope boundary — `requirement.md` §1
|
|
155
|
+
|
|
156
|
+
A `flowchart` showing what is in scope, what is explicitly excluded, and what outcome each
|
|
157
|
+
in-scope item produces, so the shape of the change is visible before the prose. Use
|
|
158
|
+
`subgraph IN["In scope"]` / `subgraph OUT["Out of scope"]`. Write `N/A: [why]` for a change too
|
|
159
|
+
small to have a meaningful boundary.
|
|
160
|
+
|
|
161
|
+
### C4 levels — `design.md` §2
|
|
162
|
+
|
|
163
|
+
C4 is kept as the **conceptual zoom model** — system context, container, component — and rendered
|
|
164
|
+
with Mermaid `flowchart` plus `subgraph` blocks marking C4 boundaries. Each level takes its own
|
|
165
|
+
heading, written `### C4 Level 1: System Context`, `### C4 Level 2: Container` and
|
|
166
|
+
`### C4 Level 3: Component`.
|
|
167
|
+
|
|
168
|
+
| Level | Shows | Required? |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| C4 Level 1 | Actors and external systems. One box per actor or external system — no internals | yes |
|
|
171
|
+
| C4 Level 2 | Independently deployable units and how they talk | yes |
|
|
172
|
+
| C4 Level 3 | Internals of one container | only when the feature touches 3+ components in a single container |
|
|
173
|
+
|
|
174
|
+
**No level label may match `^C[0-9]+$`.** That pattern is what a `design.md` §3 component ID looks
|
|
175
|
+
like, so a bare `C3` in the same document is ambiguous between the third zoom level and the third
|
|
176
|
+
component. Spelling the level `C4 Level 3` keeps the C4 vocabulary explicit for a reviewer who
|
|
177
|
+
cites levels by number while leaving the component IDs unambiguous.
|
|
178
|
+
|
|
179
|
+
Skip a level with `N/A: [why]`; for C4 Level 3 that is normally
|
|
180
|
+
`N/A: covered by §3 Components & Boundaries`. `DIAGRAM_GUIDE.md` §1 carries the reasoning that
|
|
181
|
+
excludes the `C4Context` / `C4Container` diagram types in favour of `flowchart`.
|
|
182
|
+
|
|
183
|
+
### Task dependency graph — `plan.md` §8
|
|
184
|
+
|
|
185
|
+
A `flowchart` showing the phases, the dependency order between tasks, and which tasks carry the
|
|
186
|
+
`[P]` parallel marker, so execution order is visible before the checklist is read. The per-task
|
|
187
|
+
`- [ ]` checklist stays the single source of truth for tasks and the diagram is never parsed as a
|
|
188
|
+
second inventory of them — the same rule §5 states for the phase rollup. Write `N/A: [why]` for a
|
|
189
|
+
plan too small to have meaningful ordering.
|
|
190
|
+
|
|
191
|
+
## 5. plan.md — phase rollup
|
|
192
|
+
|
|
193
|
+
§8 gains a phase-level summary above the checklists:
|
|
194
|
+
|
|
195
|
+
```markdown
|
|
196
|
+
### Task Summary
|
|
197
|
+
|
|
198
|
+
| Phase | Tasks | Delivers | [P] |
|
|
199
|
+
|---|---|---|---|
|
|
200
|
+
| A | 2 | Verification layer | yes |
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
The heading is `### Task Summary`, not `### Phase Summary` — the latter collides with the
|
|
204
|
+
`### Phase <X>` pattern the checker uses to find phase sections.
|
|
205
|
+
|
|
206
|
+
**The per-task `- [ ]` checklist is the single source of truth for tasks and is never mirrored
|
|
207
|
+
into a per-task index table.** Duplicating every task line would recreate exactly the
|
|
208
|
+
hand-maintained-inventory drift this convention exists to prevent, in the one file where drift is
|
|
209
|
+
most costly — and `/do-execute-plan` parses those markers as an execution contract, so their
|
|
210
|
+
syntax must not change.
|
|
211
|
+
|
|
212
|
+
Each rollup row's task count must match the `- [ ]` lines under its `### Phase <X>` heading.
|
|
213
|
+
|
|
214
|
+
## 6. User Stories & Acceptance Criteria Conventions
|
|
215
|
+
|
|
216
|
+
### User Story Hierarchy — `requirement.md` §2
|
|
217
|
+
|
|
218
|
+
User Stories support hierarchical heading structures matching standard product backlog conventions:
|
|
219
|
+
- Use `### Story X: [Story Title] (P#)` for top-level stories or `### Story X.Y: [Story Title] (P#)` for sub-stories.
|
|
220
|
+
- Underneath each story heading, state the user requirement using standard role/want/benefit syntax:
|
|
221
|
+
`- **US1 (P1):** As a [role], I want [capability], so that [benefit].`
|
|
222
|
+
|
|
223
|
+
### Behavioral Acceptance Criteria (BDD) — `requirement.md` §6
|
|
224
|
+
|
|
225
|
+
Acceptance criteria are formatted as testable Gherkin BDD scenario blocks mapped to user story and functional requirement IDs:
|
|
226
|
+
|
|
227
|
+
```markdown
|
|
228
|
+
- [ ] **Scenario: [Scenario Title]** (US1, FR-001)
|
|
229
|
+
- **Given** [precondition or initial context]
|
|
230
|
+
- **When** [action or trigger event occurs]
|
|
231
|
+
- **Then** [expected observable outcome]
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
- **WHAT/WHY vs HOW Boundary:** `requirement.md` strictly describes user-facing behaviors and functional outcomes. Technical implementation anchors (such as database schemas, REST endpoints, repository patterns, and UX tokens) belong in `specs.md` §1 and `data-model.md`.
|
|
235
|
+
|
|
236
|
+
## 7. Technical Scaffolding in specs.md and data-model.md
|
|
237
|
+
|
|
238
|
+
`specs.md` and `data-model.md` provide dedicated homes for technical implementation anchors — `design.md` §4/§5 hold
|
|
239
|
+
only a one-line pointer to them:
|
|
240
|
+
- **Interface Contracts (`specs.md` §1):** HTTP endpoints (methods, routes, request/response shapes, status codes), CLI verb signatures, and repository/service interfaces (`interface` → `concrete` → `mock`).
|
|
241
|
+
- **Data Model (`data-model.md` §1):** Relational data model diagrams, database table schema catalogs (table purpose, keys, relations, indexes, ORM/DDL file references), and UX design tokens (color palettes, component states, layout cues).
|
|
242
|
+
|
|
243
|
+
This section routes *what* belongs in each of those two sections; the shape each one takes is
|
|
244
|
+
governed by §10.
|
|
245
|
+
|
|
246
|
+
## 8. Tables for comparison
|
|
247
|
+
|
|
248
|
+
Where an artifact presents comparative or evidentiary data — several items measured on the same
|
|
249
|
+
axes, a before/after contrast, a list of changes — lay it out as a table rather than prose or
|
|
250
|
+
nested bullets, so items compare column-wise at a glance.
|
|
251
|
+
|
|
252
|
+
## 9. What the checker does and does not do
|
|
253
|
+
|
|
254
|
+
Run `"$DOFLOW" validate [--json] [--slug=<slug>] [<path>...]` after writing — the seam passes those
|
|
255
|
+
flags through unchanged, and the helper behind the verb is not on `PATH` to be called by name. Exit `0` clean,
|
|
256
|
+
`1` on findings, `0` plus a printed note when it cannot work out what to check (no active feature,
|
|
257
|
+
resolver or `jq` unavailable).
|
|
258
|
+
|
|
259
|
+
A file that was named explicitly but cannot be read or parsed is a **finding**, not a fail-open —
|
|
260
|
+
it exits `1` and says the file was not checked. Silence there would report a clean result for a
|
|
261
|
+
file nobody looked at.
|
|
262
|
+
|
|
263
|
+
Checked: index/detail parity both directions · `Status` vocabulary · ID-shaped supersede targets
|
|
264
|
+
resolve · superseded items have a History entry · plan rollup counts match the checklist ·
|
|
265
|
+
decision references are not stale · no unknown decision references (every cited `DEC-###` is in the register).
|
|
266
|
+
|
|
267
|
+
Parity reads both detail-entry forms of §1: the `- **<ID>` bullet, and the `#### <ID>: <text>`
|
|
268
|
+
heading whose ID also appears in that section's index table. A heading that merely looks ID-shaped
|
|
269
|
+
matches no index row, so it neither satisfies a row nor reports an orphan of its own.
|
|
270
|
+
|
|
271
|
+
Not checked: whether an index summary faithfully describes its detail, whether a diagram is
|
|
272
|
+
accurate, whether a required section exists at all. It is a **consistency** checker, not a
|
|
273
|
+
conformance checker — which is also why artifacts written before this convention, having no index
|
|
274
|
+
tables, pass without needing a version marker.
|
|
275
|
+
|
|
276
|
+
`audit.md` is never a target, explicit or resolved: like `state.md`, it sits outside this
|
|
277
|
+
convention entirely (see this doc's intro), but for its own reason — it is generated fresh by
|
|
278
|
+
`render-audit.sh` from the orchestrator's own journal on every run, never hand-authored, so there
|
|
279
|
+
is no author-vs-index drift for this checker to ever catch.
|
|
280
|
+
|
|
281
|
+
Findings are reported to the author and never repaired automatically: when an index and its detail
|
|
282
|
+
disagree, deciding which one is wrong is authoring judgement, not a mechanical fix.
|
|
283
|
+
|
|
284
|
+
## 10. Reviewer-facing sections
|
|
285
|
+
|
|
286
|
+
> **Authoritative:** this section governs which reviewer-facing sections an artifact carries and
|
|
287
|
+
> what shape each one takes, including the shape of `specs.md` §1 and `data-model.md` §1 that §7 routes content to.
|
|
288
|
+
|
|
289
|
+
Three sections exist so a reviewer can reach a judgement from the top of a document rather than by
|
|
290
|
+
reading it whole:
|
|
291
|
+
|
|
292
|
+
- **`design.md` §1 — the decision-and-blocker summary.** A table with the columns `Decision`,
|
|
293
|
+
`Shape chosen`, `Owner`, `Blocks approval?`, positioned above the architectural prose. One row per
|
|
294
|
+
decision the design makes. A reviewer who reads only this table knows what is being settled, who
|
|
295
|
+
settled it, and what stands between the design and approval.
|
|
296
|
+
- **`specs.md` §1 — families.** The index carries a `Family` column, and the detail beneath is
|
|
297
|
+
grouped under `#### Family: <name>` headings, with contracts ordered within a family and families
|
|
298
|
+
ordered as the index lists them. Each contract carries a `#### IC-###: <summary>` heading, which
|
|
299
|
+
is the heading detail-entry form of §1 and counts as that contract's detail entry because its ID
|
|
300
|
+
appears in the index.
|
|
301
|
+
- **`data-model.md` §1 — a domain map, then bounded views.** The section opens with a conceptual domain
|
|
302
|
+
map: a Mermaid `flowchart` naming the entities and the relationships between them, with **no
|
|
303
|
+
attributes**, so the shape of the domain is legible before any field name. Beneath it comes one
|
|
304
|
+
`#### ER view: <subdomain>` per bounded subdomain, each a Mermaid `erDiagram` carrying the
|
|
305
|
+
attributes, keys and cardinalities of that subdomain alone. The table catalog of entities, keys,
|
|
306
|
+
indexes and ORM file references is unchanged and stays below the views. Splitting one diagram into
|
|
307
|
+
views must not drop an entity, a key or a constraint the single diagram carried.
|
|
308
|
+
|
|
309
|
+
### The `N/A: [why]` escape
|
|
310
|
+
|
|
311
|
+
Any of the three may be replaced by a line matching `^N/A: .+` stating why it does not apply — a
|
|
312
|
+
feature too small to have decisions worth tabling, a specs document with one contract family, a
|
|
313
|
+
domain with no persisted entity. A section left empty with no such line is a violation of this
|
|
314
|
+
convention, because silence cannot be told apart from an oversight.
|
|
315
|
+
|
|
316
|
+
This is the same escape §4 already uses for a skipped C4 level and for the scope-boundary
|
|
317
|
+
flowchart. There is one spelling of it in this document and no second one.
|
|
318
|
+
|
|
319
|
+
### The component detail shape
|
|
320
|
+
|
|
321
|
+
A `design.md` §3 component detail entry names the component after its ID, then answers four labels
|
|
322
|
+
in this order: `**Responsibility:**`, `**Owns:**`, `**Does not own:**`, `**Contracts:**`. None may
|
|
323
|
+
be dropped or reordered. What a component deliberately does *not* own is the half a reviewer cannot
|
|
324
|
+
reconstruct from the code, which is why it has a label of its own rather than a sentence.
|
|
325
|
+
|
|
326
|
+
The labels are structural, not emphasis — `ARTIFACT_VOICE.md` carves them out of its rule against
|
|
327
|
+
bold-labelled lists on exactly that ground. The entry still begins `- **<ID>:**` so §1's bullet form
|
|
328
|
+
locates it; the labels sit in nested bullets beneath. No other artifact's detail entries take this
|
|
329
|
+
shape.
|
|
330
|
+
|
|
331
|
+
### Nothing checks this per artifact
|
|
332
|
+
|
|
333
|
+
These are conventions the writing skill follows, not rules the checker runs. `validate-artifacts.sh`
|
|
334
|
+
has no conformance rule family and gains none: §9's account of it is accurate as written, and an
|
|
335
|
+
artifact missing a section named here produces no finding anywhere. The only mechanical enforcement
|
|
336
|
+
lives in DoFlow's own repository, not in yours: a guard there covers the shipped templates and fails
|
|
337
|
+
DoFlow's suite when a template
|
|
338
|
+
loses a section. An artifact hand-edited away from its template is not covered, and knowing that is
|
|
339
|
+
part of using the convention.
|
|
340
|
+
|
|
341
|
+
## 11. Authoritative marking
|
|
342
|
+
|
|
343
|
+
Where two sections could each be read as defining the same state, rule or outcome, the governing one
|
|
344
|
+
carries, immediately beneath its heading, a blockquote naming what it governs:
|
|
345
|
+
|
|
346
|
+
```markdown
|
|
347
|
+
> **Authoritative:** this section governs [the state, rule or outcome].
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
The other section carries a one-line pointer naming the governing section and restates nothing —
|
|
351
|
+
not a summary, not a "briefly". Restating is how the two drift apart, which is the failure the
|
|
352
|
+
callout exists to prevent.
|
|
353
|
+
|
|
354
|
+
Exactly one section may carry the callout for a given subject. Two callouts over the same subject
|
|
355
|
+
is the same ambiguity in a new costume, and neither section then governs.
|
|
356
|
+
|
|
357
|
+
## 12. Decision register citations
|
|
358
|
+
|
|
359
|
+
> **Authoritative:** this section governs decision citations and compacted History.
|
|
360
|
+
|
|
361
|
+
Applies only where the feature folder holds `decisions/register.json`; without one, nothing here
|
|
362
|
+
applies.
|
|
363
|
+
|
|
364
|
+
- A line that applies a registered decision cites it as a bare `DEC-###`.
|
|
365
|
+
- `plan.md` §3 lists the `DEC-###` decisions the plan rests on and authors no `D#`.
|
|
366
|
+
- A design §1 row ends its `Shape chosen` cell with its `DEC-###`. A §8 row that came from a
|
|
367
|
+
"Decide for me" pick cites its `DEC-###` in `Basis`.
|
|
368
|
+
- A line citing a superseded decision is a `stale` finding unless it also names a later decision in
|
|
369
|
+
that chain, and a cited `DEC-###` absent from the register is an `unknown` finding (§9).
|
|
370
|
+
- Compaction moves History content to `decisions/history/<artifact>.md` and leaves one pointer line,
|
|
371
|
+
`Earlier entries: [decisions/history/<artifact>.md](<relative link>).`, the link relative to the
|
|
372
|
+
artifact's own directory, matching `^Earlier entries: \[decisions/history/[a-z-]+\.md\]`. Index
|
|
373
|
+
rows and tombstones stay.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Artifact Voice — prose rules for chain artifacts
|
|
2
|
+
|
|
3
|
+
How a chain artifact reads, sentence by sentence. Structure lives in `ARTIFACT_FORMAT.md`; this file
|
|
4
|
+
covers only the writing. Read on demand by `do-brainstorm`, `do-design` and `do-plan` when
|
|
5
|
+
filling a template, and never loaded into a session by default.
|
|
6
|
+
|
|
7
|
+
## 1. The rules
|
|
8
|
+
|
|
9
|
+
Three minimums apply to every artifact before any category below. One bullet carries one claim, so a
|
|
10
|
+
reader can accept or reject it on its own. A `**Detail**` entry is written in complete sentences,
|
|
11
|
+
because a reviewer has to read it as an explanation. Bracket placeholders are filled in or deleted,
|
|
12
|
+
never stacked where a sentence belongs.
|
|
13
|
+
|
|
14
|
+
### Content patterns
|
|
15
|
+
|
|
16
|
+
- **Inflated claims.** "Stands as", "a pivotal moment". State what the thing does.
|
|
17
|
+
- **Name-dropping as proof.** Naming a company, paper or person to borrow weight. Say what they did
|
|
18
|
+
and why it bears on this, or drop the name.
|
|
19
|
+
- **Shallow `-ing` phrases.** "Highlighting", "underscoring", "ensuring" tacked onto a clause to
|
|
20
|
+
make a plain fact sound deeper. Cut the phrase; the fact survives.
|
|
21
|
+
- **Sales language.** "Boasts", "vibrant", "rich", "seamless", "robust". An artifact serves a maintainer, not a
|
|
22
|
+
buyer.
|
|
23
|
+
- **Vague sourcing.** "Industry reports", "experts argue", "several sources". Name the source, or own
|
|
24
|
+
the claim.
|
|
25
|
+
- **Formulaic "challenges and outlook" sections.** A closing block of abstract difficulties and
|
|
26
|
+
predictions. A real risk belongs in the risks index with a disposition.
|
|
27
|
+
|
|
28
|
+
### Language and grammar
|
|
29
|
+
|
|
30
|
+
- **Overused words.** actually, additionally, crucial, delve, enhance, fostering, highlight,
|
|
31
|
+
interplay, intricate, key, landscape, pivotal, showcase, tapestry, testament, underscore,
|
|
32
|
+
valuable, vibrant. Use a plainer word or none.
|
|
33
|
+
- **Avoiding "is" and "are".** "Serves as", "stands as", "represents", "features" are almost always
|
|
34
|
+
a longer way to write "is". Write "is".
|
|
35
|
+
- **"Not X but Y".** The construction spends a clause on something you are not claiming. Write Y.
|
|
36
|
+
- **Forced groups of three.** Three items because three sounds complete. List what there is.
|
|
37
|
+
- **Synonym cycling and repeated openings.** Calling one thing by three names costs the reader a
|
|
38
|
+
lookup each time; name it the same way every time. Three consecutive sentences opening on the same
|
|
39
|
+
word read as a template.
|
|
40
|
+
- **False "from X to Y" ranges.** "From configuration to deployment" only works when X and Y are the
|
|
41
|
+
ends of a real span. Otherwise it is two examples wearing a range.
|
|
42
|
+
- **Passive voice with a clear actor.** "The template is filled" hides who fills it. Name the actor
|
|
43
|
+
when there is one.
|
|
44
|
+
|
|
45
|
+
### Filler and hedging
|
|
46
|
+
|
|
47
|
+
- **Long forms of short words.** "In order to" is "to". "Due to the fact that" is "because".
|
|
48
|
+
- **Stacked qualifiers.** "Could potentially possibly" hedges once and then twice more. Pick the one
|
|
49
|
+
qualifier that is true.
|
|
50
|
+
- **Generic positive endings.** A closing sentence that praises what was just described adds nothing.
|
|
51
|
+
- **Announcing the next point.** "Let's dive in", "first, some background". Make the point instead of introducing it.
|
|
52
|
+
- **Fake candour.** "Honestly", "look", "here's the thing". These signal a confidence the sentence
|
|
53
|
+
has not earned.
|
|
54
|
+
- **Objections nobody raised.** Answering a question nobody asked, or rejecting an alternative
|
|
55
|
+
nobody proposed, to look even-handed.
|
|
56
|
+
- **Restating the heading.** A section whose first sentence repeats its own heading has spent a
|
|
57
|
+
sentence on nothing.
|
|
58
|
+
- **Forced punchlines and dramatic fragments.** A one-line paragraph for effect.
|
|
59
|
+
|
|
60
|
+
### Dead context
|
|
61
|
+
|
|
62
|
+
- **A status section states what is true now.** Status lines, ledger summaries, blockers and next
|
|
63
|
+
actions are rewritten in place: when a fact stops being true, replace or delete it in the same
|
|
64
|
+
edit. No appended history and no "was", "previously" or "no longer" narrative; history lives in
|
|
65
|
+
`git log`, the decision register's superseded records and `plan.md`'s History.
|
|
66
|
+
- **Resolved and finished things leave the page.** A cleared blocker, a finished phase's narration,
|
|
67
|
+
a rejected option nobody still needs and a note about a tool that has since changed are deleted,
|
|
68
|
+
not struck through or kept "for context".
|
|
69
|
+
- **One home per fact.** A fact lives in one artifact; others cite it by id or path instead of
|
|
70
|
+
restating it. Copying a decision's text, a task's description or another file's list creates a
|
|
71
|
+
second version that goes stale.
|
|
72
|
+
- **Hand-backs report results.** An agent's report holds outcomes, evidence locators, deviations and
|
|
73
|
+
open questions; it does not restate the brief, narrate steps or repeat what a command printed.
|
|
74
|
+
|
|
75
|
+
### Style
|
|
76
|
+
|
|
77
|
+
- **Sentence case headings**, not Title Case.
|
|
78
|
+
- **No decorative emoji.**
|
|
79
|
+
- **Straight quotes**, not typographic ones.
|
|
80
|
+
- **Bold for a functional reason only**: a structural label the format defines, or a term being
|
|
81
|
+
defined.
|
|
82
|
+
- **No em or en dashes.** A comma, a colon or a full stop does the work, except where §2 carves the
|
|
83
|
+
rule out.
|
|
84
|
+
|
|
85
|
+
## 2. Carve-outs
|
|
86
|
+
|
|
87
|
+
**Precedence:** a construct the checker parses governs over a prose rule that would rewrite it; a
|
|
88
|
+
prose rule applies in full to free prose.
|
|
89
|
+
|
|
90
|
+
| Prose rule | Conflicting construct | Which governs |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| Bold for a functional reason only | The `- **<ID>:**` detail-entry shape the checker locates entries by | The detail shape governs. The bold is a structural label, not emphasis. |
|
|
93
|
+
| Bold for a functional reason only | The `Responsibility` / `Owns` / `Does not own` / `Contracts` labels of a `design.md` §3 component entry | The labelled shape governs. `ARTIFACT_FORMAT.md` §10 declares these four labels and their order. |
|
|
94
|
+
| No em or en dashes | The literal `None — initial version.` that `ARTIFACT_FORMAT.md` §3 requires a new artifact to write | The literal governs. Write the em dash. |
|
|
95
|
+
| Sentence case headings | Every `##` section heading in the four chain-artifact templates, which `ARTIFACT_FORMAT.md` names by their exact words and `validate-artifacts.sh` locates History by | The template headings govern. Do not re-case a heading in a chain artifact. |
|
|
96
|
+
| Sentence case headings | The `#### <ID>: <text>` heading form of a detail entry, §1's second grammar | The heading governs. Its ID is matched literally against an index row, so its case is not free. |
|
|
97
|
+
|
|
98
|
+
Everything a carve-out protects is the marked construct itself. The prose that follows it on the
|
|
99
|
+
same line is free prose, and every rule in §1 applies there.
|
|
100
|
+
|
|
101
|
+
Two constructs need no carve-out because no §1 rule reaches them; a prose pass still leaves them
|
|
102
|
+
alone. The `- [ ]` task markers `do-execute-plan` parses carry no bold and
|
|
103
|
+
no heading case; rewriting one breaks execution. The arrow in `Superseded → <ref>` is not a dash,
|
|
104
|
+
but the checker matches it literally, so a prose pass that "tidies" it breaks it.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Base Constitution (tier-1)
|
|
2
|
+
|
|
3
|
+
**Version:** 1.0.0 · **Scope:** all repos using the doflow chain
|
|
4
|
+
|
|
5
|
+
> The universal, non-negotiable rules every feature inherits. This is the **tier-1 base**;
|
|
6
|
+
> each repo's `agent-docs/constitution.md` (tier-2) overlays it and **takes precedence on
|
|
7
|
+
> conflict**. `do-paths.sh` locates both tiers and reports whether tier-2 exists; the overlay
|
|
8
|
+
> itself is performed by the chain skill reading both files, and `/do-plan`'s Constitution Check
|
|
9
|
+
> records an **advisory** verdict. See `DOFLOW_CHAIN.md` → "Two-tier constitution" for what is
|
|
10
|
+
> computed and what is convention.
|
|
11
|
+
|
|
12
|
+
## Principles
|
|
13
|
+
|
|
14
|
+
Each states the norm; the arrow points at the always-loaded rule that carries the detail.
|
|
15
|
+
|
|
16
|
+
### P1 — Safety over speed
|
|
17
|
+
Security, data integrity, and production safety are never traded for velocity; a destructive or
|
|
18
|
+
irreversible action needs explicit confirmation. → `rules/RULE_01_SAFETY.md`.
|
|
19
|
+
|
|
20
|
+
### P2 — Evidence over assumptions
|
|
21
|
+
A claim is backed by a test, a run, or a document, never guessed; a failure is root-caused before
|
|
22
|
+
it is fixed. → `rules/RULE_01_SAFETY.md`, `PRINCIPLES.md`.
|
|
23
|
+
|
|
24
|
+
### P3 — Finish what you start
|
|
25
|
+
No TODO stubs, mocks, or "not implemented" throws in delivered code: done means validated, not
|
|
26
|
+
compiling. → `rules/RULE_02_WORKFLOW.md`.
|
|
27
|
+
|
|
28
|
+
### P4 — Scope discipline (YAGNI)
|
|
29
|
+
Build only what the spec asks — no bonus features, no speculative abstraction.
|
|
30
|
+
→ `rules/RULE_02_WORKFLOW.md`.
|
|
31
|
+
|
|
32
|
+
### P5 — Parallel by default
|
|
33
|
+
Independent work runs concurrently; sequential only for hard dependencies.
|
|
34
|
+
→ `rules/RULE_02_WORKFLOW.md`.
|
|
35
|
+
|
|
36
|
+
### P6 — Professional honesty
|
|
37
|
+
No invented metrics, no marketing language; state "untested / needs validation" plainly and push
|
|
38
|
+
back on a bad approach with evidence. → `rules/RULE_03_QUALITY.md`.
|
|
39
|
+
|
|
40
|
+
## Governance
|
|
41
|
+
- This base is versioned (semver). Tier-2 repo constitutions may **add** or **override** principles,
|
|
42
|
+
but may not weaken P1 (Safety). *This constraint is stated to the reading agent; nothing
|
|
43
|
+
validates it, so a tier-2 file that weakened P1 would not be rejected by any check.*
|
|
44
|
+
- `/do-plan` MUST evaluate its Constitution Check against both tiers together (tier-2 taking
|
|
45
|
+
precedence) and record PASS/FAIL. The verdict is **advisory** — it is recorded in `plan.md`
|
|
46
|
+
§2 "Constitution Check" and does not block work; the chain's one hard gate covers artifact
|
|
47
|
+
existence only.
|