vibe-council v0.9.1 — Describe the personas (documentation only)
Ready for the v0.9.1 tag — not yet tagged. The version bump (
backend/__init__.py,
pyproject.toml,uv.lockself-version) and the datedCHANGELOG.mdsection are done
(chore: prepare v0.9.1 release); the repo now reports0.9.1. The git tag and the GitHub
Release are still a separate, manual step — see §"Final release checklist" below and
docs/release-checklist.md.
The second release of the v0.9.x line, closing its theme — "Apply the proven; describe the
personas; defer their behavior." v0.9.0 applied the four proven preference keys; v0.9.1
describes the council review lenses as pure documentation and designs the safety framework any
future persona behavior would have to satisfy — it adds no runtime, no schema, and no behavior of
any kind. Based on and crediting karpathy/llm-council.
No commercial-clearance claim. License/provenance remains an unresolved "Question 0"
commercial gate; noLICENSEis added.
Theme
Review lenses are now documented as a shared human/agent review vocabulary. Persona/lens
behavior — prompt influence, ranking/synthesis influence, a --persona flag, a preset schema —
remains deferred to v0.10.x or later, and only behind the dissent-preservation framework this
release also designs (docs only, no implementation).
What this release adds
PR 6 — Council review lenses (documentation only)
docs/fable/council-review-lenses.md documents review
lenses as a shared human/agent review vocabulary:
- Three primary, elaborated lenses: Security Guardian, Cost Skeptic, Local-first
Guardian — each a short purpose plus emphasis/questions a reviewer can hold in mind. - Four future stubs (named for vocabulary only, not elaborated): Product Strategist, UX/User
Advocate, Risk Officer, Commercialization Lens. - Documentation only. A pinned header and a binding envelope state a lens is "a human
reviewer's mental lens, not a command" — not applied, not schema, not validated. A lens
never changes prompt construction, peer ranking, chairman synthesis, model/provider selection, the
preference reader/validator orPREFERENCES.mdmachine-block semantics, the guide/context-export
output, or the Workbench/executor/guard/trust boundary. It may only add scrutiny (tighten-only);
it can never suppress or outrank another lens's dissent, or loosen a safety rule; it creates
or reads no.council/profile.*store; it implies no UI.
PR 7 — v0.10.x dissent-preservation framework design sketch (documentation only)
docs/fable/v0.10.x-dissent-preservation-sketch.md
specifies — design only, no implementation — the safety framework any future council
persona/lens behavior must satisfy before it could ship:
- Threat model for future lens/persona behavior: reframing bias, emphasis-as-suppression, seat
crowd-out, cumulative bias across stages, and persona-text-as-injection. - How a lens can accidentally suppress dissent (an emergent failure, not an explicit one) and
why "more scrutiny" is not automatically "more safety" — attention is finite, and narrowing a
frame can reduce total coverage even when every word reads as "be more careful." - Structural rules: additive collect-stage-only, own-seat-only, ranking/synthesis
persona-blind, no hidden prompt mutation, default-off/feature-flagged, trust boundary untouched. - Content rules: no suppression/override language, no reference to other seats/ranking/
synthesis, additive-only framing, length-bounded, curated (not free-form). - Dissent-canary test ideas: a seeded objection must still surface verbatim with every persona
enabled; injection-shaped persona text is rejected; ranking/synthesis inputs stay byte-identical
with/without a persona; an off-state golden matches the pre-persona baseline. - Observability/audit requirements (persona use labeled in stage output and usage reporting),
override + rollback rules (explicit CLI/user choice always wins, per-invocation override,
feature-flag default-off, a reversible kill-switch), and acceptance criteria that gate any
future persona-behavior PR (a merge gate, not polish). - An honest feasibility verdict: partly feasible (the structural/content rules and most of the
canary suite are ordinary engineering), partly a research problem (reframing bias is not
fully catchable by output-diff tests — there is no deleted artifact to detect). Cancellation is
on the table, not just deferral, if dissent-preservation proves infeasible; a persona-free
fallback (concurrent councils with different preference sets, compared by the user) is recorded
as an alternative design, not implemented. - Stop conditions that force a full council review (persona text reaching ranking/
synthesis, silent prompt mutation, suppression of a minority opinion, aschema: 2without its
own reviewed spec, an on-by-default persona, a new local store/UI/network surface).
council-review-lenses.md links the sketch.
PR 8 — v0.9.1 release prep (this release)
Version bump (backend/__init__.py/pyproject.toml/uv.lock self-version, one line, no
dependency-graph change), a dated CHANGELOG.md [0.9.1] section, this release note, and README/
vault (STATUS.md/PROGRESS.md/ROADMAP.md/RELEASES.md) + docs/context/agent-brief.md
pointers. Release metadata + docs only.
Safety posture
- No persona/council behavior. No lens is parsed, selected, or applied to any command; nothing
reads a persona into prompt construction, ranking, or synthesis. - No prompt mutation, no ranking/synthesis change. Both files are pure documentation/design —
no code path inbackend/was touched by either. - No schema change. No
schema: 2, no new preference key, no change tobackend/preferences.py
(reader or validator) — the v0.8.2 schema v1 stays frozen, exactly as v0.9.0 left it. - No
.council/profile.*local store, no UI/dashboard, no network/LAN/mobile/hosted surface. - No Workbench/executor/guard/trust change. The deterministic trust boundary, the guarded
executor, the command allowlist, and approval-separate-from-execution are untouched. - No dependency change (stdlib-only; the only
uv.lockchange across PR 6–8 is the
vibe-councilself-version line). - Redaction lint stays 0 critical (30 warnings, pre-existing);
context checkand MCP health
stay 21/21.
Explicit non-goals (deferred, not started in this release)
No active review-lens/persona runtime of any kind · no persona schema objects or persona
validator · no prompt emphasis · no ranking/synthesis influence · no UI/dashboard · no hosted /
network / LAN / mobile mode · no .council/profile.* local store · no Workbench trust-boundary or
executor change · no command-allowlist growth · no vector DB / database stack · no /council real
command. v0.9.1 documents the lenses and designs the future safety framework, and nothing more —
persona behavior stays a v0.10.x-or-later decision, gated behind the dissent-preservation
framework's acceptance criteria.
Release checklist (must be clean before tagging)
-
uv run python -m unittest discover -s tests -t .is green (1020 tests). -
uv run python -m backend.cli --versionprintsvibe-council 0.9.1. -
vibe lint --redactionreports 0 critical (30 warnings, expected). -
vibe decisions lintpasses. -
vibe project doctorreports READY. -
vibe context checkscores 21/21. -
vibe mcp inspect --context --healthscores 21/21. -
uv syncproduces nouv.lockdiff beyond the intentional self-version sync in this PR. - No
.council/artifact (incl..council/runtime/payloads/and.council/profile.*)
staged/committed; no rootCLAUDE.md/AGENTS.md/FABLE.md; no private/local plan file
staged.
Final release checklist (manual steps, after this PR merges)
These are not automated by this PR — a maintainer performs them once the checklist above is
clean on master:
- Merge this PR (
chore: prepare v0.9.1 release) intomaster. - On the merged
master, re-confirm: tests green,vibe --versionreportsvibe-council 0.9.1, redaction lint 0 critical (30 warnings), decisions lint passes,vibe project doctor
READY,context check21/21, MCP health 21/21, anduv syncshows no drift. - Verify
git status --shortand the merged diff carry no private/local artifacts
(.council/,.council/profile.*, the two untracked private plan files,.env/.venv//
data/, secrets, generated packs/exports, rootCLAUDE.md/AGENTS.md/FABLE.md). - Create an annotated git tag:
git tag -a v0.9.1 -m "vibe-council v0.9.1"on the merge
commit, thengit push origin v0.9.1. - Create the GitHub Release for
v0.9.1manually, using this document
(docs/releases/v0.9.1.md) as the release-notes body.
Known limitations
- Documentation only, by design. Neither the lenses nor the dissent-preservation sketch change
any runtime behavior; there is nothing to dogfood beyond reading the docs. - The feasibility verdict is honest, not reassuring. Reframing bias — a persona narrowing a
seat's attention so a dissenting thought never forms — is flagged as a research problem, not
solved by this release. v0.10.x may find persona behavior infeasible and cancel it rather than
ship it. - No hosted/team/mobile/voice — deferred to later phases.
Next after v0.9.1
Cut the v0.9.1 tag/GitHub Release. v0.9.2 stays reserved as an optional hardening patch slot
— nothing is scheduled there. The next scoped work is v0.10.x, its own council-backed +
Fable-architected line for persona behavior, gated on the dissent-preservation framework's
acceptance criteria in v0.10.x-dissent-preservation-sketch.md
— including, per that document's honest verdict, the possibility that persona behavior is not
pursued at all.