Skip to content

refactor(bundle): rename built-in bundle to amplifier-agent-anchors - #151

Merged
Salil Das (sadlilas) merged 3 commits into
mainfrom
feat/rename-bundle-to-amplifier-agent-anchors
Aug 26, 2026
Merged

refactor(bundle): rename built-in bundle to amplifier-agent-anchors#151
Salil Das (sadlilas) merged 3 commits into
mainfrom
feat/rename-bundle-to-amplifier-agent-anchors

Conversation

@sadlilas

@sadlilas Salil Das (sadlilas) commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Why

The built-in bundle is called amplifier-agent-behavioral-anchor. That name is a fossil.

Date Event
2026-06-03 amplifier-foundation adds experiments/behavioral-anchor
2026-06-17 this repo vendors it at v0.7.0, naming the bundle amplifier-agent-behavioral-anchor
2026-06-23 foundation promotes it to the published anchors bundle (bundles/anchors/)
2026-07-22 upstream registers the skills-bundle skills source
2026-08-03 upstream composes Context Intelligence by default

We vendored the experiment six days before it was renamed, and every reference here has pointed at the pre-promotion name ever since.

Part 1 — the rename

amplifier-agent-behavioral-anchoramplifier-agent-anchors. The amplifier-agent- prefix is this repo's convention (the name before this one was amplifier-agent-builtin) and keeps the vendored variant distinct from foundation's anchors.

Six references move together, because the three @mentions resolve against the bundle's own name:

File What
src/amplifier_agent_lib/bundle/bundle.md bundle.name
src/amplifier_agent_lib/bundle/bundle.md @…:skills in tool-skills.config.skills
src/amplifier_agent_lib/bundle/bundle.md @…:modes in hooks-mode.config.search_paths
src/amplifier_agent_lib/bundle/bundle.md @…:context/system.md — the system prompt load
scripts/verify-wheel.py the bundle-name assertion (would fail CI otherwise)
docs/LAYERS_AND_RELEASES.md the documented bundle name

@…:skills and @…:modes have a safety net — _runtime.py prepends the absolute BUNDLE_DIR/skills and BUNDLE_DIR/modes paths, built-ins winning first-match. @…:context/system.md has none. A mismatch there means the principle-led system prompt silently fails to load, which is why all six are in one commit.

Part 2 — re-point the upstream comparison, and re-diff it

The manifest's "AAA-specific modifications from upstream" table diffed against experiments/behavioral-anchor/behavioral-anchor.md — a file frozen since June. Anyone reconciling this bundle against upstream has been reading the wrong file for two months.

Seven references now point at bundles/anchors/bundle.md, across bundle.md, bundle/__init__.py, and docs/spec/bundle-and-cache.md. More importantly, the table has been rewritten from an actual comparison rather than re-pointed and left stale. What changed:

Newly recorded as AAA additions (upstream has neither, and neither was in the old table):

  • 9 provider install-stubs. Upstream declares no providers at all. The engine needs them present so prepare(install_deps=True) clones and installs each one.
  • hooks-routing — the model-role routing matrix, inlined per Strategy 1 rather than included from @routing-matrix.

Reclassified from "addition" to "divergence":

  • Context Intelligence. The old table presented hook-context-intelligence as something we added on top of an upstream that lacked it. Upstream has composed it by default since 2026-08-03, as two behavior includes — logging and navigation. We declare the hook module inline and take the logging half only, so we do not get the session-navigator agent. The workspace-JSONL-alignment rationale (invariant I8) is unchanged.

Newly recorded divergence:

  • Skills sources. Upstream registers the amplifier-bundle-skills skills directory so its /command skills resolve. We vendor a curated subset inside the wheel instead — code-review, council, and the 6 council lenses — injected by _runtime.py as an absolute path. Consequence, now stated explicitly: council-here, mass-change, session-debug, and roughly 30 other curated skills are deliberately absent. This is a curation choice, not a gap; adding the source would be a separate decision about /command surface area.

Unchanged and still accurate: default_provider: anthropic, tool-mcp added, and hooks-streaming-ui / hooks-todo-display / hooks-approval / behaviors/logging.yaml dropped.

Also noted: upstream namespaces its roster as anchors:<name>; ours are bare because the definitions are vendored locally. Same six agents.

What is deliberately not changed

  • CHANGELOG.md history. The five references in the v0.7.0 entry record what actually shipped. Renaming them would falsify the record. A new [Unreleased] entry describes this change instead.
  • ## Behavioral Principles in context/system.md — that is the concept, and it is identical upstream.
  • Incidental uses of the word "behavioral" in docs/CLI.md, AGENTS.md, and the new-feature skill.

Verification

Check Result
./scripts/verify-wheel.py PASS — all 6 checks against the built wheel, including the renamed bundle-name assertion
Zero stale identity references outside CHANGELOG.md confirmed by grep
Frontmatter parses; 9 providers / 11 tools / 7 hooks / 6 agents intact confirmed
All three self-referencing @mentions match bundle.name and resolve to files that exist on disk confirmed — this is the failure mode the atomic group exists to prevent

Not yet run: a live session start confirming the principle block appears at the head of the system prompt. verify-wheel cannot cover it — it only checks that the file contains the declared name, never that the mentions resolve at runtime. The static resolution check above is the closest deterministic proxy. Worth one manual session before this leaves draft.

Impact

No wire-protocol change and no user-facing behavior change. The prepared-bundle cache key is (aaa_version, sha256(bundle.md)), so existing installs re-resolve once on next run — self-healing, no user action.


Release: amplifier-agent 0.16.0

This PR doubles as the release PR. RELEASING.md allows the bump to be folded into the change PR being released, and it is.

Artifacts

Artifact Version Tag Released here?
Engine (amplifier-agent) 0.15.1 → 0.16.0 v0.16.0 yes
TS SDK (amplifier-agent-ts) 0.7.1 (unchanged) wrapper-v* no — wrappers/typescript/ untouched
Py SDK (amplifier-agent-py) 0.3.0 (unchanged) py-v* no — wrappers/python-py/ untouched

Engine-only. The root package.json (amplifier-agent-client-ts) is untouched, as required.

What is in the range

v0.15.1..HEAD — four commits, nine files:

PROTOCOL_VERSION is unchanged at 0.3.0 — identical at v0.15.1 and at HEAD. No cross-component coordination required. The amplifier-foundation git pin is also unchanged.

Version choice

Minor, not patch. Direct precedent: v0.7.0 was a minor bump for "Built-in bundle replaced ... bundle name all change". This release changes the built-in bundle's name and the content of every session's system prompt. No wire break, no removed flag, no envelope change, so not major.

Sweep

Clean — nothing removed. No plan/scratch/WIP files, no .log/.bak/.orig/.DS_Store, no absolute host paths, no internal URLs or session identifiers, no credential-shaped strings. No new print(...) on a CLI path (invariant #5). No new files under src/amplifier_agent_lib/bundle/, so the force-include invariant (#6) is not engaged.

Gate

Gate Result
ruff check PASS
ruff format --check PASS — 167 files
pyright src/ PASS — 0 errors, 0 warnings
verify-codegen PASS — spec.md + 32 schemas current
verify-wheel PASS — 6/6 against the built amplifier_agent-0.16.0 wheel
verify-parity PASS — 10/10 fixtures, Python and TypeScript runners agree
verify-wrapper not run locally — bun is not installed on the release host. CI's TypeScript wrapper tests job covers it and is green, and wrappers/ is untouched in this range.

Beyond the standard gate, the rename was verified end to end in an isolated container built from this branch: the bundle resolves as amplifier-agent-anchors, @amplifier-agent-anchors:context/system.md resolves to the installed file, and a live model session recited all four behavioral principles — proving the system prompt reaches the model. That path has no fallback in _runtime.py, so it could not be proven statically.

Downstream: amplifier-app-opencode floor moves to 0.16.0

MIN_AGENT_VERSION goes 0.15.1 -> 0.16.0 as an adoption bump, so AGENT_PINNED_REF -- the exact tag opencode's launch-time self-heal installs -- tracks the current engine instead of drifting a release behind.

This is not a capability requirement. Nothing opencode consumes changed here: the HTTP face, GET /v1/models / /v1/skills / /v1/modes, host-config handling, PROTOCOL_VERSION, and the run stdout envelope are all untouched, and a code search across amplifier-app-opencode, amplifier-app-paperclip, and amplifier-app-nanoclaw finds zero references to the renamed bundle.

Adoption is the stated reason, and there is direct precedent: the current 0.15.1 floor was itself an adoption bump. prereqs.py says so in the ledger -- "0.15.1 is an adoption bump rather than a capability requirement: nothing here depends on what it changed ... The floor moves so AGENT_PINNED_REF ... tracks the current engine instead of drifting a release behind." The comment block for 0.16.0 will say the same plainly rather than inventing a capability that forced it.

Ordering is forced. AGENT_PINNED_REF = f"v{MIN_AGENT_VERSION}" resolves to v0.16.0, and prereqs.py performs uv tool install --from git+<repo>@v0.16.0 during self-heal. If the floor lands before that tag exists, every opencode launch tries to install a tag that 404s. The file states the rule itself: "to adopt a newer agent, bump both in one deliberate PR (after the tag is cut upstream)." So: merge this PR, push v0.16.0, and only then open the opencode floor PR -- which is exactly where amplifier-agent-finish-release-process Phase 4 puts it.

amplifier-app-paperclip and amplifier-app-nanoclaw caret-pin amplifier-agent-ts, which is not being released, so nothing propagates to them.

Merging does not publish

Publication is triggered by the tag, not the merge. After this merges, v0.16.0 is pushed from the tip of main, which fires publish-python.yml (PyPI) and release-notes.yml (GitHub Release). Since install.sh and amplifier-agent update resolve through the GitHub Releases API, the GitHub Release is what users actually receive.

Salil Das (sadlilas) and others added 3 commits August 25, 2026 16:50
The built-in bundle was named amplifier-agent-behavioral-anchor. That name
is a fossil: this repo vendored the manifest on 2026-06-17 from
amplifier-foundation's experiments/behavioral-anchor, and foundation
promoted that experiment to the published `anchors` bundle six days later
(bundles/anchors/). Every reference here has pointed at the pre-promotion
name since.

PART 1 -- the rename. Six references move together, because the three
@mentions resolve against the bundle's own name:
  - bundle.md: bundle.name
  - bundle.md: @...:skills           (tool-skills.config.skills)
  - bundle.md: @...:modes            (hooks-mode.config.search_paths)
  - bundle.md: @...:context/system.md
  - scripts/verify-wheel.py: the bundle-name assertion
  - docs/LAYERS_AND_RELEASES.md: the documented name

@...:skills and @...:modes have a safety net -- _runtime.py prepends the
absolute BUNDLE_DIR/skills and BUNDLE_DIR/modes paths. @...:context/system.md
has none, so a mismatch there silently drops the entire system prompt. Hence
one commit.

PART 2 -- re-point the upstream comparison, and re-diff it. The manifest's
"AAA-specific modifications from upstream" table diffed against a file frozen
since June. Seven references now point at bundles/anchors/bundle.md, and the
table is rewritten from an actual comparison:

  - NEW additions recorded: 9 provider install-stubs (upstream declares none)
    and hooks-routing (upstream has no routing matrix).
  - Context Intelligence reclassified from "addition" to "divergence":
    upstream has composed it by default since 2026-08-03 as two behavior
    includes (logging + navigation). We declare the hook module inline and
    take the logging half only -- no session-navigator agent.
  - NEW divergence recorded: skills sources. Upstream registers the
    amplifier-bundle-skills skills dir; we vendor a curated subset in the
    wheel, so council-here, mass-change, session-debug and ~30 other curated
    skills are deliberately absent.
  - Unchanged and still accurate: default_provider, tool-mcp added, and the
    four dropped hooks/behaviors.

Deliberately untouched: CHANGELOG history (it records what shipped at
v0.7.0), "## Behavioral Principles" in context/system.md (the concept, same
upstream), and incidental uses of the word.

Verified: ./scripts/verify-wheel.py PASS (6/6 against the built wheel);
zero stale identity refs outside CHANGELOG; frontmatter parses with 9
providers / 11 tools / 7 hooks / 6 agents; all three self-referencing
@mentions match bundle.name and resolve to files that exist.

No wire-protocol or user-facing behavior change. The cache key is
(aaa_version, sha256(bundle.md)), so installs re-resolve once on next run.

Generated with [Amplifier](https://github.com/microsoft/amplifier)
Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
Folds the release into this change per RELEASING.md ("the bump may be its
own release PR or folded into the change PR being released"), so the rename
reaches users via `amplifier-agent update` rather than waiting for a
separate release PR.

  - pyproject.toml: 0.15.1 -> 0.16.0
  - CHANGELOG.md: [Unreleased] promoted to [0.16.0]

Also addresses review feedback on the previous commit: the bundle.md
description had grown a 60-line narrative -- vendoring history, a full
upstream-divergence table, and cache-path detail already stated in
bundle/__init__.py. None of it affects how the bundle loads, and bundle.md
is a manifest, not a document. Cut to 15 lines: what the bundle is, how
behavior is shaped, the inline-declaration decision, the cache-key warning,
and a pointer to the spec.

The divergence detail moves to docs/spec/bundle-and-cache.md, under the
section that already specifies the vendored manifest, as three tables
(added / dropped / shaped differently) rather than prose. Same facts, right
layer.

Dropped the undefined "AAA-specific" shorthand from every line this change
touches -- the abbreviation is used across the repo but defined nowhere.

Generated with [Amplifier](https://github.com/microsoft/amplifier)
Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
The 0.16.0 entry covered the bundle rename and the description trim but not
the change that started this work: removing the descriptive prose from the
head of every session's system prompt. That shipped in this release range and
is user-observable -- the model's first instruction changed -- so it needs an
entry of its own rather than being folded into the rename.

Generated with [Amplifier](https://github.com/microsoft/amplifier)
Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
@sadlilas
Salil Das (sadlilas) marked this pull request as ready for review August 26, 2026 00:51
@sadlilas
Salil Das (sadlilas) merged commit b2127ca into main Aug 26, 2026
4 checks passed
@sadlilas
Salil Das (sadlilas) deleted the feat/rename-bundle-to-amplifier-agent-anchors branch August 26, 2026 00:52
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.

1 participant