Skip to content

v0.9.1 — Review lenses and dissent preservation

Latest

Choose a tag to compare

@EfeAydinalp EfeAydinalp released this 08 Jul 23:03
· 4 commits to master since this release
c6a46e2

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.lock self-version) and the dated CHANGELOG.md section are done
(chore: prepare v0.9.1 release); the repo now reports 0.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; no LICENSE is 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 or PREFERENCES.md machine-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, a schema: 2 without 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 in backend/ was touched by either.
  • No schema change. No schema: 2, no new preference key, no change to backend/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.lock change across PR 6–8 is the
    vibe-council self-version line).
  • Redaction lint stays 0 critical (30 warnings, pre-existing); context check and 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 --version prints vibe-council 0.9.1.
  • vibe lint --redaction reports 0 critical (30 warnings, expected).
  • vibe decisions lint passes.
  • vibe project doctor reports READY.
  • vibe context check scores 21/21.
  • vibe mcp inspect --context --health scores 21/21.
  • uv sync produces no uv.lock diff beyond the intentional self-version sync in this PR.
  • No .council/ artifact (incl. .council/runtime/payloads/ and .council/profile.*)
    staged/committed; no root CLAUDE.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) into master.
  • On the merged master, re-confirm: tests green, vibe --version reports vibe-council 0.9.1, redaction lint 0 critical (30 warnings), decisions lint passes, vibe project doctor
    READY, context check 21/21, MCP health 21/21, and uv sync shows no drift.
  • Verify git status --short and the merged diff carry no private/local artifacts
    (.council/, .council/profile.*, the two untracked private plan files, .env/.venv//
    data/, secrets, generated packs/exports, root CLAUDE.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, then git push origin v0.9.1.
  • Create the GitHub Release for v0.9.1 manually, 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.