Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
b19b80d
audit: land in-flight changes (2026-10-27)
Oct 27, 2026
0e8a25b
fix: display and answer ask_followup_question in terminal chat
Oct 28, 2026
d6b45d8
Add bounded Fleet campaign control and isolated RSI integration [skip…
Oct 29, 2026
f85d720
Check timeline parity against the shared dashboard renderer
Oct 29, 2026
fec1de2
Serve admitted model discovery metadata without invalidating worker r…
Oct 29, 2026
3c2d0e3
Add fixed local campaign API supervision and safe recovery
Oct 29, 2026
4809347
Record verified MX campaign supervisor activation
Oct 29, 2026
9203aa9
Add repository campaign control plane
w4ffl35 Oct 29, 2026
a8ed3f2
Bind repository claims to Fleet broker budgets
w4ffl35 Oct 29, 2026
7e42110
Add repository campaign progress and contained worker adapter
w4ffl35 Oct 29, 2026
b64df90
Add Fleet v2 repository budget binding
w4ffl35 Oct 29, 2026
658bbf0
Add fenced Fleet repository request handoff
w4ffl35 Oct 29, 2026
cf95e48
Run private campaign checks on the approved workstation runner
Oct 29, 2026
1de74ad
Add bounded repository campaign coordinator
w4ffl35 Oct 29, 2026
5407a60
Keep private repository scopes out of status
w4ffl35 Oct 29, 2026
3b4edbb
Complete contained repository campaign loop
w4ffl35 Oct 29, 2026
fde120b
Keep campaign control out of evaluator snapshots
w4ffl35 Oct 29, 2026
1796fb4
Stabilize campaign integration test fixtures
w4ffl35 Oct 30, 2026
53e0281
Enforce Fleet repository budget subcaps
w4ffl35 Oct 30, 2026
c21fad0
Verify image-free OpenShell sandbox identity
w4ffl35 Oct 30, 2026
9242913
Filter Docker inspection to exact workload labels
w4ffl35 Oct 30, 2026
e0db1a6
test: reduce campaign standards violations
w4ffl35 Oct 30, 2026
26948bc
docs: record repository campaign readiness
w4ffl35 Oct 30, 2026
19bdcbe
Align Curl job grants with Fleet v2 caps
w4ffl35 Oct 30, 2026
bfee98d
fix: allow read-only campaign provisioning
w4ffl35 Oct 30, 2026
43efc75
Add pinned Curl historical repair workflow
w4ffl35 Oct 30, 2026
8b8ac83
Recover verified no-call campaign failures
w4ffl35 Oct 30, 2026
833999e
Add explicit retry for verified no-call jobs
w4ffl35 Oct 30, 2026
2043cf4
Allow explicitly confirmed retry queueing from snapshot authority
w4ffl35 Oct 30, 2026
4f22b86
Extract fixed Curl private delivery adapter
w4ffl35 Oct 30, 2026
d4e578e
Extract fixed Curl runtime and private delivery modules
w4ffl35 Oct 30, 2026
f755459
Preserve exact no-call recovery and worker diagnostics
w4ffl35 Oct 30, 2026
01e093e
Guard OpenShell image permissions as sandbox
w4ffl35 Oct 30, 2026
830ebc1
Keep server coordinator tests independent of owner runtime registrations
Oct 30, 2026
60b966f
fix(hcl): stop active repository campaign workers
Oct 30, 2026
7f47e49
feat(hcl): auto-admit pinned Curl repair snapshot
Oct 30, 2026
342a0cf
feat(hcl): authorize budget-only Curl repair claims
Oct 30, 2026
c084f4b
Preserve durable no-call recovery evidence across owner delays
Oct 30, 2026
58f501c
Restore keyring context for fixed Curl delivery
Oct 30, 2026
987f847
Bound Curl qualification to two inference calls
Oct 30, 2026
ec7dca9
Derive validated desktop bus for repair delivery
Oct 30, 2026
4b78254
Add explicit retry for verified Curl repair delivery
Oct 30, 2026
2e3bff1
Allow Curl repair retry queueing from fresh snapshots
Oct 30, 2026
0637269
Restore keyring context for fixed Git operations
Oct 30, 2026
7bc27f9
Identify fixed Curl delivery failure operation
Oct 30, 2026
5c12775
Use persistent private evidence socket directory
Oct 30, 2026
3a3e96c
Seed fixed Curl checkout from verified local history
Oct 30, 2026
c709520
test: cover coordinated repository budget stop recovery
Oct 30, 2026
f438df2
test: make Curl repair fixtures independent of private checkout
Oct 30, 2026
8ed5f1d
Use owned runtime paths in isolated-home fixtures
Oct 30, 2026
c99382e
test: make Curl repair fixtures independent of private checkout
Oct 30, 2026
1c67f1f
Add proof-backed partial Curl billing reconciliation
Oct 30, 2026
ad2489e
Compare immutable closed session proof content
Oct 30, 2026
8f8c445
Display the authoritative inference budget profile in progress
Oct 30, 2026
3e88c45
Stage pinned private Fleet source for CI tests
Oct 30, 2026
b1f96ac
Require immutable private test-source input
Oct 30, 2026
833439e
Add bounded Curl historical repair v2 orchestration
Oct 30, 2026
d249dd0
Split Curl v2 evidence receipt assembly
Oct 30, 2026
6df0c28
Keep Curl v2 receipt directory private
Oct 30, 2026
7132f8d
Expose fixed read-only Curl target reader
Oct 30, 2026
9e83288
Bind Curl repair v2 to no-model budget snapshots
Oct 30, 2026
5c0b796
test: cover Curl v2 no-model budget bridge
Oct 30, 2026
f646162
refactor: split Curl v2 evidence execution helpers
Oct 30, 2026
cf3b91d
Add Curl v2 private delivery facade
Oct 30, 2026
c0a5386
Split Curl private delivery into focused modules
Oct 30, 2026
184df66
Bind nested call identity in closed billing proofs
Oct 30, 2026
330b9d8
feat: wire Curl repair v2 runtime to private delivery
Oct 30, 2026
e436e15
Merge commit '330b9d82' into wip/audit-20261027
Oct 30, 2026
45775f9
Refactor repository progress projection to standards
Oct 30, 2026
b679b56
Use short private temp root in test runner
Oct 30, 2026
1d95269
Pin Curl v2 helper cancellation fix
Oct 30, 2026
a757ef9
Split campaign CLI command families
Oct 30, 2026
ee31fdc
Refactor campaign CLI entrypoint
Oct 30, 2026
d439834
Make Curl v2 runtime fixture home independent
Oct 30, 2026
12bbf4d
accept v2 private campaign result markers
Oct 30, 2026
c190f62
Extract v2 repair CLI action
Oct 30, 2026
ffe0cb9
Extract v1 repair CLI action
Oct 30, 2026
94224f4
Extract Curl v2 advisory test fixture
Oct 30, 2026
b18def7
Fix Curl v2 evidence root path traversal
Oct 30, 2026
0437880
Allow exact Curl v2 zero-call recovery proof
Oct 30, 2026
2e3912a
Report repository worker preparation progress accurately
Oct 30, 2026
f943659
Guard explicit recovery of no-model Curl infrastructure failures
Oct 30, 2026
da67e5e
Add explicit recovered Curl v2 no-call retry
Oct 30, 2026
3ad127b
Accept preserved legacy v2 recovery progress
Oct 30, 2026
0453d5d
Extract verified repair retry CLI action
Oct 30, 2026
7e11dc4
Report fixed-proof bridge outcome in historical repair rejection
Oct 30, 2026
a8d876b
Split historical repair proof composition into rated helpers
Oct 30, 2026
a59b8ea
Split Docker sandbox image observer suite into rated helpers
Oct 30, 2026
a481095
Split readiness and provider-RSI suites into rated checks
Oct 30, 2026
b08c46b
Split RSI status verification into rated predicates
Oct 30, 2026
a787abb
Split campaign-scoped RSI evaluation suite into rated helpers
Oct 30, 2026
d24da28
Wrap three overlong lines in campaign identity and budget suites
Oct 30, 2026
7c0f162
Wrap four overlong lines in RSI controller and delivery-lock suite
Oct 30, 2026
664e6a7
Wrap six overlong lines in RSI fleet, evaluator, and queue types
Oct 30, 2026
e09cc90
Share campaign objective union and split path constants
Oct 30, 2026
22c4f0c
Split curl evaluator suite into short names and one-field calls
Oct 30, 2026
9ae8890
Wrap nine overlong lines in supervisor suite and dashboard page
Oct 30, 2026
bf612cf
Split CLI boundary snapshot suite into rated helpers
Oct 30, 2026
6c54a12
Split v2 boardref suite into typed authority and claim-phase helpers
Oct 30, 2026
9ce4a27
Split known-advisory suite into definition, record, and phase helpers
Oct 30, 2026
8f4d56c
Split worker suite long lines with secret-preserving splices
Oct 30, 2026
0880130
Wrap three overlong lines in RSI worker suite
Oct 30, 2026
b0eacf3
Split diagnostics suite into rated helpers with byte-exact secret han…
Oct 30, 2026
54b13ae
Split source-tree suite into fixture interface and CRLF phase helpers
Oct 30, 2026
6a2e52d
Split worker workspace into scope, dispatch, and digest phases
Oct 30, 2026
a74c7bd
Wrap long lines in repair-known-v2 CLI guard test
Oct 30, 2026
957c7f4
Wrap long lines in advisory-intake suite
Oct 30, 2026
cc557b4
Split budget-allocation fixture into typed section builders
Oct 30, 2026
fab4201
Split budget-binding suite into phase helpers
Oct 30, 2026
e8a9ea2
Split repair-store suite into authority, phases, and tests
Oct 30, 2026
f0f2246
Split worker-registry suite into rated helpers
Oct 30, 2026
91c8f37
Split budget-v2 integration suite into fixture modules
Oct 30, 2026
f332652
Split coordinator suite into fixture modules
Oct 30, 2026
e81336e
Split intake suite into fixture modules
Oct 30, 2026
9055b95
Add dashboard session stop endpoint
Nov 1, 2026
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
33 changes: 27 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,27 @@
# e2e pass (scripts/e2e/run.sh) since the e2e suites exercise real
# spawn/worker flows against a local mock OpenRouter server.
#
# Runs on GitHub-hosted runners (public repo — no self-hosted worker).
# No API key and no network access are needed — the mock server serves the
# entire session, so this is safe to run on any push/PR, including from forks.
# entire session. Only branches in the private maintenance repository run here.
name: ci

on:
push:
branches: ["**", "!headlesscode-claims/**"]
branches: ["wip/audit-20261027"]
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: private-campaign-ci-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
typecheck-test-e2e:
if: github.event.repository.private == false
runs-on: ubuntu-latest
if: github.repository == 'Capsize-Games/headlesscode-internal' && github.event.repository.private == true && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository)
runs-on: [self-hosted, Linux, X64, workstation-ci, headlesscode-internal-ci]
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
Expand All @@ -32,14 +35,23 @@ jobs:
node-version: 22
cache: npm

- name: Test private Fleet source staging
run: node --test scripts/stage-fleet-test-source.test.mjs

- name: Stage pinned private Fleet source for integration tests
env:
FLEET_SECURITY_WATCH_PRIVATE_ROOT: ${{ vars.FLEET_SECURITY_WATCH_PRIVATE_ROOT }}
FLEET_SECURITY_WATCH_TEST_REF: ${{ vars.FLEET_SECURITY_WATCH_TEST_REF }}
run: node scripts/stage-fleet-test-source.mjs

- name: Install dependencies
run: npm ci

# The full test suite includes src/tools/__tests__/browser-action.test.ts,
# which launches a REAL headless Chromium via Playwright — the browser
# binary is a separate download, not part of npm ci.
- name: Install Playwright browser
run: npx playwright install --with-deps chromium
run: npx playwright install chromium

- name: Typecheck
run: npx tsc --noEmit
Expand All @@ -55,3 +67,12 @@ jobs:

- name: End-to-end (mock OpenRouter, no key)
run: bash scripts/e2e/run.sh

- name: Remove staged Fleet source
if: always()
run: >-
node -e 'const fs=require("node:fs");const path=require("node:path");
const root=process.env.FLEET_SECURITY_WATCH_TEST_ROOT;
const temp=process.env.RUNNER_TEMP;
if(root&&temp&&path.dirname(root).startsWith(path.join(temp,"fleet-test-source-")))
fs.rmSync(path.dirname(root),{recursive:true,force:true})'
5 changes: 3 additions & 2 deletions .github/workflows/container.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# Public publishing is disabled in this private maintenance branch.
name: Publish verified container
on:
workflow_run:
Expand All @@ -12,8 +13,8 @@ concurrency:
cancel-in-progress: false
jobs:
publish:
if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch == 'master'
runs-on: ubuntu-latest
if: ${{ false }}
runs-on: [self-hosted, Linux, X64, workstation-ci, headlesscode-internal-ci]
steps:
- uses: actions/checkout@v4
with:
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# Public publishing is disabled in this private maintenance branch.
# Build a release package on version tags and attach it to the GitHub Release.
# This workflow does not publish packages to npm.
#
Expand All @@ -15,8 +16,8 @@ permissions:
jobs:
npm-publish:
name: Verify and attach release artifact
if: github.event.repository.private == false
runs-on: ubuntu-latest
if: ${{ false }}
runs-on: [self-hosted, Linux, X64, workstation-ci, headlesscode-internal-ci]
timeout-minutes: 30
steps:
- name: Checkout tag
Expand Down
18 changes: 18 additions & 0 deletions docker/OpenShell.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,24 @@ RUN mkdir -p /opt/headlesscode-session /opt/headlesscode-data/projects /opt/head
ENV HEADLESSCODE_ROOT=/opt/headlesscode
WORKDIR /sandbox
USER sandbox
RUN --network=none set -eu; \
test "$(id -u)" = "1000"; \
test -r /opt/headlesscode/src/cli.ts; \
test -r /opt/headlesscode/package.json; \
test -r /opt/headlesscode/package-lock.json; \
test -r /opt/headlesscode/tsconfig.json; \
test -r /opt/headlesscode/shared/stacks; \
test -x /opt/headlesscode/shared/stacks; \
test -x /opt/headlesscode/node_modules/.bin/tsx; \
test -r /opt/headlesscode/scripts/run-worker.sh; \
test -x /opt/headlesscode/scripts/run-worker.sh; \
test ! -w /opt/headlesscode/src/cli.ts; \
test ! -w /opt/headlesscode/src; \
test ! -w /opt/headlesscode/shared; \
test ! -w /opt/headlesscode/package.json; \
test ! -w /opt/headlesscode/package-lock.json; \
test ! -w /opt/headlesscode/tsconfig.json; \
/opt/headlesscode/node_modules/.bin/tsx /opt/headlesscode/src/cli.ts --help >/dev/null
RUN test -r /opt/headlesscode/src/cli.ts \
&& test -r /opt/headlesscode/package.json \
&& test -r /opt/headlesscode/package-lock.json \
Expand Down
76 changes: 76 additions & 0 deletions docs/RSI_SESSION_BRIEF.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# HeadlessCode RSI Self-Improvement — Session Brief

New session. Read this file first, then work. Parent session stays on the
upstream-fix campaign and Hetzner pipeline; do not touch those.

## Goal

Review the headlesscode codebase, fix what needs fixing, and run the RSI
loop on headlesscode itself (dogfood the bounded RSI harness against its
own repo). Workers are authorized for this job — use several in parallel
on genuinely independent subtasks (review areas, test gaps, docs drift),
serial where they share files.

## Starting facts (verified 2026-10-27)

- Repo: `~/Projects/headlesscode`, branch `master`, tree CLEAN
(HEAD `a1887b3c`, previous `33ac57f7`). Keep it clean: commit completed
work per the repo's own contribution rules, never rewrite history.
- It is a coding-agent harness (CLI + HTTP) with bounded RSI that can
already target itself. Entry docs: `docs/recursive-self-improvement.md`,
`docs/rsi-progress.md`, `docs/rsi-control-and-monitoring-direction.md`,
`docs/evidence-journal.md`, `docs/security-verification.md`.
- CI runs typecheck + full suite + mock workflows; RSI gates include
regression, frozen-proof, and hidden-verification checks.

## Operating rules for this job

1. Read `AGENTS.md`/`CONTRIBUTING.md` first and obey the repo's own gates.
2. Review before changing: correctness, security controls (the seven
insider-risk principles in the README), test coverage, docs drift.
3. Every code change needs a regression test and must keep CI green.
Evidence-required: quote test output, not impressions.
4. RSI-on-itself runs bounded: fixed task list, inference budgets,
contained profile, evidence journal on. Any RSI candidate that fails
gates is dropped with the reason recorded.
5. Never weaken a security gate to make a candidate pass. If a gate
blocks legitimate work, flag it for the owner instead.
6. No history rewrites, no force pushes. Signing deferred (existing key
issue) — do not block on it.

## Standing owner constraints (apply here too)

- Approved on everything technical, but: never touch `/opt/wxrq`,
homeserver, keyrings, sudoers, systemd daemons, package DBs, kernel
builds, or the live Hetzner pipeline (`/home/secwatch`, daemon,
drainer, fix-worker). No public exposure of anything.
- Preserve data, configs, API compatibility, licenses (Apache-2.0 here).
- `5194`/`5195` stay localhost-only.
- Report per worker: what was reviewed, what changed, test evidence,
what remains unverified. No success claims without observed runs.

## Box workers are IN scope (added 2026-10-27)

The live Hetzner pipeline — `github-mail-daemon.py`, `queue-drain.py`,
`fix-worker.py` (repo copies in `fleet-security-watch/operations/`) — is
part of the RSI target. It is the highest-value loop to improve: triage
accuracy, the fix-worker model loop (v1 ack loop live since 2026-10-27;
code-fix acting still unimplemented), evidence quality.

Live-safety rules (no exceptions):
- Review and rewrite code only in repo checkouts and sandboxes. Never
hot-edit `/home/secwatch` live files, state, queue, or cron.
- Deployment to the box stays with the owner session (this window's
parent). RSI session proposes; it does not deploy.
- The fix-worker model loop must keep: STOP kill-switch, post budget,
unknown-tasks-stay-queued, mandatory regression test + evidence bundle
per fix. Any proposal weakening these is rejected, not refined.
- No live posting in tests. Dry-runs only outside production paths.

## Suggested split

- Worker 1: code review of `src/rsi/` + roles/gates (correctness + bypasses).
- Worker 2: code review of permissions/containment/emergency controls.
- Worker 3: test-gap analysis (what the suite does not cover) + add tests.
- Worker 4 (after 1–3 land): run bounded RSI-on-itself cycle on one
well-scoped target from the reviews, with evidence.
101 changes: 101 additions & 0 deletions docs/campaign-control-service.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Campaign-control API supervisor

`headlesscode campaign serve` runs the loopback campaign-control HTTP API and
its dashboard files. The API binds to `127.0.0.1:4391`; it does not run campaign
ticks or start RSI work. On MX, `scripts/campaign_control_supervisor.py`
checks the listener address, process command line, working directory, and API
status before adopting the existing process. If that process exits, it starts
only the installed fixed `headlesscode campaign serve` command, using bounded
retry delays.

The supervisor uses the existing home-directory registration and control
files. It does not set a model, budget, adapter, credential, or alternate
data-directory environment variable. Campaign data remains under
`~/.local/share/headlesscode/campaign-control/`. API authentication continues
to follow the existing campaign-control server configuration.

## Prerequisites

- Node.js and the supported `headlesscode` CLI wrapper are installed.
- The dashboard build exists at
`~/Projects/capsize-web/apps/fleet-campaign-control/dist`, the path selected
by `campaign serve`.
- The user cron daemon is running. The installer adds one marked `@reboot`
entry and preserves unrelated entries.
- Port 4391 is free, or the existing campaign-control API is the process being
adopted. Do not start a second instance beside the existing listener.

The installer checks the wrapper and dashboard build before changing cron. It
rejects a changed or duplicate managed entry and preserves cron output that it
cannot verify as the explicit no-crontab case. It does not inspect or copy
process environment values.

## Install and check

The reviewed supervisor was activated on the reference MX workstation on
2026-10-29. Use these commands to install on another authorized target or verify
the existing installation.

```sh
python3 scripts/manage_campaign_control_supervisor.py install
python3 scripts/manage_campaign_control_supervisor.py check
```

The supervisor checks every ten seconds. Restart delays increase from five
seconds to a five-minute cap. Production waits are interruptible, so rollback
can stop the supervisor promptly during backoff. It uses a private lock, PID
file, and log under
`~/.local/state/headlesscode/campaign-control-supervisor/`; it does not write
campaign state. If the port belongs to an unrecognized process, it leaves that
listener untouched and does not launch another process. For campaign data, use
`headlesscode campaign status --json`; do not use `campaign tick` as a service
health check.

## Rollback

```sh
python3 scripts/manage_campaign_control_supervisor.py rollback
```

Rollback validates the managed cron line before stopping the supervisor or
removing its installed artifact. It removes only its exact marked `@reboot`
line and stops the supervisor only when its PID matches the fixed launcher. It
does not signal the campaign API or delete registration, control state, job
history, or evidence. If the cron line or installed source was edited, rollback
stops and preserves it for review. Other cron entries are kept.

## Current activation status

The managed check last reported the loopback supervisor healthy. An earlier
check found the supervisor stopped even though its `@reboot` entry remained;
the supported installer restarted the existing managed singleton, and the next
managed check passed. Reboot recovery has not been exercised, so the cron entry
is not evidence of a successful reboot test. The API is a control surface; its
health does not establish that a repository worker is ready or running.

At the latest recorded campaign check, legacy global admission was ON at epoch
20. The separate Curl repository campaign remained disabled and blocked on
prerequisites because `workerQualified` was false and the private worker registry
was empty. No live CVE worker was runnable or claimed. See
[Fleet campaign control](fleet-campaign-control.md) for the current distinction
between global admission and repository readiness.

The service check does not verify model access, qualify a worker, enable a
repository campaign, run a campaign tick, or test reboot recovery. It does not
change repository campaign state or publish CVE catalog content.

## Synthetic checks

Run the focused unit suite through the shared build queue and compile-check the
Python modules:

```sh
python3 -m py_compile scripts/campaign_control_supervisor.py scripts/manage_campaign_control_supervisor.py scripts/test_campaign_control_supervisor.py
python3 -m unittest discover -s scripts -p 'test_campaign_control_supervisor.py' -v
```

The tests use temporary state and mocked listeners/processes. They cover exact
loopback process identity, unknown-listener refusal, singleton locking,
interruptible backoff, bounded restart delay, cron preservation, error handling,
rollback validation, and zombie process handling. They do not connect to the
campaign API or a provider.
52 changes: 52 additions & 0 deletions docs/fleet-campaign-control.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Fleet campaign control

HeadlessCode exposes two separate controls: the legacy global Fleet adapter and
registered per-repository campaigns. Their switches and readiness are separate.
Enabling the global adapter does not enable a repository campaign.

## Legacy global adapter

The optional `headlesscode campaign` commands control the locally registered
Fleet adapter:

- `campaign status` reads the global switch, budget allocation and run history.
- `campaign on` and `campaign off` change admission for the legacy adapter.
OFF blocks new work while accepted work retains its cleanup and evaluation
path.
- `campaign budget --usd <amount>` sets the shared monthly limit. The limit
cannot discard committed or ambiguous spend.
- `campaign tick` runs the fixed adapter under a non-overlap lease. The ordinary
owner-managed schedule invokes it; Codex timers do not.
- `campaign serve` exposes the loopback control API on port 4391. It does not
expose the public CVE catalog.

The legacy budget remains part of the existing shared monthly authority; it is
not a separate allowance for repository campaigns.

## Per-repository campaign status

The additive repository coordinator keeps campaign definitions, claims,
readiness, job history and worker registrations in separate owner-controlled
state. Browser requests cannot set trusted source, worker, policy, model,
access or evaluator qualifications. A campaign is runnable only when the
owner-provisioned definition and exact worker registration satisfy those
checks.

The current repository definition is the Curl entry for CVE-2026-92390. Code
includes the fixed evaluator profile `curl-92390-fixed-v1` and a
qualification-only preflight for its pinned source proof. That proof does not
establish worker qualification and the preflight is not a patch worker or a
general advisory approval. The live private worker registry is empty and the
campaign definition reports `workerQualified=false`. The Curl campaign is
disabled and blocked on prerequisites. No live CVE worker is currently
runnable or claimed.

As of 2026-10-29, the legacy global admission switch is ON at control epoch 22.
That state does not change the Curl campaign's disabled, blocked-prerequisite
state. Do not describe qualification-profile code or historical jobs as a live
worker run, verified repair, upstream submission or catalog publication.

The protected budget and stop controls remain authoritative for any future
repository worker. A stopped or blocked campaign must not be started until its
registered source, worker, fixed recipe, evaluator, data access and model
qualifications are independently present and verified.
Loading