From 059baad4d99b50cb666da38f61aec1744ef3a38a Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 9 Aug 2026 16:38:56 +0200 Subject: [PATCH 01/18] Generalize the agentic development organization examples Describe the project boundary as any adopting GitHub organization, keeping MSXOrg and PSModule as the concrete examples and a placeholder row for the general case. --- src/docs/Capabilities/agentic-development/design.md | 10 ++++++---- src/docs/Capabilities/agentic-development/spec.md | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/docs/Capabilities/agentic-development/design.md b/src/docs/Capabilities/agentic-development/design.md index 05bfbd6..9b4ee76 100644 --- a/src/docs/Capabilities/agentic-development/design.md +++ b/src/docs/Capabilities/agentic-development/design.md @@ -23,9 +23,11 @@ Current project scopes follow the same shape: | Host | Organization | Docs | Memory | | --- | --- | --- | --- | -| `dnb.ghe.com` | `AI-Platform` | `AI-Platform/docs` | `AI-Platform/memory` | | `github.com` | `MSXOrg` | `MSXOrg/docs` | `MSXOrg/memory` | | `github.com` | `PSModule` | `PSModule/docs` | `PSModule/memory` | +| `` | `` | `/docs` | `/memory` | + +The last row is the general case: any adopting organization on any GitHub host — public or an enterprise instance — plugs into the same shape without changing the framework. ## Repository roles @@ -135,13 +137,13 @@ flowchart TD pointer --> locate["Resolve host, org, docs, and memory roots"] locate --> host{"Which project scope?"} - host -->|"dnb.ghe.com / AI-Platform"| aip["AI-Platform context"] host -->|"github.com/MSXOrg"| msx["MSXOrg context"] host -->|"github.com/PSModule"| psmodule["PSModule context"] + host -->|"any adopting org"| other["<host>/<org> context"] - aip --> refresh["Refresh selected docs + memory
stop unless exactly synchronized"] - msx --> refresh + msx --> refresh["Refresh selected docs + memory
stop unless exactly synchronized"] psmodule --> refresh + other --> refresh refresh --> repo["Read README, CONTRIBUTING,
and local docs"] repo --> path["Apply path-scoped local rules"] path --> orgdocs["Read organization
documentation"] diff --git a/src/docs/Capabilities/agentic-development/spec.md b/src/docs/Capabilities/agentic-development/spec.md index 0696cce..3a10616 100644 --- a/src/docs/Capabilities/agentic-development/spec.md +++ b/src/docs/Capabilities/agentic-development/spec.md @@ -7,7 +7,7 @@ description: Requirements for refresh-first, index-first agentic development thr ## Premise -An agent does useful work only when it knows which project it is serving, which standards apply, and what the team has already learned. That context MUST be project-scoped, durable, reviewable, and readable by humans and agents alike. The project boundary is the GitHub organization: `dnb.ghe.com/AI-Platform`, `github.com/MSXOrg`, `github.com/PSModule`, and any future organization that adopts the framework. +An agent does useful work only when it knows which project it is serving, which standards apply, and what the team has already learned. That context MUST be project-scoped, durable, reviewable, and readable by humans and agents alike. The project boundary is the GitHub organization — `github.com/MSXOrg`, `github.com/PSModule`, and any other organization that adopts the framework, on any GitHub host. Each organization owns two canonical repositories: @@ -71,9 +71,9 @@ Applies to any organization that wants a shared project knowledge base and memor ## Success criteria -- An agent working in `github.com/PSModule/` reads PSModule docs and memory, not MSXOrg or AI-Platform rules. +- An agent working in `github.com/PSModule/` reads PSModule docs and memory, not another organization's rules. - An agent working in `github.com/MSXOrg/` resolves `github.com/MSXOrg/docs` and `github.com/MSXOrg/memory` as the canonical project context. -- An agent working in `dnb.ghe.com/AI-Platform/` resolves `dnb.ghe.com/AI-Platform/docs` and `dnb.ghe.com/AI-Platform/memory` as the canonical project context. +- An agent working in `//` for any adopting organization resolves `//docs` and `//memory` as the canonical project context, with no change to the framework. - A new product repository can adopt the framework by adding a router and the client routes that reach it, without copying standards or memory pages. - An agent reads the repository's own README and CONTRIBUTING before it reads an organization standard, and still applies the organization standard when the two disagree. - A human can start at `docs/index.md` or `memory/index.md` and navigate to the same context an agent uses. From 0a02c464fac3e664a8fd8bcda3d3eb7511bfa96e Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 9 Aug 2026 16:47:55 +0200 Subject: [PATCH 02/18] Expand spec-driven development to six artifact tiers Specification and design remain the required pair. Beneath them, implementation docs, guides, references, and research each get a defined altitude, a home in the capability folder, and a test for when a tier is warranted. Requirements now carry their own behavioral scenarios, so acceptance criteria hold only cross-cutting behavior. Large capabilities decompose into a core spec plus feature addenda with independent, append-only numbering. Authoring conventions add the impersonal-voice and enduring-problem rules, and the template suite moves to its own page and covers every tier. --- .../Ways-of-Working/Documentation-Model.md | 41 +- .../Spec-Driven-Development-Templates.md | 359 ++++++++++++++++++ .../Spec-Driven-Development.md | 244 ++++++------ src/docs/Ways-of-Working/index.md | 1 + src/zensical.toml | 1 + 5 files changed, 507 insertions(+), 139 deletions(-) create mode 100644 src/docs/Ways-of-Working/Spec-Driven-Development-Templates.md diff --git a/src/docs/Ways-of-Working/Documentation-Model.md b/src/docs/Ways-of-Working/Documentation-Model.md index 0b43d3c..1dd5e2d 100644 --- a/src/docs/Ways-of-Working/Documentation-Model.md +++ b/src/docs/Ways-of-Working/Documentation-Model.md @@ -56,19 +56,56 @@ it documents](Principles/Engineering-Practices.md#documentation-lives-close-to-t applied to the spec–design pair; where a design maps to a repository, the same two documents live with the code. +The spec and the design are the only required files. A capability that outgrows +them grows downward into the optional +[artifact tiers](Spec-Driven-Development.md#the-artifact-tiers), each of which has +a fixed home in the same folder: + +```text +Capabilities/ + / + index.md # what this capability is (required) + spec.md # the why + what (required) + features/ # per-feature spec addenda + index.md + .md + design.md # the how + what we build (required) + implementation.md # the concrete values and names + guides/ # task-oriented walkthroughs + index.md + .md + references.md # lookup tables + research/ # point-in-time exploration + index.md + .md +``` + +A file that grows past a single page becomes a folder with an `index.md` and one +page per member — `design.md` may become `design/`, and `references.md` may +become `references/`, without changing what the tier means. The reverse also +holds: a tier that never fills up is never created. Empty scaffolding is a cost +with no reader, so a folder appears the first time it has something to hold +([concise by default](#concise-by-default)). + ## Why, what, how — a home for everything | Concern | Owned by | | --- | --- | | **Why / what** a capability must do | the capability's **spec** | | **How / what** we build to deliver it | the capability's **design** | +| **Which exact value or name** we chose | the capability's **implementation** docs | +| **How to perform a task** with it | the capability's **guides** | +| **What the settings are** | the capability's **references** | +| **What was explored** before deciding | the capability's **research** | | **How we work** — process, principles, conventions | [Ways of Working](index.md) | | **How code looks** — style applied to code | [Coding Standards](../Coding-Standards/index.md) | | **How this one change is implemented** — paths, trade-offs | the Task or Bug delivery leaf and its PR; see [Issue Planning](Issues/Process/Planning.md) | Keeping implementation out of the spec is what makes the spec durable: -implementation detail rots fastest, so the spec leaves it to the design, and the -design leaves per-change detail to the issue and the PR. +implementation detail rots fastest, so the spec leaves it to the design, the +design leaves exact values to the implementation docs, and all of them leave +per-change detail to the issue and the PR. Each tier absorbs the churn of the one +below it, so the tier above stays still. ## It starts with a need diff --git a/src/docs/Ways-of-Working/Spec-Driven-Development-Templates.md b/src/docs/Ways-of-Working/Spec-Driven-Development-Templates.md new file mode 100644 index 0000000..3fdb137 --- /dev/null +++ b/src/docs/Ways-of-Working/Spec-Driven-Development-Templates.md @@ -0,0 +1,359 @@ +--- +title: Spec-Driven Development Templates +description: A copyable skeleton for every spec-driven artifact — specification, feature addendum, design, implementation doc, guide, reference, research, and decision record. +--- + +# Spec-Driven Development Templates + +One skeleton per artifact tier defined in [Spec-Driven Development](Spec-Driven-Development.md#the-artifact-tiers). Copy the one that matches the tier being written. Every section is present so nothing is forgotten; **delete a heading rather than marking it "N/A"** — empty scaffolding hides the real content. + +Each template assumes the [authoring conventions](Spec-Driven-Development.md#authoring-conventions): present tense, impersonal, normative, and free of dates and status. + +## Specification + +````markdown +--- +title: — Spec +description: +--- + +# — Spec + + + +## Problem + + + +## Outcomes and impact + +- **Outcome:** +- **DORA:** +- **Domain signal:** + +## Users and jobs + + + +## Scope + +**In scope** + +- <...> + +**Out of scope** + +- <...> + +## Non-goals + +- + +## Functional requirements + +### FR1 — { #fr1 } + +#### Behavioral scenarios + +```gherkin +Scenario: + Given + When + Then +``` + +### FR2 — <...> { #fr2 } + +## Non-functional requirements + +### NFR1 — { #nfr1 } + +#### Behavioral scenarios + +```gherkin +Scenario: + Given + When + Then +``` + +## Acceptance criteria + + + +```gherkin +# AC1 — Verifies: FR1, NFR1 +Scenario: + Given + When + Then +``` + +## Constraints and assumptions + +- **Constraint:** +- **Assumption:** + +## Dependencies + +- + +## Open questions + +- [NEEDS CLARIFICATION: ] + +## Where this connects + +- `design.md` — how these requirements are delivered. +```` + +## Feature addendum + +A [feature addendum](Spec-Driven-Development.md#core-and-feature-addenda) extends the core spec. It restates nothing and starts its own numbering at `FR1`. + +````markdown +--- +title: +description: +--- + +# + + + +## Extends + +- `../spec.md` — the core requirements this feature inherits. +- + +## Scope + +**In scope** + +- <...> + +**Out of scope** + +- <...> + +## Functional requirements + +### FR1 — { #fr1 } + +#### Behavioral scenarios + +```gherkin +Scenario: <...> + Given <...> + When <...> + Then <...> +``` + +## Non-functional requirements + +### NFR1 — { #nfr1 } +```` + +## Design + +````markdown +--- +title: — Design +description: +--- + +# — Design + + + +## Specification + + + +## Approach + + + +## Alternatives considered + +| Option | Trade-offs | Verdict | +|---|---|---| +| { #nfr1 } - -### NFR2 — <...> { #nfr2 } - -## Acceptance criteria - -```gherkin -Scenario: - Given - When - Then -``` - -## Constraints and assumptions - -- **Constraint:** -- **Assumption:** - -## Dependencies - -- - -## Open questions - -- [NEEDS CLARIFICATION: ] - -## Decisions - - -```` - -### Design template - -````markdown -# — Design - - - -## Specification - - - -## Approach - - - -## Alternatives considered - -| Option | Trade-offs | Verdict | -|---|---|---| -|