Skip to content

docs(#265): AgDR-0047 for framework packaging & distribution#343

Merged
atlas-apex merged 2 commits into
devfrom
docs/GH-265-packaging-agdr
May 20, 2026
Merged

docs(#265): AgDR-0047 for framework packaging & distribution#343
atlas-apex merged 2 commits into
devfrom
docs/GH-265-packaging-agdr

Conversation

@atlas-apex

Copy link
Copy Markdown
Collaborator

Summary

  • AgDR-0047 authored at docs/agdr/AgDR-0047-framework-packaging-and-distribution.md — proposes a packaging-strategy decision with six options compared (fork-as-install / release-tarball / layered install / npm / Homebrew / one-line install script) plus combination plays. The Options table is the load-bearing artefact — Pros / Cons / Migration cost columns per option so the operator can pick without diff archaeology.
  • Recommendation leans option 3 (layered install) with the "3 + brand mitigation" pattern — read-only framework dir + adopter customisation overlay (XDG-style), with a visible install-dir name + fork-root README.md + registry-at-fork-root so the brand-visibility concern that motivated the original fork-as-install model stays mitigated. The recommendation is honest about the breaking-change migration cost for existing adopters — every adopter would need a /migrate-to-layered skill (shaped like /split-portfolio from [Feature] /split-portfolio migration helper skill (follow-up to #143) #146) before their next framework update.
  • Status is PROPOSED — operator picks via PR comment. The AgDR's Decision section explicitly defers: it'll be rewritten from PROPOSED → ACCEPTED + chosen option after the operator comments on this PR. Per the ticket scope, this PR is AgDR-only — no implementation; a follow-up ticket will land the chosen option's implementation.
  • AgDR numbering corrected to 0047 — the ticket body referenced AgDR-0029 but that number is already taken (AgDR-0029-pr-summary-narrative-quality.md). Latest currently-merged AgDR is 0046; this PR claims 0047. The AgDR uses body-H1 only, no YAML frontmatter to match the live convention of AgDR-0044 / 0045 / 0046 (markdownlint MD025 trips on YAML title: + body H1 together — the drift from templates/agdr.md is documented inline in the AgDR's metadata section).

Testing

  • AgDR renders on GitHub (Options table + combination plays + Recommendation + Decision + Consequences all readable in PR file view)
  • AgDR shape matches sibling AgDR-0046 (body-H1 only, no YAML frontmatter, italic-prose blockquote summary at top)
  • No AgDR-number collision — docs/agdr/AgDR-0047-*.md is unique on dev (verified against upstream/dev at branch-create time)
  • Markdownlint passes in CI (.markdownlint.json disables MD013 / MD024 / MD025 surfaces this AgDR could trip)
  • Filename matches the in-document references in the Related-AgDR links (AgDR-0007, AgDR-0021, AgDR-0023)

Closes #265

Glossary

Term Definition
AgDR (Agent Decision Record) A markdown record capturing a technical decision — context, options considered, choice made, consequences. Stored at docs/agdr/AgDR-NNNN-<slug>.md. The framework's per-decision durable artefact.
AgDR PROPOSED status The pre-decision state of an AgDR. Options are laid out and a recommendation may be made, but no choice is committed. The Decision section explicitly defers to a downstream input (here: operator PR comment). Contrast with ACCEPTED (decision recorded), SUPERSEDED (replaced by a later AgDR), or REJECTED (option discarded).
Fork-as-install ApexYard's current distribution model. The adopter forks me2resh/apexyard on GitHub, clones the fork locally, and syncs updates via git pull upstream + the /update skill. Framework files live in the adopter's git tree alongside their customisations.
Layered install A packaging model where framework files live in a read-only install directory (the base layer) and adopter customisations live in a separate overlay directory (the adopter layer). The framework dir is never edited by the adopter, so upstream updates can be applied as a directory-replace with zero merge conflicts.
XDG The XDG Base Directory Specification — a Linux/Unix convention defining where applications store data (~/.local/share/<app>/), config (~/.config/<app>/), and cache (~/.cache/<app>/). One candidate layout for layered install's base + overlay split.
Breaking change A change that requires existing adopters to take an action (migration) before they can continue using the framework. Layered install is breaking because every existing fork would need to relocate .claude/, roles/, workflows/, templates/ under a new install dir.
Migration path The documented + tooled sequence existing adopters follow to move from the old model to a new one. Precedent shape in the framework: /split-portfolio (#146) — explicit destructive-recovery flow with operator-confirmation gates, idempotent re-runs, default-no dry-run mode.
Version pin A declarative record of which framework version an adopter is running. Today: implicit, via git log on the fork. Layered install would make this explicit via a manifest file (framework_version: 1.3.0) so skills declaring requires framework ≥ N can be checked mechanically at runtime.
Brand visibility The framework's discoverability on the adopter's GitHub org. Pre-v1 ApexYard lived inside a .apexyard/ dotfile dir invisible to ls and GitHub views; v1 moved to fork-as-install partly to fix this. Any new packaging model must preserve discoverability — typically via a visible install-dir name + fork-root README.md naming the framework + registry-at-fork-root.

- Compares 6 packaging options: fork-as-install (status quo),
  release-tarball delivery, layered install, npm package, Homebrew
  formula, one-line install script
- Pros / Cons / Migration cost columns per option, plus combination
  plays (2+3 staged, 3+4 layered, 3 + brand mitigation, 6 + any)
- Recommendation leans option 3 (layered install) with brand-mitigation
  pattern; status quo explicitly NOT recommended
- Decision section is PROPOSED; operator picks via PR comment
- Body-H1 only, no YAML frontmatter (matches AgDR-0044/0045/0046 live
  convention; documents the drift from templates/agdr.md inline)

Refs #265

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… count) in AgDR-0047

CI flagged 3 markdownlint errors on the initial push:
- MD028 line 4: blockquote with bare blank-line separator (need `>` continuation)
- MD056 lines 39-40: options 4 (npm) + 5 (Homebrew) missing the 5th
  "Migration cost" column cell — table header declares 5 columns, those
  two rows had only 4.

Replaced the blank blockquote line with `>` continuation, filled the
missing Migration cost cells with the medium-disruption rationale
(npm: smooth for JS adopters, awkward for non-JS shops; Homebrew:
brew tap + per-release formula bump, no Windows path).

Refs #265

@atlas-apex atlas-apex left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review: PR #343

Commit: d2d2a5ad825ad11a2657c0430d914098cb764243

Summary

Pure-docs PR adding docs/agdr/AgDR-0047-framework-packaging-and-distribution.md (114 lines, single file, zero deletions). Compares six packaging-strategy options for the framework — fork-as-install / release-tarball / layered install / npm / Homebrew / one-line install script — plus four combination plays. Recommends option 3 (layered install) with the "3 + brand mitigation" pattern but defers the actual call (status PROPOSED, operator picks via PR comment).

Checklist Results

  • ✅ Architecture & Design: N/A (docs-only)
  • ✅ Code Quality: Pass
  • ✅ Testing: N/A (docs-only; markdown lint covered by CI)
  • ✅ Security: Pass (no secrets, no executable changes)
  • ✅ Performance: N/A
  • ✅ PR Description & Glossary: Pass (8-row glossary, narrative bullets)
  • ✅ Technical Decisions (AgDR):Pass (this PR is an AgDR — meta-Pass)
  • ✅ Adopter Handbooks: N/A (architecture/general handbooks load but find no violations; no language diff)

Issues Found

None.

Spot-checks against the items called out in the review request

1. AgDR shape — body-H1 only, no YAML frontmatter, canonical one-liner present.
Verified. Line 1 is # AgDR-0047 — Framework packaging & distribution (body H1). No --- frontmatter delimiter at file start. Markdownlint MD025 cannot fire. The Metadata line (line 7) carries the body-H1-convention rationale inline, which is helpful for the next AgDR author who might be tempted to re-add frontmatter.

The canonical "In the context of … I am proposing … accepting …" one-liner is at line 3, present and complete. It correctly uses proposing (not decided) given the PROPOSED status — small but load-bearing tense choice that keeps the AgDR honest.

2. Six options + 5-column table — all cells populated.
Verified row-by-row: every option has Pros, Cons, and Migration cost filled. No empty cells. Specifically on the two cells called out in the fix-up commit (npm + Homebrew Migration cost):

  • Option 4 (npm) Migration cost: "JS/TS adopters adopt smoothly via package.json; non-JS shops bear awkwardness or skip; framework ships an npm-publish CI step on release tag." Accurate — the adopter-side cost is heterogeneous (JS shops vs others), and naming the framework-side cost (npm-publish CI step) is the right level of detail for a PROPOSED options table.
  • Option 5 (Homebrew) Migration cost: "brew tap setup + per-release formula bump; Windows adopters unsupported (no migration path); needs an additional distribution channel." Accurate and surfaces the Windows gap that's already a known framework constraint (per link-custom-skills.sh). Not misleading.

Both cells are consistent with their respective Pros/Cons cells — no contradictions.

3. PROPOSED status with explicit operator-pick-via-PR-comment guidance.
Verified. The Decision section opens with "PROPOSED — awaiting operator pick via PR comment." and enumerates five concrete inputs the operator should weigh in on (option pick, brand-visibility mitigation shape, staged vs single-step, migration story, install-script timing). The status appears coherently in three places: the one-liner blockquote tense, the Metadata line, and the Decision header — no drift between them.

4. Consequences section captures the v1 risks.
Verified. Lines 90–95 explicitly call out:

  • Migration path articulation must precede implementation (with the /split-portfolio precedent named — the right reference shape)
  • Compounding implementation cost ("every new skill, hook, or rule from the date this AgDR lands implicitly assumes the chosen packaging model")
  • Reversibility-but-rising-cost-over-time

These match exactly the three risks the ticket scope called out. The per-option sketches that follow are appropriately tagged as "placeholders to be expanded in the chosen-option follow-up AgDR" — they don't pre-decide.

5. PR body Glossary + narrative bullets.
Verified. Four bullets in the Summary, each answering both what changed AND why it matters per .claude/rules/pr-quality.md. No label-only bullets. Glossary has 8 rows covering every framework-specific or load-bearing term (AgDR PROPOSED status, fork-as-install, layered install, XDG, breaking change, migration path, version pin, brand visibility) — comfortably above the "every technical term explained" bar.

Suggestions

Two small nice-to-haves, neither blocking, neither expected to be addressed in this PR:

  1. Combination 3 + 4 ("layered + npm as delivery channel") is a strong combination play but currently lives only in the prose subsection. If the operator's eventual pick is "option 3 + option 4 as delivery channel", the Decision section's bullet list might need one more input slot. Not a current-PR fix — flagging for the follow-up AgDR that records the pick.

  2. The "PR: (will be filled in once opened)" placeholder in the Artifacts section is fine for a PROPOSED AgDR but worth remembering to populate when this lands (or when the ACCEPTED-rewrite PR opens). The framework convention from sibling AgDRs (0044/0045/0046) is to link the merging PR. Operator's call — could be addressed in the ACCEPTED follow-up rewrite.

On PR #267 (the superseded draft)

Per the review request — flagging that PR #267 (currently draft state) carries the same scope but with the wrong AgDR number (0029, which is already taken). Operator's call to close it as superseded post-merge here. No action needed in this PR.

Verdict

APPROVED (recorded as a --comment because GitHub blocks self-approve on author-owned PRs)

The AgDR is structurally clean, honest about the trade-offs, deferential on the actual decision, and explicit about the cost of not deciding. The two cells the author flagged for verification (npm + Homebrew Migration cost) are accurate and non-misleading. CI is 3/3 green.

Ready to merge from the code-review side. Per pr-workflow.md, the merge itself still requires an explicit per-PR CEO approval via /approve-merge 343 — plan-level "go" does not authorise the merge.


🤖 Reviewed by Rex (Code Reviewer Agent)
📌 Reviewed commit: d2d2a5ad825ad11a2657c0430d914098cb764243

@atlas-apex atlas-apex merged commit 50f4d41 into dev May 20, 2026
3 checks passed
@atlas-apex atlas-apex deleted the docs/GH-265-packaging-agdr branch May 20, 2026 15:38
me2resh added a commit that referenced this pull request Jun 5, 2026
* docs(#265): AgDR-0047 framework packaging & distribution (proposed)

- Compares 6 packaging options: fork-as-install (status quo),
  release-tarball delivery, layered install, npm package, Homebrew
  formula, one-line install script
- Pros / Cons / Migration cost columns per option, plus combination
  plays (2+3 staged, 3+4 layered, 3 + brand mitigation, 6 + any)
- Recommendation leans option 3 (layered install) with brand-mitigation
  pattern; status quo explicitly NOT recommended
- Decision section is PROPOSED; operator picks via PR comment
- Body-H1 only, no YAML frontmatter (matches AgDR-0044/0045/0046 live
  convention; documents the drift from templates/agdr.md inline)

Refs #265

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: fix markdownlint MD028 (blockquote blank) + MD056 (table column count) in AgDR-0047

CI flagged 3 markdownlint errors on the initial push:
- MD028 line 4: blockquote with bare blank-line separator (need `>` continuation)
- MD056 lines 39-40: options 4 (npm) + 5 (Homebrew) missing the 5th
  "Migration cost" column cell — table header declares 5 columns, those
  two rows had only 4.

Replaced the blank blockquote line with `>` continuation, filled the
missing Migration cost cells with the medium-disruption rationale
(npm: smooth for JS adopters, awkward for non-JS shops; Homebrew:
brew tap + per-release formula bump, no Windows path).

Refs #265

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants