@geraldmaron/construct 1.1.1 → 1.2.1
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 +30 -19
- package/bin/construct +487 -87
- package/bin/construct-postinstall.mjs +30 -2
- package/examples/distribution/README.md +42 -0
- package/examples/distribution/manifest.json +53 -0
- package/examples/distribution/sources/adr.md +84 -0
- package/examples/distribution/sources/deck-one-pager.md +65 -0
- package/examples/distribution/sources/prd-platform.md +161 -0
- package/examples/distribution/sources/research-brief.md +80 -0
- package/examples/distribution/sources/rfc-platform.md +82 -0
- package/examples/distribution/sources/runbook.md +103 -0
- package/examples/distribution/sources/strategy.md +88 -0
- package/lib/adapters-sync.mjs +67 -0
- package/lib/artifact-gate-notice.mjs +38 -0
- package/lib/artifact-manifest.mjs +258 -0
- package/lib/artifact-release-gate.mjs +171 -0
- package/lib/artifact-reviewers.mjs +68 -0
- package/lib/artifact-type-from-path.mjs +79 -0
- package/lib/artifact-workflow.mjs +252 -0
- package/lib/audit-skills.mjs +4 -0
- package/lib/audit-specialists.mjs +285 -0
- package/lib/audit-trail.mjs +1 -1
- package/lib/auto-docs.mjs +90 -19
- package/lib/beads/drift.mjs +27 -6
- package/lib/beads-client.mjs +49 -121
- package/lib/beads-optimistic.mjs +5 -12
- package/lib/brand-fonts.mjs +93 -0
- package/lib/brand-prose.mjs +214 -0
- package/lib/brand-tokens.mjs +92 -0
- package/lib/bridges/copilot-proxy.mjs +13 -26
- package/lib/capability-ledger.mjs +156 -0
- package/lib/certification/artifact-fixtures.mjs +132 -0
- package/lib/certification/artifact-gates.mjs +63 -0
- package/lib/certification/artifact-provenance.mjs +97 -0
- package/lib/certification/canonical-scenarios.mjs +78 -0
- package/lib/certification/cli.mjs +191 -0
- package/lib/certification/dashboard-api.mjs +71 -0
- package/lib/certification/demo-parity.mjs +116 -0
- package/lib/certification/document-io-fixtures.mjs +246 -0
- package/lib/certification/document-workflow.mjs +97 -0
- package/lib/certification/eval-bridge.mjs +77 -0
- package/lib/certification/model-routing.mjs +149 -0
- package/lib/certification/prompt-budget.mjs +119 -0
- package/lib/certification/rc-gate.mjs +206 -0
- package/lib/certification/real-llm-scenarios.mjs +303 -0
- package/lib/certification/role-cards.mjs +113 -0
- package/lib/certification/role-overlays.mjs +117 -0
- package/lib/certification/run.mjs +122 -0
- package/lib/certification/runner.mjs +323 -0
- package/lib/certification/scenarios.mjs +51 -0
- package/lib/certification/skill-inventory.mjs +289 -0
- package/lib/certification/skill-scenarios.mjs +147 -0
- package/lib/certification/specialist-contracts.mjs +85 -0
- package/lib/certification/specialist-scenarios.mjs +175 -0
- package/lib/certification/stale-impact.mjs +146 -0
- package/lib/certification/status.mjs +252 -0
- package/lib/certification/store.mjs +77 -0
- package/lib/chat/cli.mjs +333 -0
- package/lib/chat/command-suggest.mjs +161 -0
- package/lib/chat/commands.mjs +215 -0
- package/lib/chat/config.mjs +142 -0
- package/lib/chat/context-compactor.mjs +250 -0
- package/lib/chat/context-continuation.mjs +253 -0
- package/lib/chat/continuation-source.mjs +58 -0
- package/lib/chat/demo-guide.mjs +61 -0
- package/lib/chat/design-tokens.mjs +91 -0
- package/lib/chat/desktop-binary.mjs +79 -0
- package/lib/chat/desktop-build.mjs +130 -0
- package/lib/chat/desktop-launcher.mjs +133 -0
- package/lib/chat/evidence.mjs +145 -0
- package/lib/chat/export.mjs +74 -0
- package/lib/chat/harness/driver.mjs +91 -0
- package/lib/chat/list-picker.mjs +112 -0
- package/lib/chat/model-picker.mjs +356 -0
- package/lib/chat/openrouter-fallback.mjs +151 -0
- package/lib/chat/permission-prompt.mjs +33 -0
- package/lib/chat/picker-catalog.mjs +45 -0
- package/lib/chat/policy-telemetry.mjs +34 -0
- package/lib/chat/present.mjs +246 -0
- package/lib/chat/session-context.mjs +39 -0
- package/lib/chat/session-persist.mjs +73 -0
- package/lib/chat/session-restore.mjs +71 -0
- package/lib/chat/session-settings.mjs +53 -0
- package/lib/chat/system-prompt.mjs +52 -0
- package/lib/chat/transparency.mjs +93 -0
- package/lib/chat/tui/color-scheme.mjs +42 -0
- package/lib/chat/tui/markdown.mjs +123 -0
- package/lib/chat/tui/presentation.mjs +100 -0
- package/lib/chat/tui/render.mjs +500 -0
- package/lib/chat/tui/turn-block.mjs +284 -0
- package/lib/chat/tui/turn-present.mjs +18 -0
- package/lib/chat/tui/turn-state.mjs +88 -0
- package/lib/chat/tui/usage.mjs +122 -0
- package/lib/chat/web-commands.mjs +146 -0
- package/lib/chat/web-launcher.mjs +63 -0
- package/lib/chat/web-picker-keys.mjs +46 -0
- package/lib/chat/web-session.mjs +159 -0
- package/lib/cli-commands.mjs +146 -15
- package/lib/cli-service-inventory.mjs +42 -0
- package/lib/comment-lint.mjs +6 -4
- package/lib/config/intake-policy.mjs +209 -0
- package/lib/config/project-config.mjs +11 -2
- package/lib/config/schema.mjs +86 -6
- package/lib/config/source-targets.mjs +311 -0
- package/lib/contract-schemas/decision.json +50 -0
- package/lib/contract-schemas/implementation.json +51 -0
- package/lib/contract-schemas/review-report.json +32 -0
- package/lib/contract-schemas/test-report.json +43 -0
- package/lib/contracts/construct-handoff.mjs +60 -0
- package/lib/contracts/validate.mjs +32 -3
- package/lib/contracts/violation-log.mjs +58 -5
- package/lib/dashboard-demo.mjs +71 -0
- package/lib/dashboard-static.mjs +19 -5
- package/lib/decisions/registry.mjs +5 -3
- package/lib/deck-export-pptx.mjs +1152 -0
- package/lib/demo-recording.mjs +142 -0
- package/lib/demo-script.mjs +114 -0
- package/lib/demo-surface.mjs +249 -0
- package/lib/demo.mjs +598 -140
- package/lib/diagram-export.mjs +192 -0
- package/lib/diagram.mjs +13 -11
- package/lib/docs-verify.mjs +25 -7
- package/lib/doctor/index.mjs +3 -1
- package/lib/doctor/project-adapters.mjs +44 -0
- package/lib/doctor/source-checkout.mjs +16 -0
- package/lib/doctor/watchers/cx-budget.mjs +98 -0
- package/lib/doctor/watchers/graph-staleness.mjs +52 -0
- package/lib/doctor/watchers/process-pressure.mjs +4 -3
- package/lib/document-export.mjs +384 -38
- package/lib/document-extract.mjs +44 -4
- package/lib/document-ingest.mjs +29 -20
- package/lib/embed/auto-sources.mjs +44 -0
- package/lib/embed/cli.mjs +4 -3
- package/lib/embed/daemon.mjs +18 -46
- package/lib/embed/demand-fetch.mjs +50 -19
- package/lib/embed/inbox.mjs +6 -10
- package/lib/embed/worker.mjs +4 -3
- package/lib/embedded-contract/index.mjs +11 -0
- package/lib/embedded-contract/model-resolve.mjs +10 -9
- package/lib/env-config.mjs +26 -0
- package/lib/evals/dataset.mjs +137 -0
- package/lib/evals/gates.mjs +175 -0
- package/lib/export-branding.mjs +32 -0
- package/lib/graph/build-co-change.mjs +54 -0
- package/lib/graph/build-from-registry.mjs +136 -0
- package/lib/graph/build-import-graph.mjs +153 -0
- package/lib/graph/cli.mjs +110 -0
- package/lib/graph/impact-cli.mjs +89 -0
- package/lib/graph/impact.mjs +108 -0
- package/lib/graph/staleness.mjs +44 -0
- package/lib/graph/store.mjs +172 -0
- package/lib/health-check.mjs +90 -76
- package/lib/hooks/artifact-release-gate.mjs +43 -0
- package/lib/hooks/brand-prose-lint.mjs +38 -0
- package/lib/hooks/graph-impact-advisory.mjs +62 -0
- package/lib/hooks/session-optimize.mjs +84 -207
- package/lib/hooks/session-start.mjs +18 -16
- package/lib/host-disposition.mjs +7 -0
- package/lib/improvement/cli.mjs +189 -0
- package/lib/improvement/controller.mjs +137 -0
- package/lib/improvement/proposal.mjs +120 -0
- package/lib/improvement/specialist-loop.mjs +192 -0
- package/lib/improvement/store.mjs +89 -0
- package/lib/improvement/surface.mjs +219 -0
- package/lib/ingest-tooling.mjs +97 -0
- package/lib/init/doc-lanes.mjs +165 -0
- package/lib/init-docs.mjs +31 -178
- package/lib/init-unified.mjs +50 -119
- package/lib/init-update-guide.mjs +102 -0
- package/lib/init-update.mjs +32 -1
- package/lib/init.mjs +8 -0
- package/lib/install/desktop-binary-download.mjs +85 -0
- package/lib/install/legacy-global-cleanup.mjs +189 -0
- package/lib/intake/constants.mjs +29 -0
- package/lib/intake/daemon.mjs +2 -0
- package/lib/intake/git-queue.mjs +9 -8
- package/lib/intake/intake-config.mjs +52 -105
- package/lib/intake/legacy-paths.mjs +5 -0
- package/lib/intake/queue.mjs +2 -1
- package/lib/intake/session-prelude.mjs +90 -1
- package/lib/libreoffice-export.mjs +97 -0
- package/lib/logging/rotate.mjs +9 -0
- package/lib/maintenance/docker-reclaim.mjs +206 -0
- package/lib/mcp/external-schema-cost.mjs +74 -0
- package/lib/mcp/server.mjs +103 -10
- package/lib/mcp/stdio-mcp-probe.mjs +188 -0
- package/lib/mcp/tool-budget.mjs +55 -4
- package/lib/mcp/tools/document.mjs +18 -4
- package/lib/mcp/tools/embedded-contract.mjs +14 -0
- package/lib/mcp/tools/skills.mjs +32 -3
- package/lib/mcp/tools/workflow.mjs +13 -1
- package/lib/model-free-selector.mjs +18 -0
- package/lib/model-registry.mjs +13 -229
- package/lib/model-router.mjs +373 -92
- package/lib/models/behavior-matrix.mjs +289 -0
- package/lib/models/catalog.mjs +209 -0
- package/lib/models/execution-capability-profile.mjs +196 -0
- package/lib/models/execution-policy.mjs +307 -0
- package/lib/models/provider-poll.mjs +383 -0
- package/lib/npm-spawn-env.mjs +17 -0
- package/lib/ollama/installed-models.mjs +129 -0
- package/lib/oracle/actions.mjs +187 -0
- package/lib/oracle/artifact-gate.mjs +99 -0
- package/lib/oracle/cli.mjs +204 -0
- package/lib/oracle/daemon-entry.mjs +14 -0
- package/lib/oracle/dispatch.mjs +81 -0
- package/lib/oracle/execute.mjs +143 -0
- package/lib/oracle/gaps.mjs +76 -0
- package/lib/oracle/index.mjs +84 -0
- package/lib/oracle/issues.mjs +164 -0
- package/lib/oracle/org-graph.mjs +170 -0
- package/lib/oracle/policy.mjs +80 -0
- package/lib/oracle/read-model.mjs +398 -0
- package/lib/oracle/reconcile.mjs +191 -0
- package/lib/oracle/routing.mjs +89 -0
- package/lib/oracle/synthesize.mjs +384 -0
- package/lib/oracle/verdicts.mjs +51 -0
- package/lib/orchestration/worker.mjs +88 -27
- package/lib/orchestration-policy.mjs +50 -0
- package/lib/parity.mjs +96 -2
- package/lib/playwright-demo.mjs +254 -0
- package/lib/project-init-shared.mjs +4 -1
- package/lib/prompt-composer.js +7 -3
- package/lib/prompt-validation-contract.mjs +24 -0
- package/lib/provider-capabilities.js +57 -11
- package/lib/providers/contract/adapters/confluence/index.mjs +181 -0
- package/lib/providers/contract/adapters/git/index.mjs +115 -0
- package/lib/providers/contract/adapters/github/index.mjs +166 -0
- package/lib/providers/contract/adapters/jira/index.mjs +187 -0
- package/lib/providers/contract/adapters/slack/index.mjs +175 -0
- package/lib/providers/contract/contract-tests.mjs +57 -0
- package/lib/providers/contract/errors.mjs +48 -0
- package/lib/providers/contract/interface.mjs +50 -0
- package/lib/providers/contract/registry.mjs +102 -0
- package/lib/providers/copilot-auth.mjs +297 -0
- package/lib/providers/credential-bootstrap.mjs +178 -0
- package/lib/providers/credential-catalog.mjs +46 -0
- package/lib/providers/credential-sources.mjs +63 -0
- package/lib/providers/creds.mjs +5 -2
- package/lib/providers/op-run.mjs +59 -0
- package/lib/providers/secret-resolver.mjs +159 -0
- package/lib/publish-template.mjs +163 -0
- package/lib/publish-tooling.mjs +119 -0
- package/lib/publish.mjs +305 -0
- package/lib/registry/cli.mjs +82 -0
- package/lib/registry/consolidation.mjs +147 -0
- package/lib/registry/generate-docs.mjs +75 -0
- package/lib/registry/skill-verification.mjs +57 -0
- package/lib/registry/surface-map.mjs +76 -0
- package/lib/registry/validate.mjs +135 -0
- package/lib/resources/budget.mjs +82 -0
- package/lib/resources/process-budget.mjs +45 -0
- package/lib/rules-delivery.mjs +9 -2
- package/lib/rules-read.mjs +26 -0
- package/lib/runtime-env.mjs +23 -0
- package/lib/runtime-pressure.mjs +51 -7
- package/lib/schema-infer.mjs +13 -2
- package/lib/server/chat-loop.mjs +622 -0
- package/lib/server/demo-preview.mjs +63 -0
- package/lib/server/index.mjs +259 -9
- package/lib/server/rate-limit.mjs +5 -3
- package/lib/server/webhook.mjs +3 -2
- package/lib/service-manager.mjs +60 -8
- package/lib/setup.mjs +70 -7
- package/lib/specialists/prompt-schema.mjs +19 -10
- package/lib/specialists/roster.mjs +43 -0
- package/lib/specialists/scaffold.mjs +56 -0
- package/lib/storage/backend.mjs +6 -6
- package/lib/storage/hybrid-query.mjs +7 -4
- package/lib/storage/state-source.mjs +5 -5
- package/lib/storage/sync.mjs +2 -3
- package/lib/telemetry/rule-calls.mjs +52 -0
- package/lib/template-registry.mjs +2 -2
- package/lib/templates/visual-requirements.mjs +27 -51
- package/lib/test-corpus-inventory.mjs +313 -0
- package/lib/uninstall/uninstall.mjs +19 -7
- package/lib/update.mjs +12 -0
- package/lib/upgrade.mjs +14 -0
- package/lib/wireframe.mjs +20 -14
- package/lib/worker/run.mjs +17 -4
- package/lib/worker/trace.mjs +11 -3
- package/package.json +28 -14
- package/personas/construct.md +2 -2
- package/platforms/claude/settings.template.json +36 -0
- package/rules/common/patterns.md +1 -1
- package/rules/common/release-gates.md +4 -3
- package/scripts/sync-specialists.mjs +41 -28
- package/skills/devops/data-engineering.md +1 -1
- package/skills/docs/adr-workflow.md +1 -0
- package/skills/docs/backlog-proposal-workflow.md +1 -0
- package/skills/docs/codebase-research-workflow.md +40 -0
- package/skills/docs/customer-profile-workflow.md +1 -0
- package/skills/docs/document-ingest-workflow.md +1 -0
- package/skills/docs/evidence-ingest-workflow.md +1 -0
- package/skills/docs/init-docs.md +2 -2
- package/skills/docs/init-project.md +7 -2
- package/skills/docs/prd-workflow.md +24 -1
- package/skills/docs/prfaq-workflow.md +1 -0
- package/skills/docs/product-intelligence-workflow.md +1 -0
- package/skills/docs/product-signal-workflow.md +1 -0
- package/skills/docs/research-workflow.md +54 -37
- package/skills/docs/runbook-workflow.md +1 -0
- package/skills/docs/strategy-workflow.md +1 -0
- package/skills/docs/user-research-workflow.md +40 -0
- package/skills/operating/orchestration-reference.md +1 -1
- package/skills/roles/architect.md +5 -0
- package/skills/roles/operator.docs.md +4 -0
- package/skills/routing.md +4 -2
- package/specialists/artifact-manifest.json +489 -0
- package/specialists/artifact-manifest.schema.json +83 -0
- package/specialists/audit-enrichments.json +454 -0
- package/specialists/contracts.json +37 -25
- package/specialists/prompts/_shared/validation-contract.md +26 -0
- package/specialists/prompts/cx-accessibility.md +21 -2
- package/specialists/prompts/cx-ai-engineer.md +24 -1
- package/specialists/prompts/cx-architect.md +4 -1
- package/specialists/prompts/cx-business-strategist.md +23 -2
- package/specialists/prompts/cx-data-analyst.md +22 -1
- package/specialists/prompts/cx-data-engineer.md +23 -2
- package/specialists/prompts/cx-debugger.md +21 -2
- package/specialists/prompts/cx-designer.md +26 -3
- package/specialists/prompts/cx-devil-advocate.md +19 -2
- package/specialists/prompts/cx-docs-keeper.md +28 -1
- package/specialists/prompts/cx-engineer.md +22 -1
- package/specialists/prompts/cx-evaluator.md +18 -1
- package/specialists/prompts/cx-explorer.md +21 -2
- package/specialists/prompts/cx-legal-compliance.md +21 -2
- package/specialists/prompts/cx-operations.md +21 -2
- package/specialists/prompts/cx-oracle.md +94 -0
- package/specialists/prompts/cx-orchestrator.md +20 -1
- package/specialists/prompts/cx-platform-engineer.md +25 -2
- package/specialists/prompts/cx-product-manager.md +32 -1
- package/specialists/prompts/cx-qa.md +24 -2
- package/specialists/prompts/cx-rd-lead.md +23 -2
- package/specialists/prompts/cx-release-manager.md +23 -2
- package/specialists/prompts/cx-researcher.md +22 -2
- package/specialists/prompts/cx-reviewer.md +18 -1
- package/specialists/prompts/cx-security.md +22 -2
- package/specialists/prompts/cx-sre.md +30 -3
- package/specialists/prompts/cx-test-automation.md +7 -1
- package/specialists/prompts/cx-trace-reviewer.md +22 -3
- package/specialists/prompts/cx-ux-researcher.md +21 -2
- package/specialists/registry.json +52 -173
- package/specialists/tone-profiles.json +42 -0
- package/templates/demos/playwright/demo-recording.config.mjs +47 -0
- package/templates/demos/recordings/agentic-platforms-prd.json +19 -0
- package/templates/demos/scripts/agentic-platforms-prd.json +44 -0
- package/templates/demos/specs/_helpers/scroll-artifact.ts +89 -0
- package/templates/demos/tapes/agentic-platforms-prd.tape +49 -0
- package/templates/demos/tapes/resource-guard-rails.tape +49 -0
- package/templates/demos/vhs/construct-cockpit.json +24 -0
- package/templates/distribution/construct-brand.typ +446 -0
- package/templates/distribution/construct-decision.typ +38 -0
- package/templates/distribution/construct-deck.html +95 -0
- package/templates/distribution/construct-pdf.typ +38 -0
- package/templates/distribution/construct-prd.typ +38 -0
- package/templates/distribution/construct-reference.docx +0 -0
- package/templates/distribution/construct-research.typ +38 -0
- package/templates/distribution/construct-web.html +92 -0
- package/templates/distribution/fonts/Geist-Bold.ttf +0 -0
- package/templates/distribution/fonts/Geist-Medium.ttf +0 -0
- package/templates/distribution/fonts/Geist-Regular.ttf +0 -0
- package/templates/distribution/fonts/Geist-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-Medium.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-Regular.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/IBMPlexMono-Regular.otf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-Medium.ttf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-Regular.ttf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Bold.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Medium.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Regular.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/README.md +36 -0
- package/templates/distribution/fonts/SpaceGrotesk-Variable.ttf +0 -0
- package/templates/distribution/fonts/handwritten/Caveat.ttf +0 -0
- package/templates/distribution/fonts/legacy/IBMPlexMono-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-Medium.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-SemiBold.otf +0 -0
- package/templates/distribution/fonts/legacy/InterDisplay-SemiBold.otf +0 -0
- package/templates/distribution/fonts/legacy/SourceSerif4-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/SourceSerif4-Semibold.otf +0 -0
- package/templates/distribution/icons/activity.svg +15 -0
- package/templates/distribution/icons/alert-triangle.svg +17 -0
- package/templates/distribution/icons/book-open.svg +16 -0
- package/templates/distribution/icons/bot.svg +20 -0
- package/templates/distribution/icons/brain.svg +22 -0
- package/templates/distribution/icons/circle-check.svg +16 -0
- package/templates/distribution/icons/clipboard-check.svg +17 -0
- package/templates/distribution/icons/cpu.svg +28 -0
- package/templates/distribution/icons/database.svg +17 -0
- package/templates/distribution/icons/eye.svg +16 -0
- package/templates/distribution/icons/file-text.svg +19 -0
- package/templates/distribution/icons/gauge.svg +16 -0
- package/templates/distribution/icons/git-branch.svg +17 -0
- package/templates/distribution/icons/key.svg +17 -0
- package/templates/distribution/icons/layers.svg +17 -0
- package/templates/distribution/icons/list-checks.svg +19 -0
- package/templates/distribution/icons/lock.svg +16 -0
- package/templates/distribution/icons/message-square.svg +15 -0
- package/templates/distribution/icons/network.svg +19 -0
- package/templates/distribution/icons/route.svg +17 -0
- package/templates/distribution/icons/scale.svg +19 -0
- package/templates/distribution/icons/search.svg +16 -0
- package/templates/distribution/icons/send.svg +16 -0
- package/templates/distribution/icons/server.svg +18 -0
- package/templates/distribution/icons/shield-check.svg +16 -0
- package/templates/distribution/icons/users.svg +18 -0
- package/templates/distribution/icons/webhook.svg +17 -0
- package/templates/distribution/icons/workflow.svg +17 -0
- package/templates/distribution/icons/wrench.svg +15 -0
- package/templates/distribution/run.mjs +18 -1
- package/templates/docs/adr.md +7 -0
- package/templates/docs/construct_guide.md +8 -8
- package/templates/docs/customer-profile.md +4 -0
- package/templates/docs/one-pager.md +4 -0
- package/templates/docs/postmortem.md +31 -0
- package/templates/docs/prd-platform.md +19 -0
- package/templates/docs/prd.md +15 -0
- package/templates/docs/prfaq.md +7 -0
- package/templates/docs/qa-strategy.md +103 -0
- package/templates/docs/research-brief.md +8 -0
- package/templates/docs/rfc-platform.md +12 -0
- package/templates/docs/test-plan.md +7 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.21.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-server"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="#0a0c10"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<rect width="20" height="8" x="2" y="2" rx="2" ry="2" />
|
|
15
|
+
<rect width="20" height="8" x="2" y="14" rx="2" ry="2" />
|
|
16
|
+
<line x1="6" x2="6.01" y1="6" y2="6" />
|
|
17
|
+
<line x1="6" x2="6.01" y1="18" y2="18" />
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.21.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-shield-check"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="#0a0c10"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
|
|
15
|
+
<path d="m9 12 2 2 4-4" />
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.21.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-users"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="#0a0c10"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
|
|
15
|
+
<path d="M16 3.128a4 4 0 0 1 0 7.744" />
|
|
16
|
+
<path d="M22 21v-2a4 4 0 0 0-3-3.87" />
|
|
17
|
+
<circle cx="9" cy="7" r="4" />
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.21.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-webhook"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="#0a0c10"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2" />
|
|
15
|
+
<path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06" />
|
|
16
|
+
<path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8" />
|
|
17
|
+
</svg>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.21.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-workflow"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="#0a0c10"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<rect width="8" height="8" x="3" y="3" rx="2" />
|
|
15
|
+
<path d="M7 11v4a2 2 0 0 0 2 2h4" />
|
|
16
|
+
<rect width="8" height="8" x="13" y="13" rx="2" />
|
|
17
|
+
</svg>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.21.0 - ISC -->
|
|
2
|
+
<svg
|
|
3
|
+
class="lucide lucide-wrench"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="#0a0c10"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z" />
|
|
15
|
+
</svg>
|
|
@@ -58,6 +58,19 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
58
58
|
import { fileURLToPath } from 'node:url';
|
|
59
59
|
|
|
60
60
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
61
|
+
|
|
62
|
+
// npm 11.2+ warns on unknown npm_config_* keys. Cursor injects devdir for
|
|
63
|
+
// node-gyp cache routing; strip before npm spawns (inline — no repo imports).
|
|
64
|
+
|
|
65
|
+
function sanitizeNpmSpawnEnv(env = process.env) {
|
|
66
|
+
const next = { ...env };
|
|
67
|
+
for (const key of Object.keys(next)) {
|
|
68
|
+
if (/^npm_config_devdir$/i.test(key) || key === 'NPM_CONFIG_DEVDIR') {
|
|
69
|
+
delete next[key];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return next;
|
|
73
|
+
}
|
|
61
74
|
const PROJECT_ROOT = resolve(HERE, '..');
|
|
62
75
|
const VERSION_FILE = join(HERE, 'version');
|
|
63
76
|
const CACHE_BIN_DIR = join(HERE, 'cache', 'bin');
|
|
@@ -138,7 +151,11 @@ function tryNpx(version) {
|
|
|
138
151
|
// so that failure can never fall through to the global/cache/Docker resolvers below.
|
|
139
152
|
// Confirm the spec resolves first; on a miss, defer instead of dead-ending the chain.
|
|
140
153
|
|
|
141
|
-
const probe = spawnSync('npm', ['view', spec, 'version'], {
|
|
154
|
+
const probe = spawnSync('npm', ['view', spec, 'version'], {
|
|
155
|
+
stdio: 'ignore',
|
|
156
|
+
timeout: 8000,
|
|
157
|
+
env: sanitizeNpmSpawnEnv(process.env),
|
|
158
|
+
});
|
|
142
159
|
if (probe.status !== 0) return false;
|
|
143
160
|
runForeground('npx', ['-p', spec, '--', 'construct', ...process.argv.slice(2)]);
|
|
144
161
|
return true;
|
package/templates/docs/adr.md
CHANGED
|
@@ -37,6 +37,13 @@ Should reference:
|
|
|
37
37
|
## Context
|
|
38
38
|
<!-- Forces at play beyond the core problem. What else is true today that bounds the decision space? Prior ADRs, architectural constraints, external commitments. -->
|
|
39
39
|
|
|
40
|
+
```mermaid
|
|
41
|
+
flowchart LR
|
|
42
|
+
A[Current state] --> B[Decision]
|
|
43
|
+
B --> C[Target state]
|
|
44
|
+
D[Rejected alt] -.-> B
|
|
45
|
+
```
|
|
46
|
+
|
|
40
47
|
## Decision
|
|
41
48
|
<!-- The position taken, in one or two sentences. State it as a commitment, not a proposal. -->
|
|
42
49
|
|
|
@@ -35,8 +35,8 @@ Generated tooling (`.construct/`, `.claude/`, `.cx/`, `plan.md`) is gitignored;
|
|
|
35
35
|
|
|
36
36
|
Three intake paths, ordered by formality:
|
|
37
37
|
|
|
38
|
-
1. **`.cx/inbox/`**
|
|
39
|
-
2. **`docs/intake
|
|
38
|
+
1. **`.cx/inbox/`** — drop a file here (URL, screenshot, paste, anything). The embed daemon watches the directory; when a file lands, it ingests it into the local knowledge base within a second or two and writes a triage packet to `.cx/intake/pending/` describing the new content, its classification (intake type, stage, owner persona, recommended chain), its suggested docs lane, and existing docs that overlap. The agent surfaces pending items at the next session start and you can ask it to process them.
|
|
39
|
+
2. **`docs/intake/`** — for proper intake batches (research notes, evidence from a meeting, raw source material). Has a template. Survives in git history.
|
|
40
40
|
3. **`AGENTS.md`**: for rules and conventions you want the agent to follow every time. "We prefer functional components. Don't introduce new dependencies without flagging." Read at session start.
|
|
41
41
|
|
|
42
42
|
For URLs or quick notes, the easiest path is to drop a file into `~/Downloads` and run:
|
|
@@ -111,13 +111,13 @@ All ports bind to `127.0.0.1` only; nothing is reachable from other machines on
|
|
|
111
111
|
| `construct sync` | Regenerate platform adapters (Claude Code, OpenCode, Codex, Cursor) |
|
|
112
112
|
| `construct dev` / `construct stop` | Start / stop local services |
|
|
113
113
|
| `construct status` | Live runtime status (services, providers, daemons) |
|
|
114
|
-
| `construct intake list / show / done / skip / reopen` | Drive the
|
|
114
|
+
| `construct intake list / show / done / skip / reopen` | Drive the active profile's intake queue (label varies — run `construct intake --help`) |
|
|
115
115
|
| `construct graph from-intake <id>` | Generate a task graph from a triaged intake packet |
|
|
116
116
|
| `construct drop` | Ingest the most recent downloaded file |
|
|
117
117
|
| `construct search "..."` | Hybrid file + SQL + semantic search over project state |
|
|
118
118
|
| `construct uninstall` | Interactive teardown: never touches Docker or your code |
|
|
119
119
|
|
|
120
|
-
Full reference: <https://geraldmaron.github.io/construct/
|
|
120
|
+
Full reference: <https://geraldmaron.github.io/construct/reference/cli>
|
|
121
121
|
|
|
122
122
|
## Updating Construct
|
|
123
123
|
|
|
@@ -134,13 +134,13 @@ construct doctor # most issues surface here with a fix hint
|
|
|
134
134
|
construct stop && construct dev # restart local services
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Troubleshooting guide: <https://geraldmaron.github.io/construct/
|
|
137
|
+
Troubleshooting guide: <https://geraldmaron.github.io/construct/runbooks/>
|
|
138
138
|
|
|
139
139
|
## Next steps
|
|
140
140
|
|
|
141
|
-
- [Connect your editor](https://geraldmaron.github.io/construct/
|
|
142
|
-
- [Run your first task](https://geraldmaron.github.io/construct/
|
|
143
|
-
- Skim [the architecture](https://geraldmaron.github.io/construct/
|
|
141
|
+
- [Connect your editor](https://geraldmaron.github.io/construct/start/connect-your-editor) if you haven't already.
|
|
142
|
+
- [Run your first task](https://geraldmaron.github.io/construct/start/first-task) to feel the flow.
|
|
143
|
+
- Skim [the architecture](https://geraldmaron.github.io/construct/concepts/architecture) when you have 10 minutes: it'll save you hours later.
|
|
144
144
|
|
|
145
145
|
If you'd rather have a teammate walk you through it, the persona itself can:
|
|
146
146
|
|
|
@@ -21,6 +21,10 @@ asks for cleanup. Keep facts tied to source evidence.
|
|
|
21
21
|
## Open asks
|
|
22
22
|
<!-- Table: ask, first raised, times mentioned, source, linked issue, status. -->
|
|
23
23
|
|
|
24
|
+
| Ask | First raised | Status |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| {customer ask} | {YYYY-MM-DD} | open / blocked / done |
|
|
27
|
+
|
|
24
28
|
## Key contacts
|
|
25
29
|
<!-- Roles and responsibilities. Avoid unnecessary personal data. -->
|
|
26
30
|
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
## Success measure
|
|
18
18
|
<!-- The single metric that tells us this worked. Numeric, time-bound. -->
|
|
19
19
|
|
|
20
|
+
| Measure | Baseline | Target | By when |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| {metric} | {today} | {goal} | {YYYY-MM-DD} |
|
|
23
|
+
|
|
20
24
|
## Cost
|
|
21
25
|
<!-- People, time, money. Rough order of magnitude. -->
|
|
22
26
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Postmortem: {incident title}
|
|
2
|
+
|
|
3
|
+
- **Date**: {YYYY-MM-DD}
|
|
4
|
+
- **Owner**: {name or on-call rotation}
|
|
5
|
+
- **Severity**: SEV-1 | SEV-2 | SEV-3
|
|
6
|
+
|
|
7
|
+
<!-- Same structure as incident-report.md. Blameless tone required. -->
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
## Severity rationale
|
|
12
|
+
|
|
13
|
+
## Impact
|
|
14
|
+
|
|
15
|
+
## Timeline
|
|
16
|
+
|
|
17
|
+
| Time (UTC) | Event |
|
|
18
|
+
|---|---|
|
|
19
|
+
| {HH:MM} | {what happened} |
|
|
20
|
+
|
|
21
|
+
## Trigger
|
|
22
|
+
|
|
23
|
+
## Root cause
|
|
24
|
+
|
|
25
|
+
## Contributing factors
|
|
26
|
+
|
|
27
|
+
## Action items
|
|
28
|
+
|
|
29
|
+
| Priority | Action | Owner | Due |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| P0 | {corrective action} | {name} | {date} |
|
|
@@ -25,6 +25,15 @@ operator. "Developer" is too broad.
|
|
|
25
25
|
## Goals and non-goals
|
|
26
26
|
<!-- Goals: what success looks like for the consumers. Non-goals: explicitly scoped out. -->
|
|
27
27
|
|
|
28
|
+
## Platform flow
|
|
29
|
+
|
|
30
|
+
```mermaid
|
|
31
|
+
flowchart TD
|
|
32
|
+
A[Consumer] --> B[Platform API]
|
|
33
|
+
B --> C[Core service]
|
|
34
|
+
C --> D[Response / event]
|
|
35
|
+
```
|
|
36
|
+
|
|
28
37
|
## API and interface contract
|
|
29
38
|
<!-- The surface being defined: endpoints, schemas, SDK methods, event payloads, config shapes, permission models. Number each contract item (C-1, C-2, …). -->
|
|
30
39
|
|
|
@@ -49,6 +58,16 @@ operator. "Developer" is too broad.
|
|
|
49
58
|
## Success metrics
|
|
50
59
|
<!-- How we know this worked: adoption, error rate, latency, support ticket reduction. Leading vs. lagging. -->
|
|
51
60
|
|
|
61
|
+
| Metric | Baseline | Target |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| {name} | {current} | {goal} |
|
|
64
|
+
|
|
65
|
+
## Risks and mitigations
|
|
66
|
+
|
|
67
|
+
| Risk | Likelihood | Impact | Mitigation |
|
|
68
|
+
|---|---|---|---|
|
|
69
|
+
| {risk} | low / med / high | low / med / high | {mitigation} |
|
|
70
|
+
|
|
52
71
|
## Consumer impact
|
|
53
72
|
<!-- What changes for existing consumers. What breaks, what degrades, what stays the same. Link to migration guide if needed. -->
|
|
54
73
|
|
package/templates/docs/prd.md
CHANGED
|
@@ -75,6 +75,17 @@ A reader should be able to compare the current state (Background) to this
|
|
|
75
75
|
section and see the delta in plain language.
|
|
76
76
|
-->
|
|
77
77
|
|
|
78
|
+
## User flow
|
|
79
|
+
|
|
80
|
+
```mermaid
|
|
81
|
+
flowchart TD
|
|
82
|
+
A[User starts] --> B{Current friction?}
|
|
83
|
+
B -->|Yes| C[Proposed path]
|
|
84
|
+
B -->|No| D[Existing path]
|
|
85
|
+
C --> E[Success outcome]
|
|
86
|
+
D --> E
|
|
87
|
+
```
|
|
88
|
+
|
|
78
89
|
## In scope and out of scope
|
|
79
90
|
|
|
80
91
|
| | Description |
|
|
@@ -163,6 +174,10 @@ How we will know this worked in production over time, beyond the per-requirement
|
|
|
163
174
|
acceptance criteria. Leading vs. lagging. Avoid vanity metrics.
|
|
164
175
|
-->
|
|
165
176
|
|
|
177
|
+
| Metric | Baseline | Target |
|
|
178
|
+
|---|---|---|
|
|
179
|
+
| {name} | {current} | {goal} |
|
|
180
|
+
|
|
166
181
|
## Constraints
|
|
167
182
|
<!--
|
|
168
183
|
Budget, timeline, platform, team, legal, technical debt: anything that shapes
|
package/templates/docs/prfaq.md
CHANGED
|
@@ -15,6 +15,13 @@ or directly from evidence, but it must not invent customer demand.
|
|
|
15
15
|
## Problem statement
|
|
16
16
|
<!-- Two or three paragraphs grounded in evidence. Explain the customer problem, why now, and what is missing today. -->
|
|
17
17
|
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart LR
|
|
20
|
+
A[Customer need] --> B[Current workaround]
|
|
21
|
+
B --> C[Proposed capability]
|
|
22
|
+
C --> D[Outcome after launch]
|
|
23
|
+
```
|
|
24
|
+
|
|
18
25
|
## Press release
|
|
19
26
|
<!-- Write as if the capability has shipped. Focus on customer outcome, not implementation. Include a spokesperson quote and a customer quote — mark a hypothetical quote as such; never invent an attributed one (rules/common/no-fabrication.md). -->
|
|
20
27
|
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# QA Strategy: {feature or system name}
|
|
2
|
+
|
|
3
|
+
- **Date**: {YYYY-MM-DD}
|
|
4
|
+
- **Owner**: {name or role}
|
|
5
|
+
- **Status**: draft | in-review | approved | executed
|
|
6
|
+
- **Related**: {PRD / ADR paths or none}
|
|
7
|
+
|
|
8
|
+
<!--
|
|
9
|
+
Use this when a feature, migration, or system change needs a deliberate
|
|
10
|
+
verification strategy before it ships. The plan is the contract between
|
|
11
|
+
what was specified and what will be proven; every scenario below must
|
|
12
|
+
trace to a requirement or an observed risk, never to guesswork.
|
|
13
|
+
|
|
14
|
+
Before drafting, read rules/common/framing.md and rules/common/no-fabrication.md.
|
|
15
|
+
Acceptance criteria must be binary pass/fail. If a criterion cannot be
|
|
16
|
+
checked without asking the author, it is not done. Cite the requirement
|
|
17
|
+
(FR/NFR id, ADR decision, ticket) each scenario verifies.
|
|
18
|
+
-->
|
|
19
|
+
|
|
20
|
+
## Scope
|
|
21
|
+
<!--
|
|
22
|
+
What is under test and what is explicitly not. Name the components, surfaces,
|
|
23
|
+
or behaviors covered. The out-of-scope list protects reviewer attention and
|
|
24
|
+
makes coverage gaps deliberate rather than accidental.
|
|
25
|
+
-->
|
|
26
|
+
|
|
27
|
+
| | Description |
|
|
28
|
+
|---|---|
|
|
29
|
+
| **In scope** | <what this plan verifies> |
|
|
30
|
+
| **Out of scope** | <related behavior deliberately not tested here, and why> |
|
|
31
|
+
|
|
32
|
+
## Test strategy
|
|
33
|
+
<!--
|
|
34
|
+
The levels of testing applied and why each is justified. Map levels to risk:
|
|
35
|
+
unit for logic, integration for contracts and boundaries, end-to-end for
|
|
36
|
+
user-visible flows, manual/exploratory for what automation cannot reach.
|
|
37
|
+
State what each level is responsible for so coverage gaps are visible.
|
|
38
|
+
-->
|
|
39
|
+
|
|
40
|
+
| Level | What it covers | Why it lives at this level |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| Unit | <logic, pure functions, edge cases> | <reason> |
|
|
43
|
+
| Integration | <contracts, boundaries, data access> | <reason> |
|
|
44
|
+
| End-to-end | <user-visible flows> | <reason> |
|
|
45
|
+
| Manual / exploratory | <what automation cannot reach> | <reason> |
|
|
46
|
+
|
|
47
|
+
## Coverage
|
|
48
|
+
|
|
49
|
+
| Scenario | Type | Priority |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| TC-1 | unit / integration / e2e | P0 / P1 / P2 |
|
|
52
|
+
| TC-2 | <...> | <...> |
|
|
53
|
+
|
|
54
|
+
## Key scenarios
|
|
55
|
+
<!--
|
|
56
|
+
The scenarios that prove the change works. Each scenario names the requirement
|
|
57
|
+
it verifies, the setup, the action, and the binary acceptance criterion. A
|
|
58
|
+
reviewer must be able to run or read the scenario and decide pass/fail without
|
|
59
|
+
asking the author.
|
|
60
|
+
-->
|
|
61
|
+
|
|
62
|
+
| ID | Scenario | Verifies | Acceptance (binary pass/fail) |
|
|
63
|
+
|---|---|---|---|
|
|
64
|
+
| TC-1 | <setup, action, expected result> | <FR/NFR id or risk> | <observable condition> |
|
|
65
|
+
| TC-2 | <...> | <...> | <...> |
|
|
66
|
+
|
|
67
|
+
## Risks and edge cases
|
|
68
|
+
<!--
|
|
69
|
+
The failure modes and boundary conditions worth explicit attention: empty
|
|
70
|
+
inputs, concurrency, partial failure, large data, permission boundaries,
|
|
71
|
+
rollback. For each, state how the plan covers it or why the residual risk
|
|
72
|
+
is accepted.
|
|
73
|
+
-->
|
|
74
|
+
|
|
75
|
+
| Risk / edge case | Likelihood | Impact | Coverage or accepted reason |
|
|
76
|
+
|---|---|---|---|
|
|
77
|
+
| <condition> | low / med / high | low / med / high | <how it is tested, or why accepted> |
|
|
78
|
+
|
|
79
|
+
## Environments and data
|
|
80
|
+
<!--
|
|
81
|
+
Where tests run and what data they use. Name the environments, fixtures,
|
|
82
|
+
seed data, and any external dependencies (sandboxes, stubs, recorded
|
|
83
|
+
responses). Flag data that must be synthetic or anonymized.
|
|
84
|
+
-->
|
|
85
|
+
|
|
86
|
+
## Entry and exit criteria
|
|
87
|
+
<!--
|
|
88
|
+
Entry: what must be true before testing starts (build available, environment
|
|
89
|
+
provisioned, dependencies stubbed). Exit: what must be true to call testing
|
|
90
|
+
done (all blocking scenarios pass, known issues triaged, coverage threshold
|
|
91
|
+
met). Both are checklists a reviewer can verify.
|
|
92
|
+
-->
|
|
93
|
+
|
|
94
|
+
**Entry criteria**
|
|
95
|
+
|
|
96
|
+
- <condition that must hold before execution begins>
|
|
97
|
+
|
|
98
|
+
**Exit criteria**
|
|
99
|
+
|
|
100
|
+
- <condition that must hold to declare the plan executed>
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
<!-- PRD, ADR, RFC, related test plans, prior incidents. -->
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Research Brief: {title}
|
|
2
2
|
|
|
3
|
+
Optional publish frontmatter (for `construct publish --strict`):
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
publish:
|
|
7
|
+
demo: my-tape-name
|
|
8
|
+
dashboardDemo: cockpit-tour
|
|
9
|
+
```
|
|
10
|
+
|
|
3
11
|
- **Date**: {YYYY-MM-DD}
|
|
4
12
|
- **Author**: {name}
|
|
5
13
|
- **Domain**: {ai-tools | developer-tools | security | market | cloud-api | regulatory | academic | other}
|
|
@@ -26,6 +26,18 @@ Use rfc.md instead for proposals that do not touch external contracts.
|
|
|
26
26
|
## Proposed contract
|
|
27
27
|
<!-- The new interface in full. Schemas, endpoint signatures, payload shapes, permission rules, config fields. Be precise enough that a consumer can write against this spec without asking questions. -->
|
|
28
28
|
|
|
29
|
+
```mermaid
|
|
30
|
+
sequenceDiagram
|
|
31
|
+
participant Consumer
|
|
32
|
+
participant Platform
|
|
33
|
+
participant Backend
|
|
34
|
+
Consumer->>Platform: contract call
|
|
35
|
+
Platform->>Backend: validate and execute
|
|
36
|
+
Backend-->>Platform: result
|
|
37
|
+
Platform-->>Consumer: response
|
|
38
|
+
Note over Platform,Backend: error path — validation failure returns typed error
|
|
39
|
+
```
|
|
40
|
+
|
|
29
41
|
## Backwards compatibility strategy
|
|
30
42
|
<!-- How existing consumers are supported during transition. Options: versioning, dual-write, feature flags, shim layer, deprecation window. State which and why. -->
|
|
31
43
|
|
|
@@ -44,6 +44,13 @@ State what each level is responsible for so coverage gaps are visible.
|
|
|
44
44
|
| End-to-end | <user-visible flows> | <reason> |
|
|
45
45
|
| Manual / exploratory | <what automation cannot reach> | <reason> |
|
|
46
46
|
|
|
47
|
+
## Coverage
|
|
48
|
+
|
|
49
|
+
| Scenario | Type | Priority |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| TC-1 | unit / integration / e2e | P0 / P1 / P2 |
|
|
52
|
+
| TC-2 | <...> | <...> |
|
|
53
|
+
|
|
47
54
|
## Key scenarios
|
|
48
55
|
<!--
|
|
49
56
|
The scenarios that prove the change works. Each scenario names the requirement
|