refactor(bundle): rename built-in bundle to amplifier-agent-anchors - #151
Merged
Salil Das (sadlilas) merged 3 commits intoAug 26, 2026
Merged
Conversation
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>
Salil Das (sadlilas)
marked this pull request as ready for review
August 26, 2026 00:51
Salil Das (sadlilas)
deleted the
feat/rename-bundle-to-amplifier-agent-anchors
branch
August 26, 2026 00:52
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The built-in bundle is called
amplifier-agent-behavioral-anchor. That name is a fossil.amplifier-foundationaddsexperiments/behavioral-anchoramplifier-agent-behavioral-anchoranchorsbundle (bundles/anchors/)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-anchor→amplifier-agent-anchors. Theamplifier-agent-prefix is this repo's convention (the name before this one wasamplifier-agent-builtin) and keeps the vendored variant distinct from foundation'sanchors.Six references move together, because the three
@mentionsresolve against the bundle's own name:src/amplifier_agent_lib/bundle/bundle.mdbundle.namesrc/amplifier_agent_lib/bundle/bundle.md@…:skillsintool-skills.config.skillssrc/amplifier_agent_lib/bundle/bundle.md@…:modesinhooks-mode.config.search_pathssrc/amplifier_agent_lib/bundle/bundle.md@…:context/system.md— the system prompt loadscripts/verify-wheel.pydocs/LAYERS_AND_RELEASES.md@…:skillsand@…:modeshave a safety net —_runtime.pyprepends the absoluteBUNDLE_DIR/skillsandBUNDLE_DIR/modespaths, built-ins winning first-match.@…:context/system.mdhas 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, acrossbundle.md,bundle/__init__.py, anddocs/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):
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":
hook-context-intelligenceas 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 thesession-navigatoragent. The workspace-JSONL-alignment rationale (invariant I8) is unchanged.Newly recorded divergence:
amplifier-bundle-skillsskills directory so its/commandskills resolve. We vendor a curated subset inside the wheel instead —code-review,council, and the 6 council lenses — injected by_runtime.pyas 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/commandsurface area.Unchanged and still accurate:
default_provider: anthropic,tool-mcpadded, andhooks-streaming-ui/hooks-todo-display/hooks-approval/behaviors/logging.yamldropped.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.mdhistory. 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 Principlesincontext/system.md— that is the concept, and it is identical upstream.docs/CLI.md,AGENTS.md, and the new-feature skill.Verification
./scripts/verify-wheel.pyCHANGELOG.md@mentionsmatchbundle.nameand resolve to files that exist on diskNot yet run: a live session start confirming the principle block appears at the head of the system prompt.
verify-wheelcannot 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.mdallows the bump to be folded into the change PR being released, and it is.Artifacts
amplifier-agent)v0.16.0amplifier-agent-ts)wrapper-v*wrappers/typescript/untouchedamplifier-agent-py)py-v*wrappers/python-py/untouchedEngine-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:docs(skill): finish-release opencode gate points at a check that exists. Repo-internal dev skill under.amplifier/, not shipped in the wheel, so no changelog entry.PROTOCOL_VERSIONis unchanged at 0.3.0 — identical atv0.15.1and at HEAD. No cross-component coordination required. Theamplifier-foundationgit 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 newprint(...)on a CLI path (invariant #5). No new files undersrc/amplifier_agent_lib/bundle/, so theforce-includeinvariant (#6) is not engaged.Gate
ruff checkruff format --checkpyright src/verify-codegenverify-wheelamplifier_agent-0.16.0wheelverify-parityverify-wrapperbunis not installed on the release host. CI's TypeScript wrapper tests job covers it and is green, andwrappers/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.mdresolves 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-opencodefloor moves to 0.16.0MIN_AGENT_VERSIONgoes0.15.1->0.16.0as an adoption bump, soAGENT_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 therunstdout envelope are all untouched, and a code search acrossamplifier-app-opencode,amplifier-app-paperclip, andamplifier-app-nanoclawfinds 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.pysays 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 tov0.16.0, andprereqs.pyperformsuv tool install --from git+<repo>@v0.16.0during 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, pushv0.16.0, and only then open the opencode floor PR -- which is exactly whereamplifier-agent-finish-release-processPhase 4 puts it.amplifier-app-paperclipandamplifier-app-nanoclawcaret-pinamplifier-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.0is pushed from the tip ofmain, which firespublish-python.yml(PyPI) andrelease-notes.yml(GitHub Release). Sinceinstall.shandamplifier-agent updateresolve through the GitHub Releases API, the GitHub Release is what users actually receive.