Skip to content

Commit 1f3fec9

Browse files
committed
fix(os-rv64): keep release gates source-only honest
1 parent 5230c48 commit 1f3fec9

9 files changed

Lines changed: 80 additions & 43 deletions

File tree

packages/chip/docs/project/prototype-status-dashboard.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Prototype Status Dashboard
22

3-
Snapshot: updated 2026-05-21 after native-toolchain recovery; MVP rows mirror `scripts/check_mvp_status.py --json`.
3+
Snapshot: updated 2026-05-22 from a source-only checkout; volatile generated-artifact rows stay conservative until the local/CI run regenerates evidence.
44

55
## MVP Gate Snapshot
66

@@ -14,18 +14,18 @@ Snapshot: updated 2026-05-21 after native-toolchain recovery; MVP rows mirror `s
1414
| software-bsp | `BLOCK` | `scaffold_only` | `make software-bsp-evidence-check` |
1515
| real-world-release-gates | `PASS` | `command_pass` | `none` |
1616
| rtl-source | `PASS` | `source_present` | `none` |
17-
| synthesis | `PASS` | `generated_artifact` | `none` |
18-
| cocotb | `PASS` | `generated_artifact` | `none` |
19-
| verilator | `PASS` | `generated_artifact` | `none` |
17+
| synthesis | `BLOCK` | `tool_blocker` | `make synth` |
18+
| cocotb | `BLOCK` | `regen_required` | `make cocotb cocotb-npu cocotb-contract cocotb-cpu` |
19+
| verilator | `BLOCK` | `tool_blocker` | `make verilator` |
2020
| formal | `BLOCK` | `tool_blocker` | `make formal inside Docker/Nix` |
2121
| qemu | `BLOCK` | `tool_blocker` | `make qemu-check` |
2222
| renode | `BLOCK` | `tool_blocker` | `make renode-check` |
23-
| npu-ml-proof | `PASS` | `generated_artifact` | `none` |
23+
| npu-ml-proof | `BLOCK` | `tool_blocker` | `make mvp-npu-ml-evidence-check` |
2424
| minimum-linux-npu-target | `BLOCK` | `tool_blocker` | `make minimum-linux-npu-target-strict` |
2525
| pd-contract | `PASS` | `command_pass` | `none` |
2626
| product-package | `BLOCK` | `release_blocker` | `close package/FPGA/KiCad/PD/manufacturing release blockers or keep product claim below fabrication` |
2727
| benchmarks | `BLOCK` | `scaffold_only` | `python3 benchmarks/run_benchmarks.py run --metadata benchmarks/metadata/strict-blocked-template.json --strict-missing` |
28-
| release-pipeline | `PASS` | `generated_artifact` | `none` |
28+
| release-pipeline | `BLOCK` | `regen_required` | `make tool-versions pipeline-check` |
2929

3030
## Workstream Dashboard
3131

packages/chip/scripts/check_prototype_status_dashboard.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"qemu",
2020
"renode",
2121
"benchmarks",
22+
"npu-ml-proof",
2223
"release-pipeline",
2324
}
2425

packages/chip/scripts/test_check_prototype_status_dashboard.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,19 @@ def test_allows_benchmark_regen_to_remain_scaffold_only(self) -> None:
8787
}
8888
self.assertTrue(conservative_snapshot_allowed("benchmarks", status, row))
8989

90+
def test_allows_npu_ml_proof_to_remain_source_only_conservative(self) -> None:
91+
status = {
92+
"status": "pass",
93+
"evidence_class": "generated_artifact",
94+
"next_step": "none",
95+
}
96+
row = {
97+
"Status": "`BLOCK`",
98+
"Evidence class": "`tool_blocker`",
99+
"Next action": "`make mvp-npu-ml-evidence-check`",
100+
}
101+
self.assertTrue(conservative_snapshot_allowed("npu-ml-proof", status, row))
102+
90103

91104
if __name__ == "__main__":
92105
unittest.main()

packages/os/linux/elizaos/Makefile

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# make build ARCH=riscv64 DEBIAN_MIRROR=https://ftp.debian.org/debian
99
#
1010
# make qemu-boot ARCH=riscv64
11-
# make release-check-strict ARCH=amd64
11+
# make release-check-strict ARCH=riscv64
1212
# make brand-assets
1313

1414
ARCH ?= amd64
@@ -23,13 +23,14 @@ AGENT_ARTIFACTS_MOUNT := $(if $(wildcard $(AGENT_ARTIFACTS)),-v "$(AGENT_ARTIFAC
2323

2424
SUPPORTED_ARCHES := amd64 arm64 riscv64
2525

26-
.PHONY: help build builder qemu-boot release-check-strict release-check brand-assets clean lint
26+
.PHONY: help build builder qemu-boot release-check-strict release-check check-riscv64-release-arch brand-assets clean lint
2727

2828
help:
2929
@echo "elizaOS Linux build targets:"
3030
@echo " make build [ARCH=amd64|arm64|riscv64] [PROFILE=default|secure]"
3131
@echo " make qemu-boot ARCH=<arch>"
32-
@echo " make release-check-strict ARCH=<arch>"
32+
@echo " make release-check ARCH=riscv64"
33+
@echo " make release-check-strict ARCH=riscv64"
3334
@echo " make brand-assets # regenerate PNG branding from SVG sources"
3435
@echo " make lint # static smoke checks"
3536
@echo " make clean # remove out/ and live-build state"
@@ -75,11 +76,17 @@ build: builder check-arch
7576
qemu-boot: check-arch
7677
scripts/boot-qemu.sh $(ARCH)
7778

78-
release-check-strict: check-arch
79-
scripts/release-check.sh --strict --arch $(ARCH)
79+
release-check-strict: check-riscv64-release-arch
80+
scripts/check_release_manifest.py --strict
8081

81-
release-check: check-arch
82-
scripts/release-check.sh --arch $(ARCH)
82+
release-check: check-riscv64-release-arch
83+
scripts/check_release_manifest.py
84+
85+
check-riscv64-release-arch: check-arch
86+
@if [ "$(ARCH)" != "riscv64" ]; then \
87+
echo "ERROR: release-check currently validates the riscv64 qemu-virt release manifest only; got ARCH=$(ARCH)" >&2; \
88+
exit 64; \
89+
fi
8390

8491
brand-assets:
8592
scripts/generate-elizaos-brand-assets.sh

packages/os/linux/elizaos/README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,13 @@ No promoted artifact exists yet — the manifest template carries
8989

9090
This is the active, canonical Linux build. The build pipeline, multi-arch
9191
config, branding overlay, `secure` hardening profile, and release-manifest
92-
gate are in the tree. A riscv64 candidate ISO has qemu-virt boot evidence
93-
under `evidence/qemu_virt_boot.json`, including GRUB EFI, Linux, local curl
94-
health, agent-ready, and terminal TUI smoke markers. amd64 and arm64 still
95-
need produced ISO evidence before release promotion. See
92+
gate are in the tree. The checked-in riscv64 release manifest is intentionally
93+
`planned`: promotion remains blocked until a local build fills artifact
94+
metadata and archives qemu-virt, GRUB EFI, local curl health, agent-ready, and
95+
terminal TUI smoke transcripts. The existing `evidence/qemu_virt_boot.json`
96+
records the prior local qemu-virt summary only; it is not promoted release
97+
evidence without its matching transcript and ISO artifact. amd64 and arm64
98+
still need produced ISO evidence before release promotion. See
9699
`packages/os/CLAUDE.md` for the distribution-channel and promotion policy.
97100

98101
## License

packages/os/linux/elizaos/build.sh

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -401,20 +401,20 @@ echo
401401
echo "--- step 5/5: manifest ---"
402402
TEMPLATE="${HERE}/manifest.json.template"
403403
if [ ! -f "${TEMPLATE}" ]; then
404-
echo "WARN: ${TEMPLATE} missing — skipping manifest emission." >&2
405-
else
406-
SHA256="$(awk '{print $1}' "${OUT}/${ARTIFACT_BASENAME}.iso.sha256")"
407-
sed \
408-
-e "s|@@ARCH@@|${ARCH}|g" \
409-
-e "s|@@PROFILE@@|${PROFILE}|g" \
410-
-e "s|@@FILENAME@@|${ARTIFACT_BASENAME}.iso|g" \
411-
-e "s|@@BUILD_TIMESTAMP@@|${BUILD_TS}|g" \
412-
-e "s|@@SHA256@@|${SHA256}|g" \
413-
-e "s|@@SIZE_BYTES@@|${ISO_BYTES}|g" \
414-
"${TEMPLATE}" > "${OUT}/${ARTIFACT_BASENAME}.manifest.json"
415-
python3 -c "import json,sys; json.load(open('${OUT}/${ARTIFACT_BASENAME}.manifest.json'))"
416-
echo " manifest: ${OUT}/${ARTIFACT_BASENAME}.manifest.json"
404+
echo "ERROR: ${TEMPLATE} missing; refusing to emit an ISO without release metadata." >&2
405+
exit 3
417406
fi
407+
SHA256="$(awk '{print $1}' "${OUT}/${ARTIFACT_BASENAME}.iso.sha256")"
408+
sed \
409+
-e "s|@@ARCH@@|${ARCH}|g" \
410+
-e "s|@@PROFILE@@|${PROFILE}|g" \
411+
-e "s|@@FILENAME@@|${ARTIFACT_BASENAME}.iso|g" \
412+
-e "s|@@BUILD_TIMESTAMP@@|${BUILD_TS}|g" \
413+
-e "s|@@SHA256@@|${SHA256}|g" \
414+
-e "s|@@SIZE_BYTES@@|${ISO_BYTES}|g" \
415+
"${TEMPLATE}" > "${OUT}/${ARTIFACT_BASENAME}.manifest.json"
416+
python3 -c "import json,sys; json.load(open('${OUT}/${ARTIFACT_BASENAME}.manifest.json'))"
417+
echo " manifest: ${OUT}/${ARTIFACT_BASENAME}.manifest.json"
418418

419419
echo
420420
echo "=== done ==="

packages/os/linux/elizaos/manifest.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
"hypervisor": "qemu-virt",
99
"firmware": "qemu-efi-riscv64/EDK2 + OpenSBI"
1010
},
11-
"filename": "elizaos-linux-riscv64-default-20260521T131111Z.iso",
11+
"filename": "elizaos-linux-riscv64-planned.iso",
1212
"downloadUrl": null,
13-
"status": "candidate",
14-
"sizeBytes": 427153408,
15-
"sha256": "07519ebc789eb1cb83d9aea94a72265ca694e147af24d1f0d5070214450c1eb1",
16-
"notes": "elizaOS Live (profile=default, built=20260521T131111Z); promotion blocked until qemu-virt, GRUB EFI RISC-V, and elizaOS agent boot evidence are collected.",
13+
"status": "planned",
14+
"sizeBytes": null,
15+
"sha256": null,
16+
"notes": "elizaOS Live riscv64 release manifest skeleton; promotion is blocked until a local build fills artifact metadata and qemu-virt, GRUB EFI RISC-V, and elizaOS agent boot evidence are collected with archived transcripts.",
1717
"validation": {
1818
"requiredEvidence": [
1919
"qemu-virt-boot",
@@ -23,18 +23,18 @@
2323
"evidence": [
2424
{
2525
"id": "qemu-virt-boot",
26-
"status": "collected",
27-
"path": "evidence/qemu_virt_boot.json"
26+
"status": "missing",
27+
"path": null
2828
},
2929
{
3030
"id": "grub-efi-riscv64-boot",
31-
"status": "collected",
32-
"path": "evidence/qemu_virt_boot.json"
31+
"status": "missing",
32+
"path": null
3333
},
3434
{
3535
"id": "elizaos-agent-live",
36-
"status": "collected",
37-
"path": "evidence/qemu_virt_boot.json"
36+
"status": "missing",
37+
"path": null
3838
}
3939
]
4040
}

packages/os/linux/elizaos/scripts/check_release_manifest.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,7 @@ def check_schema(manifest: dict, schema: dict) -> list[GateResult]:
207207
GateResult(
208208
"BLOCKED",
209209
"python dependency missing: jsonschema; run "
210-
"`python3 -m pip install -r packages/os/linux/variants/"
211-
"elizaos-linux/requirements.txt`",
210+
"`python3 -m pip install jsonschema`",
212211
)
213212
]
214213
artifact_schema = _artifact_schema(schema)

packages/os/linux/elizaos/scripts/static-smoke.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,20 @@ done < <(find scripts config/includes.chroot/usr/local/lib/elizaos config/includ
3333
\( -name "*.sh" -o -name "first-boot.sh" -o -name "start-launcher" -o -name "start-chat-overlay" \) \
3434
2>/dev/null)
3535

36+
# Release-check Make targets must stay wired to the checked-in Python gate.
37+
# This is intentionally source-only: it catches stale deleted helper paths
38+
# without requiring a local ISO, QEMU transcript, or release artifact.
39+
python3 -m py_compile scripts/check_release_manifest.py \
40+
|| { echo "PY COMPILE FAIL: scripts/check_release_manifest.py"; fail=1; }
41+
if ! make -n release-check ARCH=riscv64 2>/dev/null | grep -q 'scripts/check_release_manifest.py'; then
42+
echo "BAD RELEASE CHECK TARGET: release-check must invoke scripts/check_release_manifest.py"
43+
fail=1
44+
fi
45+
if make -n release-check ARCH=riscv64 2>/dev/null | grep -q 'scripts/release-check.sh'; then
46+
echo "STALE RELEASE CHECK TARGET: release-check references deleted scripts/release-check.sh"
47+
fail=1
48+
fi
49+
3650
# Systemd unit files have [Unit] + [Install] (or are .path/.target).
3751
for f in $(find config/includes.chroot/etc/systemd -name "*.service" 2>/dev/null); do
3852
grep -q '^\[Unit\]' "${f}" || { echo "BAD UNIT: ${f}"; fail=1; }

0 commit comments

Comments
 (0)