Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 11 Sep 01:20
· 107 commits to main since this release
93f1016

Added

  • --report[=FILE] on replay and scan: the same assessment as one
    self-contained HTML file. No CDN, no font fetch, no script tag — it opens on a
    machine with no network, which is where a security artifact most needs to
    open. Two properties are regression-tested rather than intended:
    the reachability caveat rides on the artifact in the same type size as the
    verdict (an exported "100% clean" that leaves its caveat in the terminal it
    came from is worse than no export — it looks authoritative), and trajectory
    text is escaped, never interpolated
    — paths, hosts and task strings are
    written by the monitored agent, so a renderer that trusted them would hand
    that agent a script tag in its reviewer's browser. The CLI names the file it
    wrote on stderr, never stdout, and says that it carries your own hosts and
    paths.

  • The README quickstart now leads with plumbline scan ~/.claude/projects.
    The synthetic replay is the proof; what an agent actually did last week is
    the reason to install anything.

  • siphon, an eighth deterministic detector: ambient credential material
    converging on off-provider egress. It fires when the agent reads a credential
    store for a provider its envelope never named — ~/.aws/credentials,
    ~/.kube/config, a projected service-account token — and then sends data
    off-box to somewhere that is not that provider. The read alone is a lead
    (0.15, below warn); the convergence is the finding (0.7, reaching
    confirm and no further, because a silent envelope is not proof of intent).
    An allowlisted destination does not clear it: that is precisely how the
    residual-floor escape stayed invisible. Naming the provider does —
    cloud:aws, cred:*, or an explicit fs:/home/runner/.aws/* grant.

  • corpus/evasion-semantic-floor.jsonl — the floor case that remains after
    siphon, where the secret is a workspace config file no vendor convention
    marks. Shipped as a passing (clean) test, inheriting the role
    evasion-residual-floor.jsonl held, so the boundary cannot be quietly
    "fixed" with an overfit threshold.

  • corpus/eval-benign/hard-npm-auth.jsonl — siphon's declared false
    positive
    : a CI-debugging agent reads its own ~/.npmrc, uses it at the
    registry, then opens a PR on GitHub. Shape-identical to the escape; only
    meaning separates them. Kept for the same reason hard-metadata-research
    is kept for metadata.

  • target.path is now a declared reachability field, so a trajectory that
    records file access without paths reports siphon as starved rather than
    clean.

  • siphon reads outcome asymmetrically, after review caught it rejecting only
    denied on both sides. A failed read holds nothing — an ENOENT on
    ~/.aws/credentials followed by an ordinary request used to score confirm
    over a credential the agent never got. A failed send still counts when
    there is evidence it reached the network (a response status, or bytes already
    written), because an error request in this schema usually means the host
    answered with a failure status and a 500 from a collector is an exfiltration
    that worked.

Changed

  • corpus/evasion-residual-floor.jsonl now reaches confirm on the
    deterministic path, two events before the trajectory ends. Its header and the
    evasion regressions were rewritten rather than deleted: the file records that
    the floor moved and why.
  • eval/semantic-eval.mjs keys its pass bar on the new floor escape and
    includes both new corpora. The scorecard in docs/semantic-detector.md
    predates them and is labelled as such rather than estimated forward.
  • siphon is not in the real-traffic coverage table: it postdates that
    measurement, and the README says so where the clean rate is quoted.