Skip to content

docs(#100): positioning rewrite — "where projects get forged"#4

Merged
atlas-apex merged 3 commits into
mainfrom
docs/GH-100-positioning-rewrite
Apr 9, 2026
Merged

docs(#100): positioning rewrite — "where projects get forged"#4
atlas-apex merged 3 commits into
mainfrom
docs/GH-100-positioning-rewrite

Conversation

@atlas-apex

Copy link
Copy Markdown
Collaborator

Summary

PR 1 of 5 for the apexstack positioning epic (me2resh/apexscript-org#100). Reframes apexstack from "an opinionated stack for Claude Code" to "a multi-project ops repo where projects get forged." Targets the solo founder / technical CEO running 2–5 products and drowning in context-switching.

This PR only touches copy and the hero CTA. No new features, no roles work, no skill fixes — those land in PRs 2–5 per the epic.

Audience discovery (per the new UX rule)

Captured in the epic issue; summarised here:

  • Primary persona: solo founder / technical CEO running 2–5 products, drowning in context-switching
  • Conversion goal: (1) star the repo, (2) git clone to try it locally
  • Objections to overcome: "too Claude Code specific" and "too opinionated"
  • Tone: punchy and confident, short sentences, strong verbs
  • Forge metaphor: literal — use the word "forge"

Three open aha-moment candidates — pick one in review

You said A2 ("not sure") — I drafted four H1 options below. Picked option 1 as the working default in this PR; swap to any of the others in a follow-up commit if you prefer.

# H1 Tagline Vibe
1 (shipped) "Where projects get forged." "The multi-project ops repo where your projects reference each other, learn from shared experience, and ship production-ready under a strict SDLC." Quiet-confident, stays close to your exact phrasing
2 "Forge your portfolio." "One ops repo. Every product. Shared memory. Strict SDLC. Production-ready MVPs — from a founder juggling 2–5 products at once." Imperative, punchier, more SaaS-ad
3 "One forge. Every project." "The multi-project setup where your portfolio learns from itself. Strict SDLC, shared memory, and production-ready MVPs — the Claude-Code-native default, but the forge is plain markdown." Two-sentence punch, leans into "one" × "every" parallelism
4 "Stop duct-taping 5 CLAUDE.mds." "ApexStack is the multi-project forge for founders running 2–5 products. One ops repo. Shared memory. Strict SDLC. Production-ready MVPs." Problem-first, pain-named, most ad-like

What changed

site/index.html hero

  • Eyebrow: "plain markdown · zero dependencies""for founders forging multiple products"
  • H1: "apexstack""Where projects get forged."
  • Tagline: rewritten to lead with the multi-project + forge framing + strict SDLC
  • Subhead: rewritten. New structure: framing (you don't add, you forge inside) → promise (one ops repo, every product, shared memory, strict gates, production-ready MVPs) → objection handling (Claude Code is the default driver, but the rules/hooks/templates are plain markdown and shell — swap the AI, keep the forge)
  • NEW hero__cta block: [★ Star on GitHub] · [or install it now ↓]. Star is primary (filled ink → accent on hover), install link is ghost (text-only, accent on hover)
  • Install command: ~/.apexstack.apexstack (fix — the brief was pointing at a broken home-dir pattern per the audit)
  • Install caveat: rewritten to point at the six-step install + the new global-install alternative

site/index.html CSS

Added .hero__cta, .cta, .cta--primary, .cta--ghost, .cta__sep to the existing terminal-brutalism style block. Sharp corners, hairline borders, no gradients. ~40 lines.

site/index.html install section (05 / INSTALL)

  • Kept the six-step per-ops-repo walkthrough unchanged (canonical path)
  • Kept the single-project opt-out at the end
  • NEW: "alternative — global install" step (anchor #install-global) for users running several ops repos. Documents the tradeoff (absolute paths in symlinks).

README.md

  • Hero rewritten end-to-end to match the site
  • Added "Global install (alternative)" section after "Single-project install (opt-out)"
  • gstacks.org attribution reworded

CLAUDE.md

  • Title: "AI-Native Development Stack""A Multi-Project Forge for Claude Code"
  • First paragraph expanded with the forge framing and the "projects get forged inside it, not added to it" phrasing. The operational instructions below it are untouched so the rest of the file still drives Claude correctly.

What's NOT in this PR (tracked in the epic)

Item Tracked as
Commands sub-page explaining each skill PR 2
Hero shell animation (CSS + JS typewriter) PR 3 (depends on PR 2 — the command shown in the animation will be picked from the sub-page)
Roles integration (CLAUDE.md imports, role-triggers.md rule, workflow threading) PR 4 — the audit flagged all 19 roles are completely disconnected from the running system, so this will be its own PR
/handover auto-append to registry + /idea polish PR 5
Anvil / metalwork SVG iconography holding off on visuals until copy is locked
AgDR backfill explicitly skipped per earlier CEO call

Glossary

Term Definition
Forge The central metaphor — apexstack is the workbench where multiple products get shaped, not a tool you bolt onto an existing codebase. "Projects get forged inside it."
Ops repo The repo where apexstack lives and where Claude Code runs from. Holds shared rules/skills/hooks + the portfolio registry + per-project planning docs. Different from the project code repos it governs.
Shared memory The fact that decisions, learnings, and AgDRs in one project are visible to every other project in the ops repo. The opposite of "re-explain the stack in every project's CLAUDE.md".
Default driver Claude Code is the default AI that reads the stack, but the rules/hooks/templates are plain markdown and shell scripts — portable to other AI tools if/when they arrive.
Aha moment The single sentence or image that makes a reader stop scrolling and say "oh, this is the thing I need". Four candidates above, option 1 shipped.
hero__cta New CSS block in the hero that holds the primary (★ Star) and secondary (install link) call-to-action buttons
Global install Alternative install pattern: clone apexstack once at ~/.apexstack/ and reference from every ops repo via symlinks. Good for founders running multiple orgs.

Test plan

  • cd projects/hava/mockups/ && python3 -m http.server 8000 — wait, wrong repo. Run python3 -m http.server 8000 inside site/ in the apexstack repo
  • Open http://localhost:8000 in a browser, confirm the hero reads "Where projects get forged." and the CTA buttons are visible above the install block
  • Click "★ Star on GitHub" — opens the GitHub repo
  • Click "or install it now ↓" — scrolls to #install section
  • Click the install caveat's #install-global link — scrolls to the new global-install step
  • Inspect CSS in devtools, confirm .cta--primary has background: var(--ink) and hover → var(--accent)
  • Dark-mode check (prefers-color-scheme: dark) — CTA should still be readable
  • grep -n "~/.apexstack" site/index.html — should only hit the new global-install step, NOT the hero install block
  • grep -n "opinionated stack for Claude Code" site/index.html README.md CLAUDE.md — should return zero hits (old tagline gone)
  • README.md renders cleanly on GitHub (preview the PR)
  • Rex review

Refs me2resh/apexscript-org#100

🤖 Generated with Claude Code

Reframes apexstack from "an opinionated stack for Claude Code" to
"a multi-project ops repo where projects get forged." Targets the
solo founder / technical CEO running 2-5 products and drowning in
context-switching.

Hero (site/index.html)
- Eyebrow flips from "plain markdown · zero dependencies" to
  "for founders forging multiple products"
- H1 changes from the brand name ("apexstack") to the value
  prop ("Where projects get forged.")
- New tagline: "The multi-project ops repo where your projects
  reference each other, learn from shared experience, and ship
  production-ready under a strict SDLC."
- New subhead leans into the forge framing: "You don't add
  apexstack to a project — projects get forged inside it. One
  ops repo. Every product. Shared memory. Strict gates.
  Production-ready MVPs." Addresses the Claude-Code-lock-in
  objection head-on: "Claude Code is the default driver, but
  the rules, hooks, and templates are plain markdown and shell.
  Swap the AI. Keep the forge."
- NEW hero CTA block with star-first priority:
  [★ Star on GitHub] · [or install it now ↓]
- Install command fixed from `~/.apexstack` (home dir, broken
  per the audit) to `.apexstack` (per-ops-repo, canonical)
- Caveat rewritten to match and point at both install paths

CSS
- Added .hero__cta, .cta, .cta--primary, .cta--ghost, .cta__sep
  to the existing terminal-brutalism style block. Sharp corners,
  hairline borders, no gradients. Primary CTA goes from ink → accent
  on hover. Ghost CTA is text-only with accent on hover.

Install section (site/index.html SECTION 05)
- Kept the six-step per-ops-repo walkthrough as the canonical
  path
- Kept the single-project opt-out at the bottom
- NEW "alternative — global install" step for users running
  several ops repos (founders with multiple orgs, consultants
  with multiple clients). Documents the tradeoff: symlinks
  use absolute paths, breaks if ~/.apexstack/ moves.
- Hero caveat links to #install-global for the alternative

README.md
- Hero rewritten end-to-end to match the site
- Added "Global install (alternative)" section after the
  single-project opt-out, mirroring the new site step
- gstacks.org attribution reworded to say "for teams running
  more than one product at a time"

CLAUDE.md
- Intro title changed from "AI-Native Development Stack" to
  "A Multi-Project Forge for Claude Code"
- First paragraph expanded with the forge framing and the
  explicit "projects get forged inside it, not added to it"
  phrasing, while keeping the operational instructions
  untouched so the rest of the file still drives Claude
  correctly.

Audience discovery (recorded in the epic issue)
- Primary persona: solo founder / technical CEO juggling
  2-5 products
- Tone: punchy and confident, short sentences, strong verbs
- Forge metaphor: literal
- Conversion: star first, clone second
- Objections addressed: Claude-Code lock-in (explicit),
  opinionated (leaned into — "strict gates" is the point)

NOT in this PR (tracked in the epic)
- Commands sub-page (PR 2)
- Hero shell animation (PR 3, depends on PR 2)
- Roles integration (PR 4 — the audit flagged all 19 roles
  are completely disconnected from workflows/skills/CLAUDE.md
  imports, will fix there)
- /idea and /handover skill polish (PR 5)
- AgDR backfill — explicitly skipped
- Anvil / metalwork SVG iconography — holding off on visual
  changes until the copy is locked

Refs me2resh/apexscript-org#100

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

@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 #4

Reviewed commit: b50b20ef59661db8b7e189bcc183987f480b6467

Summary

Copy + hero-CTA positioning rewrite across site/index.html, README.md, and CLAUDE.md. Reframes apexstack as a multi-project forge, adds a primary star CTA, and documents a global-install alternative. Scope is clean: 3 files, +94/-11, no leakage into PR 2–5 territory.

Checklist Results (14 verifications)

# Check Result
1 PR body matches scope Pass
2 Epic #100 scope — PR 1 only Pass (only copy + hero CTA + install-global)
3 3 files, ~+94/-11 Pass (exact: +94 / -11, 3 files)
4 Hero copy (eyebrow, H1, tagline, subhead, CTA block, install cmd, caveat) Mostly pass — see B1 below
5 CSS correctness (.hero__cta, .cta*, var(--ink), no gradients, specific transitions) Pass — new .cta rule uses transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease (not all)
6 #install-global step — tradeoff, ~/.apexstack, &gt;&gt; entity Pass
7 README hero (forge framing, swap-the-AI line, gstacks attribution) Pass
8 README global-install section after single-project Pass (lines 152–167, plain markdown fences, no HTML entities)
9 CLAUDE.md title + first paragraph Pass (title is now # ApexStack -- A Multi-Project Forge for Claude Code)
10 Verification greps FAIL — see B1
11 Scope discipline (no .claude/, roles/, workflows/, commands page, shell JS) Pass
12 Glossary in PR body Pass (7 terms: forge, ops repo, shared memory, default driver, aha moment, hero__cta, global install)
13 Objection handling ("Claude-specific" + "opinionated") Pass (both addressed in subhead line 945)
14 Accessibility (<h1> present, semantic text on star button, dark-mode var flip, reduced-motion untouched) Pass — --ink/--paper flip cleanly in the @media (prefers-color-scheme: dark) block at line 48

Blockers

B1 — Stale "opinionated stack for Claude Code" in <title> and meta description

The PR's whole premise is killing the old tagline, and the PR's own test plan includes:

grep -n \"opinionated stack for Claude Code\" site/index.html README.md CLAUDE.md — should return zero hits

That grep currently hits once on site/index.html:6:

<title>ApexStack — an opinionated stack for Claude Code</title>
<meta name=\"description\" content=\"ApexStack packages roles, workflows, hooks, agents, slash commands, and CI pipelines into one drop-in stack for Claude Code. Open source. Plain markdown. No lock-in.\">

Both the <title> (line 6) and the <meta name=\"description\"> (line 7) still carry the exact positioning this PR is replacing. These are the first things shown in browser tabs, search engine results, and social cards — arguably higher-leverage than the H1. Please update both to match the new forge framing, e.g.:

  • <title>ApexStack — where projects get forged</title>
  • meta description along the lines of: "The multi-project ops repo where your projects reference each other, learn from shared experience, and ship production-ready under a strict SDLC."

Suggestions (non-blocking)

S1 — README line 9 and site hero both say "Swap the AI. Keep the forge." but CLAUDE.md doesn't carry that line. The spec only required site + README, so this is fine — just noting in case you want a third hit for the forge messaging to land in the file Claude itself reads first.

S2.cta--ghost has border: none and padding: 0.85rem 0.25rem, which lines it up with the star button visually. On narrow screens where .hero__cta wraps (the flex-wrap: wrap kicks in), the separator dot (.cta__sep) sits on a line by itself and looks slightly orphaned. Not worth a fix now — just flagging so we can consider display: none on the sep below a breakpoint in a future pass.

S3 — The install caveat (line 961) now reads "Five more steps in install below" but the install-global article is the 7th step. Accurate, but a first-time reader counting steps in the install section might be briefly confused about whether "five more steps" includes global-install or not. Minor.

Verdict

CHANGES REQUESTED — B1 is a direct contradiction of the PR's own objective and its own test plan. Fix the <title> and <meta description>, push, and re-request review. Everything else is solid and ready to ship.


Reviewed by Rex (Code Reviewer Agent)
Reviewed commit: b50b20ef59661db8b7e189bcc183987f480b6467

Per house rules, only the CEO approves — this is a comment review, not an approval.

Address Rex's review on PR #4 commit b50b20e:

B1 (blocker) — Page title and meta description still said "an
opinionated stack for Claude Code" and "one drop-in stack for
Claude Code". These are the highest-leverage strings in the file
(browser tabs, search results, social cards) and they directly
contradicted the rest of the PR. Replaced with the forge framing:

  <title>ApexStack — where projects get forged</title>
  <meta description="... a multi-project ops repo where your
  projects reference each other, learn from shared experience,
  and ship production-ready under a strict SDLC. Built for
  founders running 2–5 products at once. Open source. Claude
  Code native, but plain markdown underneath.">

S2 (non-blocking) — On narrow screens where .hero__cta wraps,
the `·` separator could orphan onto its own line. Added
@media (max-width: 520px) { .cta__sep { display: none; } }
so the two CTAs stack cleanly on mobile.

S3 (non-blocking) — Hero caveat said "Five more steps in install
below" but the install section now has 6 per-ops-repo steps plus
the single-project opt-out and the new global-install alternative.
Rephrased to "Full walkthrough in install below" so the copy is
count-agnostic.

S1 (skipped) — Rex noted CLAUDE.md doesn't carry "Swap the AI.
Keep the forge." but also explicitly said the spec only required
the line in site + README, so leaving CLAUDE.md's operational
tone intact.

Refs me2resh/apexscript-org#100

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

@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.

Re-Review: PR #4 (delta on fix-up commit)

Reviewed commit: 714e8c3 (previous review was on b50b20e)
Diff stat: 1 file changed, +6/-3 — site/index.html only. Matches expected scope.

Previous notes — status

Note Severity Status
B1<title> and <meta name="description"> still carried old "opinionated stack for Claude Code" / "one drop-in stack for Claude Code" framing blocker FIXED
S2.cta__sep could orphan on narrow screens suggestion FIXED
S3 — "Five more steps in install below" was count-wrong suggestion FIXED
S1CLAUDE.md missing "Swap the AI. Keep the forge." tagline suggestion (skip) Correctly left alone — no diff in CLAUDE.md

Verification

B1site/index.html:6-7:

  • Title now: ApexStack — where projects get forged
  • Meta description now mentions multi-project, reference each other, strict SDLC, forge, founders, 2–5 products. Exactly the forge framing.

S2site/index.html:344-346:

@media (max-width: 520px) {
  .cta__sep { display: none; }
}

Clean, scoped fix. Separator hides below 520px so .hero__cta can wrap without the orphan ·.

S3site/index.html:964:

  • Old: "Five more steps in install below"
  • New: "Full walkthrough in install below"
  • Links to #install and #install-global both still intact.

Grep verification suite (all pass)

Check Expected Actual
"opinionated stack for Claude Code" across site/README/CLAUDE.md 0 0
"one drop-in stack for Claude Code" in site 0 0
"AI-Native Development Stack" in CLAUDE.md 0 0
"Where projects get forged" in site + README ≥ 2 2
"Five more steps" in site 0 0

No regressions

  • Hero H1 / tagline / subhead intact
  • .hero__cta block with star + install-link CTAs intact (line 951)
  • Install command still git clone … .apexstack (not ~/.apexstack) in hero (line 959)
  • #install-global alternative step intact (line 1433)
  • README.md and CLAUDE.md unchanged between b50b20e..714e8c3

New issues introduced

None. The fix-up is tightly scoped to exactly the three things that needed fixing.

Checklist

  • Architecture & DDD: N/A (docs/marketing-site only)
  • Code Quality: Pass
  • Testing: N/A (static HTML + copy)
  • Security: Pass
  • Performance: Pass
  • PR Description & Glossary: Pass (from prior review)
  • AgDR: N/A — copy/CSS fix-up, no technical decisions

Verdict

COMMENT — ready for CEO approval

All three blocker/suggestion items from the prior review are fixed. No regressions. Scope is exactly what was promised. Deferring final sign-off to the CEO per two-review rule.


Reviewed by Rex (Code Reviewer Agent)
Reviewed commit: 714e8c3

…tagline

CEO feedback on the live site at b50b20e:
- Missed the flickering "_" cursor on the old H1 — the three-word
  H1 ("Where projects get forged.") also overflowed the hero
  width because .hero__title has white-space: nowrap; overflow:
  hidden; and was clipping at ~"projects" on a standard laptop
- Forge statement belongs in the subheading, not the H1

Changes:
- H1 reverts to "apexstack" (was "Where projects get forged.").
  The .hero__title::after pseudo-element already appends a "_"
  and animates it via the blink keyframe, so the flicker comes
  back for free.
- Tagline becomes "Where projects get forged." — the forge
  statement now sits in the visually-prominent subheading slot
  right under the H1.
- .hero__tagline font-size bumped from clamp(1rem, 1.6vw, 1.25rem)
  to clamp(1.5rem, 3vw, 2.5rem) so a 4-word punchy statement
  carries visual weight. Also font-weight 500 → 600, line-height
  1.5 → 1.25, and a small negative letter-spacing for the
  display-style treatment.
- Sub paragraph absorbs the previous tagline content merged
  with the existing subhead — one longer descriptive paragraph
  covering the multi-project promise, the forge framing, and
  the Claude-Code lock-in objection.

Typography hierarchy is now:
- H1 (huge, monospace, with blinking cursor) — brand mark
- Tagline (display-size, punchy) — the one-line promise
- Sub (body-size, descriptive) — the multi-paragraph pitch

Refs me2resh/apexscript-org#100

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

@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 (Round 3): PR #4

Commit: cf5fcba7e4c4859815efdcfd1e70331e20e9edd8

Summary

Third pass: the CEO caught that the previous Where projects get forged. H1 was overflowing the hero (the .hero__title has white-space: nowrap; overflow: hidden; which clipped "projects") and also missed the _ flicker that the original apexstack H1 had. This commit reverts the H1 to apexstack (reinstating the blinking underscore for free via .hero__title::after) and promotes the forge statement into the tagline slot, with the tagline font-size bumped so the promise still reads loud. Tight, surgical fix.

Verification against the 8 checks

# Check Result
1 Diff is 1 file, ~+7/-6 PASS — site/index.html only, +7/-6 exactly
2 H1 reverted to apexstack, ::after flicker + reduced-motion override intact PASS — line 942 H1, lines 230-234 ::after with content: '_', color: var(--accent), blink 1.1s steps(1,end) infinite, @keyframes blink at 236, reduced-motion override at 883
3 Tagline = "Where projects get forged.", sub absorbs old tagline + old sub PASS — tagline at 944-946, sub at 948-950 mentions multi-project / reference each other / shared experience / strict SDLC / forge inside / one ops repo / every product / shared memory / strict gates / production-ready MVPs / Claude Code / swap the AI / keep the forge
4 .hero__tagline font bumped PASS — clamp(1.5rem, 3vw, 2.5rem) / 600 / 1.25 / letter-spacing: -0.015em (lines 238-246). No other CSS touched
5 No regressions to prior fixes PASS — <title> still ApexStack — where projects get forged (line 6), meta description forge framing intact (line 7), .cta__sep mobile hide at 345-347, caveat reads "Full walkthrough in install below" (line 965), install command git clone … .apexstack (line 960, NOT ~/.apexstack), #install-global section at line 1434, README.md and CLAUDE.md untouched vs 714e8c3
6 Visual hierarchy sane PASS — H1 clamp(3.5rem, 12vw, 11rem) > tagline clamp(1.5rem, 3vw, 2.5rem) > sub 14px. Top-down: brand → promise → detail
7 H1 width safe PASS — apexstack is 9 chars, no overflow risk at 11rem max even on narrow viewports. The intentional white-space: nowrap; overflow: hidden; on .hero__title is the right guard for a brand mark of fixed length
8 Grep suite PASS — >apexstack< hits at line 916 (titlebar path ~/apexstack) and line 942 (H1), exactly as expected. hero__title rise rise-2">apexstack hits once at 942. white-space: nowrap still on .hero__title at 227. Where projects get forged hits the tagline at line 945, and case-insensitively also the lowercase <title> at line 6 (the B1 fix)

Checklist Results

  • Architecture & DDD: N/A (content only)
  • Code Quality: PASS
  • Testing: N/A (static HTML)
  • Security: PASS (no new script, no user input)
  • Performance: PASS (one CSS block tweaked, no new assets)
  • PR Description & Glossary: PASS (from previous rounds, unchanged)
  • Technical Decisions (AgDR): N/A (visual/copy fix, not a technical decision)

Issues Found

None. This is a clean fix-up that:

  1. Restores the blinking underscore brand mark (the CEO's aesthetic signature)
  2. Eliminates the overflow-clipping bug introduced when the tagline text was promoted to H1
  3. Keeps the "where projects get forged" promise prominent by moving it to a bumped-up tagline
  4. Preserves every previous B/S fix from rounds 1 and 2

Suggestions

None blocking. Optional future polish (not for this PR):

  • Consider text-wrap: balance on .hero__tagline so "Where projects get forged." never leaves a single orphan word on narrow viewports — it's already short enough that it's unlikely to break badly, but balance is free insurance.

Verdict

COMMENT — all 8 verification checks pass. No regressions. No new blockers. Ready for CEO final approval. I do not self-approve.


Reviewed by Rex (Code Reviewer Agent)
Reviewed commit: cf5fcba7e4c4859815efdcfd1e70331e20e9edd8

@atlas-apex atlas-apex merged commit 1ea63b6 into main Apr 9, 2026
@atlas-apex atlas-apex deleted the docs/GH-100-positioning-rewrite branch April 9, 2026 02:21
atlas-apex pushed a commit that referenced this pull request Apr 9, 2026
Two strategic direction changes from the CEO rolled into one PR
because they're deeply coupled — removing single-project mode
changes the install flow, and the fork-first install changes
every doc that talked about cloning into .apexstack/.

1. Drop single-project mode entirely
---------------------------------------
Single-project mode was a dual-mode compromise that added
complexity without matching how apexstack is actually used.
The audit found every skill had a mode branch that was never
exercised in practice. Users who thought they only had one repo
almost always ended up with two within a few months.

- onboarding.yaml: removed the apexstack.mode field + the
  multi-paragraph mode explainer
- apexstack.projects.yaml.example: rewritten header comment to
  lead with "no single-project fallback mode; register your one
  repo and the skills work the same"
- CLAUDE.md: OPERATING MODE section replaced with PORTFOLIO MODEL
  section explaining the fork-as-ops-repo mental model. SETUP
  section dropped the "read apexstack.mode" step.
- docs/multi-project.md: full rewrite as the canonical setup
  guide. Removed the TL;DR comparison table, the "when to switch
  to single-project" section, the "migrating from single → multi"
  section, the "going back: multi → single" section, and every
  trade-off framed against single-project.
- 8 skill files (handover, idea, inbox, projects, roadmap,
  stakeholder-update, status, tasks): dropped every mode detection
  block (grep onboarding.yaml for mode:), dropped every
  mode-comparison table, simplified scope statements to "iterates
  the registry" or equivalent. Dead code removed.
- workspace/README.md, projects/README.md: removed the "two
  modes" sections, simplified to describe the single portfolio
  pattern.
- README.md: removed the Operating modes table + the
  Single-project install (opt-out) section + the Global install
  (alternative) section (see item 2 for why the global install
  is gone).
- site/index.html: removed the "Operating modes (single &
  multi-project)" hero metric, updated the layers section lede,
  removed every single-project mention in Layer 05, removed the
  "opt-out — single-project mode" install step, removed the
  "alternative — global install" install step.

The only remaining "single-project" strings in the codebase are
TWO intentional negation disclaimers (in docs/multi-project.md
and site/index.html Layer 05) that tell anyone searching for the
concept: "there is no single-project fallback". That's a feature,
not a bug.

2. Fork-first install (replaces clone-into-.apexstack/)
--------------------------------------------------------
The old install model cloned apexstack into a hidden .apexstack/
subdirectory of a separate ops repo, then symlinked .claude/ up
one level. Three problems:

  a. Brand invisibility — .apexstack/ is a dotfile, hidden from
     ls and GitHub views. Nobody knew you were using apexstack.
  b. Two repos to maintain — your ops repo plus the nested clone.
  c. Symlink fragility — the .claude/ symlink broke on dotfile
     sync tools and Windows setups.

New model: your ops repo IS a fork of apexstack. One repo, no
nesting, no symlinks. Upgrades flow via `git fetch upstream &&
git merge upstream/main` — the standard fork workflow.

Per the CEO's call, users can rename the fork to your-org/ops
or keep it as your-org/apexstack. GitHub handles the rename
cleanly. The install docs describe the rename as optional.

- Hero install block: "git clone ... .apexstack" →
  "gh repo fork me2resh/apexstack --clone"
- Hero CTA: "★ Star on GitHub" →
  "★ Star · ⑂ Fork on GitHub" (single button, per Q3.c)
- Hero install caveat: rewrote to explain "the fork IS your ops
  repo, no nested installs, no symlinks"
- SECTION 05 / INSTALL: full rewrite. 6 steps became 5. The 5
  steps are: star+fork, add upstream remote, configure
  onboarding.yaml, create the registry, start working. The old
  "symlink runnable layer" step is gone (no symlink needed). The
  old "wire CLAUDE.md with @-import" step is gone (CLAUDE.md is
  already at the fork root).
- README.md Quick Start: same 5-step rewrite, matched to the
  site flow.
- docs/multi-project.md: complete rewrite as a setup guide
  covering the fork flow, directory layout, daily workflow,
  upgrade path (git pull upstream), trade-offs, and FAQ. ~314
  lines, honest about the pros and cons.

Side effects (positive)
-----------------------
- Layers section UX bug from the earlier screenshot is gone.
  Layer 05 no longer has "content only fills left 1/3" — added a
  new .layer--wide CSS variant with a 2-column internal grid
  (description on the left, registry file list on the right).
  Fills the full width naturally.
- Hero metric #4 changed from "2 Operating modes" to "1 Fork ·
  your ops repo in one command" — celebrates the simplification
  instead of the dropped complexity.

Not in scope
------------
- The lifecycle demo script in the hero is untouched
  (it doesn't reference install or mode)
- Role files in roles/ are untouched (no mode refs)
- Workflow files (sdlc, code-review, deployment) are untouched
  (no mode refs)
- .claude/agents/ are untouched (no mode refs)
- Hooks in .claude/hooks/ are untouched (no mode refs)
- The apexstack.mode field in the existing onboarding.yaml.example
  — this is the site's own onboarding.yaml which gets removed
  with the mode config

Verification
------------
  grep -rn "single-project" --include="*.md" --include="*.yaml" \
    --include="*.html" --include="*.sh"
  → 2 hits, both intentional negation disclaimers

  grep -rn "mode:" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → 0 hits

  grep -rn "\.apexstack/" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → only in docs/multi-project.md explaining why the old pattern
    was dropped (historical context paragraph)

Multi-project neutrality
------------------------
  grep -iE "flat-?mate|curios|sharp ?pick|movetwo|yumyum" \
    on all 16 changed files
  → 0 hits

Refs me2resh/apexscript-org#100

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
atlas-apex added a commit that referenced this pull request Apr 9, 2026
* refactor(#100): multi-project only + fork-first install

Two strategic direction changes from the CEO rolled into one PR
because they're deeply coupled — removing single-project mode
changes the install flow, and the fork-first install changes
every doc that talked about cloning into .apexstack/.

1. Drop single-project mode entirely
---------------------------------------
Single-project mode was a dual-mode compromise that added
complexity without matching how apexstack is actually used.
The audit found every skill had a mode branch that was never
exercised in practice. Users who thought they only had one repo
almost always ended up with two within a few months.

- onboarding.yaml: removed the apexstack.mode field + the
  multi-paragraph mode explainer
- apexstack.projects.yaml.example: rewritten header comment to
  lead with "no single-project fallback mode; register your one
  repo and the skills work the same"
- CLAUDE.md: OPERATING MODE section replaced with PORTFOLIO MODEL
  section explaining the fork-as-ops-repo mental model. SETUP
  section dropped the "read apexstack.mode" step.
- docs/multi-project.md: full rewrite as the canonical setup
  guide. Removed the TL;DR comparison table, the "when to switch
  to single-project" section, the "migrating from single → multi"
  section, the "going back: multi → single" section, and every
  trade-off framed against single-project.
- 8 skill files (handover, idea, inbox, projects, roadmap,
  stakeholder-update, status, tasks): dropped every mode detection
  block (grep onboarding.yaml for mode:), dropped every
  mode-comparison table, simplified scope statements to "iterates
  the registry" or equivalent. Dead code removed.
- workspace/README.md, projects/README.md: removed the "two
  modes" sections, simplified to describe the single portfolio
  pattern.
- README.md: removed the Operating modes table + the
  Single-project install (opt-out) section + the Global install
  (alternative) section (see item 2 for why the global install
  is gone).
- site/index.html: removed the "Operating modes (single &
  multi-project)" hero metric, updated the layers section lede,
  removed every single-project mention in Layer 05, removed the
  "opt-out — single-project mode" install step, removed the
  "alternative — global install" install step.

The only remaining "single-project" strings in the codebase are
TWO intentional negation disclaimers (in docs/multi-project.md
and site/index.html Layer 05) that tell anyone searching for the
concept: "there is no single-project fallback". That's a feature,
not a bug.

2. Fork-first install (replaces clone-into-.apexstack/)
--------------------------------------------------------
The old install model cloned apexstack into a hidden .apexstack/
subdirectory of a separate ops repo, then symlinked .claude/ up
one level. Three problems:

  a. Brand invisibility — .apexstack/ is a dotfile, hidden from
     ls and GitHub views. Nobody knew you were using apexstack.
  b. Two repos to maintain — your ops repo plus the nested clone.
  c. Symlink fragility — the .claude/ symlink broke on dotfile
     sync tools and Windows setups.

New model: your ops repo IS a fork of apexstack. One repo, no
nesting, no symlinks. Upgrades flow via `git fetch upstream &&
git merge upstream/main` — the standard fork workflow.

Per the CEO's call, users can rename the fork to your-org/ops
or keep it as your-org/apexstack. GitHub handles the rename
cleanly. The install docs describe the rename as optional.

- Hero install block: "git clone ... .apexstack" →
  "gh repo fork me2resh/apexstack --clone"
- Hero CTA: "★ Star on GitHub" →
  "★ Star · ⑂ Fork on GitHub" (single button, per Q3.c)
- Hero install caveat: rewrote to explain "the fork IS your ops
  repo, no nested installs, no symlinks"
- SECTION 05 / INSTALL: full rewrite. 6 steps became 5. The 5
  steps are: star+fork, add upstream remote, configure
  onboarding.yaml, create the registry, start working. The old
  "symlink runnable layer" step is gone (no symlink needed). The
  old "wire CLAUDE.md with @-import" step is gone (CLAUDE.md is
  already at the fork root).
- README.md Quick Start: same 5-step rewrite, matched to the
  site flow.
- docs/multi-project.md: complete rewrite as a setup guide
  covering the fork flow, directory layout, daily workflow,
  upgrade path (git pull upstream), trade-offs, and FAQ. ~314
  lines, honest about the pros and cons.

Side effects (positive)
-----------------------
- Layers section UX bug from the earlier screenshot is gone.
  Layer 05 no longer has "content only fills left 1/3" — added a
  new .layer--wide CSS variant with a 2-column internal grid
  (description on the left, registry file list on the right).
  Fills the full width naturally.
- Hero metric #4 changed from "2 Operating modes" to "1 Fork ·
  your ops repo in one command" — celebrates the simplification
  instead of the dropped complexity.

Not in scope
------------
- The lifecycle demo script in the hero is untouched
  (it doesn't reference install or mode)
- Role files in roles/ are untouched (no mode refs)
- Workflow files (sdlc, code-review, deployment) are untouched
  (no mode refs)
- .claude/agents/ are untouched (no mode refs)
- Hooks in .claude/hooks/ are untouched (no mode refs)
- The apexstack.mode field in the existing onboarding.yaml.example
  — this is the site's own onboarding.yaml which gets removed
  with the mode config

Verification
------------
  grep -rn "single-project" --include="*.md" --include="*.yaml" \
    --include="*.html" --include="*.sh"
  → 2 hits, both intentional negation disclaimers

  grep -rn "mode:" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → 0 hits

  grep -rn "\.apexstack/" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → only in docs/multi-project.md explaining why the old pattern
    was dropped (historical context paragraph)

Multi-project neutrality
------------------------
  grep -iE "flat-?mate|curios|sharp ?pick|movetwo|yumyum" \
    on all 16 changed files
  → 0 hits

Refs me2resh/apexscript-org#100

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

* refactor(#100): address Rex review — blockers + CTA contradiction + doc fork

Rex's delta review on a44b706 found 4 blockers + 1 site CTA
contradiction + a few vestigial mentions. Plus the deeper grep
I ran caught two more: a stale .apexstack/ example in
golden-paths/pipelines/README.md, and docs/getting-started.md
still documenting the old .apexstack/ + symlink flow.

Blockers fixed
--------------
- B1: idea/SKILL.md rule 5 "Mode-aware — detect apexstack.mode"
      → "Single backlog — every idea goes into
         projects/ideas-backlog.md"
- B2: roadmap/SKILL.md rule 6 "Mode-aware — ROADMAP.md or
      projects/<name>/roadmap.md"
      → "One roadmap per project — always write to
         projects/<name>/roadmap.md"
- B3: status/SKILL.md had a "## Multi-project mode" section and
      a "Single-project mode default:" output format header.
      Renamed to "## Portfolio output" and "## Output format
      (one-project view with --project <name>)". No behaviour
      change — just language that doesn't frame /status as
      mode-switching.

Non-blocking suggestions fixed
------------------------------
- S1 (site CTA contradiction): index.html:1732 final CTA was
      "one git clone, one symlink, and one config file away"
      → "one fork, one clone, and one config file away". The
      old line directly contradicted the "no symlinks" story.
- S3 (CLAUDE.md QUICK REFERENCE):
  - "Project registry (multi-project)" → "Portfolio registry"
  - "Per-project docs (multi-project)" → "Per-project docs"
  - "Live working copies (multi-project)" → "Live working
    copies (gitignored)"
  - "Multi-project guide" → "Full setup guide"

Also cleaned up while I was in there
------------------------------------
- inbox/SKILL.md rule 3: "Multi-project mode iterates the
  registry" → "Registry-scoped — only projects listed in
  apexstack.projects.yaml count"
- projects/SKILL.md error row: "Multi-project mode but no
  apexstack.projects.yaml" → "No apexstack.projects.yaml at
  the ops-repo root"
- projects/README.md directory layout: "ideas-backlog.md
  (multi-project mode)" → just "shared ideas backlog"

Out-of-scope but too tangled to leave
-------------------------------------
- golden-paths/pipelines/README.md: `cp` examples pointed at
  `.apexstack/golden-paths/...` as if apexstack were still a
  nested clone. Rewrote to "copy from ~/apexstack (your fork)
  to your managed project's .github/workflows/". Not strictly
  within the mode-removal scope but the README is now
  self-consistent with the fork-first install.
- docs/getting-started.md: rewrote Step 1 and Step 3 to match
  the new fork flow. Was still documenting the old .apexstack/
  + submodule + @.apexstack/CLAUDE.md @-import pattern —
  guaranteed to confuse a new adopter. Keeps parity with
  docs/multi-project.md and the site install section.

Verification
------------
  grep -rin "single-project" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → 2 hits, both intentional negation disclaimers in
    docs/multi-project.md:5 and site/index.html:1367

  grep -rn "apexstack.mode\|mode: multi-project\|mode: single-project\|Mode-aware" \
    --include="*.md" --include="*.yaml" --include="*.html"
  → 0 hits

  grep -rn "\.apexstack/" --include="*.md" --include="*.html"
  → only in docs/multi-project.md historical context paragraph
    (explaining why the old pattern was dropped) and README.md
    negation disclaimer ("no .apexstack/ symlinks")

Refs me2resh/apexscript-org#100

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

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
atlas-apex pushed a commit that referenced this pull request Apr 9, 2026
Closes the last sub-task of the apexstack positioning epic (#100).
The Explore agent audit flagged specific gaps in both skills; these
were deferred through PRs #4-#8 because they're independent of the
positioning work. Now fixed.

/handover — 3 gaps closed
-------------------------

1. **Auto-append to the portfolio registry** (was the CRITICAL gap
   from the audit). Previously the skill printed a YAML snippet
   and told the user "add this to apexstack.projects.yaml". Users
   forgot, or miscopied, or broke the YAML indentation.

   Fix: new step 6 prompts the user `Ready to add {name} to
   apexstack.projects.yaml? (y/n)`. On y, the skill:
   - Locates the registry at the ops-repo root (creates from
     .example if missing, with a warning)
   - Appends the entry via `yq` if available, otherwise plain-text
     append with careful indentation
   - Validates the result by parsing the YAML (yq or python yaml)
   - Rolls back on failure (never leaves the registry broken)
   - Confirms the append to the user with the derived roles list

   On n, prints the snippet for manual copy-paste and continues
   without writing.

2. **Dynamic "Next Steps"** derived from the risks found. The
   old template had generic placeholders like `{first concrete
   action — usually "run /audit-deps and triage criticals"}`
   which was embarrassing to ship.

   New behaviour: a mapping table in the skill spec defines the
   derivation. Examples:
   - CVEs detected → `/audit-deps {name} — triage the {severity}
     {package} CVE before any new feature work`
   - Failing tests → `Fix the {N} failing tests in {module}
     before merging new PRs`
   - No observability → `/decide on observability ({top 2 options
     for this stack})`
   - Stale CI → `Re-enable CI — copy in golden-paths/pipelines/ci.yml`
   - Coverage unknown → `Set up test coverage reporting`
   - Backlog > 10 → `Triage the issue backlog with previous owner`
   - Missing README → `Write a minimum-viable README`

3. **Post-handover checklist** added to the assessment template,
   also dynamically tailored to the risks found. Items like "close
   {top risk} before the first feature PR", "add {name} to weekly
   /stakeholder-update rollup", "set up a coverage baseline".

Bonus gap closed: **derive the role list dynamically** from the
tech stack + CI config + security surface, instead of hard-coding
`[tech-lead, backend-engineer]`. Mapping table in the spec:
- backend deps → backend-engineer
- UI code → frontend-engineer
- CI config → platform-engineer
- deployment evidence → sre
- auth/crypto/secrets → security-auditor
- always → tech-lead

A typical handover ends up with 3-5 roles in the registry entry.

/idea — 3 gaps closed + 1 numbering bug fixed
----------------------------------------------

1. **Input validation for category**. The old step 2 asked for
   category but silently accepted anything. A user who typed
   `foo` got `Category: foo` in the backlog.

   Fix: the prompt now explicitly lists 1/2/3/4, accepts either
   the number or the word (case-insensitive), and **re-prompts
   on invalid input** with `Please pick 1-4 or type the category
   name.` Loops until valid.

   Same treatment for the description field — re-prompt if empty.

2. **Dedup check before appending** (new step 3). Prevents
   submitting the same idea twice.

   Implementation: a simple token-overlap heuristic. Normalise
   both titles (lowercase, strip punctuation), compare with a
   threshold (≥ 80% of the words in the shorter title appear in
   the longer one).

   If a match is found:

     ⚠ Similar idea already in the backlog:
       IDEA-025 — {existing title} (status: {status})

     Is this a duplicate? (y = skip, n = add anyway)

   On y: skip the append, suggest `/write-spec IDEA-025` if the
   user wants to work on the existing idea. On n: continue to
   step 4.

3. **Error handling for `gh issue create`** in step 6. Old
   behaviour: if the tracking issue creation failed, the idea
   was half-saved or the whole thing errored out. New behaviour:

     ⚠ Couldn't create the tracking issue: {reason}
       The idea is still saved in projects/ideas-backlog.md
       as IDEA-NNN.

     Try again? (y = retry, n = skip, gh = show the gh error)

   With a failure-modes table: missing auth scope, label not
   found, rate limit, network error, etc. — each has a specific
   recovery path.

   Guiding principle (now rule #8): **the backlog entry is the
   primary artefact; the tracking issue is a bonus**. Never lose
   the backlog entry because GitHub was flaky.

4. **Section numbering bug** fixed. The old file had steps 1, 2,
   4, 5, 6 — step 3 was missing because an earlier refactor
   deleted it without renumbering. With the new step 3 (dedup
   check) the sequence is now 1, 2, 3, 4, 5, 6 again.

Rules sections updated for both skills
--------------------------------------

- /handover: rule 4 is now "Auto-append to the registry (with
  confirmation)"; rule 5 is "Derive roles from the stack"; rule
  6 is "Derive next steps from the risks"; rule 10 is "Never
  break the registry".
- /idea: rule 6 is "Validate before accepting"; rule 7 is
  "Dedup before appending"; rule 8 is "The backlog is the
  primary artefact".

What's NOT in this commit
-------------------------

- The tabbed terminal animation (#102) — separate ticket,
  not part of the epic closure
- Any changes to the skill frontmatter
- Any changes to the `/handover` assessment output format
  beyond the Next Steps and Post-Handover Checklist sections
- Any changes to `/idea`'s backlog file format or ID scheme

This closes the epic #100. After this merges, apexstack is at
its v0.2 shape: positioning rewritten, lifecycle demo in the
hero, 19 roles wired in, multi-project-only + fork-first install,
and now the /handover and /idea skills that actually work
end-to-end.

Closes me2resh/apexscript-org#101
Closes me2resh/apexscript-org#100

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
atlas-apex added a commit that referenced this pull request Apr 9, 2026
…#9)

Closes the last sub-task of the apexstack positioning epic (#100).
The Explore agent audit flagged specific gaps in both skills; these
were deferred through PRs #4-#8 because they're independent of the
positioning work. Now fixed.

/handover — 3 gaps closed
-------------------------

1. **Auto-append to the portfolio registry** (was the CRITICAL gap
   from the audit). Previously the skill printed a YAML snippet
   and told the user "add this to apexstack.projects.yaml". Users
   forgot, or miscopied, or broke the YAML indentation.

   Fix: new step 6 prompts the user `Ready to add {name} to
   apexstack.projects.yaml? (y/n)`. On y, the skill:
   - Locates the registry at the ops-repo root (creates from
     .example if missing, with a warning)
   - Appends the entry via `yq` if available, otherwise plain-text
     append with careful indentation
   - Validates the result by parsing the YAML (yq or python yaml)
   - Rolls back on failure (never leaves the registry broken)
   - Confirms the append to the user with the derived roles list

   On n, prints the snippet for manual copy-paste and continues
   without writing.

2. **Dynamic "Next Steps"** derived from the risks found. The
   old template had generic placeholders like `{first concrete
   action — usually "run /audit-deps and triage criticals"}`
   which was embarrassing to ship.

   New behaviour: a mapping table in the skill spec defines the
   derivation. Examples:
   - CVEs detected → `/audit-deps {name} — triage the {severity}
     {package} CVE before any new feature work`
   - Failing tests → `Fix the {N} failing tests in {module}
     before merging new PRs`
   - No observability → `/decide on observability ({top 2 options
     for this stack})`
   - Stale CI → `Re-enable CI — copy in golden-paths/pipelines/ci.yml`
   - Coverage unknown → `Set up test coverage reporting`
   - Backlog > 10 → `Triage the issue backlog with previous owner`
   - Missing README → `Write a minimum-viable README`

3. **Post-handover checklist** added to the assessment template,
   also dynamically tailored to the risks found. Items like "close
   {top risk} before the first feature PR", "add {name} to weekly
   /stakeholder-update rollup", "set up a coverage baseline".

Bonus gap closed: **derive the role list dynamically** from the
tech stack + CI config + security surface, instead of hard-coding
`[tech-lead, backend-engineer]`. Mapping table in the spec:
- backend deps → backend-engineer
- UI code → frontend-engineer
- CI config → platform-engineer
- deployment evidence → sre
- auth/crypto/secrets → security-auditor
- always → tech-lead

A typical handover ends up with 3-5 roles in the registry entry.

/idea — 3 gaps closed + 1 numbering bug fixed
----------------------------------------------

1. **Input validation for category**. The old step 2 asked for
   category but silently accepted anything. A user who typed
   `foo` got `Category: foo` in the backlog.

   Fix: the prompt now explicitly lists 1/2/3/4, accepts either
   the number or the word (case-insensitive), and **re-prompts
   on invalid input** with `Please pick 1-4 or type the category
   name.` Loops until valid.

   Same treatment for the description field — re-prompt if empty.

2. **Dedup check before appending** (new step 3). Prevents
   submitting the same idea twice.

   Implementation: a simple token-overlap heuristic. Normalise
   both titles (lowercase, strip punctuation), compare with a
   threshold (≥ 80% of the words in the shorter title appear in
   the longer one).

   If a match is found:

     ⚠ Similar idea already in the backlog:
       IDEA-025 — {existing title} (status: {status})

     Is this a duplicate? (y = skip, n = add anyway)

   On y: skip the append, suggest `/write-spec IDEA-025` if the
   user wants to work on the existing idea. On n: continue to
   step 4.

3. **Error handling for `gh issue create`** in step 6. Old
   behaviour: if the tracking issue creation failed, the idea
   was half-saved or the whole thing errored out. New behaviour:

     ⚠ Couldn't create the tracking issue: {reason}
       The idea is still saved in projects/ideas-backlog.md
       as IDEA-NNN.

     Try again? (y = retry, n = skip, gh = show the gh error)

   With a failure-modes table: missing auth scope, label not
   found, rate limit, network error, etc. — each has a specific
   recovery path.

   Guiding principle (now rule #8): **the backlog entry is the
   primary artefact; the tracking issue is a bonus**. Never lose
   the backlog entry because GitHub was flaky.

4. **Section numbering bug** fixed. The old file had steps 1, 2,
   4, 5, 6 — step 3 was missing because an earlier refactor
   deleted it without renumbering. With the new step 3 (dedup
   check) the sequence is now 1, 2, 3, 4, 5, 6 again.

Rules sections updated for both skills
--------------------------------------

- /handover: rule 4 is now "Auto-append to the registry (with
  confirmation)"; rule 5 is "Derive roles from the stack"; rule
  6 is "Derive next steps from the risks"; rule 10 is "Never
  break the registry".
- /idea: rule 6 is "Validate before accepting"; rule 7 is
  "Dedup before appending"; rule 8 is "The backlog is the
  primary artefact".

What's NOT in this commit
-------------------------

- The tabbed terminal animation (#102) — separate ticket,
  not part of the epic closure
- Any changes to the skill frontmatter
- Any changes to the `/handover` assessment output format
  beyond the Next Steps and Post-Handover Checklist sections
- Any changes to `/idea`'s backlog file format or ID scheme

This closes the epic #100. After this merges, apexstack is at
its v0.2 shape: positioning rewritten, lifecycle demo in the
hero, 19 roles wired in, multi-project-only + fork-first install,
and now the /handover and /idea skills that actually work
end-to-end.

Closes me2resh/apexscript-org#101
Closes me2resh/apexscript-org#100

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@iamB0ody

Copy link
Copy Markdown

Closing — hlmna-sys removed from portfolio.

me2resh added a commit that referenced this pull request May 20, 2026
…GES REQUESTED

Rex's review of #344 surfaced a real correctness gap between AgDR-0049's
Decision #4 claim and what the smoke test actually enforces. The leak-scan
is a PATH-scan (catches files at framework-distinctive paths like
_lib-portfolio-paths.sh) but is NOT a CONTENT-scan (doesn't catch SKILL.md
prose mentioning /handover, or _lib-audit-history.sh calling
portfolio_projects_dir). Several extracted files in audit-pack DO carry
such prose references.

Per the operator's chosen path (Rex's option a, honest-scope amend, not
full refactor): acknowledge the limitation in the AgDR + add a "Known
framework references" section to the audit-pack README so adopters know
what they're looking at, while preserving the generated-not-forked
contract (decision #3) that would be contradicted by content-scrubbing.

Changes:

- AgDR-0049 § Decision #4 rewritten — distinguishes path-leak guard
  (mechanically enforced) from content references (deliberate, funnel-
  pointer, graceful-degrade outside an apexyard fork). v2 may revisit if
  adopter friction surfaces.
- marketplace/audit-pack/README.md — new "Known framework references"
  section enumerates the three concrete surfaces Rex found (SKILL.md
  prose hints, _lib-audit-history.sh portfolio_projects_dir fallback,
  broken relative links to upstream docs/agdr/). Frames each as
  intentional + funnel-pointer. Flags v2 as the escape hatch.
- safety-hooks is unaffected — Rex confirmed graceful-degrades correctly.

Smoke test unchanged (path-scan is the right shape for what it catches;
the AgDR amend clarifies what it does and doesn't claim).

Refs #321
atlas-apex added a commit that referenced this pull request May 20, 2026
* feat(#321): scaffold marketplace/audit-pack + safety-hooks layout

- marketplace/audit-pack/ — extracted /launch-check + 8 deep-dive audit
  skills + _lib-audit-history.sh + _lib-read-config.sh + _lib-ops-root.sh
  + AI-crawler registry + 8 audit templates. Includes authored README
  and PLUGIN.json that pitch the full framework as the graduation path.
- marketplace/safety-hooks/ — extracted 7 safety hooks (secrets / main
  push / git-add-all / pre-push / commit-refs / PR-title / branch-name)
  + _lib-tracker.sh (tracker-agnostic) + _lib-read-config.sh +
  _lib-ops-root.sh + _lib-extract-pr.sh + settings.snippet.json showing
  recommended hook wiring. Same funnel-pitching README and PLUGIN.json.
- EXTRACTION_MANIFEST.json in each sub-pack records the upstream SHA
  and file inventory so the "generated, not forked" maintenance
  contract is auditable.
- Strategic intent: a one-way discovery funnel from Claude Code
  marketplace users to full-framework adopters. The two sub-packs are
  genuinely self-contained — no portfolio model, no /handover, no role
  definitions — and pitch the full framework via the README without
  pressuring.

Closes #321

* feat(#321): bin/extract-subpacks.sh + extraction smoke test

- bin/extract-subpacks.sh — idempotent extraction script that copies
  the audit-pack + safety-hooks inventories from upstream HEAD into
  marketplace/<pack>/, writes EXTRACTION_MANIFEST.json with the
  upstream SHA, and supports --dry-run + --manifest-only for CI
  validation. Invokable both locally (operator debugging) and from
  the release-tag CI workflow.
- .claude/hooks/tests/test_subpack_extraction.sh — smoke test that
  (a) runs extraction into a tmp dir, (b) asserts the file inventory
  matches the AgDR-0049 contract for both sub-packs, (c) scans for
  framework-distinctive paths that would indicate a leak
  (apexyard.projects.yaml, _lib-portfolio-paths.sh, /handover skill,
  /agdr skill, role definitions), (d) plants a deliberate leak token
  and asserts the scan catches it (proves the scan does work, not
  just exits 0 silently), and (e) verifies each sub-pack's authored
  marketplace files (PLUGIN.json, README, settings snippet) are
  present at the repo-root marketplace/.

Refs #321

* feat(#321): release-tag extraction CI workflow

- .github/workflows/extract-subpacks-on-release.yml — fires on every
  v* tag push (cut by /release) and on PRs touching extraction-
  relevant files. Runs bin/extract-subpacks.sh, then runs the
  smoke test, then uploads marketplace/ as a build artefact when
  the trigger is a release tag (90-day retention).
- The publish step (push to Claude Code marketplace) remains a
  manual operator concern in v1 — the workflow's job summary lists
  the next steps with the tag name + upstream SHA so the operator
  can take the artefact from the run and push it to the marketplace
  with the right semver.
- Per-PR mode catches contributors who break the extraction
  contract (e.g. an audit skill that adds a portfolio dependency)
  at PR time rather than at release time.

See AgDR-0049 for the rationale on release-tag-driven vs every-PR
auto-publish (the marketplace doesn't want a release per PR; every
WIP commit landing on real users is the wrong shape).

Refs #321

* docs: AgDR-0049 — marketplace sub-packs as framework funnel

Records the strategic + maintenance decisions behind the two
marketplace sub-packs (apexyard/audit-pack and apexyard/safety-hooks):

- Two-sub-pack scope vs alternatives (single mega-plugin, more
  sub-packs in v1, /rex + /migrations sub-packs)
- Generated-not-forked maintenance contract — sub-packs are
  extracted from upstream HEAD at release time, NOT separately
  maintained codebases; the framework stays single source of truth
- Release-tag-driven CI workflow + manual operator publish step
  (release-tag-only in v1; automated publish deferred to v2)
- Funnel direction is one-way (plugin → framework); the README
  pitches but does not pressure
- Performance contract — same files serve both distribution
  channels; the smoke test mechanically asserts no framework-
  distinctive elements (portfolio registry, _lib-portfolio-paths.sh,
  /handover skill, role definitions) leak into the extracted output
- Why /rex and /migrations are deferred — session-state convention
  and migration-ticket dependencies respectively don't survive
  extraction into a drop-in shape without losing the gate's value

Closes #321

* fix: shellcheck SC2064 trap-expansion + markdownlint MD051 link-fragment slugs

Two CI failures on initial #344 push:

1. shellcheck SC2064 in test_subpack_extraction.sh:34 — double-quoted
   trap expanded $TMP_ROOT at definition time rather than signal time.
   Swap inner/outer quoting (single quotes around the trap body, double
   quotes around the variable) so expansion is deferred. Cleanup now
   resolves the correct path even if TMP_ROOT is reassigned later.

2. markdownlint MD051 in both READMEs — link `#graduation-path-the-full-framework`
   doesn't match heading `## Graduation path — the full framework` because
   GFM slug-generation translates ` — ` (em-dash with spaces) to `--`
   (double dash). Swap the em-dash in the heading to a colon: the slug
   becomes `graduation-path-the-full-framework`, matching the existing
   link. Same fix in both audit-pack and safety-hooks READMEs.

Refs #321

* docs: honest-scope amend AgDR-0049 + audit-pack README per Rex's CHANGES REQUESTED

Rex's review of #344 surfaced a real correctness gap between AgDR-0049's
Decision #4 claim and what the smoke test actually enforces. The leak-scan
is a PATH-scan (catches files at framework-distinctive paths like
_lib-portfolio-paths.sh) but is NOT a CONTENT-scan (doesn't catch SKILL.md
prose mentioning /handover, or _lib-audit-history.sh calling
portfolio_projects_dir). Several extracted files in audit-pack DO carry
such prose references.

Per the operator's chosen path (Rex's option a, honest-scope amend, not
full refactor): acknowledge the limitation in the AgDR + add a "Known
framework references" section to the audit-pack README so adopters know
what they're looking at, while preserving the generated-not-forked
contract (decision #3) that would be contradicted by content-scrubbing.

Changes:

- AgDR-0049 § Decision #4 rewritten — distinguishes path-leak guard
  (mechanically enforced) from content references (deliberate, funnel-
  pointer, graceful-degrade outside an apexyard fork). v2 may revisit if
  adopter friction surfaces.
- marketplace/audit-pack/README.md — new "Known framework references"
  section enumerates the three concrete surfaces Rex found (SKILL.md
  prose hints, _lib-audit-history.sh portfolio_projects_dir fallback,
  broken relative links to upstream docs/agdr/). Frames each as
  intentional + funnel-pointer. Flags v2 as the escape hatch.
- safety-hooks is unaffected — Rex confirmed graceful-degrades correctly.

Smoke test unchanged (path-scan is the right shape for what it catches;
the AgDR amend clarifies what it does and doesn't claim).

Refs #321

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
osama-abu-baker pushed a commit to osama-abu-baker/apexyard that referenced this pull request Jun 3, 2026
…e2resh#4)

* docs(me2resh#100): positioning rewrite — "where projects get forged"

Reframes apexstack from "an opinionated stack for Claude Code" to
"a multi-project ops repo where projects get forged." Targets the
solo founder / technical CEO running 2-5 products and drowning in
context-switching.

Hero (site/index.html)
- Eyebrow flips from "plain markdown · zero dependencies" to
  "for founders forging multiple products"
- H1 changes from the brand name ("apexstack") to the value
  prop ("Where projects get forged.")
- New tagline: "The multi-project ops repo where your projects
  reference each other, learn from shared experience, and ship
  production-ready under a strict SDLC."
- New subhead leans into the forge framing: "You don't add
  apexstack to a project — projects get forged inside it. One
  ops repo. Every product. Shared memory. Strict gates.
  Production-ready MVPs." Addresses the Claude-Code-lock-in
  objection head-on: "Claude Code is the default driver, but
  the rules, hooks, and templates are plain markdown and shell.
  Swap the AI. Keep the forge."
- NEW hero CTA block with star-first priority:
  [★ Star on GitHub] · [or install it now ↓]
- Install command fixed from `~/.apexstack` (home dir, broken
  per the audit) to `.apexstack` (per-ops-repo, canonical)
- Caveat rewritten to match and point at both install paths

CSS
- Added .hero__cta, .cta, .cta--primary, .cta--ghost, .cta__sep
  to the existing terminal-brutalism style block. Sharp corners,
  hairline borders, no gradients. Primary CTA goes from ink → accent
  on hover. Ghost CTA is text-only with accent on hover.

Install section (site/index.html SECTION 05)
- Kept the six-step per-ops-repo walkthrough as the canonical
  path
- Kept the single-project opt-out at the bottom
- NEW "alternative — global install" step for users running
  several ops repos (founders with multiple orgs, consultants
  with multiple clients). Documents the tradeoff: symlinks
  use absolute paths, breaks if ~/.apexstack/ moves.
- Hero caveat links to #install-global for the alternative

README.md
- Hero rewritten end-to-end to match the site
- Added "Global install (alternative)" section after the
  single-project opt-out, mirroring the new site step
- gstacks.org attribution reworded to say "for teams running
  more than one product at a time"

CLAUDE.md
- Intro title changed from "AI-Native Development Stack" to
  "A Multi-Project Forge for Claude Code"
- First paragraph expanded with the forge framing and the
  explicit "projects get forged inside it, not added to it"
  phrasing, while keeping the operational instructions
  untouched so the rest of the file still drives Claude
  correctly.

Audience discovery (recorded in the epic issue)
- Primary persona: solo founder / technical CEO juggling
  2-5 products
- Tone: punchy and confident, short sentences, strong verbs
- Forge metaphor: literal
- Conversion: star first, clone second
- Objections addressed: Claude-Code lock-in (explicit),
  opinionated (leaned into — "strict gates" is the point)

NOT in this PR (tracked in the epic)
- Commands sub-page (PR 2)
- Hero shell animation (PR 3, depends on PR 2)
- Roles integration (PR 4 — the audit flagged all 19 roles
  are completely disconnected from workflows/skills/CLAUDE.md
  imports, will fix there)
- /idea and /handover skill polish (PR 5)
- AgDR backfill — explicitly skipped
- Anvil / metalwork SVG iconography — holding off on visual
  changes until the copy is locked

Refs me2resh/apexscript-org#100

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

* docs(me2resh#100): fix page title, meta description, CTA separator, caveat copy

Address Rex's review on PR me2resh#4 commit b50b20e:

B1 (blocker) — Page title and meta description still said "an
opinionated stack for Claude Code" and "one drop-in stack for
Claude Code". These are the highest-leverage strings in the file
(browser tabs, search results, social cards) and they directly
contradicted the rest of the PR. Replaced with the forge framing:

  <title>ApexStack — where projects get forged</title>
  <meta description="... a multi-project ops repo where your
  projects reference each other, learn from shared experience,
  and ship production-ready under a strict SDLC. Built for
  founders running 2–5 products at once. Open source. Claude
  Code native, but plain markdown underneath.">

S2 (non-blocking) — On narrow screens where .hero__cta wraps,
the `·` separator could orphan onto its own line. Added
@media (max-width: 520px) { .cta__sep { display: none; } }
so the two CTAs stack cleanly on mobile.

S3 (non-blocking) — Hero caveat said "Five more steps in install
below" but the install section now has 6 per-ops-repo steps plus
the single-project opt-out and the new global-install alternative.
Rephrased to "Full walkthrough in install below" so the copy is
count-agnostic.

S1 (skipped) — Rex noted CLAUDE.md doesn't carry "Swap the AI.
Keep the forge." but also explicitly said the spec only required
the line in site + README, so leaving CLAUDE.md's operational
tone intact.

Refs me2resh/apexscript-org#100

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

* docs(me2resh#100): revert H1 to "apexstack_" with flicker, promote forge to tagline

CEO feedback on the live site at b50b20e:
- Missed the flickering "_" cursor on the old H1 — the three-word
  H1 ("Where projects get forged.") also overflowed the hero
  width because .hero__title has white-space: nowrap; overflow:
  hidden; and was clipping at ~"projects" on a standard laptop
- Forge statement belongs in the subheading, not the H1

Changes:
- H1 reverts to "apexstack" (was "Where projects get forged.").
  The .hero__title::after pseudo-element already appends a "_"
  and animates it via the blink keyframe, so the flicker comes
  back for free.
- Tagline becomes "Where projects get forged." — the forge
  statement now sits in the visually-prominent subheading slot
  right under the H1.
- .hero__tagline font-size bumped from clamp(1rem, 1.6vw, 1.25rem)
  to clamp(1.5rem, 3vw, 2.5rem) so a 4-word punchy statement
  carries visual weight. Also font-weight 500 → 600, line-height
  1.5 → 1.25, and a small negative letter-spacing for the
  display-style treatment.
- Sub paragraph absorbs the previous tagline content merged
  with the existing subhead — one longer descriptive paragraph
  covering the multi-project promise, the forge framing, and
  the Claude-Code lock-in objection.

Typography hierarchy is now:
- H1 (huge, monospace, with blinking cursor) — brand mark
- Tagline (display-size, punchy) — the one-line promise
- Sub (body-size, descriptive) — the multi-paragraph pitch

Refs me2resh/apexscript-org#100

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

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
osama-abu-baker pushed a commit to osama-abu-baker/apexyard that referenced this pull request Jun 3, 2026
…sh#8)

* refactor(me2resh#100): multi-project only + fork-first install

Two strategic direction changes from the CEO rolled into one PR
because they're deeply coupled — removing single-project mode
changes the install flow, and the fork-first install changes
every doc that talked about cloning into .apexstack/.

1. Drop single-project mode entirely
---------------------------------------
Single-project mode was a dual-mode compromise that added
complexity without matching how apexstack is actually used.
The audit found every skill had a mode branch that was never
exercised in practice. Users who thought they only had one repo
almost always ended up with two within a few months.

- onboarding.yaml: removed the apexstack.mode field + the
  multi-paragraph mode explainer
- apexstack.projects.yaml.example: rewritten header comment to
  lead with "no single-project fallback mode; register your one
  repo and the skills work the same"
- CLAUDE.md: OPERATING MODE section replaced with PORTFOLIO MODEL
  section explaining the fork-as-ops-repo mental model. SETUP
  section dropped the "read apexstack.mode" step.
- docs/multi-project.md: full rewrite as the canonical setup
  guide. Removed the TL;DR comparison table, the "when to switch
  to single-project" section, the "migrating from single → multi"
  section, the "going back: multi → single" section, and every
  trade-off framed against single-project.
- 8 skill files (handover, idea, inbox, projects, roadmap,
  stakeholder-update, status, tasks): dropped every mode detection
  block (grep onboarding.yaml for mode:), dropped every
  mode-comparison table, simplified scope statements to "iterates
  the registry" or equivalent. Dead code removed.
- workspace/README.md, projects/README.md: removed the "two
  modes" sections, simplified to describe the single portfolio
  pattern.
- README.md: removed the Operating modes table + the
  Single-project install (opt-out) section + the Global install
  (alternative) section (see item 2 for why the global install
  is gone).
- site/index.html: removed the "Operating modes (single &
  multi-project)" hero metric, updated the layers section lede,
  removed every single-project mention in Layer 05, removed the
  "opt-out — single-project mode" install step, removed the
  "alternative — global install" install step.

The only remaining "single-project" strings in the codebase are
TWO intentional negation disclaimers (in docs/multi-project.md
and site/index.html Layer 05) that tell anyone searching for the
concept: "there is no single-project fallback". That's a feature,
not a bug.

2. Fork-first install (replaces clone-into-.apexstack/)
--------------------------------------------------------
The old install model cloned apexstack into a hidden .apexstack/
subdirectory of a separate ops repo, then symlinked .claude/ up
one level. Three problems:

  a. Brand invisibility — .apexstack/ is a dotfile, hidden from
     ls and GitHub views. Nobody knew you were using apexstack.
  b. Two repos to maintain — your ops repo plus the nested clone.
  c. Symlink fragility — the .claude/ symlink broke on dotfile
     sync tools and Windows setups.

New model: your ops repo IS a fork of apexstack. One repo, no
nesting, no symlinks. Upgrades flow via `git fetch upstream &&
git merge upstream/main` — the standard fork workflow.

Per the CEO's call, users can rename the fork to your-org/ops
or keep it as your-org/apexstack. GitHub handles the rename
cleanly. The install docs describe the rename as optional.

- Hero install block: "git clone ... .apexstack" →
  "gh repo fork me2resh/apexstack --clone"
- Hero CTA: "★ Star on GitHub" →
  "★ Star · ⑂ Fork on GitHub" (single button, per Q3.c)
- Hero install caveat: rewrote to explain "the fork IS your ops
  repo, no nested installs, no symlinks"
- SECTION 05 / INSTALL: full rewrite. 6 steps became 5. The 5
  steps are: star+fork, add upstream remote, configure
  onboarding.yaml, create the registry, start working. The old
  "symlink runnable layer" step is gone (no symlink needed). The
  old "wire CLAUDE.md with @-import" step is gone (CLAUDE.md is
  already at the fork root).
- README.md Quick Start: same 5-step rewrite, matched to the
  site flow.
- docs/multi-project.md: complete rewrite as a setup guide
  covering the fork flow, directory layout, daily workflow,
  upgrade path (git pull upstream), trade-offs, and FAQ. ~314
  lines, honest about the pros and cons.

Side effects (positive)
-----------------------
- Layers section UX bug from the earlier screenshot is gone.
  Layer 05 no longer has "content only fills left 1/3" — added a
  new .layer--wide CSS variant with a 2-column internal grid
  (description on the left, registry file list on the right).
  Fills the full width naturally.
- Hero metric me2resh#4 changed from "2 Operating modes" to "1 Fork ·
  your ops repo in one command" — celebrates the simplification
  instead of the dropped complexity.

Not in scope
------------
- The lifecycle demo script in the hero is untouched
  (it doesn't reference install or mode)
- Role files in roles/ are untouched (no mode refs)
- Workflow files (sdlc, code-review, deployment) are untouched
  (no mode refs)
- .claude/agents/ are untouched (no mode refs)
- Hooks in .claude/hooks/ are untouched (no mode refs)
- The apexstack.mode field in the existing onboarding.yaml.example
  — this is the site's own onboarding.yaml which gets removed
  with the mode config

Verification
------------
  grep -rn "single-project" --include="*.md" --include="*.yaml" \
    --include="*.html" --include="*.sh"
  → 2 hits, both intentional negation disclaimers

  grep -rn "mode:" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → 0 hits

  grep -rn "\.apexstack/" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → only in docs/multi-project.md explaining why the old pattern
    was dropped (historical context paragraph)

Multi-project neutrality
------------------------
  grep -iE "flat-?mate|curios|sharp ?pick|movetwo|yumyum" \
    on all 16 changed files
  → 0 hits

Refs me2resh/apexscript-org#100

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

* refactor(me2resh#100): address Rex review — blockers + CTA contradiction + doc fork

Rex's delta review on a44b706 found 4 blockers + 1 site CTA
contradiction + a few vestigial mentions. Plus the deeper grep
I ran caught two more: a stale .apexstack/ example in
golden-paths/pipelines/README.md, and docs/getting-started.md
still documenting the old .apexstack/ + symlink flow.

Blockers fixed
--------------
- B1: idea/SKILL.md rule 5 "Mode-aware — detect apexstack.mode"
      → "Single backlog — every idea goes into
         projects/ideas-backlog.md"
- B2: roadmap/SKILL.md rule 6 "Mode-aware — ROADMAP.md or
      projects/<name>/roadmap.md"
      → "One roadmap per project — always write to
         projects/<name>/roadmap.md"
- B3: status/SKILL.md had a "## Multi-project mode" section and
      a "Single-project mode default:" output format header.
      Renamed to "## Portfolio output" and "## Output format
      (one-project view with --project <name>)". No behaviour
      change — just language that doesn't frame /status as
      mode-switching.

Non-blocking suggestions fixed
------------------------------
- S1 (site CTA contradiction): index.html:1732 final CTA was
      "one git clone, one symlink, and one config file away"
      → "one fork, one clone, and one config file away". The
      old line directly contradicted the "no symlinks" story.
- S3 (CLAUDE.md QUICK REFERENCE):
  - "Project registry (multi-project)" → "Portfolio registry"
  - "Per-project docs (multi-project)" → "Per-project docs"
  - "Live working copies (multi-project)" → "Live working
    copies (gitignored)"
  - "Multi-project guide" → "Full setup guide"

Also cleaned up while I was in there
------------------------------------
- inbox/SKILL.md rule 3: "Multi-project mode iterates the
  registry" → "Registry-scoped — only projects listed in
  apexstack.projects.yaml count"
- projects/SKILL.md error row: "Multi-project mode but no
  apexstack.projects.yaml" → "No apexstack.projects.yaml at
  the ops-repo root"
- projects/README.md directory layout: "ideas-backlog.md
  (multi-project mode)" → just "shared ideas backlog"

Out-of-scope but too tangled to leave
-------------------------------------
- golden-paths/pipelines/README.md: `cp` examples pointed at
  `.apexstack/golden-paths/...` as if apexstack were still a
  nested clone. Rewrote to "copy from ~/apexstack (your fork)
  to your managed project's .github/workflows/". Not strictly
  within the mode-removal scope but the README is now
  self-consistent with the fork-first install.
- docs/getting-started.md: rewrote Step 1 and Step 3 to match
  the new fork flow. Was still documenting the old .apexstack/
  + submodule + @.apexstack/CLAUDE.md @-import pattern —
  guaranteed to confuse a new adopter. Keeps parity with
  docs/multi-project.md and the site install section.

Verification
------------
  grep -rin "single-project" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → 2 hits, both intentional negation disclaimers in
    docs/multi-project.md:5 and site/index.html:1367

  grep -rn "apexstack.mode\|mode: multi-project\|mode: single-project\|Mode-aware" \
    --include="*.md" --include="*.yaml" --include="*.html"
  → 0 hits

  grep -rn "\.apexstack/" --include="*.md" --include="*.html"
  → only in docs/multi-project.md historical context paragraph
    (explaining why the old pattern was dropped) and README.md
    negation disclaimer ("no .apexstack/ symlinks")

Refs me2resh/apexscript-org#100

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

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
osama-abu-baker pushed a commit to osama-abu-baker/apexyard that referenced this pull request Jun 3, 2026
…d gaps) (me2resh#9)

Closes the last sub-task of the apexstack positioning epic (me2resh#100).
The Explore agent audit flagged specific gaps in both skills; these
were deferred through PRs me2resh#4-me2resh#8 because they're independent of the
positioning work. Now fixed.

/handover — 3 gaps closed
-------------------------

1. **Auto-append to the portfolio registry** (was the CRITICAL gap
   from the audit). Previously the skill printed a YAML snippet
   and told the user "add this to apexstack.projects.yaml". Users
   forgot, or miscopied, or broke the YAML indentation.

   Fix: new step 6 prompts the user `Ready to add {name} to
   apexstack.projects.yaml? (y/n)`. On y, the skill:
   - Locates the registry at the ops-repo root (creates from
     .example if missing, with a warning)
   - Appends the entry via `yq` if available, otherwise plain-text
     append with careful indentation
   - Validates the result by parsing the YAML (yq or python yaml)
   - Rolls back on failure (never leaves the registry broken)
   - Confirms the append to the user with the derived roles list

   On n, prints the snippet for manual copy-paste and continues
   without writing.

2. **Dynamic "Next Steps"** derived from the risks found. The
   old template had generic placeholders like `{first concrete
   action — usually "run /audit-deps and triage criticals"}`
   which was embarrassing to ship.

   New behaviour: a mapping table in the skill spec defines the
   derivation. Examples:
   - CVEs detected → `/audit-deps {name} — triage the {severity}
     {package} CVE before any new feature work`
   - Failing tests → `Fix the {N} failing tests in {module}
     before merging new PRs`
   - No observability → `/decide on observability ({top 2 options
     for this stack})`
   - Stale CI → `Re-enable CI — copy in golden-paths/pipelines/ci.yml`
   - Coverage unknown → `Set up test coverage reporting`
   - Backlog > 10 → `Triage the issue backlog with previous owner`
   - Missing README → `Write a minimum-viable README`

3. **Post-handover checklist** added to the assessment template,
   also dynamically tailored to the risks found. Items like "close
   {top risk} before the first feature PR", "add {name} to weekly
   /stakeholder-update rollup", "set up a coverage baseline".

Bonus gap closed: **derive the role list dynamically** from the
tech stack + CI config + security surface, instead of hard-coding
`[tech-lead, backend-engineer]`. Mapping table in the spec:
- backend deps → backend-engineer
- UI code → frontend-engineer
- CI config → platform-engineer
- deployment evidence → sre
- auth/crypto/secrets → security-auditor
- always → tech-lead

A typical handover ends up with 3-5 roles in the registry entry.

/idea — 3 gaps closed + 1 numbering bug fixed
----------------------------------------------

1. **Input validation for category**. The old step 2 asked for
   category but silently accepted anything. A user who typed
   `foo` got `Category: foo` in the backlog.

   Fix: the prompt now explicitly lists 1/2/3/4, accepts either
   the number or the word (case-insensitive), and **re-prompts
   on invalid input** with `Please pick 1-4 or type the category
   name.` Loops until valid.

   Same treatment for the description field — re-prompt if empty.

2. **Dedup check before appending** (new step 3). Prevents
   submitting the same idea twice.

   Implementation: a simple token-overlap heuristic. Normalise
   both titles (lowercase, strip punctuation), compare with a
   threshold (≥ 80% of the words in the shorter title appear in
   the longer one).

   If a match is found:

     ⚠ Similar idea already in the backlog:
       IDEA-025 — {existing title} (status: {status})

     Is this a duplicate? (y = skip, n = add anyway)

   On y: skip the append, suggest `/write-spec IDEA-025` if the
   user wants to work on the existing idea. On n: continue to
   step 4.

3. **Error handling for `gh issue create`** in step 6. Old
   behaviour: if the tracking issue creation failed, the idea
   was half-saved or the whole thing errored out. New behaviour:

     ⚠ Couldn't create the tracking issue: {reason}
       The idea is still saved in projects/ideas-backlog.md
       as IDEA-NNN.

     Try again? (y = retry, n = skip, gh = show the gh error)

   With a failure-modes table: missing auth scope, label not
   found, rate limit, network error, etc. — each has a specific
   recovery path.

   Guiding principle (now rule me2resh#8): **the backlog entry is the
   primary artefact; the tracking issue is a bonus**. Never lose
   the backlog entry because GitHub was flaky.

4. **Section numbering bug** fixed. The old file had steps 1, 2,
   4, 5, 6 — step 3 was missing because an earlier refactor
   deleted it without renumbering. With the new step 3 (dedup
   check) the sequence is now 1, 2, 3, 4, 5, 6 again.

Rules sections updated for both skills
--------------------------------------

- /handover: rule 4 is now "Auto-append to the registry (with
  confirmation)"; rule 5 is "Derive roles from the stack"; rule
  6 is "Derive next steps from the risks"; rule 10 is "Never
  break the registry".
- /idea: rule 6 is "Validate before accepting"; rule 7 is
  "Dedup before appending"; rule 8 is "The backlog is the
  primary artefact".

What's NOT in this commit
-------------------------

- The tabbed terminal animation (me2resh#102) — separate ticket,
  not part of the epic closure
- Any changes to the skill frontmatter
- Any changes to the `/handover` assessment output format
  beyond the Next Steps and Post-Handover Checklist sections
- Any changes to `/idea`'s backlog file format or ID scheme

This closes the epic me2resh#100. After this merges, apexstack is at
its v0.2 shape: positioning rewritten, lifecycle demo in the
hero, 19 roles wired in, multi-project-only + fork-first install,
and now the /handover and /idea skills that actually work
end-to-end.

Closes me2resh/apexscript-org#101
Closes me2resh/apexscript-org#100

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
me2resh added a commit that referenced this pull request Jun 5, 2026
* feat(#321): scaffold marketplace/audit-pack + safety-hooks layout

- marketplace/audit-pack/ — extracted /launch-check + 8 deep-dive audit
  skills + _lib-audit-history.sh + _lib-read-config.sh + _lib-ops-root.sh
  + AI-crawler registry + 8 audit templates. Includes authored README
  and PLUGIN.json that pitch the full framework as the graduation path.
- marketplace/safety-hooks/ — extracted 7 safety hooks (secrets / main
  push / git-add-all / pre-push / commit-refs / PR-title / branch-name)
  + _lib-tracker.sh (tracker-agnostic) + _lib-read-config.sh +
  _lib-ops-root.sh + _lib-extract-pr.sh + settings.snippet.json showing
  recommended hook wiring. Same funnel-pitching README and PLUGIN.json.
- EXTRACTION_MANIFEST.json in each sub-pack records the upstream SHA
  and file inventory so the "generated, not forked" maintenance
  contract is auditable.
- Strategic intent: a one-way discovery funnel from Claude Code
  marketplace users to full-framework adopters. The two sub-packs are
  genuinely self-contained — no portfolio model, no /handover, no role
  definitions — and pitch the full framework via the README without
  pressuring.

Closes #321

* feat(#321): bin/extract-subpacks.sh + extraction smoke test

- bin/extract-subpacks.sh — idempotent extraction script that copies
  the audit-pack + safety-hooks inventories from upstream HEAD into
  marketplace/<pack>/, writes EXTRACTION_MANIFEST.json with the
  upstream SHA, and supports --dry-run + --manifest-only for CI
  validation. Invokable both locally (operator debugging) and from
  the release-tag CI workflow.
- .claude/hooks/tests/test_subpack_extraction.sh — smoke test that
  (a) runs extraction into a tmp dir, (b) asserts the file inventory
  matches the AgDR-0049 contract for both sub-packs, (c) scans for
  framework-distinctive paths that would indicate a leak
  (apexyard.projects.yaml, _lib-portfolio-paths.sh, /handover skill,
  /agdr skill, role definitions), (d) plants a deliberate leak token
  and asserts the scan catches it (proves the scan does work, not
  just exits 0 silently), and (e) verifies each sub-pack's authored
  marketplace files (PLUGIN.json, README, settings snippet) are
  present at the repo-root marketplace/.

Refs #321

* feat(#321): release-tag extraction CI workflow

- .github/workflows/extract-subpacks-on-release.yml — fires on every
  v* tag push (cut by /release) and on PRs touching extraction-
  relevant files. Runs bin/extract-subpacks.sh, then runs the
  smoke test, then uploads marketplace/ as a build artefact when
  the trigger is a release tag (90-day retention).
- The publish step (push to Claude Code marketplace) remains a
  manual operator concern in v1 — the workflow's job summary lists
  the next steps with the tag name + upstream SHA so the operator
  can take the artefact from the run and push it to the marketplace
  with the right semver.
- Per-PR mode catches contributors who break the extraction
  contract (e.g. an audit skill that adds a portfolio dependency)
  at PR time rather than at release time.

See AgDR-0049 for the rationale on release-tag-driven vs every-PR
auto-publish (the marketplace doesn't want a release per PR; every
WIP commit landing on real users is the wrong shape).

Refs #321

* docs: AgDR-0049 — marketplace sub-packs as framework funnel

Records the strategic + maintenance decisions behind the two
marketplace sub-packs (apexyard/audit-pack and apexyard/safety-hooks):

- Two-sub-pack scope vs alternatives (single mega-plugin, more
  sub-packs in v1, /rex + /migrations sub-packs)
- Generated-not-forked maintenance contract — sub-packs are
  extracted from upstream HEAD at release time, NOT separately
  maintained codebases; the framework stays single source of truth
- Release-tag-driven CI workflow + manual operator publish step
  (release-tag-only in v1; automated publish deferred to v2)
- Funnel direction is one-way (plugin → framework); the README
  pitches but does not pressure
- Performance contract — same files serve both distribution
  channels; the smoke test mechanically asserts no framework-
  distinctive elements (portfolio registry, _lib-portfolio-paths.sh,
  /handover skill, role definitions) leak into the extracted output
- Why /rex and /migrations are deferred — session-state convention
  and migration-ticket dependencies respectively don't survive
  extraction into a drop-in shape without losing the gate's value

Closes #321

* fix: shellcheck SC2064 trap-expansion + markdownlint MD051 link-fragment slugs

Two CI failures on initial #344 push:

1. shellcheck SC2064 in test_subpack_extraction.sh:34 — double-quoted
   trap expanded $TMP_ROOT at definition time rather than signal time.
   Swap inner/outer quoting (single quotes around the trap body, double
   quotes around the variable) so expansion is deferred. Cleanup now
   resolves the correct path even if TMP_ROOT is reassigned later.

2. markdownlint MD051 in both READMEs — link `#graduation-path-the-full-framework`
   doesn't match heading `## Graduation path — the full framework` because
   GFM slug-generation translates ` — ` (em-dash with spaces) to `--`
   (double dash). Swap the em-dash in the heading to a colon: the slug
   becomes `graduation-path-the-full-framework`, matching the existing
   link. Same fix in both audit-pack and safety-hooks READMEs.

Refs #321

* docs: honest-scope amend AgDR-0049 + audit-pack README per Rex's CHANGES REQUESTED

Rex's review of #344 surfaced a real correctness gap between AgDR-0049's
Decision #4 claim and what the smoke test actually enforces. The leak-scan
is a PATH-scan (catches files at framework-distinctive paths like
_lib-portfolio-paths.sh) but is NOT a CONTENT-scan (doesn't catch SKILL.md
prose mentioning /handover, or _lib-audit-history.sh calling
portfolio_projects_dir). Several extracted files in audit-pack DO carry
such prose references.

Per the operator's chosen path (Rex's option a, honest-scope amend, not
full refactor): acknowledge the limitation in the AgDR + add a "Known
framework references" section to the audit-pack README so adopters know
what they're looking at, while preserving the generated-not-forked
contract (decision #3) that would be contradicted by content-scrubbing.

Changes:

- AgDR-0049 § Decision #4 rewritten — distinguishes path-leak guard
  (mechanically enforced) from content references (deliberate, funnel-
  pointer, graceful-degrade outside an apexyard fork). v2 may revisit if
  adopter friction surfaces.
- marketplace/audit-pack/README.md — new "Known framework references"
  section enumerates the three concrete surfaces Rex found (SKILL.md
  prose hints, _lib-audit-history.sh portfolio_projects_dir fallback,
  broken relative links to upstream docs/agdr/). Frames each as
  intentional + funnel-pointer. Flags v2 as the escape hatch.
- safety-hooks is unaffected — Rex confirmed graceful-degrades correctly.

Smoke test unchanged (path-scan is the right shape for what it catches;
the AgDR amend clarifies what it does and doesn't claim).

Refs #321

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
mosta7il pushed a commit to mosta7il/apexyard that referenced this pull request Jun 8, 2026
…e2resh#4)

* docs(me2resh#100): positioning rewrite — "where projects get forged"

Reframes apexstack from "an opinionated stack for Claude Code" to
"a multi-project ops repo where projects get forged." Targets the
solo founder / technical CEO running 2-5 products and drowning in
context-switching.

Hero (site/index.html)
- Eyebrow flips from "plain markdown · zero dependencies" to
  "for founders forging multiple products"
- H1 changes from the brand name ("apexstack") to the value
  prop ("Where projects get forged.")
- New tagline: "The multi-project ops repo where your projects
  reference each other, learn from shared experience, and ship
  production-ready under a strict SDLC."
- New subhead leans into the forge framing: "You don't add
  apexstack to a project — projects get forged inside it. One
  ops repo. Every product. Shared memory. Strict gates.
  Production-ready MVPs." Addresses the Claude-Code-lock-in
  objection head-on: "Claude Code is the default driver, but
  the rules, hooks, and templates are plain markdown and shell.
  Swap the AI. Keep the forge."
- NEW hero CTA block with star-first priority:
  [★ Star on GitHub] · [or install it now ↓]
- Install command fixed from `~/.apexstack` (home dir, broken
  per the audit) to `.apexstack` (per-ops-repo, canonical)
- Caveat rewritten to match and point at both install paths

CSS
- Added .hero__cta, .cta, .cta--primary, .cta--ghost, .cta__sep
  to the existing terminal-brutalism style block. Sharp corners,
  hairline borders, no gradients. Primary CTA goes from ink → accent
  on hover. Ghost CTA is text-only with accent on hover.

Install section (site/index.html SECTION 05)
- Kept the six-step per-ops-repo walkthrough as the canonical
  path
- Kept the single-project opt-out at the bottom
- NEW "alternative — global install" step for users running
  several ops repos (founders with multiple orgs, consultants
  with multiple clients). Documents the tradeoff: symlinks
  use absolute paths, breaks if ~/.apexstack/ moves.
- Hero caveat links to #install-global for the alternative

README.md
- Hero rewritten end-to-end to match the site
- Added "Global install (alternative)" section after the
  single-project opt-out, mirroring the new site step
- gstacks.org attribution reworded to say "for teams running
  more than one product at a time"

CLAUDE.md
- Intro title changed from "AI-Native Development Stack" to
  "A Multi-Project Forge for Claude Code"
- First paragraph expanded with the forge framing and the
  explicit "projects get forged inside it, not added to it"
  phrasing, while keeping the operational instructions
  untouched so the rest of the file still drives Claude
  correctly.

Audience discovery (recorded in the epic issue)
- Primary persona: solo founder / technical CEO juggling
  2-5 products
- Tone: punchy and confident, short sentences, strong verbs
- Forge metaphor: literal
- Conversion: star first, clone second
- Objections addressed: Claude-Code lock-in (explicit),
  opinionated (leaned into — "strict gates" is the point)

NOT in this PR (tracked in the epic)
- Commands sub-page (PR 2)
- Hero shell animation (PR 3, depends on PR 2)
- Roles integration (PR 4 — the audit flagged all 19 roles
  are completely disconnected from workflows/skills/CLAUDE.md
  imports, will fix there)
- /idea and /handover skill polish (PR 5)
- AgDR backfill — explicitly skipped
- Anvil / metalwork SVG iconography — holding off on visual
  changes until the copy is locked

Refs me2resh/apexscript-org#100

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

* docs(me2resh#100): fix page title, meta description, CTA separator, caveat copy

Address Rex's review on PR me2resh#4 commit a044bd2:

B1 (blocker) — Page title and meta description still said "an
opinionated stack for Claude Code" and "one drop-in stack for
Claude Code". These are the highest-leverage strings in the file
(browser tabs, search results, social cards) and they directly
contradicted the rest of the PR. Replaced with the forge framing:

  <title>ApexStack — where projects get forged</title>
  <meta description="... a multi-project ops repo where your
  projects reference each other, learn from shared experience,
  and ship production-ready under a strict SDLC. Built for
  founders running 2–5 products at once. Open source. Claude
  Code native, but plain markdown underneath.">

S2 (non-blocking) — On narrow screens where .hero__cta wraps,
the `·` separator could orphan onto its own line. Added
@media (max-width: 520px) { .cta__sep { display: none; } }
so the two CTAs stack cleanly on mobile.

S3 (non-blocking) — Hero caveat said "Five more steps in install
below" but the install section now has 6 per-ops-repo steps plus
the single-project opt-out and the new global-install alternative.
Rephrased to "Full walkthrough in install below" so the copy is
count-agnostic.

S1 (skipped) — Rex noted CLAUDE.md doesn't carry "Swap the AI.
Keep the forge." but also explicitly said the spec only required
the line in site + README, so leaving CLAUDE.md's operational
tone intact.

Refs me2resh/apexscript-org#100

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

* docs(me2resh#100): revert H1 to "apexstack_" with flicker, promote forge to tagline

CEO feedback on the live site at a044bd2:
- Missed the flickering "_" cursor on the old H1 — the three-word
  H1 ("Where projects get forged.") also overflowed the hero
  width because .hero__title has white-space: nowrap; overflow:
  hidden; and was clipping at ~"projects" on a standard laptop
- Forge statement belongs in the subheading, not the H1

Changes:
- H1 reverts to "apexstack" (was "Where projects get forged.").
  The .hero__title::after pseudo-element already appends a "_"
  and animates it via the blink keyframe, so the flicker comes
  back for free.
- Tagline becomes "Where projects get forged." — the forge
  statement now sits in the visually-prominent subheading slot
  right under the H1.
- .hero__tagline font-size bumped from clamp(1rem, 1.6vw, 1.25rem)
  to clamp(1.5rem, 3vw, 2.5rem) so a 4-word punchy statement
  carries visual weight. Also font-weight 500 → 600, line-height
  1.5 → 1.25, and a small negative letter-spacing for the
  display-style treatment.
- Sub paragraph absorbs the previous tagline content merged
  with the existing subhead — one longer descriptive paragraph
  covering the multi-project promise, the forge framing, and
  the Claude-Code lock-in objection.

Typography hierarchy is now:
- H1 (huge, monospace, with blinking cursor) — brand mark
- Tagline (display-size, punchy) — the one-line promise
- Sub (body-size, descriptive) — the multi-paragraph pitch

Refs me2resh/apexscript-org#100

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

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
mosta7il pushed a commit to mosta7il/apexyard that referenced this pull request Jun 8, 2026
…sh#8)

* refactor(me2resh#100): multi-project only + fork-first install

Two strategic direction changes from the CEO rolled into one PR
because they're deeply coupled — removing single-project mode
changes the install flow, and the fork-first install changes
every doc that talked about cloning into .apexstack/.

1. Drop single-project mode entirely
---------------------------------------
Single-project mode was a dual-mode compromise that added
complexity without matching how apexstack is actually used.
The audit found every skill had a mode branch that was never
exercised in practice. Users who thought they only had one repo
almost always ended up with two within a few months.

- onboarding.yaml: removed the apexstack.mode field + the
  multi-paragraph mode explainer
- apexstack.projects.yaml.example: rewritten header comment to
  lead with "no single-project fallback mode; register your one
  repo and the skills work the same"
- CLAUDE.md: OPERATING MODE section replaced with PORTFOLIO MODEL
  section explaining the fork-as-ops-repo mental model. SETUP
  section dropped the "read apexstack.mode" step.
- docs/multi-project.md: full rewrite as the canonical setup
  guide. Removed the TL;DR comparison table, the "when to switch
  to single-project" section, the "migrating from single → multi"
  section, the "going back: multi → single" section, and every
  trade-off framed against single-project.
- 8 skill files (handover, idea, inbox, projects, roadmap,
  stakeholder-update, status, tasks): dropped every mode detection
  block (grep onboarding.yaml for mode:), dropped every
  mode-comparison table, simplified scope statements to "iterates
  the registry" or equivalent. Dead code removed.
- workspace/README.md, projects/README.md: removed the "two
  modes" sections, simplified to describe the single portfolio
  pattern.
- README.md: removed the Operating modes table + the
  Single-project install (opt-out) section + the Global install
  (alternative) section (see item 2 for why the global install
  is gone).
- site/index.html: removed the "Operating modes (single &
  multi-project)" hero metric, updated the layers section lede,
  removed every single-project mention in Layer 05, removed the
  "opt-out — single-project mode" install step, removed the
  "alternative — global install" install step.

The only remaining "single-project" strings in the codebase are
TWO intentional negation disclaimers (in docs/multi-project.md
and site/index.html Layer 05) that tell anyone searching for the
concept: "there is no single-project fallback". That's a feature,
not a bug.

2. Fork-first install (replaces clone-into-.apexstack/)
--------------------------------------------------------
The old install model cloned apexstack into a hidden .apexstack/
subdirectory of a separate ops repo, then symlinked .claude/ up
one level. Three problems:

  a. Brand invisibility — .apexstack/ is a dotfile, hidden from
     ls and GitHub views. Nobody knew you were using apexstack.
  b. Two repos to maintain — your ops repo plus the nested clone.
  c. Symlink fragility — the .claude/ symlink broke on dotfile
     sync tools and Windows setups.

New model: your ops repo IS a fork of apexstack. One repo, no
nesting, no symlinks. Upgrades flow via `git fetch upstream &&
git merge upstream/main` — the standard fork workflow.

Per the CEO's call, users can rename the fork to your-org/ops
or keep it as your-org/apexstack. GitHub handles the rename
cleanly. The install docs describe the rename as optional.

- Hero install block: "git clone ... .apexstack" →
  "gh repo fork me2resh/apexstack --clone"
- Hero CTA: "★ Star on GitHub" →
  "★ Star · ⑂ Fork on GitHub" (single button, per Q3.c)
- Hero install caveat: rewrote to explain "the fork IS your ops
  repo, no nested installs, no symlinks"
- SECTION 05 / INSTALL: full rewrite. 6 steps became 5. The 5
  steps are: star+fork, add upstream remote, configure
  onboarding.yaml, create the registry, start working. The old
  "symlink runnable layer" step is gone (no symlink needed). The
  old "wire CLAUDE.md with @-import" step is gone (CLAUDE.md is
  already at the fork root).
- README.md Quick Start: same 5-step rewrite, matched to the
  site flow.
- docs/multi-project.md: complete rewrite as a setup guide
  covering the fork flow, directory layout, daily workflow,
  upgrade path (git pull upstream), trade-offs, and FAQ. ~314
  lines, honest about the pros and cons.

Side effects (positive)
-----------------------
- Layers section UX bug from the earlier screenshot is gone.
  Layer 05 no longer has "content only fills left 1/3" — added a
  new .layer--wide CSS variant with a 2-column internal grid
  (description on the left, registry file list on the right).
  Fills the full width naturally.
- Hero metric me2resh#4 changed from "2 Operating modes" to "1 Fork ·
  your ops repo in one command" — celebrates the simplification
  instead of the dropped complexity.

Not in scope
------------
- The lifecycle demo script in the hero is untouched
  (it doesn't reference install or mode)
- Role files in roles/ are untouched (no mode refs)
- Workflow files (sdlc, code-review, deployment) are untouched
  (no mode refs)
- .claude/agents/ are untouched (no mode refs)
- Hooks in .claude/hooks/ are untouched (no mode refs)
- The apexstack.mode field in the existing onboarding.yaml.example
  — this is the site's own onboarding.yaml which gets removed
  with the mode config

Verification
------------
  grep -rn "single-project" --include="*.md" --include="*.yaml" \
    --include="*.html" --include="*.sh"
  → 2 hits, both intentional negation disclaimers

  grep -rn "mode:" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → 0 hits

  grep -rn "\.apexstack/" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → only in docs/multi-project.md explaining why the old pattern
    was dropped (historical context paragraph)

Multi-project neutrality
------------------------
  grep -iE "flat-?mate|curios|sharp ?pick|movetwo|yumyum" \
    on all 16 changed files
  → 0 hits

Refs me2resh/apexscript-org#100

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

* refactor(me2resh#100): address Rex review — blockers + CTA contradiction + doc fork

Rex's delta review on 160148f found 4 blockers + 1 site CTA
contradiction + a few vestigial mentions. Plus the deeper grep
I ran caught two more: a stale .apexstack/ example in
golden-paths/pipelines/README.md, and docs/getting-started.md
still documenting the old .apexstack/ + symlink flow.

Blockers fixed
--------------
- B1: idea/SKILL.md rule 5 "Mode-aware — detect apexstack.mode"
      → "Single backlog — every idea goes into
         projects/ideas-backlog.md"
- B2: roadmap/SKILL.md rule 6 "Mode-aware — ROADMAP.md or
      projects/<name>/roadmap.md"
      → "One roadmap per project — always write to
         projects/<name>/roadmap.md"
- B3: status/SKILL.md had a "## Multi-project mode" section and
      a "Single-project mode default:" output format header.
      Renamed to "## Portfolio output" and "## Output format
      (one-project view with --project <name>)". No behaviour
      change — just language that doesn't frame /status as
      mode-switching.

Non-blocking suggestions fixed
------------------------------
- S1 (site CTA contradiction): index.html:1732 final CTA was
      "one git clone, one symlink, and one config file away"
      → "one fork, one clone, and one config file away". The
      old line directly contradicted the "no symlinks" story.
- S3 (CLAUDE.md QUICK REFERENCE):
  - "Project registry (multi-project)" → "Portfolio registry"
  - "Per-project docs (multi-project)" → "Per-project docs"
  - "Live working copies (multi-project)" → "Live working
    copies (gitignored)"
  - "Multi-project guide" → "Full setup guide"

Also cleaned up while I was in there
------------------------------------
- inbox/SKILL.md rule 3: "Multi-project mode iterates the
  registry" → "Registry-scoped — only projects listed in
  apexstack.projects.yaml count"
- projects/SKILL.md error row: "Multi-project mode but no
  apexstack.projects.yaml" → "No apexstack.projects.yaml at
  the ops-repo root"
- projects/README.md directory layout: "ideas-backlog.md
  (multi-project mode)" → just "shared ideas backlog"

Out-of-scope but too tangled to leave
-------------------------------------
- golden-paths/pipelines/README.md: `cp` examples pointed at
  `.apexstack/golden-paths/...` as if apexstack were still a
  nested clone. Rewrote to "copy from ~/apexstack (your fork)
  to your managed project's .github/workflows/". Not strictly
  within the mode-removal scope but the README is now
  self-consistent with the fork-first install.
- docs/getting-started.md: rewrote Step 1 and Step 3 to match
  the new fork flow. Was still documenting the old .apexstack/
  + submodule + @.apexstack/CLAUDE.md @-import pattern —
  guaranteed to confuse a new adopter. Keeps parity with
  docs/multi-project.md and the site install section.

Verification
------------
  grep -rin "single-project" --include="*.md" --include="*.yaml" \
    --include="*.html"
  → 2 hits, both intentional negation disclaimers in
    docs/multi-project.md:5 and site/index.html:1367

  grep -rn "apexstack.mode\|mode: multi-project\|mode: single-project\|Mode-aware" \
    --include="*.md" --include="*.yaml" --include="*.html"
  → 0 hits

  grep -rn "\.apexstack/" --include="*.md" --include="*.html"
  → only in docs/multi-project.md historical context paragraph
    (explaining why the old pattern was dropped) and README.md
    negation disclaimer ("no .apexstack/ symlinks")

Refs me2resh/apexscript-org#100

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

---------

Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
mosta7il pushed a commit to mosta7il/apexyard that referenced this pull request Jun 8, 2026
…d gaps) (me2resh#9)

Closes the last sub-task of the apexstack positioning epic (me2resh#100).
The Explore agent audit flagged specific gaps in both skills; these
were deferred through PRs me2resh#4-me2resh#8 because they're independent of the
positioning work. Now fixed.

/handover — 3 gaps closed
-------------------------

1. **Auto-append to the portfolio registry** (was the CRITICAL gap
   from the audit). Previously the skill printed a YAML snippet
   and told the user "add this to apexstack.projects.yaml". Users
   forgot, or miscopied, or broke the YAML indentation.

   Fix: new step 6 prompts the user `Ready to add {name} to
   apexstack.projects.yaml? (y/n)`. On y, the skill:
   - Locates the registry at the ops-repo root (creates from
     .example if missing, with a warning)
   - Appends the entry via `yq` if available, otherwise plain-text
     append with careful indentation
   - Validates the result by parsing the YAML (yq or python yaml)
   - Rolls back on failure (never leaves the registry broken)
   - Confirms the append to the user with the derived roles list

   On n, prints the snippet for manual copy-paste and continues
   without writing.

2. **Dynamic "Next Steps"** derived from the risks found. The
   old template had generic placeholders like `{first concrete
   action — usually "run /audit-deps and triage criticals"}`
   which was embarrassing to ship.

   New behaviour: a mapping table in the skill spec defines the
   derivation. Examples:
   - CVEs detected → `/audit-deps {name} — triage the {severity}
     {package} CVE before any new feature work`
   - Failing tests → `Fix the {N} failing tests in {module}
     before merging new PRs`
   - No observability → `/decide on observability ({top 2 options
     for this stack})`
   - Stale CI → `Re-enable CI — copy in golden-paths/pipelines/ci.yml`
   - Coverage unknown → `Set up test coverage reporting`
   - Backlog > 10 → `Triage the issue backlog with previous owner`
   - Missing README → `Write a minimum-viable README`

3. **Post-handover checklist** added to the assessment template,
   also dynamically tailored to the risks found. Items like "close
   {top risk} before the first feature PR", "add {name} to weekly
   /stakeholder-update rollup", "set up a coverage baseline".

Bonus gap closed: **derive the role list dynamically** from the
tech stack + CI config + security surface, instead of hard-coding
`[tech-lead, backend-engineer]`. Mapping table in the spec:
- backend deps → backend-engineer
- UI code → frontend-engineer
- CI config → platform-engineer
- deployment evidence → sre
- auth/crypto/secrets → security-auditor
- always → tech-lead

A typical handover ends up with 3-5 roles in the registry entry.

/idea — 3 gaps closed + 1 numbering bug fixed
----------------------------------------------

1. **Input validation for category**. The old step 2 asked for
   category but silently accepted anything. A user who typed
   `foo` got `Category: foo` in the backlog.

   Fix: the prompt now explicitly lists 1/2/3/4, accepts either
   the number or the word (case-insensitive), and **re-prompts
   on invalid input** with `Please pick 1-4 or type the category
   name.` Loops until valid.

   Same treatment for the description field — re-prompt if empty.

2. **Dedup check before appending** (new step 3). Prevents
   submitting the same idea twice.

   Implementation: a simple token-overlap heuristic. Normalise
   both titles (lowercase, strip punctuation), compare with a
   threshold (≥ 80% of the words in the shorter title appear in
   the longer one).

   If a match is found:

     ⚠ Similar idea already in the backlog:
       IDEA-025 — {existing title} (status: {status})

     Is this a duplicate? (y = skip, n = add anyway)

   On y: skip the append, suggest `/write-spec IDEA-025` if the
   user wants to work on the existing idea. On n: continue to
   step 4.

3. **Error handling for `gh issue create`** in step 6. Old
   behaviour: if the tracking issue creation failed, the idea
   was half-saved or the whole thing errored out. New behaviour:

     ⚠ Couldn't create the tracking issue: {reason}
       The idea is still saved in projects/ideas-backlog.md
       as IDEA-NNN.

     Try again? (y = retry, n = skip, gh = show the gh error)

   With a failure-modes table: missing auth scope, label not
   found, rate limit, network error, etc. — each has a specific
   recovery path.

   Guiding principle (now rule me2resh#8): **the backlog entry is the
   primary artefact; the tracking issue is a bonus**. Never lose
   the backlog entry because GitHub was flaky.

4. **Section numbering bug** fixed. The old file had steps 1, 2,
   4, 5, 6 — step 3 was missing because an earlier refactor
   deleted it without renumbering. With the new step 3 (dedup
   check) the sequence is now 1, 2, 3, 4, 5, 6 again.

Rules sections updated for both skills
--------------------------------------

- /handover: rule 4 is now "Auto-append to the registry (with
  confirmation)"; rule 5 is "Derive roles from the stack"; rule
  6 is "Derive next steps from the risks"; rule 10 is "Never
  break the registry".
- /idea: rule 6 is "Validate before accepting"; rule 7 is
  "Dedup before appending"; rule 8 is "The backlog is the
  primary artefact".

What's NOT in this commit
-------------------------

- The tabbed terminal animation (me2resh#102) — separate ticket,
  not part of the epic closure
- Any changes to the skill frontmatter
- Any changes to the `/handover` assessment output format
  beyond the Next Steps and Post-Handover Checklist sections
- Any changes to `/idea`'s backlog file format or ID scheme

This closes the epic me2resh#100. After this merges, apexstack is at
its v0.2 shape: positioning rewritten, lifecycle demo in the
hero, 19 roles wired in, multi-project-only + fork-first install,
and now the /handover and /idea skills that actually work
end-to-end.

Closes me2resh/apexscript-org#101
Closes me2resh/apexscript-org#100

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants