{
  "claim": "Beacon's headline is \"20+ other harnesses\", and the count holds: every row of the README's runtime table has real code behind it. What the count hides is how unlike each other the adapters are — a settings-file hook, a SQLite reader and a monkeypatched window.fetch are three different pieces of engineering, and Beacon normalises all of them into one typed event. Then the learning layer, which is the part the announcement is about, flattens that typed event down to six string fields and sends at most 80 of them to a decision model. Line counts are non-test Go (non-test TypeScript for the extension) at commit 63d43f4.",
  "method": "Counted by walking the repository at commit 63d43f4. Hook installers: files in cli/beacon/internal/endpoint/hooks/ excluding tests and the four shared files (runtime.go, settings_hooks.go, managed_extension.go, dsh_patch.go). Hook event translators: non-test commands in cli/beacon-hooks/cmd/. Session pollers: packages matching cli/beacon/internal/*session plus devincloud. OTLP: the entries of harness.DiscoverAll() whose Capability is otel_env, otel_config, otel_hooks or admin_otel. Browser: browser-extension/src. Rules: *.rule.yaml under rules/, with labelled cases counted as occurrences of 'verdict:' in those files. Learning: cli/beacon/internal/learning/ excluding _test.go.",
  "source": "https://github.com/Asymptote-Labs/agent-beacon",
  "captured": "2026-09-22",
  "note": "The two rows worth reading against each other are the last two. The rules engine and the learning rubric ask questions of the same event stream. One is a declarative expression over typed fields, shipped with 509 labelled cases that run in CI on three operating systems. The other is a hosted model call over prose, shipped with none.",
  "columns": [
    { "key": "mechanism", "label": "capture mechanism" },
    { "key": "n", "label": "harnesses", "align": "right", "mono": true },
    { "key": "reads", "label": "what it actually reads" },
    { "key": "loc", "label": "lines", "align": "right", "mono": true }
  ],
  "rows": [
    {
      "mechanism": "Hook installers",
      "n": 22,
      "reads": "the harness's own settings file, to register beacon-hooks with it",
      "loc": 7439
    },
    {
      "mechanism": "Hook event translators",
      "n": "33 cmds",
      "reads": "the typed payload each vendor's hook hands it on stdin",
      "loc": 13382
    },
    {
      "mechanism": "Session-log pollers",
      "n": "14 + 1 cloud",
      "reads": "files the harness wrote for itself: ~/.claude/projects/**/*.jsonl, Cursor's state.vscdb SQLite and agent-transcripts/",
      "loc": 21201
    },
    {
      "mechanism": "OTLP configuration",
      "n": 7,
      "reads": "the harness's own OpenTelemetry exporter, pointed at a local collector",
      "loc": 2127
    },
    {
      "mechanism": "Browser extension",
      "n": "2 sites",
      "reads": "window.fetch, monkeypatched in the page, teeing SSE chunks",
      "loc": 1573
    },
    {
      "mechanism": "rules/ threat detection",
      "n": "75 rules",
      "reads": "the full typed event — event.action, file.path, command, approval — with 509 labelled test cases",
      "loc": 5598
    },
    {
      "mechanism": "internal/learning",
      "n": "all of them",
      "reads": "6 string fields per event, at most 80 events, no exit code, no actor, no approval decision — with 0 labelled cases",
      "loc": 1509
    }
  ]
}
