From e862c80ffb56520ce563697950f20e060ae6b495 Mon Sep 17 00:00:00 2001 From: drknowhow Date: Thu, 10 Sep 2026 11:51:46 -0400 Subject: [PATCH] =?UTF-8?q?chore(release):=202.129.2=20=E2=80=94=20the=20h?= =?UTF-8?q?ub's=20override=20switch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cuts a release for #178 so the feature can actually reach the box. The hub imports from site-packages, not the checkout (`~/.c3/hub_start.py` sets _REPO to the site-packages path), so a merge to main is invisible to the running process and a restart alone re-imports the same tree. Verified rather than assumed this time: GET /api/hub/overrides/policy on the live hub returned 405 — it fell through to the POST-only route, which is exactly what "the route does not exist in this process" looks like. Both version sites bumped in one pass. test_version_sync exists because v2.56.0 shipped with pyproject.toml and cli/c3.py disagreeing, and it passes here — run AFTER the changelog edit, not before, since the last edit and the last verification have to be the same tree. 811 passed across the areas this release touches. The single failure, test_mobile_clients::test_chat_poll_shares_the_credential_set (404 != 401), is PRE-EXISTING test-ordering pollution: it passes in isolation and by file, and fails identically on clean main with the same -k. Proven before this branch existed, not asserted. Claude-Session: https://claude.ai/code/session_013z6ZciSk628VGRbLDZqB2n --- CHANGELOG.md | 38 ++++++++++++++++++++++++++++++++++++++ cli/c3.py | 2 +- pyproject.toml | 2 +- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1f6126..6f6fa75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,44 @@ All notable changes to Code Context Control (C3) are documented here. The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.129.2] - 2026-09-10 + +### Added — the hub could decide override requests but not allow them + +The Access screen already listed override requests and approved or denied +them. Nothing exposed `override.enabled`, which decides whether a request +may *exist* — so the hub answered a question the agent was never permitted +to ask, and the only ways to change that were the mobile API or hand-editing +`.c3/config.json`. + +`GET`/`POST /api/hub/overrides/policy`, plus a **"May agents ask?"** panel +between the costing strip and the request list: project picker, the enable +toggle, the seven escalatable layers, and the two caveats a toggle screen +must not let a reader forget — policy merges by *tightening only*, and the +credential vault, `.c3/secrets.enc`, `.c3/cred_state.json`, the dispatcher +fail-closed deny and the catastrophic shell blocks are never escalatable at +any setting. + +Widening — enabling the feature or turning a layer on — needs a typed +confirmation; tightening never does, because making the guard stricter +should always be one click. The panel asks in plain words before sending +rather than surfacing a 400 afterwards, and the server refuses anyway if it +does not. + +### Changed — one implementation of "what counts as widening", not two + +Validation, widening detection and the config write moved into +`services/override_policy` (`apply_section`, `widenings`, `write_section`); +`oracle/services/mobile_api` now delegates to them. Two copies would be two +chances for one surface to quietly allow what the other refuses, and this is +the check that decides whether an approval needs a challenge. The retired +inline copy is kept as `_override_widenings_legacy` solely so a test can +prove the move preserved behaviour rather than assert it. + +`wake` stays asymmetric on purpose: refused from the phone, accepted from +the hub. It names an argv this machine runs, and a bearer token is +authentication, not physical presence. + ## [2.129.1] - 2026-09-10 ### Fixed — the file watcher counted gitignored churn as source changes, and the MCP server's memory never came back diff --git a/cli/c3.py b/cli/c3.py index 615b191..fe0a3f5 100644 --- a/cli/c3.py +++ b/cli/c3.py @@ -91,7 +91,7 @@ # Config CONFIG_DIR = ".c3" CONFIG_FILE = ".c3/config.json" -__version__ = "2.129.1" +__version__ = "2.129.2" def _compress_file_cli(compressor, path, mode="smart", **kw): diff --git a/pyproject.toml b/pyproject.toml index d7a265a..6c9675c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "code-context-control" -version = "2.129.1" +version = "2.129.2" description = "Local MCP code-intelligence for AI coding tools: surgical search/read/edit, agent-config version history, path-level access + masking guards, and a multi-project hub." readme = "README.md" requires-python = ">=3.10"