Document · doc-0003

Closed GitHub issues (pre-Backlog history index)

Any #NNNN reference below 656 in this repo is a GitHub issue, not a backlog task. Tracking moved in-repo on 2026-08-14 at issue #655; OPN-0001 onwards are backlog tasks and the two numbering schemes do not overlap. Commit messages, CHANGELOG.md, code comments, AGENTS.md and the grafana/ and scripts/ sources are full of the old numbers and were deliberately left alone — rewriting 524 issues’ worth of references would have been churn with no reader.

Those issues were deleted from GitHub on 2026-08-14, so gh issue view <n> 404s. They are archived instead, in full, at archive/github-issues-2026-08-14.json — that file is the record and this doc is the index into it:

jq '.[] | select(.number == 336)' archive/github-issues-2026-08-14.json      # one issue
jq -r '.[] | select(.number == 336) | .comments[].body' archive/…            # its replies

The load-bearing detail — closing decisions, corrections, acceptance evidence — is usually in the comments rather than the body, so read the archive, not just the table below. The archive is redacted: host names, LAN and tailnet addresses, the WAN address, MACs and token fingerprints were replaced with stable placeholders before it was committed, one real value to one token. archive/README.md carries the mapping and the two verification traps worth knowing.

GitHub Issues stays enabled on this repo, deliberately. External contributors can still file — #40 is one such report and was kept, as was Renovate’s Dependency Dashboard (#22, and #7). Anything arriving that way becomes an OPN-NNNN task; the board, not the issue, is where it is worked.

Why there was no bulk import as tasks

524 issues were deleted, 506 of them Rob’s own project tracking and 18 filed by CI. Importing them as Done tasks fails twice over: it creates a second ID space over the same history — backlog IDs follow creation order, so no OPN-NNNN could ever line up with the #NNN already cited in AGENTS.md, CHANGELOG.md, commit messages and code comments — and hundreds of Done rows would compete with the board’s only real signal, what is left. Archiving the bodies to one JSON file and indexing the load-bearing numbers here keeps the history readable from the checkout alone, keeps the original ID space as the only one, and costs two files.

The numbers AGENTS.md cites, and what they mean

AGENTS.md refers to these nine by number as if the reader knows them. They are the ones worth resolving without a gh call.

# Meaning
#235 A live-box canary drift run. Flagged healthCheck subsystems; #243 did not. Two runs disagreeing is a box-state tell, not intermittent drift — this pair is the worked example behind that rule.
#243 The canary run that did not flag it. 7/7 of its findings were box-state.
#248 The syslog receiver with API enrichment — replaced the firewall/diaglog poll lanes with a push receiver. Why internal/logship/ exists and why it is not a collector.
#271 Another canary drift run; 7/7 box-state. With #243, the evidence that box-state is the most common verdict in practice, not the exotic one.
#284 metadata.subsystems is never populated — the 26.1.11 health model rested on a false premise. Cost two fabricated fixtures and a permanently dead branch. The canonical instance of modelling a shape upstream cannot produce.
#302 The multi-page operator console at /. Why internal/webui/ renders only from metricsnap, StatusTracker and the client cache view, and must never Gather() on the live registry.
#336 The epic that decoupled collectors from the scrape: per-collector poll scheduler, volatility tiers, in-memory snapshot. Why /metrics and the OTLP bridge replay a snapshot and make no live API call.
#346 NetFlow v9 receiver + Zenarmor rollups + the correlator that merges fragments into one flow log per connection-window. The origin of internal/flow/ and of its correlation defect class.
#495 Plugin-gating and 404-cacheability are two questions, not one list. The canary was misreporting vnstatGetJsonData as a vanished core route because its real request path carries a query string the cache key does not.

Three more worth knowing

# Meaning
#544 Five payloads decoded with the identifying dimension discarded. Produced make fieldaudit and its unit-test gate.
#565 Live firewall addresses removed from public repository content. Produced make check-public-ips and scripts/public-ip-allowlist.json.
#625 The testbed guests power down outside the canary window (06:00–08:30 UTC). The reason the lab is unreachable most of the day, and the reason the canary is dispatch-triggered rather than cron-triggered.

The two issues open at cutover

# Disposition
#654 live-canary never ran inside the testbed power window. Closed as complete — its last criterion, one unattended green run, was satisfied by seven consecutive green 06:05 UTC dispatch runs, 2026-08-08 to 2026-08-14. Not migrated; archived and deleted with the rest.
#655 Rare data race in the syslog Listener shutdown path. Migrated to OPN-0001 with its ~290 negative reproduction runs intact. Archived and deleted; OPN-0001 carries the full reproduction record, so nothing depends on the issue.

View the source file on GitHub