proposals: accept bullets on experiences; find_bullets hosted-mirror doc flips - #102
Conversation
…doc flips The cloud vault_propose applier gained `bullets` in its experience payload allowlist (traitprint-cloud#1737); mirror it here so the two validators stay in lock-step: _EXPERIENCE_KEYS gains "bullets", with shape validation at apply via BulletSchema through the entity model (minimal agent bullets gain generated ids and model defaults; a payload list replaces the inventory, [] clears it). Also flip the hosted-mirror doc clauses now that find_bullets is served by the cloud MCP server (traitprint-cloud#1736, deployed 2026-07-26): AGENTS.md and GEMINI.md no longer call it local-only. No contract revision bump — $defs/proposal.payload is free-form by design; the per-kind key allowlists live in traitprint.proposals and the hosted vault_propose. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RdYoLHB9CWNAdf8gZVjShZ
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 455407f20d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "skill_links", | ||
| "scope", | ||
| "artifact_links", | ||
| "bullets", |
There was a problem hiding this comment.
Update the manual for bullet proposals
Once this allowlist ships, the canonical AGENTS.md still tells agents under the bullet instructions to hand-edit them because proposal support is a future follow-up. In an agents init project, an agent staging extracted resume bullets may therefore bypass the newly supported add_experience/update_experience proposal path and its user-review gate. Update that guidance to document the proposal payload and its replace/clear semantics.
AGENTS.md reference: AGENTS.md:L343-L347
Useful? React with 👍 / 👎.
Why
Two lock-step follow-ups to the cloud bullets work (traitprint-cloud#1736 / #1737):
vault_proposeapplier now acceptsbulletsin experience payloads — the CLI's mirrored validator must gain the key at the same time (the "Don't drift from cloud" constraint:proposals.pymirrors the hostedvault_proposevalidation).find_bulletsis now served by the hosted MCP server, so the "local-only until its hosted mirror ships" doc clauses are stale.What changed
proposals.py—_EXPERIENCE_KEYSgains"bullets"(betweenartifact_linksandsource, the vault byte order). Shape validation happens at apply viaBulletSchemathroughExperienceSchema.model_validate, like every other experience field: minimal agent bullets ({text}only) gain generated ids and model defaults; a payload list REPLACES the inventory and[]clears it — the same semantics as the cloud applier'sprepareBullets. Stories keep rejecting the key.find_bulletshosted-mirror caveats: the hosted mirror shipped 2026-07-26 with the same filters, no default-lens auto-apply, the same deterministic ordering, and per-bulletevidenced/disputedtrust signals. GEMINI.md's hosted read-tool list now namesfind_bullets.[Unreleased].No contract revision bump:
$defs/proposal.payloadis free-form by design ("the reference validation lives in traitprint.proposals / the hosted vault_propose"), and the experience entity$defsalready carry bullets since revision 1.7.Testing
source: "manual"); update replaces and[]clears; blank/over-cap/over-count bullets hard-reject at apply with nothing mutated.pytest -q: 1092 passed.ruff: clean.mypy: only the two known pre-existingunused-ignoreartifacts inmining.py(environment-specific, untouched by this change; CI's matrix is clean).🤖 Generated with Claude Code
https://claude.ai/code/session_01RdYoLHB9CWNAdf8gZVjShZ
Generated by Claude Code