v2026.5.0

Previous release

AIWG v2026.5.0 — "Project-Local + Kernel-Pivot Maturity"

Released: 2026-05-11 Type: Major release (41 rc iterations folded in) Previous stable release: v2026.3.3 (2026.4.0 was never cut — the rc series rolled forward into 2026.5.0)

v2026.5.0 is two complementary stories landing in one stable cut:

1. Project-local artifacts — a complete operator surface for customizing AIWG per-project without forking, with a graduation path to upstream or a private corpus that's a hash-verified copy with zero rewrite. Epic #1033 delivered eight ADRs / design docs and four implementation phases. 2. Kernel-pivot maturity — the kernel-vs-standard skill split (introduced in 2026.5.0-rc.10) became the load-bearing model AIWG actually operates under. The late-rc work hardened the discover-first protocol, fixed the publish pipeline, audited the Hermes integration against upstream source, and shipped visual docs that finally make the mental model accessible without prose-only walls.


Highlights

What changedWhy you care
Project-local artifact lifecycle (epic #1033)Customize AIWG per project without forking. The full chain `new-bundle` → `use` → `doctor` → `remove` → `promote` ships in 2026.5.0.
`aiwg new-bundle <name>` (#1050)One command produces a valid manifest + starter artifact + README under `.aiwg/{type}/{name}/`. Aliases: `new-extension`, `new-addon`, `new-framework`, `new-plugin` infer the type.
`aiwg promote <name>` (#1037)Graduate a project-local bundle to upstream or to a private corpus path. SHA-256 verified copy with rollback on mismatch. `--dry-run`, `--cleanup`, `--force`.
`aiwg remove` is project-local-aware (#1037)Reverts deployed files using artifact-hash detection. Source under `.aiwg/<type>/<name>/` is never deleted — `--force` only overrides the case-2 mutation prompt.
`aiwg doctor --project-local` (#1037)Per-type counts, validation errors, shadows (informational vs blocking), drift detection, provider deployment matrix.
Activity log for project-local lifecycle (#1037)12 lifecycle events emitted to `.aiwg/activity.log` — discover / deploy / shadow-acknowledged / remove-mutated / promote / etc. — with `(name, type)` dedupe for read-only operations.
Override / shadow policy (#1036)Project-local artifacts can shadow upstream cleanly with seven verdicts. Safety-critical denylist refuses to shadow without explicit `overrides:` declaration; `--force` does not bypass.
Identical-form portability invariant (ADR #1038)A bundle at `.aiwg/extensions/foo/` is byte-identical to `agentic/code/addons/foo/` upstream. `aiwg promote` is a copy + verify, not a migration.
Path A / B / C customization modelProject-local (recommended for most users), Fork (for upstream contributions), Corpus (cross-project sharing). Mix freely; bundles move between paths by copy.
Comprehensive customization docsNew quickstart, lifecycle reference, troubleshooting, from-fork migration, and type disambiguation. Old `.aiwg/.project/` docs replaced with redirects to canonical sources.

What's new in detail

Project-local artifact lifecycle (epic #1033)

The epic shipped in dependency order, child by child. Each phase produced a usable feature on its own; the complete operator surface lit up in #1037.

Discovery + manifest validation (#1034)

Read-only scan of `.aiwg/{extensions,addons,frameworks,plugins}/<name>/manifest.json`:

  • Unified `BundleManifestSchema` (Zod) — discriminated nested config (`addonConfig`, `frameworkConfig`, `extensionConfig`, `pluginConfig`)
  • Strict validation rejects unknown top-level keys, enforces DoS limits (64 KB manifest, 200 bundles, 50 keywords, 20 overrides), supports `safety-critical` and `overrides` fields
  • Symlinked bundle dirs refused unless `--allow-symlinks` (per threat model #1042)
  • Case-insensitive id collisions within a type are refused
  • Surfaced in `aiwg list` with `[project]` source label; `aiwg list --project-local` filters with per-type counts

Deploy via `aiwg use` (#1035)

`aiwg use sdlc` now deploys project-local bundles automatically alongside the upstream framework. `aiwg use <bundle-name>` deploys a single bundle. `--no-project-local` skips discovery entirely. Registry tracks `source: 'project-local'` with `localPath`, `localType`, `manifestVersion`, and (new in #1037) `artifactHashes`.

Override / shadow policy + safety-critical denylist (#1036)

Seven verdicts from ADR #1041:

1. No collision → deploy 2. Non-safety shadow → deploy + warn 3. Safety-critical + explicit `overrides:` → deploy + prominent warn 4. Safety-critical without `overrides:` → refuse (`--force` does not bypass) 5. Phantom override → refuse 6. Two project-local bundles export same artifact → refuse both 7. Git-installed (cache) shadow → same path as cases 2/3/4 against the cache

Remove + doctor + promote + activity log (#1037)

Implemented in five phases following the design contracts:

PhaseCommitWhat
1`fb540d50`Activity log helper + integration
2`2f7e4508`Project-local-aware `aiwg remove` (cases 1–6, `--force`, `--dry-run`, `--keep-registry`)
3`d2a21f2b``aiwg doctor` project-local section (counts, validation, shadows, drift, matrix)
4+5`ae96d2e2``aiwg promote` + test strategy update
Fix`81ce265c`Register `promoteCommand` in command definitions registry

Scaffolding (#1050)

`aiwg new-bundle <name> [--type {extension|addon|framework|plugin}] [--starter {skill|rule|agent|minimal}]` creates a complete bundle in one command. Aliases (`new-extension`, `new-addon`, etc.) infer the type from invocation. Output validates against `BundleManifestSchema` out of the box.

Activity log

Every lifecycle event writes a single line to `.aiwg/activity.log`:

## [2026-05-02 19:45] deploy | deploy: my-bundle:extension | claude: agents=0 commands=0 skills=1 rules=1
## [2026-05-02 19:46] delete | remove: my-bundle:extension | claude=2 reverted
## [2026-05-02 19:47] promote | promote: my-bundle:extension | agentic/code/addons/my-bundle

12 design events: `discover`, `deploy`, `deploy-failed`, `conflict`, `shadow-acknowledged`, `shadow-refused`, `remove`, `remove-mutated`, `remove-conflict`, `remove-force`, `promote`, `promote-failed`. Writes are non-blocking (failures emit a stderr warning, never break the underlying op). Discover events deduplicate by `(name, type)` against the recent log tail.

Identical-form portability (ADR #1038)

The load-bearing design invariant: a project-local bundle is byte-identical in shape to its upstream form. This makes `aiwg promote` a hash-verified copy — no rewrite, no migration, no schema gymnastics. The same manifest shape works at:

  • `.aiwg/extensions/<name>/` (project-local)
  • `agentic/code/addons/<name>/` (upstream)
  • `<corpus-path>/<name>/` (private corpus)
  • A marketplace-packaged plugin payload

Moving between any of these is `cp -r` + SHA-256 verify.


Customization paths (Path A / B / C)

The customization guide restructured around three paths. Pick by what you're customizing and how you want to share it:

PathWhenEffort
A — Project-localPer-project rules, agents, skills5 minutes — no fork
B — ForkCross-project customization, contributing back, modifying AIWG core30 minutes — fork + dev mode
C — CorpusCross-project sharing without going publicOne-time setup per corpus

The three paths compose. A project on Path A can later promote to Path B or Path C; a fork (Path B) can deploy alongside Path A bundles cleanly; a corpus (Path C) is just another `source` in the registry.

See docs/customization/README.md for the full decision tree.


Documentation

A comprehensive doc refresh shipped alongside the implementation:

DocWhat it covers
`docs/customization/README.md`Path A / B / C overview + decision tree
`docs/customization/project-local-quickstart.md`First bundle in 5 minutes
`docs/customization/project-local-lifecycle.md`Full operator reference
`docs/customization/project-local-troubleshooting.md`Common failures + fixes
`docs/customization/from-fork-to-project-local.md`Migrate existing fork-based work
`docs/customization/extensions-vs-addons-vs-frameworks-vs-plugins.md`Pick the right bundle type
`docs/cli-reference.md`Updated entries for `new-bundle`, `promote`, `remove`, `doctor --project-local`
`examples/project-local/README.md`Working example via `aiwg new-bundle`

The old `docs/project-local/` directory (which documented a superseded `.aiwg/.project/` design) was replaced with redirect stubs pointing at the canonical docs above.


Architecture decisions

The epic produced eight new ADRs / design docs in `.aiwg/architecture/`:

FileIssue
`adr-identical-form-portability.md`#1038
`adr-aiwg-directory-layout.md`#1039
`adr-unified-registry-shape.md`#1040
`adr-override-shadow-policy.md`#1041
`threat-model-project-local.md`#1042
`design-reference-resolution.md`#1043
`design-manifest-schema.md`#1044
`design-aiwg-remove-revert.md`#1048
`design-doctor-log-promote.md`#1049

Test coverage

The 2026.5.0 work added 33 new unit tests across 4 new test files for the project-local lifecycle, plus integration and UAT coverage:

FileTestsCoverage
`test/unit/extensions/project-local-activity.test.ts`6Activity log helper + dedupe + non-blocking writes
`test/unit/extensions/project-local-remove.test.ts`15Cases 1–6 from #1048 design
`test/unit/extensions/project-local-doctor.test.ts`8DC-1: counts, validation, drift, quiet mode, matrix
`test/unit/extensions/project-local-promote.test.ts`10PR-1..PR-5: bundle-not-found, dry-run, copy+verify, destination-exists, project-local @-refs
`test/unit/extensions/project-local-scaffold.test.ts`11All four types, all four starters, validation, refuse-on-exists
`test/unit/extensions/project-local.test.ts`9Cross-cutting matrix (D-8 path-traversal, D-9 unicode, C-2 three-way, C-3 cross-type)
`test/integration/project-local-deploy.test.ts`6Real `deploy-agents.mjs` against synthesized bundles
`test/uat/project-local-flow.uat.ts`2End-to-end round-trip + safety-critical shadow refusal

Plus the full test matrix mapping in `.aiwg/testing/test-strategy-project-local.md`.


Migration notes

From v2026.4.x

No breaking changes. Existing `aiwg use` and `aiwg remove` invocations work unchanged — project-local awareness is additive.

The two surfaces that gained behavior:

1. `aiwg use` now auto-discovers `.aiwg/{extensions,addons,frameworks,plugins}/<name>/` bundles after the upstream deploy. Pass `--no-project-local` to skip. 2. `aiwg remove <name>` now routes to a project-local handler when `<name>` matches a project-local entry in `aiwg.config.installed`. Otherwise falls through to the existing plugin-uninstaller.

Upgrading an existing project to take advantage

npm install -g [email protected]
aiwg refresh         # re-deploy with project-local discovery enabled
aiwg new-bundle my-team-rules --type extension --starter rule
# edit the bundle, then:
aiwg use my-team-rules
aiwg doctor --project-local

Operators currently maintaining a fork

See `docs/customization/from-fork-to-project-local.md` for the per-category migration guide. Common case: rules / skills / agents move to project-local; AIWG core changes stay in the fork.


Late-cycle additions

Two user-reported issues landed in the rc.10 cut and ship in 2026.5.0:

  • `#107` — Claude `settings.json` hooks field shape. The hook installer (and the CLI extension hook auto-registration from `#480`) wrote `hooks` as an array of `{matcher, hooks}` objects. Claude Code requires an object keyed by event name with matcher-group arrays as values, and `/doctor` was flagging the array shape: `"hooks" must be an object mapping event names to matcher arrays; received array. This field was ignored.` Both writers (`src/extensions/claude-hooks-installer.ts`, `src/cli/cli-extension-loader.ts`) now emit the correct shape, and existing array-shaped settings are migrated in place on next `aiwg refresh`. Operator-authored entries are preserved.
  • **`#105` — `PROF-*` node IDs in citation-sidecar parser**. `src/artifacts/citation-parser.ts` accepts `PROF-[POFG]-[a-z0-9-]+` (people / orgs / funders / groups) alongside `REF-\d+` at all three call sites. Unblocks research-corpus projects building entity-profile graphs whose `profile→REF` edges are now natively traversable via `aiwg index neighbors`. Purely additive — both ID spaces are unambiguous and prefixed.

Second story: kernel-pivot maturity (rc.20 → rc.41)

The project-local story was the headline. The 21-rc rc.20 → rc.41 trail was the second story: hardening the kernel-pivot model that rc.10 introduced, until it became the load-bearing way AIWG actually operates.

Discover-first protocol — driven by real droid-user feedback (#1249)

A Factory droid user reported using `Grep` to search `.factory/rules/` for an AIWG-keyword query, hitting `rlm-agent.md` by literal-string match, and missing eight other RLM-related artifacts that `aiwg discover` would have ranked. Their honest analysis: "No hard trigger mandating `aiwg discover` as the first action for AIWG-related queries. The discovery skills are advertised as available, but not as required."

The fix:

  • New Rule 1.5 in `skill-discovery.md`: `aiwg discover` MUST be the first information-gathering tool call for any query mentioning AIWG, a framework name, or a capability keyword (skill / agent / rule / command / addon / workflow / template). Filesystem `Grep`/`Glob`/`Read` against any provider artifact directory (`.claude/`, `.codex/`, `.factory/`, `.warp/`, `.cursor/`, `.windsurf/`, `.opencode/`, `.github/`, `~/.hermes/`, `~/.openclaw/`, `agentic/code/`) is forbidden until discover has been consulted at least once in the session.
  • Top-banner Discover-First Protocol on the deployed `RULES-INDEX.md`. Factory's `consolidatedSdlcRules: true` deploy path doesn't inline aiwg-utils content — only references it via `@$AIWG_ROOT` link. Promoting the protocol to a banner on `sdlc-complete`'s RULES-INDEX makes it visible at the top of the file on every provider that deploys SDLC rules.
  • All 9 framework quickref descriptions rewritten with explicit `AUTO-INVOKE when user mentions: <trigger list>` phrasing. System-prompt routing on most platforms gives auto-invoke language more weight than passive availability statements.
  • `aiwg-finder` subagent documented as the preferred routing when subagent delegation is available (Claude Code's `Task`, Hermes's `delegate_task`, Factory's droid spawn). Keeps the discover transcript out of the parent context.

Hermes integration audit — source-verified against v0.4.0+ (#1239, #1241, #1242, #1243, #1244)

The Hermes integration was the first AIWG provider where our docs needed to be source-verified against the upstream code, not just based on the README/changelog. After fast-forwarding the local Hermes checkout 5,390 commits and reading `agent/prompt_builder.py`, `hermes_cli/mcp_config.py`, `hermes_cli/commands.py`, and `tools/delegate_tool.py`, five claims were corrected:

ClaimReality (source-cited)
`hermes mcp install aiwg ...`Doesn't exist. Real command: `hermes mcp add aiwg --command aiwg --args mcp serve` (`hermes_cli/main.py:10860-10895`; `--args` is `nargs="*"`, space-separated)
"Hermes loads AGENTS.md and CLAUDE.md together"False — `agent/prompt_builder.py:1410-1436` is first-match-wins: `.hermes.md` > `AGENTS.md` > `CLAUDE.md` > `.cursorrules`. Exactly one project-context file loads per turn
"v0.4.0+ has real-time config reload"Partially false — config reload is operator-driven via `/reload-mcp` slash command (`hermes_cli/config.py:1228` `mcp_reload_confirm` flag)
Session reload via chat restart`/reload-skills` and `/reload-mcp` are in-session slash commands (`hermes_cli/commands.py:178`). No chat restart needed
`CONTEXT_FILE_MAX_CHARS` undocumented20,000-char cap per source with head/tail truncation (`agent/prompt_builder.py:1284`)

Concrete deliverables shipped:

  • AGENTS.md is now a 579-byte thin pointer (was 30 KB+ on a typical SDLC deploy) referencing `AIWG.md` and `aiwg discover` / `aiwg show`. Eliminates four warning classes across all 10 AGENTS.md providers (auto-split, spillover, approaches-cap, per-entry sanitizer-rejection).
  • `.hermes.md` twin file diverges from AGENTS.md with a Hermes-MCP-specific suffix pointing readers at `artifact-read`, `aiwg discover/show`, and `delegate_task` instead of the dead-end AIWG.md link (Hermes doesn't auto-load AIWG.md).
  • `aiwg-orchestrate` skill auto-installs to `~/.hermes/skills/` on first deploy. Idempotent on rerun — operator edits preserved. Provides ~95% per-workflow context reduction via `delegate_task`.
  • Hermes Capabilities Reference in the quickstart catalogs 10 capabilities (`/kanban`, `/handoff`, ACP adapter, `/agents`, `/goal`, `/cron`, `/snapshot`, `/background`, gateway platforms, plugin system) with file:line citations and AIWG composition notes.
  • Steward agent gained a "Hermes Composition Reference" routing table for operator-level integration questions.

Per-platform session reload notice (#1240)

Every `aiwg use` now ends with a "Session reload required:" section that names the action, rationale, and consequence per provider — covering all 10 platforms (claude, codex, copilot, cursor, warp, windsurf, factory, opencode, hermes, openclaw). The notice diagnoses the "Agent type 'X' not found" symptom that occurs when a running session predates the most recent deploy.

The Steward agent's Post-Deploy Session Reload table makes this triage rule explicit: when a user reports "Agent type not found" for an agent that exists on disk, the first move is to check whether their session predates the most recent `aiwg use` and instruct them to reload accordingly.

`aiwg-regenerate` promoted to kernel skill (#1245)

The kernel set grew from 9 to 10 self-maintenance ops (`steward`, `aiwg-doctor`, `aiwg-refresh`, `aiwg-status`, `aiwg-help`, `use`, plus the new `aiwg-regenerate`). Natural-language invocation works for "regenerate my CLAUDE.md" without an `aiwg discover` round-trip. Per-provider variants (`aiwg-regenerate-claude`, `aiwg-regenerate-codex`, etc.) stay non-kernel — the umbrella delegates to them.

Publish pipeline fixes (#1246, #1247)

After rc.27, Gitea Release objects stopped being auto-created and public npmjs.org publishes stopped landing — but CI reported green. Two silent-failure bugs:

  • `.gitea/workflows/gitea-release.yml`: doubly-escaped inline JSON body returned `"[]: json: string unexpected end of JSON input"` from Gitea, swallowed by `|| echo "Release may already exist"`. Rewritten with `jq -n` JSON construction + explicit HTTP-code handling (201/200 = created, 409 = already exists, anything else = `exit 1`).
  • `.gitea/workflows/npm-publish.yml`: `npm publish ... 2>&1 | tee ...` returned `tee`'s exit code (always 0) without `set -o pipefail`. Added `defaults.run.shell: bash` at the job level, `set -o pipefail` to all four publish steps, and refined error-pattern allowlist (drops spurious 403 match).

`NPMJS_TOKEN` rotation by the operator closed the loop. Every rc tag from rc.38 forward actually creates a Gitea Release and publishes to public npmjs.org.

Architecture overview docs (#1248)

A new canonical `docs/architecture-overview.md` lands with 8 mermaid diagrams giving the visual mental model:

1. AIWG is a deploy-time tool — runtime-invisible 2. Two-tier skill model — kernel vs standard 3. Discover → show flow (the optional layer) 4. What's optional — Minimal vs Standard vs Full 5. The `.aiwg/` lifecycle 6. Hermes context-file priority (first-match-wins) 7. Multi-platform deploy — one source, ten targets 8. Session reload after `aiwg use`

Cross-linked from `docs/how-it-works.md`, `docs/discovery-and-kernel-skills.md`, `docs/integrations/hermes-quickstart.md`, and the README. Image placeholders at `docs/architecture-overview/images/` ready for polished Gemini-generated illustrations — three prompt-set aesthetics (illustrated computing iconography, monospace/terminal, editorial) catalogued on issue #1248 for whatever channel needs them.

Acknowledgements

The 2026.5.0 work was scoped in epic #1033 with companion issues #1034–#1037 (implementation), #1038–#1044 (decisions), #1045–#1052 (parallel design / docs / test). All children resolved.

Late-cycle bug reports from `@sebuh-infsol` (#107) and the research-papers downstream consumer audit (#105).


Install

# Pre-release (current)
npm install -g aiwg@next         # latest 2026.5.0-rc.X

# Stable (when cut)
npm install -g aiwg              # latest stable

Or use the Claude Code plugin:

/plugin marketplace add jmagly/ai-writing-guide
/plugin install sdlc@aiwg

Reference