cabloy 5.1.149 → 5.1.151
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/.cabloy-version +1 -1
- package/.claude/commands/release.md +12 -1
- package/.claude/hooks/contract-loop-gate.ts +35 -17
- package/.claude/skills/cabloy-backend-scaffold/SKILL.md +4 -3
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +3 -2
- package/.claude/skills/cabloy-contract-loop/SKILL.md +4 -3
- package/.claude/skills/cabloy-domain-planning/SKILL.md +4 -3
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +5 -3
- package/.claude/skills/cabloy-master-detail/SKILL.md +4 -3
- package/.claude/skills/cabloy-module-removal/SKILL.md +5 -4
- package/.claude/skills/cabloy-resource-field-update/SKILL.md +8 -5
- package/.claude/skills/cabloy-spec-execution/SKILL.md +169 -0
- package/.claude/skills/cabloy-spec-execution/evals/evals.json +71 -0
- package/.claude/skills/cabloy-spec-execution/references/execution-protocol.md +137 -0
- package/.claude/skills/cabloy-spec-execution/references/status-and-evidence.md +117 -0
- package/.claude/skills/cabloy-spec-generation/SKILL.md +227 -0
- package/.claude/skills/cabloy-spec-generation/evals/evals.json +83 -0
- package/.claude/skills/cabloy-spec-generation/references/repo-aware-discovery.md +101 -0
- package/.claude/skills/cabloy-spec-generation/references/repo-specs-document-set.md +267 -0
- package/.claude/skills/cabloy-spec-generation/references/traceability-and-status-rules.md +135 -0
- package/.claude/skills/cabloy-spec-generation/scripts/generate-implementation-charts.mjs +350 -0
- package/.claude/skills/cabloy-spec-generation/scripts/generate-implementation-charts.test.mjs +202 -0
- package/.claude/skills/cabloy-workflow/SKILL.md +21 -10
- package/.claude/skills/cabloy-workflow/evals/evals.json +8 -2
- package/.claude/skills/cabloy-workflow/references/edition-detection.md +5 -3
- package/.claude/skills/cabloy-zova-source-reading/SKILL.md +4 -3
- package/CHANGELOG.md +41 -0
- package/CLAUDE.md +12 -11
- package/package.json +4 -2
- package/repo-docs/.vitepress/config.mjs +4 -0
- package/repo-docs/ai/docs-skills-rules-mapping.md +6 -6
- package/repo-docs/ai/future-skill-roadmap.md +2 -2
- package/repo-docs/ai/introduction.md +5 -5
- package/repo-docs/ai/playbook-contract-regeneration.md +3 -9
- package/repo-docs/ai/repo-guidance.md +5 -4
- package/repo-docs/ai/rules-and-config.md +2 -2
- package/repo-docs/ai/virtual-decorator-guidance.md +1 -3
- package/repo-docs/backend/cache-guide.md +36 -0
- package/repo-docs/backend/dto-guide.md +7 -6
- package/repo-docs/backend/dto-infer-generation.md +25 -5
- package/repo-docs/backend/introduction.md +1 -1
- package/repo-docs/backend/migration-and-changes.md +27 -2
- package/repo-docs/backend/model-guide.md +1 -1
- package/repo-docs/backend/resource-field-update.md +156 -0
- package/repo-docs/frontend/a-model-under-the-hood.md +38 -0
- package/repo-docs/frontend/a-openapi-under-the-hood.md +13 -2
- package/repo-docs/frontend/form-layout-guide.md +26 -9
- package/repo-docs/frontend/model-resource-best-practices.md +2 -0
- package/repo-docs/frontend/model-resource-cookbook.md +7 -1
- package/repo-docs/frontend/router-tabs-introduction.md +2 -4
- package/repo-docs/frontend/use-state-data-best-practices.md +44 -0
- package/repo-docs/frontend/zova-form-source-reading-map.md +26 -9
- package/repo-docs/frontend/zova-form-under-the-hood.md +11 -0
- package/repo-docs/fullstack/a-pay-payment-suite.md +1 -1
- package/repo-docs/fullstack/contract-loop-playbook.md +4 -0
- package/repo-docs/fullstack/one-to-one-companion-resource-guide.md +2 -2
- package/repo-docs/reference/package-map.md +1 -1
- package/repo-e2e/specs/a-commerce.spec.ts +40 -0
- package/scripts/release.ts +48 -1
- package/scripts/upgrade.ts +18 -7
- package/vona/packages-cli/cli/package.json +1 -1
- package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/boilerplate/src/controller/{{resourceName}}.ts_ +2 -2
- package/vona/packages-cli/cli-set-api/package.json +1 -1
- package/vona/pnpm-lock.yaml +83 -75
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +108 -108
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +12 -0
- package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +19 -1
- package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuPresentation.test.ts +53 -4
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +148 -148
- package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAdjust.tsx +37 -3
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +2 -2
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +7 -6
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +1 -1
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +7 -6
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +10 -7
- package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +4 -4
- package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +39 -67
- package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +56 -37
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/pnpm-lock.yaml +5 -5
- package/zova/src/suite/a-commerce/modules/commerce-trade/cli/openapi.config.ts +1 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/package.json +6 -1
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/component/tableCellActionAdjustStock.ts +34 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +81 -6
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/commerceTradeStockBalance.ts +32 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +44 -44
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +356 -338
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/apiSchema/commerceTradeStockBalance.ts +17 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/bean/tableCell.actionAdjustStock.tsx +35 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionAdjustStock/controller.tsx +138 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +3 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +3 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/stockBalance.ts +36 -0
- package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/payment/controller.tsx +4 -4
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +8 -8
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +11 -11
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +2 -2
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/bean/behavior.appModal.tsx +2 -0
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +2 -1
- package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/test/model/resource.types.ts +11 -0
- package/zova/src/suite-vendor/a-cabloy/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-form/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-form/src/lib/formLayout.ts +58 -9
- package/zova/src/suite-vendor/a-zova/modules/a-form/test/lib/formLayout.test.ts +157 -0
- package/zova/src/suite-vendor/a-zova/modules/a-model/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/bean/bean.model/bean.model.persister.ts +3 -1
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/bean/bean.model/bean.model.useQuery.ts +11 -13
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/bean/bean.model/bean.model.useState.ts +9 -7
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/bean/bean.model/bean.model.useStateGeneral.ts +5 -12
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/lib/queryPersister.ts +17 -0
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/lib/queryRefetch.ts +34 -0
- package/zova/src/suite-vendor/a-zova/modules/a-model/src/types/query.ts +27 -3
- package/zova/src/suite-vendor/a-zova/modules/a-model/test/lib/queryPersister.test.ts +115 -0
- package/zova/src/suite-vendor/a-zova/modules/a-model/test/lib/queryRefetch.test.ts +84 -0
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/lib/schema.ts +27 -5
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts +2 -2
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/rest.ts +4 -0
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/schema.ts +2 -5
- package/zova/src/suite-vendor/a-zova/modules/a-openapi/test/lib/schema.test.ts +179 -0
- package/zova/src/suite-vendor/a-zova/package.json +4 -4
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Repository-Aware Discovery
|
|
2
|
+
|
|
3
|
+
Use this reference before putting repository-specific paths or commands into a suite planning record.
|
|
4
|
+
|
|
5
|
+
## Read-only discovery
|
|
6
|
+
|
|
7
|
+
Run from the active repository root when needed:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git rev-parse --show-toplevel
|
|
11
|
+
git status --short
|
|
12
|
+
find . -maxdepth 1 \( -name '__CABLOY_BASIC__' -o -name '__CABLOY_START__' \) -print
|
|
13
|
+
find repo-specs -maxdepth 2 -type f -name 'README.md' -print
|
|
14
|
+
npm run vona
|
|
15
|
+
npm run zova
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Inspect the root `package.json` before documenting exact future commands. Read the active edition marker first:
|
|
19
|
+
|
|
20
|
+
- only `__CABLOY_BASIC__` present means Cabloy Basic;
|
|
21
|
+
- only `__CABLOY_START__` present means Cabloy Start;
|
|
22
|
+
- both markers mean the checkout is invalid or ambiguous and must not receive edition-specific assumptions;
|
|
23
|
+
- neither marker means the edition is unresolved and must not receive edition-specific assumptions.
|
|
24
|
+
|
|
25
|
+
For a Start repository, resolve flavor names, sites, public paths, generated-output locations, and command wrappers from that repository. Do not inherit Basic examples by analogy.
|
|
26
|
+
|
|
27
|
+
## Site-strategy discovery
|
|
28
|
+
|
|
29
|
+
Use two passes when the proposed suite has a Web, Admin, or another user-facing site audience.
|
|
30
|
+
|
|
31
|
+
1. **Before strategy selection**, inspect the active edition only far enough to identify observed shared Web/Admin hosts, their composition owners and extension points, and any independent-site conventions. Read current `SsrSite` registrations, Zova site/flavor configuration, root scripts, and representative shared-site or site-owner modules as needed. Do not turn an example suite’s layout into the new suite’s target.
|
|
32
|
+
2. **After the high-level strategy is selected**, inspect only the affected source/configuration surfaces to establish exact facts: `SsrSite` registrations, shared-shell contribution patterns, site IDs, public paths, bundle/flavor names, environment/configuration files, asset-copy targets, paired development/SSR-build/REST-build commands, and dependency-sync procedures.
|
|
33
|
+
|
|
34
|
+
Cite every observed site/runtime fact by source path in the planning record. Describe a selected strategy as a confirmed input, proposed target, or accepted ADR boundary—not as a source-confirmed fact. Keep each unobserved identifier as `TODO(confirm from active source)`; never derive it from a suite/module name or symmetry between Web and Admin.
|
|
35
|
+
|
|
36
|
+
When selecting Web/Admin strategy, evaluate each audience separately. A normal choice may combine shared or independent composition for each audience, but a custom combination, an audience with no site, or deferral remains valid. If strategy or required identifiers are deferred, make only affected frontend/site implementation work `blocked`; a source-discovery task can remain `not-started`, and backend, known shared-site, or unrelated-audience work remains accurately statused.
|
|
37
|
+
|
|
38
|
+
Basic identifiers and commands are not portable Start facts, and neither Basic nor Start example-suite details are portable to another suite without active-source inspection.
|
|
39
|
+
|
|
40
|
+
## Suite-first source topology
|
|
41
|
+
|
|
42
|
+
For a confirmed suite short name `<suite>`, the intended source layout is normally:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
vona/src/suite/<suite>/modules/<module>/
|
|
46
|
+
zova/src/suite/<suite>/modules/<module>/
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
This is a planning target, not proof that the directories already exist. State whether a path is observed or proposed.
|
|
50
|
+
|
|
51
|
+
## CLI-first planning
|
|
52
|
+
|
|
53
|
+
No known Cabloy CLI currently generates the complete repository Markdown planning set. Once the baseline is confirmed, create the planning records manually under `repo-specs/`. Use Vona/Zova CLI discovery to plan eventual code scaffolding, metadata, OpenAPI generation, dependency synchronization, or verification; do not invent a command family.
|
|
54
|
+
|
|
55
|
+
Potential Cabloy Basic root commands observed in the active repository include:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm run vona
|
|
59
|
+
npm run zova
|
|
60
|
+
npm run tsc
|
|
61
|
+
npm run test
|
|
62
|
+
npm run build
|
|
63
|
+
npm run test:e2e
|
|
64
|
+
npm run build:zova:admin
|
|
65
|
+
npm run build:zova:web
|
|
66
|
+
npm run deps:vona
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
These are prospective commands only until actually executed for the relevant change. A test plan must label them as planned procedures. A command in a document is not evidence of a passing run.
|
|
70
|
+
|
|
71
|
+
For a fullstack contract change, record the appropriate checkpoint:
|
|
72
|
+
|
|
73
|
+
- forward chain: backend contract truth, OpenAPI inspection, generated Zova consumers, then thin model/page follow-up;
|
|
74
|
+
- reverse chain: matching Zova flavor SSR plus REST build, then `npm run deps:vona`;
|
|
75
|
+
- if generated artifacts are correct but installed consumers remain stale, diagnose local dependency drift before editing generated files.
|
|
76
|
+
|
|
77
|
+
Hand actual implementation-time synchronization to `cabloy-contract-loop`.
|
|
78
|
+
|
|
79
|
+
## Documentation boundaries
|
|
80
|
+
|
|
81
|
+
| Content | Home |
|
|
82
|
+
| --- | --- |
|
|
83
|
+
| Product requirements, SRS contracts, WBS, ATPs, suite ADRs, delivery status | `repo-specs/<suite>/` |
|
|
84
|
+
| Reusable user-facing or agent-facing framework guidance | `repo-docs/` |
|
|
85
|
+
| Cross-suite maintainer architecture, rationale, and engineering ADRs | An established internal-documentation home, when present; do not create one implicitly |
|
|
86
|
+
| Short durable AI operating rules | `CLAUDE.md` |
|
|
87
|
+
| Reusable Claude procedure | `.claude/skills/` |
|
|
88
|
+
|
|
89
|
+
Do not place suite product specifications in public docs, or copy repository-wide process rationale into every suite. Link to authoritative framework records instead.
|
|
90
|
+
|
|
91
|
+
## Safe execution boundary
|
|
92
|
+
|
|
93
|
+
While authoring planning records, do not automatically:
|
|
94
|
+
|
|
95
|
+
- run `npm run init`;
|
|
96
|
+
- reset or recreate a database;
|
|
97
|
+
- scaffold source code;
|
|
98
|
+
- run deployment or external-provider operations;
|
|
99
|
+
- claim test, browser, CI, build, migration, or generated-artifact results.
|
|
100
|
+
|
|
101
|
+
If the user explicitly asks for a verification command to be run and the result is intended as retained evidence, execute only after confirming the scope and then record the actual revision, environment, exact procedure, result, and redacted artifact location. Otherwise keep the command as a future WBS/test-plan procedure.
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Repository-Native Spec Document Set
|
|
2
|
+
|
|
3
|
+
This reference defines the standard generated by `cabloy-spec-generation`. It is distilled from the suite records in `repo-specs/a-commerce`, `repo-specs/home-user`, and Cabloy Start's `repo-specs/cabloy-admin`.
|
|
4
|
+
|
|
5
|
+
## Default directory
|
|
6
|
+
|
|
7
|
+
For a new long-lived business suite:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
repo-specs/<suite-short-name>/
|
|
11
|
+
├── README.md
|
|
12
|
+
├── prd.md
|
|
13
|
+
├── srs.md
|
|
14
|
+
├── pdp-wbs.md
|
|
15
|
+
├── test-plan.md
|
|
16
|
+
├── progress.md
|
|
17
|
+
├── implementation-gantt.svg
|
|
18
|
+
├── implementation-burndown.svg
|
|
19
|
+
└── decisions/
|
|
20
|
+
└── 0001-<suite-boundary-slug>.md
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The directory is repository-native, suite-local, and maintainer-facing. It is not a second public documentation tree and not a parallel change-management authority.
|
|
24
|
+
|
|
25
|
+
## Authority map
|
|
26
|
+
|
|
27
|
+
| Document | Authority |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| `README.md` | Index, reading order, baseline summary, topology, authority map, and related-record links. It does not replace the other documents. |
|
|
30
|
+
| `prd.md` | Product outcomes, personas, scope, journeys, business rules, product requirements, and product acceptance. |
|
|
31
|
+
| `srs.md` | System contracts, capability/data ownership, APIs/DTOs, authorization, state, transactions, invariants, frontend/SSR boundaries, and technical acceptance. |
|
|
32
|
+
| `pdp-wbs.md` | Delivery sequencing, dependencies, implementation tasks, completion checks, and delivery traceability. |
|
|
33
|
+
| `test-plan.md` | Quality priorities, executable acceptance scenarios, fixtures, evidence format, verification procedures, and release proof. |
|
|
34
|
+
| `progress.md` | Derived execution status, blockers, decisions needed, next proof, and evidence pointers. It never redefines requirements or contracts. |
|
|
35
|
+
| `implementation-gantt.svg` | Deterministic derived WBS view of phases, task order, dependencies, status, and optional ATP labels. It is not schedule or planning authority. |
|
|
36
|
+
| `implementation-burndown.svg` | Deterministic derived scope/status view. Without dated history, it is a scope-count reference, not a time-series, velocity trend, or forecast. |
|
|
37
|
+
| `decisions/*.md` | Durable suite-local scope, architecture, security, ownership, migration, or integration decisions. |
|
|
38
|
+
| `runbooks/*.md` | Operational procedures subordinate to the relevant SRS, ADR, WBS, and test plan. |
|
|
39
|
+
|
|
40
|
+
When records disagree, update the authoritative record first, then update downstream summaries, mappings, and derived status. After any change to `pdp-wbs.md`, `test-plan.md`, or `progress.md`, run `npm run spec:charts -- <suite>` followed by `npm run spec:charts:check -- <suite>`.
|
|
41
|
+
|
|
42
|
+
The implementation charts are generated records, not authorities. The Gantt reads formal WBS phases/tasks/dependencies and progress status, with ATP labels only when they resolve in `test-plan.md`; absent authoritative dates or estimates must be shown as relative/illustrative order. The burndown reads active/deferred scope and verified status; without immutable dated snapshots it must be a scope-count reference rather than a calendar trend or forecast. Neither chart may add scope, dependencies, evidence, or completion claims. Both SVGs use the README-derived language consistently, including visible labels, accessibility text, and metadata.
|
|
43
|
+
|
|
44
|
+
## README template contract
|
|
45
|
+
|
|
46
|
+
Use the following sections:
|
|
47
|
+
|
|
48
|
+
1. `# <Suite> Internal Planning`
|
|
49
|
+
2. introductory statement that this is maintainer-facing planning material;
|
|
50
|
+
3. `## Reading Order` with ordered links to every core document and justified extension;
|
|
51
|
+
4. `## Product and Technical Baseline` with a compact table for suite identity, scope, tenancy, audiences, sites/flavors, and major constraints;
|
|
52
|
+
5. `## Current or Intended Topology` with Vona/Zova paths and capability ownership;
|
|
53
|
+
6. `## Document Authority` with the authority map and conflict rule;
|
|
54
|
+
7. `## Traceability Chain and Status Rules`;
|
|
55
|
+
8. `## Related Framework Records`.
|
|
56
|
+
|
|
57
|
+
The `## Reading Order` section must also link `implementation-gantt.svg` and `implementation-burndown.svg` as derived delivery views. Their language defaults to the language used by this README, and the generator applies that choice consistently to labels, accessibility text, and metadata.
|
|
58
|
+
|
|
59
|
+
The README is an index and baseline summary. Keep detailed business requirements in the PRD and detailed contracts in the SRS. For each Web, Admin, or other site audience, summarize the selected shared/independent/no-site strategy and its certainty as a confirmed input, observed current-source fact, proposed target, or `TODO(confirm)` decision. README may summarize cited identifiers but does not establish their authority. The README must not call a proposed target or durable boundary confirmed/accepted while its governing ADR remains `Proposed`; only explicitly accepted decisions may use that wording.
|
|
60
|
+
|
|
61
|
+
## PRD template contract
|
|
62
|
+
|
|
63
|
+
Use:
|
|
64
|
+
|
|
65
|
+
1. `## Purpose`;
|
|
66
|
+
2. `## Product Goals`;
|
|
67
|
+
3. `## Personas`;
|
|
68
|
+
4. `## Scope` with `In Scope`, `Deferred`, and, where useful, `Out of Scope`;
|
|
69
|
+
5. `## Primary User Journeys`;
|
|
70
|
+
6. `## Product Requirements`, grouped by capability;
|
|
71
|
+
7. `## Business Rules`;
|
|
72
|
+
8. `## Launch Criteria`;
|
|
73
|
+
9. `## Requirement Traceability`;
|
|
74
|
+
10. `## Related Records`.
|
|
75
|
+
|
|
76
|
+
Requirements state observable business outcomes and use stable identifiers. Preferred forms are `PRD-<DOMAIN>-01` or `PRD-<DOMAIN>-<CAPABILITY>-01`. When site strategy affects the product, describe the intended audience/channel scope and journey, not site IDs, route mechanics, flavors, configuration, lock strategy, DTO syntax, table names, or test commands. Those belong downstream.
|
|
77
|
+
|
|
78
|
+
A typical requirement should identify actor, allowed outcome, key boundary, and observable acceptance without dictating implementation:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
- **PRD-<DOMAIN>-<CAP>-01**: An authorized <actor> can <outcome> within the active tenant.
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## SRS template contract
|
|
85
|
+
|
|
86
|
+
Use:
|
|
87
|
+
|
|
88
|
+
1. `## Purpose and Authority`;
|
|
89
|
+
2. `## Current-Source Facts and Target Contracts`;
|
|
90
|
+
3. `## System Context`;
|
|
91
|
+
4. `## Capability and Persistence Ownership`;
|
|
92
|
+
5. `## Tenant, Identity, Privacy, and Authorization Contracts`;
|
|
93
|
+
6. `## Data, Relationship, and Money Contracts` when relevant;
|
|
94
|
+
7. `## State Machines` when lifecycle states exist;
|
|
95
|
+
8. `## Transactional, Concurrency, Idempotency, Audit, and Recovery Requirements` as applicable;
|
|
96
|
+
9. `## API, DTO, OpenAPI, and Contract-Loop Contracts`;
|
|
97
|
+
10. `## Frontend State, Route, Site, and SSR Contracts` when applicable;
|
|
98
|
+
11. `## Non-Functional and Migration Requirements`;
|
|
99
|
+
12. `## Acceptance Mapping`;
|
|
100
|
+
13. `## Related Records`.
|
|
101
|
+
|
|
102
|
+
Use identifiers such as `SRS-<DOMAIN>-*`. Define the technical facts needed to implement and test the product requirement:
|
|
103
|
+
|
|
104
|
+
- who owns persistence, services, DTOs, and UI state;
|
|
105
|
+
- which fields/identities are server-authoritative;
|
|
106
|
+
- how instance/tenant and resource ownership are enforced;
|
|
107
|
+
- legal state transitions and final states;
|
|
108
|
+
- transaction boundaries, contention behavior, idempotency, rollback, audit, and recovery;
|
|
109
|
+
- generated API consumers and forward/reverse contract-loop obligations;
|
|
110
|
+
- frontend model/resource ownership, audience-specific contracts, route names/params, SSR privacy, and hydration behavior when applicable.
|
|
111
|
+
|
|
112
|
+
For each user-facing audience, the SRS owns the shared-versus-independent site topology, its relation to the domain/persistence boundary, and the audience-specific API/DTO, server-scope, state/page/route, and SSR contracts. List shared targets and exact independent-site identifiers only when observed and cited. Keep unobserved site IDs, public paths, bundles, flavors, environment/configuration files, `SsrSite` registrations, output locations, and command pairs as `TODO(confirm from active source)`. An independent site does not establish a separate tenant, identity, authorization, persistence, or business-rule authority.
|
|
113
|
+
|
|
114
|
+
Mark observed repository facts separately from confirmed inputs and proposed target contracts. Every exact SRS ID named in PRD/WBS/test-plan traceability must have one explicit SRS contract definition here; a matrix mention, wildcard, or range is not a definition. Never pretend an unverified path, operation, flavor, or module exists.
|
|
115
|
+
|
|
116
|
+
## PDP/WBS template contract
|
|
117
|
+
|
|
118
|
+
Use:
|
|
119
|
+
|
|
120
|
+
1. `## Delivery Objective`;
|
|
121
|
+
2. `## Delivery Principles`;
|
|
122
|
+
3. `## Work Breakdown Structure`;
|
|
123
|
+
4. phased `### Phase <number>: ...` sections;
|
|
124
|
+
5. per-task `#### WBS-<DOMAIN>-<PHASE>-<TASK>: ...` entries;
|
|
125
|
+
6. `## Dependency and Contract-Loop Rules`;
|
|
126
|
+
7. `## Traceability Matrix`;
|
|
127
|
+
8. `## Completion and Evidence Rules`;
|
|
128
|
+
9. `## Related Records`.
|
|
129
|
+
|
|
130
|
+
For new long-lived suite baselines, both `implementation-gantt.svg` and `implementation-burndown.svg` are mandatory generated records. They must be regenerated after source changes with `npm run spec:charts -- <suite>` and checked with `npm run spec:charts:check -- <suite>`.
|
|
131
|
+
|
|
132
|
+
Every WBS entry should state:
|
|
133
|
+
|
|
134
|
+
- dependencies;
|
|
135
|
+
- primary source areas or ownership boundaries;
|
|
136
|
+
- bounded tasks;
|
|
137
|
+
- acceptance/completion checks;
|
|
138
|
+
- linked PRD, SRS, and ATP identifiers;
|
|
139
|
+
- whether it is planned, implemented, or awaiting evidence.
|
|
140
|
+
|
|
141
|
+
Begin with a documentation/decision implementation gate before feature work. For differing Web/Admin strategies, split shared-site integration and independent-site delivery into separate frontend tasks when their source facts, dependencies, or proof differ. An unresolved strategy or exact runtime identifier may block only the affected implementation task; preserve runnable discovery work and unaffected backend or audience work as accurately actionable. Prefer vertical, verifiable increments. Include migration and release hardening as explicit work. Keep `implementation-complete` distinct from `verified`.
|
|
142
|
+
|
|
143
|
+
## Test-plan template contract
|
|
144
|
+
|
|
145
|
+
Use:
|
|
146
|
+
|
|
147
|
+
1. `## Purpose and Authority`;
|
|
148
|
+
2. `## Scope, Quality Priorities, and Risk`;
|
|
149
|
+
3. `## Verification Model` with narrow, contract, and full closure levels;
|
|
150
|
+
4. `## Test Levels and Ownership Locations`;
|
|
151
|
+
5. `## Fixtures, Cleanup, Privacy, and Data Minimization`;
|
|
152
|
+
6. `## Evidence Record`;
|
|
153
|
+
7. `## Acceptance Scenario Catalogue`;
|
|
154
|
+
8. `## Contract, SSR, Browser, and Integration Procedures` as applicable;
|
|
155
|
+
9. `## Commands`;
|
|
156
|
+
10. `## Release Closure Gate`;
|
|
157
|
+
11. `## Related Records`.
|
|
158
|
+
|
|
159
|
+
Use `ATP-<DOMAIN>-<CAPABILITY>-01` identifiers. Each scenario links to PRD/SRS/WBS records and defines scope, setup, procedure, expected result, and minimum retained proof. Every exact ATP ID named in WBS or traceability records must have one scenario declaration here; a matrix mention, wildcard, range, or evidence-format example is not a scenario. Include appropriate negative, authorization, tenant-isolation, state-transition, rollback, concurrency, idempotency, contract-generation, SSR/hydration, migration, and browser tests for the confirmed risk profile.
|
|
160
|
+
|
|
161
|
+
Every evidence record should retain, at minimum:
|
|
162
|
+
|
|
163
|
+
- requirement and contract links;
|
|
164
|
+
- source revision;
|
|
165
|
+
- database/environment/flavor where relevant;
|
|
166
|
+
- exact command or procedure;
|
|
167
|
+
- fixture and interleaving details where relevant;
|
|
168
|
+
- pass/fail result;
|
|
169
|
+
- redacted log, response, screenshot, CI job, or artifact location;
|
|
170
|
+
- waiver owner, reason, and expiry when a temporary exception exists.
|
|
171
|
+
|
|
172
|
+
A command listed in a new test plan is a prospective procedure, not a result. For independent sites, define SSR/REST/build/browser proof only with source-confirmed site/flavor/command facts; for shared sites, define composition/integration and shared-site proof against the observed owner. Unresolved identifiers remain planned confirmation gates, never successful verification claims.
|
|
173
|
+
|
|
174
|
+
## Progress template contract
|
|
175
|
+
|
|
176
|
+
Use:
|
|
177
|
+
|
|
178
|
+
1. `## Purpose and Authority`;
|
|
179
|
+
2. `## Status Definitions`;
|
|
180
|
+
3. `## Current Delivery Overview`;
|
|
181
|
+
4. `## WBS Execution Register`;
|
|
182
|
+
5. `## Open Decision Register`;
|
|
183
|
+
6. `## Current Evidence Index`;
|
|
184
|
+
7. `## Update Rules and Next Steps`;
|
|
185
|
+
8. `## Related Records`.
|
|
186
|
+
|
|
187
|
+
Initialize a new suite with statuses such as `not-started`, `deferred`, or explicitly `blocked`; do not mark planning work as verified. Use this vocabulary:
|
|
188
|
+
|
|
189
|
+
| Status | Meaning |
|
|
190
|
+
| --- | --- |
|
|
191
|
+
| `not-started` | Defined, but implementation or acceptance evidence has not started. |
|
|
192
|
+
| `in-progress` | Work started, but closure checks are incomplete. |
|
|
193
|
+
| `implementation-complete` | Source work is reported complete, but required ATP evidence or release gates are incomplete. |
|
|
194
|
+
| `verified` | Required ATP evidence is observed and retained with revision, environment, procedure, result, and redacted artifact location. |
|
|
195
|
+
| `blocked` | A dependency, unresolved decision, or failed gate prevents closure. |
|
|
196
|
+
| `waived` | A temporary exception with owner, reason, and expiry; expiry makes it a release blocker. |
|
|
197
|
+
| `deferred` | Explicitly postponed scope, not completed scope. |
|
|
198
|
+
|
|
199
|
+
Progress must remain a derived register. It may point to evidence but must not become a second requirements document. Include a decision-register entry for each material site strategy and show strategy/identifier deferral as a blocker only on affected frontend/site WBS branches; source reading, planning, or a selected strategy alone is not implementation evidence.
|
|
200
|
+
|
|
201
|
+
## ADR 0001 template contract
|
|
202
|
+
|
|
203
|
+
Use:
|
|
204
|
+
|
|
205
|
+
```markdown
|
|
206
|
+
# ADR 0001: Establish <Suite> Boundaries
|
|
207
|
+
|
|
208
|
+
## Status
|
|
209
|
+
|
|
210
|
+
Proposed
|
|
211
|
+
|
|
212
|
+
## Background
|
|
213
|
+
|
|
214
|
+
<Why this suite needs a durable boundary.>
|
|
215
|
+
|
|
216
|
+
## Problem
|
|
217
|
+
|
|
218
|
+
<What would go wrong without the decision.>
|
|
219
|
+
|
|
220
|
+
## Decision
|
|
221
|
+
|
|
222
|
+
<Accepted or proposed suite, ownership, tenancy, security, site, and scope decisions.>
|
|
223
|
+
|
|
224
|
+
## Alternatives Deferred
|
|
225
|
+
|
|
226
|
+
<Explicitly deferred or rejected alternatives.>
|
|
227
|
+
|
|
228
|
+
## Consequences
|
|
229
|
+
|
|
230
|
+
<Operational and architectural consequences.>
|
|
231
|
+
|
|
232
|
+
## Implementation Decision Gates
|
|
233
|
+
|
|
234
|
+
<TODO(confirm) items that must close before implementation.>
|
|
235
|
+
|
|
236
|
+
## Related Records
|
|
237
|
+
|
|
238
|
+
<Links to README, PRD, SRS, WBS, test plan, and framework records.>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Use `Accepted` only for explicitly confirmed durable decisions; otherwise use `Proposed`. Record material shared/independent site strategy, alternatives, and consequences in the ADR, including the condition for a future independent Web or Admin boundary and the requirement for a superseding ADR if that boundary changes. Later ADRs should narrowly state what prior decision they supersede. Do not use an ADR as a duplicate SRS or status log.
|
|
242
|
+
|
|
243
|
+
## Optional extensions
|
|
244
|
+
|
|
245
|
+
Generate only when the confirmed scope requires them:
|
|
246
|
+
|
|
247
|
+
| Extension | Generate when |
|
|
248
|
+
| --- | --- |
|
|
249
|
+
| `presentation-contracts.md` | Multiple Admin/resource scenes need stable audience, task, information-area, editability, snapshot, or renderer decisions. Keep it subordinate to PRD/SRS. |
|
|
250
|
+
| `semantic-presentation-rollout.md` | Presentation/metadata work is staged, serial, resumable, and needs handoff gates. It does not replace WBS or test plan. |
|
|
251
|
+
| `runbooks/<provider-or-operation>.md` | Real external provider/webhook, sandbox/live operation, reconciliation, cutover, incident, or deployment procedure is in scope. Never include secrets. |
|
|
252
|
+
| Additional ADRs | A separate durable boundary or trade-off exists after ADR 0001. |
|
|
253
|
+
| `evidence/` | Actual ATP execution has produced retained redacted evidence. Do not create empty evidence to simulate progress. |
|
|
254
|
+
|
|
255
|
+
For a presentation matrix, record audience, task, resource/scene, business information areas, field boundaries, renderer choice, and linked PRD/SRS/ATP records. It must not redefine API authority, persistence, validation, authorization, page/state ownership, or SSR privacy.
|
|
256
|
+
|
|
257
|
+
For an operational runbook, record environment boundaries, secret-management rules, configuration prerequisites, callback/webhook procedure, reconciliation/idempotency checks, troubleshooting, rollback/cutover constraints, and authoritative record links. It must not redefine business lifecycle authority.
|
|
258
|
+
|
|
259
|
+
## Required cross-links
|
|
260
|
+
|
|
261
|
+
Every core document links to the README and relevant peers. Maintain a compact matrix like:
|
|
262
|
+
|
|
263
|
+
| Product area | PRD | SRS | WBS | ATP | Evidence/status |
|
|
264
|
+
| --- | --- | --- | --- | --- | --- |
|
|
265
|
+
| `<capability>` | `PRD-...` | `SRS-...` | `WBS-...` | `ATP-...` | `progress.md` / evidence link |
|
|
266
|
+
|
|
267
|
+
Every material product requirement needs at least one technical contract, delivery item, and executable acceptance scenario. Before reporting generation complete, statically audit exact-ID referential integrity and README/ADR decision-status consistency across the planning authority set. Exclude `evidence/` from this static audit: evidence is added only after execution.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Traceability and Status Rules
|
|
2
|
+
|
|
3
|
+
These rules protect the distinction between planning authority, delivery sequencing, executable proof, and derived status.
|
|
4
|
+
|
|
5
|
+
## Identifier conventions
|
|
6
|
+
|
|
7
|
+
Choose one concise domain prefix and use it consistently:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
PRD-<DOMAIN>-<CAPABILITY>-01
|
|
11
|
+
SRS-<DOMAIN>-<CAPABILITY>-01
|
|
12
|
+
WBS-<DOMAIN>-<PHASE>-01
|
|
13
|
+
ATP-<DOMAIN>-<CAPABILITY>-01
|
|
14
|
+
EVD-<DOMAIN>-<CAPABILITY>-01 # only after evidence is observed
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
A shorter `PRD-<DOMAIN>-01` / `SRS-<DOMAIN>-01` form is acceptable for a small capability. IDs must be stable: do not renumber existing records merely to make a table look tidy. If an existing suite already has a convention, preserve it.
|
|
18
|
+
|
|
19
|
+
## Identifier registry and reference validation
|
|
20
|
+
|
|
21
|
+
Before reporting a generated baseline or an authority update complete, build a temporary registry. Collect formal definitions from their owning documents (`prd.md`, `srs.md`, `pdp-wbs.md`, and `test-plan.md`) and scan every generated non-evidence Markdown record for references, including core records, `decisions/*.md`, presentation/rollout records, phase indexes, and `runbooks/*.md`.
|
|
22
|
+
|
|
23
|
+
- A **formal definition** is one atomic requirement, contract, WBS task, or ATP scenario declaration in its owning document. A prose mention, matrix cell, evidence-record format example, range, wildcard, template placeholder such as `<DOMAIN>`, or generic ellipsis is not a definition.
|
|
24
|
+
- A **concrete reference** names one complete instantiated ID, such as `SRS-<DOMAIN>-CAT-01` or `ATP-<DOMAIN>-CON-01`. It must resolve to exactly one formal definition in its owning document. Do not create duplicate definitions or dangling concrete references.
|
|
25
|
+
- A wildcard or range, such as `SRS-<DOMAIN>-CAT-*` or `ATP-<DOMAIN>-01`–`03`, is aggregation notation only. It may summarize already-defined records, but cannot define them or satisfy an exact reference/traceability requirement.
|
|
26
|
+
- Preserve an existing suite's ID convention when extending it. For a new baseline, use the chosen convention consistently across definitions and references.
|
|
27
|
+
- Report missing owners, duplicate definitions, and orphaned material definitions separately; correct the authoritative records before completion.
|
|
28
|
+
- Validate the canonical PRD -> SRS -> WBS -> ATP chain by exact defined IDs, while allowing a many-to-many relationship where the matrices make it explicit.
|
|
29
|
+
- This static audit covers generated planning records only. Exclude `evidence/`: evidence is created after observed execution and cannot establish or repair planning authority.
|
|
30
|
+
- Generated implementation charts must contain only formal WBS/ATP identifiers and current progress statuses; run `npm run spec:charts:check -- <suite>` after generation to verify freshness and reconciliation.
|
|
31
|
+
|
|
32
|
+
## Canonical chain
|
|
33
|
+
|
|
34
|
+
Maintain this chain across the core records:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
PRD requirement -> SRS contract -> PDP/WBS task -> ATP scenario -> observed evidence
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Minimum cardinality for a material in-scope requirement:
|
|
41
|
+
|
|
42
|
+
- one PRD requirement;
|
|
43
|
+
- at least one SRS contract;
|
|
44
|
+
- at least one WBS task;
|
|
45
|
+
- at least one ATP scenario;
|
|
46
|
+
- zero evidence records before execution, and at least one retained evidence record before `verified`.
|
|
47
|
+
|
|
48
|
+
A single ATP may prove several related requirements, but the matrices must make the relationship explicit. A WBS item may cover several contracts, but it still needs bounded completion checks.
|
|
49
|
+
|
|
50
|
+
## Authority-first updates
|
|
51
|
+
|
|
52
|
+
When a requirement or durable boundary changes:
|
|
53
|
+
|
|
54
|
+
1. update the authoritative PRD, SRS, or ADR first;
|
|
55
|
+
2. update traceability matrices;
|
|
56
|
+
3. update WBS dependencies and completion checks;
|
|
57
|
+
4. update ATP procedures and expected proof;
|
|
58
|
+
5. update progress and evidence pointers;
|
|
59
|
+
6. reassess prior evidence and statuses whose assumptions changed;
|
|
60
|
+
7. regenerate `implementation-gantt.svg` and `implementation-burndown.svg` with `npm run spec:charts -- <suite>`;
|
|
61
|
+
8. run `npm run spec:charts:check -- <suite>` and reconcile generated WBS/ATP/status references.
|
|
62
|
+
|
|
63
|
+
Downstream records summarize or operationalize authority; they do not silently override it. The SVGs are derived views only: they cannot authorize scope, dependencies, dates, evidence, or status. Their language follows the suite `README.md`.
|
|
64
|
+
|
|
65
|
+
## Status semantics
|
|
66
|
+
|
|
67
|
+
| Status | Meaning |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| `not-started` | Defined, but implementation or acceptance evidence has not started. |
|
|
70
|
+
| `in-progress` | Work or verification has started, but closure checks are incomplete. |
|
|
71
|
+
| `implementation-complete` | Source work is reported complete, but required ATP or release evidence is incomplete. |
|
|
72
|
+
| `verified` | Applicable WBS checks and ATPs passed, and durable evidence contains revision, environment, exact procedure, result, and redacted artifact location. |
|
|
73
|
+
| `blocked` | A failed gate, dependency, or unresolved decision prevents closure. |
|
|
74
|
+
| `waived` | A temporary exception explicitly approved with owner, reason, and expiry. |
|
|
75
|
+
| `deferred` | Explicitly postponed scope; it is not complete or verified. |
|
|
76
|
+
|
|
77
|
+
For a newly created plan, initialize delivery rows as `not-started`, `deferred`, or `blocked` as appropriate. Creating Markdown files never makes implementation `implementation-complete` or `verified`.
|
|
78
|
+
|
|
79
|
+
### README and ADR decision-status consistency
|
|
80
|
+
|
|
81
|
+
Keep the status domain explicit:
|
|
82
|
+
|
|
83
|
+
- **Observed current-source facts** are repository facts that have been inspected and cited.
|
|
84
|
+
- **Confirmed inputs** are values explicitly supplied or confirmed by the user.
|
|
85
|
+
- **Proposed targets** and durable boundaries remain proposed while their governing ADR is `Proposed`.
|
|
86
|
+
- **Accepted durable decisions** require explicit confirmation and an `Accepted` governing ADR.
|
|
87
|
+
|
|
88
|
+
A README may summarize observed facts and confirmed inputs, but it must not label a proposed target baseline, topology, scope boundary, or durable decision as `Confirmed` or `Accepted` while its governing ADR remains `Proposed`. Use neutral wording such as “Product and Technical Baseline,” and label individual entries by their actual state. The ADR remains authoritative; a README summary never upgrades its status.
|
|
89
|
+
|
|
90
|
+
## Evidence requirements
|
|
91
|
+
|
|
92
|
+
A retained evidence entry should include:
|
|
93
|
+
|
|
94
|
+
- linked PRD, SRS, WBS, and ATP IDs;
|
|
95
|
+
- source revision or commit;
|
|
96
|
+
- database, environment, and flavor/site when relevant;
|
|
97
|
+
- exact command, API procedure, or browser procedure;
|
|
98
|
+
- fixture and explicit concurrency interleaving when relevant;
|
|
99
|
+
- observed pass/fail result;
|
|
100
|
+
- durable log, response, screenshot, CI job, or artifact path;
|
|
101
|
+
- redaction statement and any waiver metadata.
|
|
102
|
+
|
|
103
|
+
Evidence must be synthetic or redacted. Never retain credentials, raw tokens, signed callback state, secrets, live provider identifiers, or real customer/payment data merely to prove a scenario.
|
|
104
|
+
|
|
105
|
+
A planned command is not a result. A code reading, design review, manual walkthrough, or single screenshot is not by itself sufficient for `verified` unless the applicable test plan explicitly defines it as adequate proof and the result is retained.
|
|
106
|
+
|
|
107
|
+
## Waivers
|
|
108
|
+
|
|
109
|
+
Every temporary waiver names:
|
|
110
|
+
|
|
111
|
+
- owner;
|
|
112
|
+
- reason;
|
|
113
|
+
- affected requirement/ATP/WBS;
|
|
114
|
+
- expiry date or time;
|
|
115
|
+
- compensating control, when relevant.
|
|
116
|
+
|
|
117
|
+
An expired waiver automatically becomes a release blocker. Do not hide an unresolved waiver in prose.
|
|
118
|
+
|
|
119
|
+
## Initial-plan safeguards
|
|
120
|
+
|
|
121
|
+
Do not:
|
|
122
|
+
|
|
123
|
+
- write `passed`, `verified`, `implemented`, or a fabricated evidence ID without an observed result;
|
|
124
|
+
- copy example-suite module names, API paths, test counts, CI links, or state assertions into a new domain;
|
|
125
|
+
- claim that a source path, API, flavor, generator, migration, test, build, or browser flow exists when it was not inspected;
|
|
126
|
+
- create empty evidence records just to make the traceability chain appear complete;
|
|
127
|
+
- mark progress `implementation-complete` because the planning set was generated;
|
|
128
|
+
- place a new requirement only in `progress.md`;
|
|
129
|
+
- reference an exact SRS or ATP ID that has no formal definition in `srs.md` or `test-plan.md`;
|
|
130
|
+
- use a wildcard, range, prose mention, or evidence-format example as if it defined an atomic PRD, SRS, WBS, or ATP record;
|
|
131
|
+
- describe a proposed target or durable boundary as confirmed/accepted in README while its governing ADR remains `Proposed`;
|
|
132
|
+
- let an optional presentation matrix, runbook, or rollout record redefine PRD/SRS authority;
|
|
133
|
+
- introduce OpenSpec or another parallel authority by duplicating these records without a repository-level decision defining ownership, migration, history, traceability, and duplicate-prevention rules.
|
|
134
|
+
|
|
135
|
+
If a fact is unknown, write `TODO(confirm)` or a neutral placeholder and put the decision gate in the ADR, SRS, WBS, or progress register according to its authority.
|