diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 26589ea..f2bf96c 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -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. diff --git a/CHANGELOG.md b/CHANGELOG.md index df88d25..cf2a5e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/CITATION.cff b/CITATION.cff index e0238c0..5b3e141 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6619aaa..acc300e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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 diff --git a/LICENSING.md b/LICENSING.md index 7b3f8b6..a99d55f 100644 --- a/LICENSING.md +++ b/LICENSING.md @@ -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). diff --git a/README.md b/README.md index d61d7d4..16fb066 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # CouncilLogic

- CouncilLogic logo + CouncilLogic — Independent answers. One governed record.

@@ -11,11 +11,14 @@ Status: public alpha

-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 @@ -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. diff --git a/SUPPORT.md b/SUPPORT.md index de5d854..4d98be8 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -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 diff --git a/assets/README.md b/assets/README.md index 8723379..dfba238 100644 --- a/assets/README.md +++ b/assets/README.md @@ -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. diff --git a/assets/councillogic-icon.png b/assets/councillogic-icon.png new file mode 100644 index 0000000..c519b76 Binary files /dev/null and b/assets/councillogic-icon.png differ diff --git a/assets/councillogic-mark.svg b/assets/councillogic-mark.svg new file mode 100644 index 0000000..a4fc887 --- /dev/null +++ b/assets/councillogic-mark.svg @@ -0,0 +1,24 @@ + + CouncilLogic mark + A governed chamber, continuous deliberation path, synthesis opening, and durable central record. + + + + + + + + + + + + + + + + + + diff --git a/assets/model-council-icon.png b/assets/model-council-icon.png deleted file mode 100644 index 1a8589a..0000000 Binary files a/assets/model-council-icon.png and /dev/null differ diff --git a/assets/model-council-logo.png b/assets/model-council-logo.png deleted file mode 100644 index d60efc4..0000000 Binary files a/assets/model-council-logo.png and /dev/null differ diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index ec13777..a9dd2e0 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -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. @@ -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 @@ -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. diff --git a/docs/PORTABLE-SERVICE.md b/docs/PORTABLE-SERVICE.md index 77bbbc2..999f5e4 100644 --- a/docs/PORTABLE-SERVICE.md +++ b/docs/PORTABLE-SERVICE.md @@ -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; diff --git a/docs/SECURITY.md b/docs/SECURITY.md index 3219c52..1cd8abe 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -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 @@ -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, diff --git a/docs/adr/0001-single-active-sqlite.md b/docs/adr/0001-single-active-sqlite.md index 85b49ba..ee7220d 100644 --- a/docs/adr/0001-single-active-sqlite.md +++ b/docs/adr/0001-single-active-sqlite.md @@ -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. diff --git a/docs/adr/0002-agpl-and-commercial-licensing.md b/docs/adr/0002-agpl-and-commercial-licensing.md index d96a458..ed2071f 100644 --- a/docs/adr/0002-agpl-and-commercial-licensing.md +++ b/docs/adr/0002-agpl-and-commercial-licensing.md @@ -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. diff --git a/docs/assets/councillogic-header.svg b/docs/assets/councillogic-header.svg new file mode 100644 index 0000000..6282719 --- /dev/null +++ b/docs/assets/councillogic-header.svg @@ -0,0 +1,39 @@ + + CouncilLogic + Independent answers. One governed record. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CouncilLogic + Independent answers. One governed record. + diff --git a/src/model_council/cli.py b/src/model_council/cli.py index baf2db4..8e11d5f 100644 --- a/src/model_council/cli.py +++ b/src/model_council/cli.py @@ -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']}`", diff --git a/src/model_council/remote.py b/src/model_council/remote.py index 0f70f84..67483fc 100644 --- a/src/model_council/remote.py +++ b/src/model_council/remote.py @@ -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( diff --git a/src/model_council/run_lock.py b/src/model_council/run_lock.py index df6afb0..29722a5 100644 --- a/src/model_council/run_lock.py +++ b/src/model_council/run_lock.py @@ -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: diff --git a/tests/test_cli.py b/tests/test_cli.py index 4d106e3..e2b8591 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -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)