You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 4753b85
Browse filesBrowse the repository at this point in the historyBrowse files
fix(manifest): attach ModelHarnessManifest on every mode's result (#50)
The auditable ModelHarnessManifest was documented as first-class on every
CouncilResult ("rides on every result, not behind a debug flag"), but only the
ask/synthesize path built one. debate, adversarial, and vote constructed their
result directly in modes.py and returned with manifest=None, so the invariant
silently drifted for 3 of 5 modes and no test guarded it.
Make manifest attachment a true invariant with a single-site fix: all five
modes funnel through Council._cached_run, which now calls a new
Council._ensure_manifest on every returned result. It is a no-op for the
synthesize/raw path (which builds its own richer manifest in _ask_uncached so
it can populate verdict-provenance slots and re-stamp secret-safety), and fills
the manifest for debate/adversarial/vote from the resolved membership +
collected answers. This also covers the zero-members early return and the
cache-hit path, so no result can escape without a secret-safety-VERIFIED
manifest.
Verdict scope is deliberately unchanged: the clustering verdict still runs on
synthesize/ask only. It is not forced onto adversarial (which already emits a
judge verdict, so it would double-count the same adjudication) and is deferred
on debate/vote; rationale recorded in PDD 4a.
Add regression tests (tests/test_manifest_all_modes.py) asserting
manifest is not None and secret_safety == verified_no_secrets for debate,
adversarial, and vote, including the zero-members and cache-hit paths.
Reconcile docs so (a) the manifest-on-every-result claim is now true and (b)
the constrained-choice vote mode is documented as shipped (CAC-09 / #3), not
"absorbed by provider_votes": README, SYSTEM_CONTEXT_DIAGRAM, PDD,
DOCUMENTATION_INDEX, and CHANGELOG.
| Packaging |[`pyproject.toml`](pyproject.toml)| hatchling build, deps (httpx, pydantic, rich, typer, pyyaml — no LLM SDK), dev extras, console script, pytest config. License: MIT. **PyPI distribution name `conclave-cli`** (the name `conclave` is an unrelated project); command + import stay `conclave`. |
| Changelog |[`CHANGELOG.md`](CHANGELOG.md)| Keep-a-Changelog history per release (SemVer). The `[1.1.0]`(unreleased) entry covers the auditable council — CouncilResult v2, deterministic consensus, native structured output, the manifest, and the absorbed `vote` mode; the 1.0.0 entry covers the distribution rename, key-leak hardening, synthesizer versioning, and release engineering. |
84
+
| Changelog |[`CHANGELOG.md`](CHANGELOG.md)| Keep-a-Changelog history per release (SemVer). The `[Unreleased]` entry covers the manifest-on-every-result invariant fix and the `vote`-mode-shipped doc reconciliation; `[1.1.0]` covers the auditable council — CouncilResult v2, deterministic consensus, native structured output, the manifest; the 1.0.0 entry covers the distribution rename, key-leak hardening, synthesizer versioning, and release engineering. |
85
85
| Dev lockfile |[`requirements-dev.lock`](requirements-dev.lock)| Hash-pinned dev + runtime tree for reproducible installs/CI. Regenerate via `uv pip compile --universal --generate-hashes --python-version 3.11 --extra dev pyproject.toml -o requirements-dev.lock`. |
86
86
| License |[`LICENSE`](LICENSE)| MIT License. Copyright (c) 2026 Ernest Provo. Matches the `pyproject.toml` license field. |
87
87
| Security policy |[`SECURITY.md`](SECURITY.md)| BYO-keys vulnerability reporting policy: how to report, scope, and the key-handling guarantees consumers can rely on. |
| 2026-07-13 |**Manifest-on-every-result invariant fix + doc reconciliation.**`ModelHarnessManifest` now attaches on all five modes (was `None` for `debate`/`adversarial`/`vote`) via a single-site fix at `Council._cached_run` → new `_ensure_manifest`; regression tests in `tests/test_manifest_all_modes.py`. Docs corrected so the manifest-on-every-result claim is accurate and the `vote` mode is documented as **shipped** (CAC-09 / #3), not "absorbed" — across README, `SYSTEM_CONTEXT_DIAGRAM.md`, PDD (§1/§3/§4a/§8/§9/§12), and `CHANGELOG.md` (`[Unreleased]`). Verdict scope unchanged (still `synthesize`/`ask`-only; not layered on `adversarial`). |
103
104
| 2026-06-21 |**v1.1 docs pivot — the auditable multi-model council.** PDD reframed to the auditable-council wedge (new §4a: CouncilResult v2, deterministic `position_cluster_ratio_v1` consensus, native + fallback structured output, the verdict-optional rule, the secret-free `ModelHarnessManifest`); `vote` mode marked **absorbed** by `provider_votes` across PDD §1/§4/§8/§9/§12; demand-gated v1.2 "Operable Council" roadmap. System Context diagram gains the verdict pipeline + manifest (mermaid re-validated). README gains an "Auditable verdict" section (CLI panel + library example). `CHANGELOG.md``[1.1.0]` added. v0.x mode-detail prose archived to [`docs/archive/pdd-v0.x-modes-detail.md`](docs/archive/pdd-v0.x-modes-detail.md) to keep the PDD under 500 lines. New modules documented: `verdict.py`, `agreement.py`, `verdict_synthesis.py`, `manifest.py`. |
104
105
| 2026-06-14 | v1.0.0 release. Version bump 0.3.0 → 1.0.0; new `CHANGELOG.md` (Keep-a-Changelog). Integrates the three v1.0 PRs below. |
105
106
| 2026-06-14 | v1.0 distribution + release-engineering (PR-A): PyPI distribution name → `conclave-cli` (command + import stay `conclave`); OIDC Trusted-Publishing release workflow (`.github/workflows/release.yml`, SHA-pinned, PEP 740 attestations, Sigstore keyless signing, inert until a Release fires + publisher configured); `pip-audit` fail-closed CI job in `test.yml`; hash-pinned `requirements-dev.lock`; `RELEASING.md` operator runbook. |
0 commit comments