Skip to content

chore(specs): normalize requirement headings to Form A per ADR-037#138

Merged
rubenvdlinde merged 1 commit into
developmentfrom
chore/phase1-normalize-req-headings
May 24, 2026
Merged

chore(specs): normalize requirement headings to Form A per ADR-037#138
rubenvdlinde merged 1 commit into
developmentfrom
chore/phase1-normalize-req-headings

Conversation

@rubenvdlinde
Copy link
Copy Markdown
Contributor

Summary

Phase 1c migration for openbuilt — converts every spec under openspec/specs/ from Form D (### Requirement: REQ-OBxxx-NNN <Title>) to canonical Form A (### Requirement: <Title> + **ID:** REQ-OBxxx-NNN in body) per ADR-037, disambiguates 10 duplicate REQ IDs in openbuilt-runtime/spec.md introduced by concatenated archive deltas, and replaces every TBD - created by archiving change … Purpose placeholder with meaningful content synthesised from the originating archived change's proposal.md Why section.

What changed

  • 17 spec files migrated (openspec/specs/*/spec.md)
  • ~134 Form D → Form A requirement-heading rewrites
  • 17 Purpose blocks rewritten from TBD to real prose
  • 10 duplicate REQ IDs in openbuilt-runtime disambiguated with single-letter suffixes mapped to source archive delta, each with an inline disambiguation note (e.g. REQ-OBR-006a = Schema designer routes from openbuilt-schema-editor; REQ-OBR-006b = Publish action from openbuilt-versioning; REQ-OBR-006c = Manifest 403 RBAC gate from openbuilt-rbac)

Validation

$ npx openspec validate --specs --strict
Totals: 17 passed, 0 failed (17 items)

openspec validate --all --strict reports 19/20 pass. The one failure is change/openbuilt-page-designer — a pre-existing issue on an in-flight change unrelated to this PR (git diff shows zero edits to that path under this branch).

Format details

Per ADR-037 the canonical heading is ### Requirement: <Title> with the REQ ID in the body. To satisfy openspec's validator rule "first body line MUST contain SHALL or MUST", the **ID:** REQ-OBxxx-NNN line is placed AFTER the lead SHALL paragraph (not before — that would make the ID line the validator-checked text and fail).

References

Test plan

  • npx openspec validate --specs --strict passes locally
  • No behaviour changes (specs-only PR)
  • Disambiguated REQ-OBR-* IDs in openbuilt-runtime/spec.md each carry an inline note explaining the suffix derivation

Phase 1c migration for openbuilt (umbrella issue #137).

Form A migration: 150 requirements across 17 specs migrated from Form D
("### Requirement: REQ-OBxxx-NNN <Title>") to Form A
("### Requirement: <Title>" + "**ID:** REQ-OBxxx-NNN" in body, placed
after the lead SHALL paragraph so the openspec validator's "SHALL on
first body line" rule still holds).

Per-spec migration counts (legacy heading → Form A):
- app-icon-management: 4
- app-nav-entries: 4
- application-creation-wizard: 11
- application-detail-overview: 12
- application-insights: 7
- application-versions: 8
- green-field-migration: 4
- openbuilt-application-register: 8
- openbuilt-exporter: 0 (already Form C; Purpose updated only)
- openbuilt-page-designer: 11
- openbuilt-rbac: 7
- openbuilt-runtime: 17 (includes duplicate-REQ disambiguation, see below)
- openbuilt-schema-designer: 8
- openbuilt-template-catalogue: 10
- openbuilt-version-snapshots: 3
- version-promotion: 11
- version-routing: 9

Total: 134 Form D → Form A migrations + 16 Form C (exporter only Purpose).

Duplicate-REQ disambiguation in openbuilt-runtime (10 requirements):
The runtime spec's archived deltas from openbuilt-schema-editor,
openbuilt-versioning, and openbuilt-rbac all introduced REQs that
collided on REQ-OBR-006 through REQ-OBR-009. Disambiguated with
single-letter suffixes mapped to source archive delta:
- REQ-OBR-006a = Schema designer routes (from openbuilt-schema-editor)
- REQ-OBR-006b = Publish action (from openbuilt-versioning)
- REQ-OBR-006c = Manifest 403 RBAC gate (from openbuilt-rbac)
- REQ-OBR-007a = Schemas menu entry (from openbuilt-schema-editor)
- REQ-OBR-007b = Draft-vs-published indicator (from openbuilt-versioning)
- REQ-OBR-007c = List filters by role (from openbuilt-rbac)
- REQ-OBR-008a = VersionHistory panel (from openbuilt-versioning)
- REQ-OBR-008b = Editor UIs gate destructive actions (from openbuilt-rbac)
- REQ-OBR-009a = Rollback action (from openbuilt-versioning)
- REQ-OBR-009b = Caller's group set via IInitialState (from openbuilt-rbac)

Each suffixed REQ carries an inline disambiguation note citing the
original archive delta source and the 2026-05-24 assignment date.

Purpose-block rewrites: 17 (every spec had the placeholder "TBD - created
by archiving change …" text; replaced with meaningful one-paragraph
purpose synthesised from the originating archived change's proposal.md
"Why" section).

Validation:
- npx openspec validate --specs --strict: 17/17 pass.
- openspec validate --all --strict: 19/20 pass. The one failure
  (change/openbuilt-page-designer) is a pre-existing issue on an
  in-flight change unrelated to this PR (no delta sections); diff
  shows zero edits to that path under this branch.

Refs ADR-037 (ConductionNL/hydra#326).
Closes part of #137.
@rubenvdlinde rubenvdlinde added yolo YOLO -- auto-approve and merge when AI reviews pass openspec OpenSpec-driven change labels May 24, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/openbuilt @ 6ed0f6a

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer
npm ✅ 591/591
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-05-24 12:07 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde rubenvdlinde merged commit 405a708 into development May 24, 2026
13 of 22 checks passed
@rubenvdlinde rubenvdlinde deleted the chore/phase1-normalize-req-headings branch May 24, 2026 18:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

openspec OpenSpec-driven change yolo YOLO -- auto-approve and merge when AI reviews pass

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant