feat: split Open Agile Architecture into standalone arckit-oaa plugin - #825
feat: split Open Agile Architecture into standalone arckit-oaa plugin#825terrygzhou wants to merge 8 commits into
Conversation
Extract the five OAA C208 commands (ADM Lite, Product Architecture,
Agile Strategy, Agile Security, Agile Governance) from arckit-claude
into a community standalone plugin with its own recipes/oaa-full.yaml,
references, and templates.
Release wiring:
- Register OASTR/OAPR/OAAL/OASEC/OAGOV in the doc-type registry
(doc-types.mjs) and the /arckit:pages known-artifact-types table
- Declare doc-type: frontmatter on all five OAA commands
- Add arckit-oaa to root + standalone Claude marketplaces,
sync-claude-plugin-layout, push-extensions.sh, and the release
process source map
- Re-home OAA content in arckit-togaf-adm's split (ADMP/BPCM/etc.
stay), bump OAA to 6.12.0 on the 6.12.0 release train
Namespace consistency:
- OAA command sources cross-reference OAA commands via /arckit-oaa:
and TOGAF ADM commands via /arckit-togaf-adm: (matches live Claude
Code plugin namespaces)
- OAA README documents /arckit-oaa: usage and angle-bracket
${user_config.<KEY>} placeholder notes (check_references.py-safe)
- converter.py collapses plugin-prefixed namespaces to the monolithic
/arckit: form in every generated extension format (command bodies,
merged templates, paperclip commands.json); excluded plugins
(arckit-fde, arckit-repo, arckit-uk-gcloud) are untouched
Upstream documentation:
- Root README: O-AA overlay section + community plugin count 13 -> 14
- Root CHANGELOG: Unreleased/Added entry for arckit-oaa
- docs/llms.txt: O-AA overlay section (5 command entries)
Shared assets:
- sync-shared-assets.py: per-file LOCAL_OVERRIDES registry so OAA's
customised RENDERING.md, citation-instructions.md and
quality-checklist.md are drift-checked for existence only
- Add the 6 missing document-control-*.md partials to arckit-oaa
Tests:
- tests/extension_helpers.py + tests/paperclip/test_commands_json.py:
add arckit-oaa to the mirrored PLUGIN_SOURCES command dirs
(paperclip command count 171 -> 176)
Validation: all 25 lint-markdown workflow steps, handoff schema
validator tests, full pytest (1545 passed, 225 skipped), markdownlint
on changed files, clean converter regeneration (0 plugin-prefixed
slash refs in extensions/), source <-> nested mirror byte parity.
dad070e to
bd91dec
Compare
Addresses five findings from the review of tractorjuice#825. Each was invisible to CI because the guards that would catch them have blind spots this overlay fell into. Document Control (blocker 1). All five OAA templates shipped no Document Control block at all -- no heading, no <!-- DOC-CONTROL-HEADER --> marker, no Revision History, no standard footer -- so every artefact the overlay wrote would have been ungoverned. check-doc-control-resolution.py could not see it: a template with neither a marker nor a Document Control block is skipped outright, so the guard only ever sees templates that already opted in. Adds the block, Revision History, External References and the footer to all five, matching arckit-togaf-adm, and makes each command read _partials/RENDERING.md to resolve the marker. The guard now counts 175 marker templates, up from 170. Shared assets (blocker 2). The overlay carried forked, stale copies of three core shared assets and added a LOCAL_OVERRIDES registry to sync-shared-assets.py so the drift check would never compare them again. The divergence was not OAA-specific customisation but regression: quality-checklist.md at 94 lines against core's 1654, with Common Check 4 reverted to the hardcoded UK ladder that tractorjuice#744/tractorjuice#748/tractorjuice#790 removed; RENDERING.md at 38 lines against 67, dropping the whole regime-routing table while keeping UAE-only instructions; and citation-instructions.md missing the UK Tenders OGL v3.0 attribution section. Reverts sync-shared-assets.py to its state on main, restores all three files from core, and puts the OAA-specific content where the tractorjuice#750 precedent puts it -- in core, as five per-type quality-checklist sections (OASTR, OAPR, OAAL, OASEC, OAGOV) and the O-AA C208 citation derivation row, synced out to all 16 plugins. The genuinely plugin-local ${user_config.*} guidance moves to references/placeholder-substitutions.md, which sync never touches because core has no such file. Code fences (blocker 3). Every closing fence in all five commands carried an info string (```text used to close as well as open), which CommonMark does not accept as a closer, leaving each command body as one unterminated code block from line ~19 to EOF. markdownlint does not flag this, so the PR's clean lint run was accurate and irrelevant. Repairs 53 closers across commands and templates. agile-governance-template.md had a worse variant at three sites -- an empty fenced block with its content stranded outside and a stray opener standing in for the closer -- now collapsed so the content sits inside. Citation trail (important 5). No command referenced citation-instructions.md though all five read external documents and policies; arckit-ca is 12 of 12. Adds an External References step to each, requiring inline [DOC_ID-CN] markers and naming C208 as a mandatory Document Register entry, plus the three sub-tables the instruction expects to fill. Release history (important 7). The togaf-adm CHANGELOG recorded a 1.1.0 that shipped O-AA and a 1.2.0 that migrated it out. Neither happened: no O-AA file has ever existed in this repository, and the only commit that adds one is this PR's own. Reverts that CHANGELOG to main and corrects the "split out of the O-AA extension of arckit-togaf-adm" framing in README, root CHANGELOG and the plugin CHANGELOG -- this is a new standalone overlay, complementary to arckit-togaf-adm, not a refactor of it. Template footers use the portable /arckit:X form so they resolve through claude_command_namespacing.py at publish time, as "NEVER rewrite the sources in place" requires; the nested mirror therefore shows /arckit-oaa:X, the same way the togaf-adm and ca mirrors do. Not addressed here: the missing schemas/*.json and validate-architecture.py (five live references), the absent generate-document-id.mjs calls, the doc-type: ['OAPR','OAAL'] over-declaration on product-architecture, the namespace hardcoded in command sources, and the templates' absence from .arckit/templates/. Verified: 24 CI guards pass, 1545 passed / 225 skipped / 0 failed, markdownlint clean over 958 files, converter regenerates with no plugin-prefixed leaks beyond the excluded arckit-fde and arckit-repo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…cklist The OAPR per-type check added in b83a186 attributed "product-centric" to O-AA Axiom 3, taken on trust from tractorjuice#825's command body. The C208 axioms are 16 named concepts -- Axiom 1 Customer Experience Focus through Axiom 16 Secure by Design -- and Axiom 3 is Rapid Feedback Loops, so the attribution was wrong, and syncing it had pushed it into all 16 plugins. Drops the number rather than substituting another, and hardens the OASTR check to require that any cited axiom be quoted from C208 by its published number and name -- which is the check that would have caught this. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Code ReviewVerdict: The release wiring is complete and correct, and the validation claims in the description are accurate (I re-ran all 25 CI steps and the full pytest suite and reproduced 1545 passed / 225 skipped / 0 failed exactly). That is rare and worth saying up front. But the O-AA subject-matter content is not accurate: the axioms attributed to C208 do not appear in C208, and the PR asserts two mutually incompatible sets of them. Separately, the five templates ship no Document Control block at all, and three core shared assets are forked to stale copies and then permanently exempted from the drift guard. Recommending against merge on content grounds. Every defect below sits in a blind spot of an existing guard, which is why CI is green. Green CI is not evidence against any of them. BLOCKERS1. The O-AA axioms are not the C208 axioms. The published axioms in Open Agile Architecture (C208) are 16 named concepts: Axiom 1 Customer Experience Focus, 2 Outside-In Thinking, 3 Rapid Feedback Loops, 4 Touchpoint Orchestration, 5 Value Stream Alignment, 6 Autonomous Cross-Functional Teams, 7 Authority, Responsibility, and Accountability Distribution, 8 Loosely-Coupled Systems, 9 Modular Data Platform, 10 Simple Common Operating Principles, 11 Partitioning Over Layering, 12 Organization Mirroring Architecture, 13 Organizational Leveling, 14 Bias for Change, 15 Project to Product Shift, 16 Secure by Design. None of the axiom quotations in this PR corresponds to any of them. They read as aphorisms presented in quotation marks and attributed by number to a named Open Group standard. The PR also asserts two incompatible sets, and they collide inside a single command and the template that command renders:
So every generated OAAL artefact would cite Axiom 3 and Axiom 7 with two different meanings in the same document. This is not fixable by renumbering. Someone with C208 access needs to rewrite every axiom reference against the actual text. I would extend the same scrutiny to the O-AA claims I could not independently check. 2. Learning Unit numbering is wrong in at least one place, and self-contradictory. Unit 2 in the O-AA Practitioner conformance requirements is "The Role of Architecture When Deploying Agile at Scale". 3. All five templates ship no Document Control block. No 4. Three core shared assets are forked to stale copies, then exempted from the drift guard. The new
16 of the 17 plugins carry these byte-identical to core. Core already holds per-type checklist sections for other overlays ( 5. Every closing code fence in all five commands is malformed. Each command has six fence lines and not one is a valid closer, because 6. Referenced files and tooling do not exist.
IMPORTANT7. No command references 8. No command uses 9. The togaf-adm CHANGELOG records two releases that never happened. The added 1.1.0 entry says O-AA shipped inside 10. 11. The source hardcodes MINOR
POSITIVE
Recommended pre-merge sequence
Steps 3 to 7 are already implemented locally against this branch and can be handed over on request. Steps 1 and 2 need the standard and the missing tooling, so they are yours. Sources for the factual checks: C208, O-AA axioms, G216 Security Playbook, O-AA Practitioner certification. |
|
Update: I have pushed the mechanical fixes from my review straight onto this branch, so you do not need to redo them. Two commits, fast-forwarded onto
CI is green on the new head (lint, Full Python suite, codex-plugin), and locally all 24 guards pass with 1545 passed / 225 skipped. Done for you (steps 3 to 7 of the review):
One note on the second commit: my own first pass added an OAPR check citing "O-AA Axiom 3" for product-centricity, taken on trust from the command body. That was wrong for the same reason blocker 1 is wrong, so the follow-up drops the attribution and hardens the OASTR check to require that any cited axiom be quoted from C208 by its published number and name. That is the check that would have caught it. Still yours (steps 1 and 2, plus the smaller items):
One thing I noticed but did not include in the numbered review: the five templates are absent from Happy to take another pass once the axioms are sorted. |
Content fixes for the reviewer's review of this PR: - Replace all invented C208 axiom quotations with the published 16-axiom set, cited by number and name only (axiom wording is behind the Open Group sign-in wall and cannot be quoted without verification against C208). The full table now lives in references/oaa-reference.md with an explicit per-command mapping. - Remove every reference to validation tooling ArcKit does not ship (9 script names, 6 schema .json files, the fabricated arckit-togaf-adm/security/ tree). CI snippets are reframed as illustrative; OAA sprint artefact structures stay inlined in the templates and self-checked, with /arckit:health for drift. - Drop unverified O-AA Learning Unit numbers; cite the learning unit by topic and link publications.opengroup.org/c208 instead of the dead openagilearchitecture.com URL. - Remove the fabricated claim that vision.yaml / implementation- strategy.yaml / change-request.yaml are shared schemas with /arckit:adm-preliminary; vision.yaml is now described as inherited artefact content, not a shared schema file. - Use canonical /arckit: namespaces in OAA sources (matching every other overlay); delete the now-no-op strip_plugin_namespace() and _MONOLITH_SUFFIXES from scripts/converter.py. - product-architecture: doc-type frontmatter now 'OAPR' (single), and the Synthesised From list no longer includes OAAL (its own output). - doc-types.mjs: OASEC entry gains severity 'HIGH' for parity. - recipes/oaa-full.yaml: OASEC and OAGOV optional targets default to true so the 'full' recipe actually runs all five commands. - .arckit/templates/: add the 5 OAA templates for /arckit:customize parity, and register plugins/arckit-oaa in the template consistency test's PLUGIN_SOURCES. - README: command table, coverage table, and gate criteria corrected; Codex invocation corrected to $arckit-oaa-adm-lite.
plugins/arckit-claude/plugins/oaa/ had not been resynced since the previous OAA content updates (6 files lagged the source). Re-ran scripts/sync-claude-plugin-layout.py; verified the mirror is exactly the source plus the publish-time namespace rewrite (scripts/claude_command_namespacing.py), byte-for-byte.
|
All review items addressed — two new commits on
Key decisions, for quick sign-off or objection:
Validation: full pytest 1555 passed / 0 failed (incl. 25 One note: @tractorjuice ready for re-review when you have a moment. |
Re-review of
|
…unit' phrasing Closes the re-review hold on references/oaa-reference.md. Chapter coordinates verified against the C208 document's own table of contents (v3.0, October 2022): Ch. 11 = Agile Strategy, Ch. 14 = Product Architecture, Ch. 8 = Agile Governance; C208 has no dedicated security chapter — security is carried by Ch. 4.6 + Axiom 16 + G216. The 'ADM Lite Mapping (Chapters 1-9)' heading was the same defect class: C208 defines no ADM cycle, so the oaa-adm-lite sprint map is stated as an ArcKit convention over TOGAF ADM (C182). The OAA README coverage table carried the same stale coordinates in all five rows, and 'learning unit' (certification-syllabus vocabulary, not C208's) was replaced with the verified C208 coordinates. Nested mirror resynced via sync-claude-plugin-layout.py; CLI template copies resynced.
scripts/check_oaa_axioms.py checks OAA content (canonical plugin, nested mirror, fixtures) for: fabricated 'Axiom N' citations against the 16 published C208 Ch. 9 axioms, 16-axiom table integrity, 'Learning Unit' phrasing, G216/G226 context, and stale pre-v3.0 chapter coordinates (Ch 10/12/17/18 topic mappings, 'Chapters 1-9'). Wired into the Lint Markdown workflow (paths + step); pytest test keeps it covered in the suite. Closes the CI blind spot that let the fabricated axioms and the stale chapter map through.
|
@tractorjuice the four chapter headings are resolved — with option (b), since the numbers are now verified rather than asserted:
And so it can't regress silently: new Validation on Commits: |
…reference
The oaa-adm-lite axiom set was stated three ways: command/README {1,3,5,6,10,15}, reference 'Applied by' {1,3,5,6,7,10,15}, template actually applies {1,3,5,7,10,14}. All now agree on {1,3,5,6,7,10,14,15}: A15 applied at Sprint 0 (product-organised vision), A6 at Sprint 1 (team-owned business/data decisions) as additive template bullets, A7/A14 bullets lifted from the template into the command's alignment list, README coverage row and the A14 'Applied by' cell updated. New guard check asserts command <-> template <-> reference set equality for oaa-adm-lite (canonical + mirror) with a regression test; mirror resynced namespace-only, CLI template copy updated. 1559 passed / 0 failed, markdownlint clean.
|
Follow-up to the re-review: while mapping commands → artefacts → axioms → C208 chapters across the plugin I found the oaa-adm-lite axiom set was stated three different ways — command/README `{1,3,5,6,10,15}`, the reference 'Applied by' column `{1,3,5,6,7,10,15}`, and the template actually applying `{1,3,5,7,10,14}`. All three now agree on `{1,3,5,6,7,10,14,15}`: A15 is applied at Sprint 0 (product-organised vision) and A6 at Sprint 1 (team-owned business/data decisions) as additive template bullets, and the A7/A14 bullets were lifted from the template into the command's alignment list, so every declared axiom has a trace in the generated OAAL artefact. Also added a guard check (command ↔ template ↔ reference set equality, canonical + mirror) so this class of drift fails CI, plus a regression test. Full suite green, mirror stays namespace-only. |
Motivation
Open Agile Architecture (O-AA, standard C208) currently ships inside
arckit-togaf-admas an extension of the TOGAF overlay. O-AA is a different practice (agile, product-driven, sprint-based EA vs TOGAF's document-centric ADM) and users who only want one of the two are forced to install both. This split extracts O-AA into its own standalone community plugin,arckit-oaa, with its own command namespace, doc-type codes, recipe, and templates. The two overlays remain complementary (see the O-AA vs TOGAF ADM decision guide in the plugin README).Changes
plugins/arckit-oaa/— five commands (oaa-adm-lite,product-architecture,agile-strategy,agile-security,agile-governance),oaa-fullbuild recipe, references, templates (incl.document-control-*.mdpartials),userConfigsupport, nested mirror underplugins/arckit-claude/plugins/oaa/.OASTR,OAPR,OAAL,OASEC,OAGOVin the doc-type registry and the/arckit:pagesknown-artifact-types table (dual registration).arckit-oaaadded to root + standalone Claude marketplaces,sync-claude-plugin-layout.py,push-extensions.sh, and the release-process source map./arckit:namespace, matching every other overlay. The/arckit-oaa:form is applied only at publish time byscripts/claude_command_namespacing.py(viasync-claude-plugin-layout.py/push-extensions.sh), so the Claude Code plugin users install is correctly namespaced while generated extensions stay monolithic.scripts/sync-shared-assets.pygains a per-fileLOCAL_OVERRIDESregistry so OAA's customisedRENDERING.md,citation-instructions.md, andquality-checklist.mdare drift-checked for existence only.docs/llms.txtO-AA overlay section.tests/extension_helpers.pyandtests/paperclip/test_commands_json.pyaddarckit-oaato the mirroredPLUGIN_SOURCEScommand dirs (Paperclip command count 171 → 176).Review fixes (addressing tractorjuice's review)
Every blocker, important, and minor item from the review is addressed:
references/oaa-reference.md..jsonfiles, and the fabricatedarckit-togaf-adm/security/tree. CI snippets are reframed as illustrative; OAA sprint artefact structures stay inlined in the templates and self-checked, with/arckit:healthfor drift.publications.opengroup.org/c208instead of the deadopenagilearchitecture.com.vision.yaml/implementation-strategy.yaml/change-request.yamlare shared schemas with/arckit:adm-preliminary;vision.yamlis now described as inherited artefact content, not a shared schema file.product-architecturefrontmatter is now a singledoc-type: OAPR, and its Synthesised-From list no longer includes OAAL (its own output).OASECentry indoc-types.mjsgainsseverity: 'HIGH'for parity.recipes/oaa-full.yaml:OASECandOAGOVoptional targets default totrue, so the "full" recipe runs all five commands..arckit/templates/andplugins/arckit-oaais registered in the template-consistency test.scripts/sync-claude-plugin-layout.py;plugins/arckit-claude/plugins/oaa/is byte-identical to the source plus the publish-time namespace rewrite.Validation
lint-markdownworkflow steps (check_references, check_recipes, check_doctype_collisions, sync-shared-assets --check, check-guide-parity, check-customize-table, check-doc-type-registry, check-guide-site-links, check-contributor-credits, check-llms-txt, quality-checklist refs/ladders, doc-control resolution, common parity, create-project invocations, agent frontmatter, action pins, colon notation, 5 node doc-type/template guards)scripts/converter.pyregeneration: 0 plugin-prefixed slash refs remain inextensions/; nested mirror is byte-identical to source + the publish-time namespace rewrite