Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
d3b4a40
Thirty verdicts on one binary taught nothing, because tolerance asked…
opencdlee-dotcom Sep 20, 2026
15666f9
Precision plan: three structural defects behind six false-alarm batch…
opencdlee-dotcom Sep 23, 2026
26426a6
Zoom and Zotero read `broken` because codesign --strict also refuses …
opencdlee-dotcom Sep 23, 2026
3a42e0f
A chain joined an OS update to a harness command on /bin/bash, the on…
opencdlee-dotcom Sep 23, 2026
d63ed74
Every command Claude Code runs arrives as eval '<CMD>', so the sensor…
opencdlee-dotcom Sep 23, 2026
42360c7
Every fix was measured by silence: backtest replay scores the current…
opencdlee-dotcom Sep 23, 2026
c07f6a6
Merge remote-tracking branch 'origin/agent/precision-s3/main' into ag…
opencdlee-dotcom Sep 23, 2026
5733d12
Merge remote-tracking branch 'origin/agent/precision-s2/main' into ag…
opencdlee-dotcom Sep 23, 2026
0d7d3b6
Merge remote-tracking branch 'origin/agent/precision-s1/main' into ag…
opencdlee-dotcom Sep 23, 2026
daac8e5
Merge remote-tracking branch 'origin/agent/claude/tolerance-follows-b…
opencdlee-dotcom Sep 23, 2026
3330ace
The replay graded persistence as recorded, so 37 OS updates filed whi…
opencdlee-dotcom Sep 23, 2026
df4c8d4
A verdict taught one path or one hash, so the operator's rebuilds wer…
opencdlee-dotcom Sep 23, 2026
dc49d69
The replay that judges every precision fix ran only when someone reme…
opencdlee-dotcom Sep 23, 2026
64839f7
A Developer ID signature earned no rung, and custody was asked only a…
opencdlee-dotcom Sep 23, 2026
efda737
One edit to a shared payload was seven HIGH incidents, and the rung t…
opencdlee-dotcom Sep 23, 2026
f5e169b
The replay's one noise number mixed a residue with evidence it could …
opencdlee-dotcom Sep 23, 2026
04ff6b8
Merge remote-tracking branch 'origin/agent/precision-s7/integration' …
opencdlee-dotcom Sep 23, 2026
1acca58
uv and Playwright leave receipts as readable as Homebrew's, and the l…
opencdlee-dotcom Sep 23, 2026
6a1aa76
The replay could not recognise the payload case as the per-job change…
opencdlee-dotcom Sep 23, 2026
73e91cc
Merge remote-tracking branch 'origin/agent/precision-p2b/receipts' in…
opencdlee-dotcom Sep 23, 2026
51f4d0e
A copied state dir without its HMAC key scored 16 more noise incident…
opencdlee-dotcom Sep 23, 2026
2e5bb9f
A new persistence item was never asked who made what it runs
opencdlee-dotcom Sep 23, 2026
fe8f9ad
One verdict on exact bytes was asked for twice more before it counted
opencdlee-dotcom Sep 24, 2026
54133d8
The publisher rung trusted a signature where the platform had said no…
opencdlee-dotcom Sep 24, 2026
e39cbdd
The agent surface asked custody of the wrong file, read a process log…
opencdlee-dotcom Sep 24, 2026
4b70e71
Merge remote-tracking branch 'origin/agent/precision-s7/integration' …
opencdlee-dotcom Sep 24, 2026
d50f784
Merge remote-tracking branch 'origin/agent/precision-s6/integration' …
opencdlee-dotcom Sep 24, 2026
a9c3da0
Merge remote-tracking branch 'origin/agent/precision-s8/integration' …
opencdlee-dotcom Sep 24, 2026
c6bda80
Merge remote-tracking branch 'origin/agent/precision-p2d/agent-surfac…
opencdlee-dotcom Sep 24, 2026
0594c36
The replay rebuilt agent exec entries from their fingerprints, so it …
opencdlee-dotcom Sep 24, 2026
8177185
Pairing a secret with a channel only inside one paragraph silenced ev…
opencdlee-dotcom Sep 24, 2026
f4b1172
Merge remote-tracking branch 'origin/agent/precision-p2d/agent-surfac…
opencdlee-dotcom Sep 24, 2026
3be3e27
Merge remote-tracking branch 'origin/agent/precision-p2a/harness-2' i…
opencdlee-dotcom Sep 24, 2026
19e6608
Merge remote-tracking branch 'origin/agent/precision-s5/main' into ag…
opencdlee-dotcom Sep 24, 2026
7ba47e6
rustup names every file it installs, and the ladder still read the to…
opencdlee-dotcom Sep 24, 2026
3ff8ea2
Incidents opened by fixed code stayed open for a week, because nothin…
opencdlee-dotcom Sep 24, 2026
ccc01b0
Demotion stepped a new LaunchAgent running an Apple-signed program do…
opencdlee-dotcom Sep 24, 2026
6549d91
Merge remote-tracking branch 'origin/agent/precision-p2b/rustup' into…
opencdlee-dotcom Sep 24, 2026
58b58b9
The beacon sensor graded a supervised Worker as if nobody had started it
opencdlee-dotcom Sep 24, 2026
81f48e6
Merge remote-tracking branch 'origin/agent/precision-s5/beacon-parent…
opencdlee-dotcom Sep 24, 2026
4c36153
Merge remote-tracking branch 'origin/agent/precision-s9/healer' into …
opencdlee-dotcom Sep 24, 2026
b579f06
Merge remote-tracking branch 'origin/agent/fable-precision/plan' into…
opencdlee-dotcom Sep 24, 2026
0eb4951
Precision plan: the results, and the one done-condition restated on e…
opencdlee-dotcom Sep 24, 2026
cbaa65f
The skill real-git tests ran under simulated Windows, where the Windo…
opencdlee-dotcom Sep 24, 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
76 changes: 68 additions & 8 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,12 @@ Allowed states are `OPEN`, `ACK`, `INVESTIGATING`, `CONTAINED`, `RECOVERING`,
`MONITORING`, `RESOLVED`, and `FALSE_POSITIVE`. Transitions are validated so a
closed incident cannot silently return to containment. An unresolved incident
gets at most three reminders (about +1 hour, +24 hours, and +72 hours); afterward
the durable open state is the reminder. A reviewed `FALSE_POSITIVE` suppresses
the durable open state is the reminder. An incident opened only by evidence the
routing gate sent to the digest (the provenance gate, low confidence, below the
floor) records why in `digest_only` and gets none: no reminder ever turns it
into a notification. It stays open, counted and listed, and becomes an ordinary
notified incident only when evidence that would itself interrupt attaches. A
reviewed `FALSE_POSITIVE` suppresses
only the exact correlation key while retaining later occurrences as evidence;
a changed content hash gets a new key (unless *acquired tolerance*, below, has
earned the right to pre-close it). A `RESOLVED` threat that recurs opens a
Expand Down Expand Up @@ -363,11 +368,37 @@ quiet rather than silence.
verdicts, and a ledger that crossed machines would let one compromised body
launder bytes into every other body's known-good set.

9. **Publisher signature** (binary-keyed findings) → **MEDIUM**, asked after
the vouch and the receipt and before `build-output`. `publisher-stable`
was the only rung that read a signature, and only on a re-sign in place,
so a valid Developer ID binary earned nothing on first sight and beaconed
HIGH from `$HOME` on the one sensor whose predicate is an OR. The binary
earns `publisher-signed` when `publisher_sig()` accepts its verdict
(apple / app-store / developer-id on macOS, a `strict: detritus` verdict
included; os-signed / signed-valid on Windows; os-managed on Linux) and
the verdict names a team or authority; the note names that signer and the
control behind it (Apple's notarization and revocation on macOS). Ad-hoc,
broken, unsigned and `signed-other` earn nothing. It reads the stat-cached
verdict the sensor already asked for, so it costs no second probe. Two
limits. The OS vendor's own signature (`apple`, Windows `os-signed`) earns
it only inside `TRUSTED_PREFIXES`, on the resolved path, and is never
carried to a copy: the same signed bytes in `/tmp`, `$HOME` or `%TEMP%` are
the living-off-the-land shape. And a caller whose evidence says the
platform's control refused the bytes withholds it (`publisher_ok=False`):
the hot-dir sensor after Gatekeeper rejects a bundle.

Guards, because grading is where an attacker would want to stand:

- **Grades, never mutes.** A downgraded finding is still created, still in the
report, still accumulates risk and joins correlation chains. Custody writes
no dismissal and cannot feed acquired tolerance.
- **Demotion never suppresses; the routing gate decides what interrupts.** A
downgraded finding is still created, still in the report, still accumulates
risk and joins correlation chains, and custody writes no dismissal and
cannot feed acquired tolerance. What keeps a proven origin quiet is the
ROUTING gate (`_provenance_gate`, asked by `route_findings` before the
notify floor): a finding below CRITICAL whose rung is in the self or
vouched tier, that is not attack-defined and not a decoy/latch/canary trip,
routes to the digest, where it remains visible (it carries
`routed: digest: provenance <rung>`, which `incident` and `report` print)
and counts toward risk at its tier weight. Weak rungs only demote.
- **Attack-defined content never downgrades.** A conceal imperative stays HIGH
even when self-attested — an agent prompt-injected into persisting a hostile
instruction attests its own write. Custody grades *churn-shaped structure*,
Expand Down Expand Up @@ -398,8 +429,8 @@ call sequence:
bidirectional: a covered change drops to INFO, an uncovered change is
promoted to at least HIGH — under enforcement, the *absence of a record*
outranks provenance, which is the entire point of opting in.
4. **The notify floor** (`emit`) routes by the final severity; it never
changes one.
4. **The notify floor** (`emit`) routes by the final severity and, through
the provenance gate, by custody; it never changes a severity.
5. **The incident ratchet** (`_severity_max`) only ever steps UP: once an
incident opened HIGH, a later regrade of the same subject cannot quietly
lower it — de-escalation is the operator's verdict to give, not custody's.
Expand Down Expand Up @@ -530,10 +561,13 @@ above. An allowlisted fingerprint still opened and refreshed incidents and
drove reminders, because `emit` skipped it while every finding flowed into
the incident tier untouched. And one genuine new HIGH marked every incident
created that scan as already-notified, so a digest-routed sibling lost the
reminder that was its only path to a human.
reminder that was its only path to a human. (That reminder was itself removed
on 2026-09-23: a digest-only incident is never reminded — see Incident
workflow. The per-finding "notified" mark stands.)

`route_findings` is the one place the order is written down: allowlisted →
seen → adopted → low-confidence → below-floor → tolerated/learning → new.
seen → adopted → low-confidence → provenance → below-floor →
tolerated/learning → new.
The scan path computes it once with the incident tier's memory and hands the
same verdicts to `emit`, to `record_security_state` (which now marks
"notified" per finding and closes an allowlisted incident as `allowlisted`,
Expand Down Expand Up @@ -568,6 +602,32 @@ observations re-rendered as though fresh. 118 of 120 dismissals were
The menu-bar plugin counts OPEN INCIDENTS, so that — not findings-per-scan —
is the number the operator actually reads, and it is what this tier targets.

### Ground truth: `backtest replay`

Every earlier fix in this tier was measured by silence ("the queue got
shorter"), which is also what broken detection looks like. `aegis.py backtest
replay [--days N] [--reobserve]` scores the CURRENT code against the answer key
the store already holds: it opens the live store read-only (`mode=ro`, one
snapshot), groups the recorded `observation.finding` events into their scans
(by `observed_at`: no writer sets `scan_id`), and re-runs each batch through
`route_findings` with the live tolerance memory and the learning period OFF,
the scan's own record-and-fold (`_record_finding_events`, shared with
`record_security_state`) and `_apply_correlations` (chains, lineage, risk,
incidents) in an in-memory store. It reports per-category interrupts, lists by
id every incident the operator closed as noise (`FALSE_POSITIVE`, whatever the
resolution) whose evidence would open an interrupt again — `noise re-opened: N
of M` — counts open cases with no noise-labelled evidence (`new interrupts
from corpus`), and routes the findings the 21 assay lanes build through the
same gate (`assay recall: X/21`; predicate-only lanes and the one lane that
writes live state are named, not skipped). `--reobserve` first re-asks the
classifier and the custody ladder about every binary a process, listener,
beacon or outbound finding names that is still on disk, and re-derives its
severity from that sensor's own gate, so a classifier or ladder fix is
scoreable and not only a routing fix. The scan-tail closers are deliberately
not run: they key on what a scan re-asserted, and the event log holds only
what the live fold recorded. The command asserts its counts against the store
before printing them and puts a failed assertion at the top.

### Identity fixes (what a finding is *about*)

| Sensor | Was identified by | Now identified by | Measured |
Expand Down
Loading
Loading