Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Private security report
url: https://github.com/apcar/model-council/security/advisories/new
url: https://github.com/apcar/CouncilLogic/security/advisories/new
about: Report suspected vulnerabilities privately.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ All notable public changes to CouncilLogic are recorded here.

### Changed

- Replaced the fixed-member square logo with a provider-count-neutral
CouncilLogic mark and PageParcel-sized README header, and made the public
product framing independent of the current provider roster.
- The default live council now uses five proposals, five juries, and one
synthesis. Existing file-backed four-provider configurations remain
four-provider until they add an explicit `[providers.xai]` section.
Expand Down
6 changes: 3 additions & 3 deletions CITATION.cff
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
cff-version: 1.2.0
message: "If you use this software, please cite it using the metadata below."
title: "Model Council"
title: "CouncilLogic"
type: software
authors:
- family-names: "Greene"
given-names: "Andrew"
version: 0.2.0a1
date-released: 2026-07-26
url: "https://github.com/apcar/model-council"
repository-code: "https://github.com/apcar/model-council"
url: "https://github.com/apcar/CouncilLogic"
repository-code: "https://github.com/apcar/CouncilLogic"
license: AGPL-3.0-only
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Contributing

Thank you for helping improve Model Council. This page is general information,
Thank you for helping improve CouncilLogic. This page is general information,
not legal advice.

## Welcome now
Expand Down
2 changes: 1 addition & 1 deletion LICENSING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Licensing

Model Council is licensed under the GNU Affero General Public License
CouncilLogic is licensed under the GNU Affero General Public License
version 3 only, using the exact SPDX identifier `AGPL-3.0-only`. The complete
license text is in [LICENSE](LICENSE).

Expand Down
24 changes: 13 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# CouncilLogic

<p align="center">
<img src="assets/model-council-logo.png" alt="CouncilLogic logo" width="240">
<img src="docs/assets/councillogic-header.svg" alt="CouncilLogic — Independent answers. One governed record." width="760">
</p>

<p align="center">
Expand All @@ -11,11 +11,14 @@
<img alt="Status: public alpha" src="https://img.shields.io/badge/status-public%20alpha-orange">
</p>

CouncilLogic is a local-first, auditable council of heterogeneous language
models. OpenAI, Anthropic, Gemini, Mistral, and xAI's Grok independently
propose answers, judge blinded candidates, contribute to a deterministic Borda
aggregate, and produce a final synthesis. The complete run record is stored
locally.
**Send one question across models, blind their judgments, and keep the complete
record.**

CouncilLogic is a local-first, auditable orchestration and governance layer for
heterogeneous language-model deliberation. It sends a question to configured
providers independently, blinds and aggregates their judgments, synthesizes the
result, and stores the complete run record locally. It currently ships with
adapters for OpenAI, Anthropic, Gemini, Mistral, and xAI's Grok.

This repository is a **public alpha (`0.2.0a1`)**, not a production service or
a truth oracle. Multiple models can share the same error. Verify consequential
Expand Down Expand Up @@ -51,12 +54,11 @@ strong single model. Establishing that would require matched-cost baselines,
protocol ablations, and evaluation across additional users and task domains.
See [Research](docs/RESEARCH.md).

## Four-stage council
## How CouncilLogic works

1. **Propose:** OpenAI, Anthropic, Gemini, Mistral, and xAI's Grok answer
independently.
2. **Judge:** each lineage ranks relabeled candidates without provider
attribution; structured responses are validated locally.
1. **Propose:** every configured lineage answers independently.
2. **Judge:** each participating lineage ranks relabeled candidates without
provider attribution; structured responses are validated locally.
3. **Aggregate:** deterministic Borda scoring combines valid juries.
4. **Synthesize:** the selected lineage receives the candidates, aggregate,
and jury records and writes the final answer.
Expand Down
2 changes: 1 addition & 1 deletion SUPPORT.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Support

Model Council is a public alpha maintained on a best-effort basis. There is no
CouncilLogic is a public alpha maintained on a best-effort basis. There is no
service-level agreement, guaranteed response time, or production support.

- Read the [README](README.md), [operations runbook](docs/OPERATIONS.md), and
Expand Down
25 changes: 18 additions & 7 deletions assets/README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
# Assets

`model-council-logo.png` is the full-resolution CouncilLogic source mark. It
was generated using OpenAI image generation and retains its embedded provenance
metadata.
`model-council-icon.png` is an optimized 256 × 256 derivative for repository
and application surfaces.
`councillogic-mark.svg` is the provider-count-neutral CouncilLogic source mark.
Its continuous chamber and flow represent governed deliberation; the central
diamond represents the durable aggregate and audit record.

`councillogic-icon.png` is a deterministic 256 × 256 raster derivative for
repository and application surfaces.

`../docs/assets/councillogic-header.svg` is the 1520 × 400 README header. It
keeps the repository landing page compact while preserving a separate,
reusable source mark.

Regenerate the raster derivative from the repository root with:

```bash
rsvg-convert -w 256 -h 256 \
-o assets/councillogic-icon.png assets/councillogic-mark.svg
```

Trademark treatment for the CouncilLogic name and mark is separate from the
AGPL-licensed code. This provenance note does not invent or assert an
additional copyright claim.
AGPL-licensed code.
Binary file added assets/councillogic-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 24 additions & 0 deletions assets/councillogic-mark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed assets/model-council-icon.png
Binary file not shown.
Binary file removed assets/model-council-logo.png
Binary file not shown.
16 changes: 8 additions & 8 deletions docs/OPERATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,8 @@ council --mock --data-dir ./work/release-gate list
Before live use:

1. Review `council.example.toml` and select the intended data directory.
2. Configure all five credentials through the environment or a tested external
secret command.
2. Configure credentials for every configured provider through the environment
or a tested external secret command.
3. Run `council --config ./council.toml doctor`.
4. Run `council --config ./council.toml providers` and verify every provider,
model, and lineage.
Expand Down Expand Up @@ -356,10 +356,10 @@ be completed.
### Rate limiting or provider server failure

The adapters perform bounded retries for explicit retryable HTTP responses such
as `429` and selected `5xx` responses. Under the default quorum, a run may still
complete with three healthy lineages when one provider is unavailable. Inspect
failures and provider request IDs, wait for provider recovery, then resume
using the same config.
as `429` and selected `5xx` responses. Under the default five-provider topology
and quorum, a run may still complete with three healthy lineages when up to two
providers are unavailable. Inspect failures and provider request IDs, wait for
provider recovery, then resume using the same config.

### Timeout or deadline exhaustion

Expand Down Expand Up @@ -459,8 +459,8 @@ intentionally written to the database.
2. Update the process environment or external secret resolver under the same
logical secret name.
3. Start a new shell/process and run `doctor`.
4. Perform a low-risk live smoke run and confirm all five providers in the
audit record and provider consoles. This incurs live usage.
4. Perform a low-risk live smoke run and confirm every configured provider in
the audit record and provider consoles. This incurs live usage.
5. Revoke the old key.
6. Clear old shell environment values, terminal scrollback, and any temporary
operator notes containing the value.
Expand Down
2 changes: 1 addition & 1 deletion docs/PORTABLE-SERVICE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## Status

This document describes the implemented `0.2.0a1` portable-service alpha for
Model Council. It is a public reference deployment with deliberately narrow
CouncilLogic. It is a public reference deployment with deliberately narrow
boundaries:

- one authenticated service on one active POSIX host;
Expand Down
4 changes: 2 additions & 2 deletions docs/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Public-alpha posture

Model Council `0.2.0a1` adds a hardened, governed service alpha to the
CouncilLogic `0.2.0a1` adds a hardened, governed service alpha to the
single-user local CLI. The service is mock-only, loopback-only, and must not be
exposed as a public network daemon. It has application-level multi-principal
controls, but it is not a production identity, billing, or Internet-facing
Expand Down Expand Up @@ -331,7 +331,7 @@ If the database or an export may have been disclosed:
## Reporting a security issue

Use GitHub's **privately report a security vulnerability** feature for
`apcar/model-council`. Do not open a public issue containing secrets, sensitive
`apcar/CouncilLogic`. Do not open a public issue containing secrets, sensitive
prompts, raw provider responses, exploit details, or identifying data.

Include a concise description, affected version, reproduction conditions,
Expand Down
4 changes: 2 additions & 2 deletions docs/adr/0001-single-active-sqlite.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

- Status: Accepted for the portable-service pilot
- Date: 2026-07-25
- Scope: Model Council service state and reference-host failover
- Scope: CouncilLogic service state and reference-host failover

## Context

Model Council already uses a local SQLite database for durable runs,
CouncilLogic already uses a local SQLite database for durable runs,
invocations, events, hashes, and results. SQLite WAL mode, transactions, and
the per-run process lock provide a strong single-host foundation. They do not
provide distributed consensus between two independent files on two Macs.
Expand Down
2 changes: 1 addition & 1 deletion docs/adr/0002-agpl-and-commercial-licensing.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

## Context

Model Council is a portable, governed council control plane. The licensing
CouncilLogic is a portable, governed council control plane. The licensing
choice should preserve software freedom for users of modified network-served
versions while leaving room for separately negotiated proprietary use where
the copyright holder has sufficient rights.
Expand Down
39 changes: 39 additions & 0 deletions docs/assets/councillogic-header.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/model_council/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def _markdown_export(
) -> str:
result = run.get("result") or {}
lines = [
"# Model Council Run",
"# CouncilLogic Run",
"",
f"- Run: `{run['id']}`",
f"- Status: `{run['status']}`",
Expand Down
2 changes: 1 addition & 1 deletion src/model_council/remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ def _request(
def _parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
prog="council-remote",
description="Submit work to a governed Model Council service.",
description="Submit work to a governed CouncilLogic service.",
)
parser.add_argument("--server", required=True, help="Council service base URL")
parser.add_argument(
Expand Down
2 changes: 1 addition & 1 deletion src/model_council/run_lock.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
try:
import fcntl
except ImportError as exc: # pragma: no cover - the tomorrow beta targets macOS/Linux
raise RuntimeError("Model Council run locking requires a POSIX host") from exc
raise RuntimeError("CouncilLogic run locking requires a POSIX host") from exc


class RunLock:
Expand Down
2 changes: 1 addition & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def test_mock_doctor_run_inspect_and_export(self) -> None:
)
self.assertEqual(code, 0, error)
exported = export_path.read_text(encoding="utf-8")
self.assertIn("# Model Council Run", exported)
self.assertIn("# CouncilLogic Run", exported)
self.assertIn("## Council answer", exported)
self.assertEqual(stat.S_IMODE(export_path.stat().st_mode), 0o600)

Expand Down
Loading