{
  "sha": "49a08a07db7f5da0ca3eb77129d5504ae107f8a9",
  "base": "b848244577d398600b59c7829fef9edbdb6315fa",
  "branch": "fix/297-rule-heavy-admission",
  "tree": "C:\\Users\\decid\\Documents\\projects\\spt-core\\.worktrees\\297-rule-heavy-admission",
  "gates": {
    "regression-red": {
      "exit": 100,
      "log_sha256": "c7df886b27e370613093fc8d2aab4b88ba4efce103640b095b996c0cc70c4d05",
      "started_utc": "2026-09-14T07:49:56.618065+00:00",
      "ended_utc": "2026-09-14T07:54:17.844819+00:00",
      "summary_lines": [
        "    Finished `test` profile [unoptimized + debuginfo] target(s) in 4m 11s",
        "     Summary [   4.050s] 1 test run: 0 passed, 1 failed, 1040 skipped",
        "error: test run failed"
      ]
    },
    "firewall-green": {
      "exit": 0,
      "log_sha256": "b5e103dc3c52d264ddcd0c08ba593cd92a93db4928809cedac2378814fc4c31e",
      "started_utc": "2026-09-14T07:56:16.219576+00:00",
      "ended_utc": "2026-09-14T07:57:06.425251+00:00",
      "summary_lines": [
        "    Finished `test` profile [unoptimized + debuginfo] target(s) in 37.79s",
        "     Summary [   5.360s] 34 tests run: 34 passed, 1008 skipped"
      ]
    },
    "compile-gate": {
      "exit": 0,
      "log_sha256": "258ccc936b756372338e01882e7253d7e0d57b9dadc045c1c16bec8b04dcff06",
      "started_utc": "2026-09-14T07:59:25.017078+00:00",
      "ended_utc": "2026-09-14T08:04:05.930238+00:00",
      "summary_lines": [
        "    Finished `dev` profile [unoptimized + debuginfo] target(s) in 4m 36s"
      ]
    },
    "traceability": {
      "exit": 0,
      "log_sha256": "a9971e0f30c52430f7ba5a425dcde209403096ab7dacd77cc1c646543bf28c22",
      "started_utc": "2026-09-14T08:00:32.616408+00:00",
      "ended_utc": "2026-09-14T08:00:37.802670+00:00",
      "summary_lines": [
        "       F-034 leg a (perri/hertz field finding 2026-07-09): the ADAPTER_UNRESOLVED refusal hint must print a WORKING command form. It currently says 'pass --adapter <name[:profile]>', but --adapter is a `spt api` GROUP flag, NOT a `listen` flag \u2014 following the hint literally (`spt api listen <id> --adapter <name>`) produces clap `error: unexpected argument '--adapter'` (exit 2). Fix: the hint prints the group-level form, e.g. `spt api --adapter <name> <cmd> \u2026` (a hint the operator can copy-paste and have work). Gate: the ADAPTER_UNRESOLVED message text carries a clap-VALID invocation (group-level --adapter placement) \u2014 a unit asserting the hint string parses under the api clap grammar, or at minimum places --adapter before the subcommand. Pure UX/hint-correctness fix, no behavior change.",
        "       A perch directory is RESIDUE only on a POSITIVE record-absence predicate, and the store that answers it is the owlery tree itself (3.4 extension; releases#109, doyle-ruled 2026-08-04). There is NO independent endpoint-existence store on a node: `spt::roster::enumerate`, the daemon's `projwriter::enumerate_perches` and `perch::list_self_perch_ids_checked` all derive the endpoint set from `read_dir(owlery)`, and a dir with no `info.json` is not a perch \u2014 so THE PERCH DIRECTORY PLUS ITS PARSEABLE RECORD IS THE ENDPOINT RECORD. The local registry is NOT that store and must never be asked: KNOWN-HAZARDS 4.3 has `clean_stale_entries` DELETE dead-pid rows and `unregister_address` fire on an ordinary stop, so registry-absence is the normal steady state of every OFFLINE endpoint (measured HFENDULEAM 2026-08-04: 6 of 14). PREDICATE: residue iff no `info.json` is present on ANY read attempt. Positive, present-tense, one read, and NEVER an age/mtime heuristic \u2014 a dormant endpoint, a suspended session and a long-idle live agent are indistinguishable from 'old' by mtime. Absent is the ONLY answer that authorizes deletion, so the read keeps NotFound distinct from every other I/O error: unreadable \u21d2 occupied, corrupt (present, unparseable) \u21d2 occupied (a destroyed record belongs to an endpoint that exists). REAP POPULATION IS NARROWER THAN RESIDUE: recordless AND spool-less AND non-empty AND no record-write in flight (`.info.lock` held \u21d2 a bringup mid-create) AND every nested/shells child independently reapable (deepest-first; a recordless parent holding ANY non-reaped child is itself refused). A REFUSED DIRECTORY SHIELDS ITS WHOLE SUBTREE (doyle, ruled 2026-08-04): a descendant that would qualify on its own is reported SHIELDED-BY-REFUSED-PARENT and left alone, because refusing a directory must mean not modifying its CONTENTS either \u2014 carving a child out destroys part of what the refusal report just asked the operator to look at, and can move the parent's own classification on the next pass, and a sweep whose refusals are unstable across its own runs is untrustworthy. A recordless dir carrying a SPOOL is refused permanently \u2014 undeliverable-by-construction settles deliverability, not VALUE, and that spool is the only surviving copy of what was queued. An EMPTY dir is refused permanently \u2014 the mid-create race 3.4 protects exists here identically and no positive discriminator for 'not mid-create' exists for an empty dir. A reparse point anywhere in the subtree is refused. Store unavailable (`read_dir` on the root fails) \u21d2 DO NOTHING and say so, reported distinctly from an empty owlery.",
        "       releases#106: the release workflow REFUSES to publish a release whose built binary disagrees with the tag. `.github/workflows/release.yml` already guards the CHANGELOG against the tag (`ver=\"${GITHUB_REF_NAME#v}\"`, `::error::` + `exit 1`) but nothing proves the ARTIFACT carries that version \u2014 a tag pushed without bumping `[workspace.package] version` (and the first-party `spt-*` lines in `Cargo.lock`) ships a binary that self-reports the previous release. Shape: after the platform builds and BEFORE `gh release create`, execute the freshly built binary FOR THE RUNNER'S OWN PLATFORM with `--version`, compare to `${GITHUB_REF_NAME#v}`, and on mismatch fail with a named error stating BOTH values and naming the fix. SCOPE CONSTRAINT, load-bearing: a cross-compiled `matrix.target` artifact CANNOT be executed on the runner, so the assert must sit where a natively-runnable artifact is in scope \u2014 the native (non-`matrix.target`) leg, or the notes job after artifact download if the native asset is fetchable there. The assert lands in the RELEASE workflow, never as a new CI window (two-runs-per-sha ruling). SHIPPED SITE: the `assemble` job after `download-artifact` and before the docs bundle and `gh release create` \u2014 the one place the whole asset set exists at once on a box that can natively execute part of it, and the bytes there are the ones about to be published rather than a build-tree lookalike. The two Linux assets are covered; the WINDOWS asset is not, stated rather than glossed \u2014 no Linux runner can execute it, and a matching Linux artifact is evidence the workspace version was bumped, not evidence the Windows leg built from that tree. VERIFICATION STANCE, recorded at mint and honored: the workflow is tag-triggered and cannot be run locally, so no green is claimed for it. Instead the logic was EXTRACTED to `.github/ci/release-version-assert.sh` (the repo's own convention for CI logic, beside `ci-notify.sh` and the reap-census pair) precisely so it stops being unrehearsable, and its selftest runs on every golden Linux leg. Gate: impl \u2014 the script plus release.yml calling it; unit \u2014 `release-version-assert-selftest.sh`, 12 assertions, over half of them negative controls (stale binary, binary ahead of tag, missing artifact, unrunnable binary, empty asset list, absent tag)."
      ]
    },
    "docs-gen": {
      "exit": 0,
      "log_sha256": "340adc51d8f01d33c2fa2fd68b56a8c1fb4c39f77294ab35806a7e8743f2d8b5",
      "started_utc": "2026-09-14T08:04:30.070474+00:00",
      "ended_utc": "2026-09-14T08:09:56.557173+00:00",
      "summary_lines": [
        "    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 13s"
      ]
    },
    "docs-check": {
      "exit": 0,
      "log_sha256": "de8a268433f442f18fc13e15915aaabf54d44102e5db1e84879b2d3b1ff4b532",
      "started_utc": "2026-09-14T08:10:18.186422+00:00",
      "ended_utc": "2026-09-14T08:10:38.390701+00:00",
      "summary_lines": [
        "    Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.43s"
      ]
    },
    "clippy": {
      "exit": 0,
      "log_sha256": "dd302592147199651d81b80597e5e45a36672a83f3ac41dd36fe998381efe0fc",
      "started_utc": "2026-09-14T08:10:38.495218+00:00",
      "ended_utc": "2026-09-14T08:12:18.675916+00:00",
      "summary_lines": [
        "    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 36s"
      ]
    },
    "release-build": {
      "exit": 0,
      "log_sha256": "ea49b96119e0bb62340cde2151ed7dabde5e0f6fb952cd876df0a1beec3c9811",
      "started_utc": "2026-09-14T08:13:10.719262+00:00",
      "ended_utc": "2026-09-14T08:25:33.951776+00:00",
      "summary_lines": [
        "    Finished `release` profile [optimized] target(s) in 12m 18s"
      ]
    }
  },
  "artifacts": [
    {
      "name": "spt.exe",
      "path": "C:\\Users\\decid\\Documents\\projects\\spt-core\\.worktrees\\297-rule-heavy-admission\\target\\release\\spt.exe",
      "bytes": 38876672,
      "sha256": "ad3354d4d9217f291c6943c5e796209802e8de3c1a6dced1b9db824ed9743f72"
    },
    {
      "name": "xtask.exe",
      "path": "C:\\Users\\decid\\Documents\\projects\\spt-core\\.worktrees\\297-rule-heavy-admission\\target\\release\\xtask.exe",
      "bytes": 5217280,
      "sha256": "abd1df7ba51885326679097227ac0e2949cc480e0edc936a5952fdc8820de302"
    }
  ],
  "smoke": {
    "command": "spt.exe --version",
    "exit": 0,
    "stdout": "spt 0.70.0\n"
  },
  "pool_released": true,
  "pool_retained": true,
  "free_bytes_final": 119151230976,
  "process_census": {
    "scope": "Observable processes whose executable or command line references the lane tree/pool",
    "matches": [],
    "inaccessible": []
  },
  "limitations": [
    "No live NetSecurity queries/mutations or field window performed",
    "No successor Windows or Linux consumers performed",
    "Linux execution requires separate doyle authorization",
    "No push, merge or golden run performed"
  ],
  "measurements": "measurements.txt"
}
