Skip to content

Onboarding matrix evidence index — 2026-08-12

Decision: TRUTHFUL_4_OF_4 / ACTIVATION_GATE_CLOSED

Public source route inspected: 549ef03017c776f23fc968881b346aa685356274 (0.9.1)

Preflight remote mutations performed: none

Outcome

The shortest maintainer audit now reports the evidence already checked into the repository instead of treating an omitted positional argument list as an empty project history:

python3 scripts/check_onboarding_trial_matrix.py --json

The command loads docs/contracts/g0-onboarding-matrix-evidence-v1.json, whose four explicit rows point to the reviewed Humble and Jazzy Docker records plus the two reviewed source records. It does not glob a directory, choose a latest file, or infer success from a missing record. Explicit paths remain available for auditing provisional records before maintainers update the index.

Current truthful matrix

Row Present Outcome Measurement Comparable
Docker Humble yes PASS INCOMPLETE no
Docker Jazzy yes PASS INCOMPLETE no
Source Humble yes PASS INCOMPLETE no
Source Jazzy yes PASS INCOMPLETE no

The aggregate is four present rows, four product PASS outcomes, zero comparable rows, and a closed activation gate. The Docker records still lack human active time, human command count, and isolated peak disk. The source records have complete route, build, map, verifier, and receipt outcomes, but deliberately record both active_operator_time_sec=null and command_count=null because no human observer measurement was retained. The Docker rows are the immutable 0.9.0 release records while the source rows are the reviewed 0.9.1 candidate records, so the checker also reports product_version_aligned=false. It exposes all four rows for review but keeps the matrix BLOCKED; no cross-version evidence is allowed to pass a route comparison gate.

Version-alignment preflight — 2026-08-13

The read-only release audit for the reviewed source candidate is still NOT_PUBLISHED:

{
  "expected_tag": "v0.9.1",
  "expected_version": "0.9.1",
  "release_present": false,
  "tag_present": false,
  "assets": [],
  "status": "NOT_PUBLISHED"
}

The exact image probes also return manifest unknown for both ghcr.io/rsasaki0109/lidar_slam_ros2:v0.9.1-humble and ghcr.io/rsasaki0109/lidar_slam_ros2:v0.9.1-jazzy. The apparent fallback— rerunning source against the frozen v0.9.0 Docker identity—is not a valid route: its public tag commit 0df0c4a86df9f68a894c83f8342e4107c3d23b0f returns source-route-contract-missing because it predates scripts/source_quickstart.sh. No local build or moving image tag is promoted to matrix evidence.

The release audit now exposes the same image gate without a second manual manifest command:

python3 scripts/check_published_release.py --version 0.9.1 --json

Its images array reports both exact tags as ABSENT while the overall result remains NOT_PUBLISHED; registry/API failures remain distinguishable as ERROR/BLOCKED. This is a read-only maintainer aid and does not publish or retag an image.

Public source diagnosis

The network-read-only source preflight against exact public Draft PR commit 549ef030 returns READY for product version 0.9.1: it resolves all six maintained source packages and all four route-contract files with no finding codes or writes. Separate clean disposable Humble and Jazzy runtime-image trials then completed the documented source route and produced map, verifier, and receipt PASS results. The checked-in records are valid product outcomes, but remain non-comparable because active human time was not observed. The runtime images already contained ROS and the build dependencies, so these rows also do not claim a cold package-install baseline. The matrix checker reports both this measurement blocker and the Docker/source version-alignment blocker as explicit next actions.

The first exact-tip check also exposed a GitHub API boundary: the commits API returns HTTP 422, rather than 404, for a syntactically valid but unpublished 40-character commit. The observer now treats 404 and 422 from that commit lookup as source-candidate-not-published, while a 422 from a content lookup remains an observer error. This keeps an unpublished candidate machine- decidable without hiding authentication, validation, or malformed-content failures.

Fail-closed checks

The evidence-index schema fixes the matrix ID, four row IDs, repository, safe repository-relative JSON paths, and no-remote-mutation authority. The checker also requires the fixed row order, regular non-symlink files, and agreement between an index row and the record's route, distribution, and environment. Missing, escaped, shuffled, or mislabeled records fail validation.

Validation results:

  • onboarding matrix regressions: 12 passed;
  • source public-preflight regressions: 20 passed, including real 422 unpublished-tip classification;
  • no-argument report: 4/4 present, 4 PASS, 0 comparable, BLOCKED;
  • runner and regression-test full flake8: PASS;
  • complete maintained Python gate: graph 1,433 passed / 13 skipped, lidar_slam 751 passed, 2,184 total;
  • strict MkDocs build: PASS with pre-existing notices;
  • source public preflight: READY at exact 549ef030, no writes;
  • issue, PR, branch, release, image, and other mutation by the preflight: none.

Next gate

Align all four rows to one product version first. At present that requires a reviewed v0.9.1 Release and its immutable Humble/Jazzy images; the v0.9.0 source fallback is closed by the route-contract preflight above. After that identity exists, run dedicated disposable Humble and Jazzy hosts with a human observer and replace rows only after active time and command count are measured. The Docker rows likewise require a dedicated filesystem and human active-time observation; another shared-host automation run would not close that gap. Until at least one Docker PASS and one source PASS are comparable, the G0 activation gate stays closed and no independent-user cohort is recruited.