Skip to content

[MAIN-HEALTH-CI-003] Restore Container Security runtime compatibility - #3674

Open
ootakazuhiko wants to merge 4 commits into
mainfrom
ci/container-security-runtime-recovery-20260730
Open

[MAIN-HEALTH-CI-003] Restore Container Security runtime compatibility#3674
ootakazuhiko wants to merge 4 commits into
mainfrom
ci/container-security-runtime-recovery-20260730

Conversation

@ootakazuhiko

@ootakazuhiko ootakazuhiko commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements #3672 under parent program #3655.

Restores a deterministic, fail-closed Security Analysis → Container Security runtime path after the GitHub-hosted Ubuntu runner image transition exposed an OCI runtime incompatibility.

Runtime failure evidence review follow-up (current head)

Exact head: da5e996
Fix commit: da5e996 — fix(ci): preserve runtime preflight failure evidence

The latest review identified that the no-preferred-runtime path fabricated a zero-duration minimal-run failure. The closed replacement now:

  • uses one deterministic selection contract for success and failure path preference;
  • first chooses the highest-preference requested candidate that passed direct smoke and failed minimal run, because it reached the later reviewed stage;
  • otherwise chooses the highest-preference requested candidate carrying the direct-smoke failure;
  • uses /usr/local before /usr within the same stage;
  • derives top-level direct-runtime-smoke and minimal-run from the chosen candidate's actual status, exitCode, durationMs, and detail;
  • preserves direct-fail/minimal-pass, direct-pass/minimal-timeout, nonzero exit, invalid-version invocation, and both-fail evidence without conversion;
  • leaves every candidate selected=false, selectedRuntime=null, and pipelineComplete=false;
  • records runtime-missing checks as not-run without fabricated execution metadata;
  • recomputes the selection during semantic validation so substituted check identity or zeroed duration is contract-invalid.

Validation: focused runtime/workflow matrix 91/91; full unit 213 files with 1443 pass and 1 skipped; types, build, API snapshot, 101-schema validation, fixture validation, docs consistency, Verify Lite, actionlint 1.7.12, Context Pack, Boundary Map, and diff check all pass.

Exact-head CI: Verify Lite 30598414851, Policy Gate 30598414871, Copilot Review Gate 30598943455, coverage 30598414951, Security 30598415058, Quality Gates 30598415127, and Full CI 30598415323 succeeded.

New independent focused acceptance:

  • 30598437848, attempt 1, exact head, workflow and Container Security success; downloaded diagnostic pipelineComplete=true, 12/12 pass, SHA-256 56574e4e9cb970fdb88a05e6574930f8b1765a554f2cf250775e1df0b10ef493.
  • 30598620836, attempt 1, exact head, workflow and Container Security success; downloaded diagnostic pipelineComplete=true, 12/12 pass, SHA-256 d814b9454645a1de8da8c80c4613e1899fec9e8b74810f688c93a5b775a75cde.

Compatibility impact is limited to the unmerged Draft evidence contract: success artifacts are unchanged, while synthetic or candidate-mismatched failure summaries are now rejected. Existing check names, security thresholds, and runtime selection remain unchanged. Rollback this review fix by reverting da5e996; the earlier evidence hardening rollback remains 2b48041.

Evidence-contract hardening follow-up (prior head 2b48041)

Human review of the prior head identified four contract-hardening themes plus an explicit completion boundary. Commit 2b480412d329888917b62c7d9b8c0226d142f05f addresses them without changing the repaired runtime selection:

  1. Safe artifact boundary: archive, SARIF, and diagnostic reads share one resolver that requires repository-relative / paths, rejects . / .. / backslashes / absolute paths, walks every component with lstat, rejects final and intermediate symlinks (including links back into the repository), and rechecks canonical parent/file containment. This is bounded pre-read validation, not an atomic-open claim.
  2. Bounded structured reads: diagnostic JSON is limited to 256 KiB and SARIF to 16 MiB. Size is checked before read/parse; oversized JSON is not truncated and is preserved as oversized-output / sarif-malformed.
  3. Non-root stage binding: the closed prerequisite chain is now manifest-detect -> repository-build -> image-user -> archive-export -> trivy-pull -> trivy-scan -> sarif-validate -> sarif-upload. archive-export=pass is rejected when image-user is absent, not-run, or failed.
  4. Closed status combinations: one semantic validator is reused for top-level checks and runtime-candidate execution results. pass, fail, and not-run have closed exit-code/detail/classification rules; unavailable candidates cannot pass and selected candidates must be available. Timeout, missing, malformed, and oversized states are not converted.
  5. Explicit finalization: preflight and every failure retain pipelineComplete=false. A new finalize command requires all 12 reviewed check IDs exactly once and all pass, runs after recorded SARIF upload success, and is the only path to pipelineComplete=true. The diagnostic artifact is uploaded after finalization on success and remains uploadable with false on failure.

Follow-up validation completed locally: 83/83 focused contract/workflow tests; Schema and fixture validation; types, build, API snapshot, docs consistency, Verify Lite; actionlint 1.7.12; Context Pack and Boundary Map; and git diff --check. Local Podman 4.9.3 / crun 1.14.1 completed preflight, production build, non-root inspection, 1.31 GiB archive export, Trivy 0.72.0 scan, and SARIF validation. Local evidence correctly remains pipelineComplete=false because GitHub SARIF upload is not available locally.

Compatibility: the pipelineComplete field is required by the current Draft contract. Artifacts from the superseded Draft head are intentionally not accepted as final evidence by this head; no released main contract or required check name is changed. Rollback is the single follow-up commit 2b480412.

Source evidence and root cause

Role Run / job Runner image Result
original main failure 30523479457 / 90809008864 ubuntu-24.04 / 20260726.254.1 first Dockerfile RUN failed through /usr/bin/crun: unknown version specified
independent reproduction 1 30566127799 / 90951003699 20260726.254.1 / eastus2 same first-RUN OCI-runtime startup failure
independent reproduction 2 30566476473 / 90952173915 20260726.254.1 / eastus same first-RUN OCI-runtime startup failure
prior successful comparator 30536784184 / 90851897224 20260720.247.2 / centralus build, export, Trivy, SARIF upload succeeded

All four source runs pulled the same observed node:22-alpine config digest sha256:395425e54d98ebbd748d388685a0c2de151a30fa92fffc10ba30fa63f3db64d6; mutable application-base content was not the observed differentiator.

The 20260726.254 hosted image release changed the runner-provided Podman bundle from 4.9.3 to 5.8.4. The former workflow then installed Ubuntu Podman 4.9.3 and its configuration/runtime tuple at job time. This created a mixed hosted-bundle/Ubuntu-package state that selected /usr/bin/crun 1.14.1 and failed before the repository command could start. The failure reproduced on three regions and was therefore not classified as a single-run transient.

Chosen remediation

Issue option 1: retain the hosted image's reviewed container surface without job-time package mutation, then select only a runtime that passes the closed preflight.

  • remove job-time apt-get install podman
  • inventory Podman, Buildah, conmon, crun, runc, apt candidates, runner image, kernel, architecture, cgroup, storage and rootless state
  • run OCI features plus minimal podman run for every available crun/runc candidate
  • prefer /usr/local/bin/runc when present, otherwise permit the reviewed /usr/bin/runc fallback only after the same direct and minimal smoke checks
  • bind the selected canonical runtime path explicitly to minimal and repository builds
  • require podman info --debug to report the same effective runtime
  • require a digest-pinned minimal RUN true build before the repository build
  • fail closed for manifest, runtime, repository build, image-user, archive, Trivy, SARIF and upload failures
  • upload container-runtime-diagnostic/v1 on success or failure

No PPA, unsigned binary, alternate builder, self-hosted runner, warning conversion, threshold change, or security-lane skip was introduced.

Closed diagnostic contract

New contract surfaces:

  • schema/container-runtime-diagnostic-v1.schema.json
  • scripts/ci/container-runtime-preflight.mjs
  • scripts/ci/lib/container-runtime-diagnostic.mjs
  • reviewed crun/runc fixtures, semantic validator, workflow policy tests and runbook/catalog entries

Stable classifications include runtime-ready, manifest-missing, runtime-missing, runtime-version-incompatible, runtime-selection-invalid, minimal-run-failed, minimal-build-failed, repository-build-failed, archive-export-failed, scan-failed, sarif-missing, sarif-malformed, and sarif-upload-failed.

Stage prerequisites are checked before external execution. Report/artifact paths are repository-bound, canonical, regular and non-symlink where applicable. Command execution is shell-free, time-bounded, and output-bounded. Environment dumps, tokens, private graph-root paths, and raw unbounded output are not retained. The newly controlled Alpine smoke and Trivy images are tag+digest pinned.

Normal and focused event semantics

Normal push/schedule behavior remains enforced and cannot silently skip Container Security.

workflow_dispatch mode=container-security is a focused diagnostic surface. It requires expected_head to be a lowercase 40-character SHA equal to github.sha. It runs Container Security while deliberately skipping unrelated heavy security lanes; focused success is not represented as a complete Security Analysis or #3671 dependency result. Scheduled security notification now waits for Container Security as well.

Prior reviewed-head runtime evidence (superseded for final acceptance)

These runs were independent attempt-1 workflow dispatches on superseded head d75a4853f2f7c6e863118330708eddb0b59f5e50. They remain runtime-repair evidence, but they do not satisfy the hardened pipelineComplete contract on the current head.

Evidence Dispatch 1 Dispatch 2
workflow 30578425829 30578788418
Container Security job 90992397296 90993602146
runner / region 20260720.247.2 / northcentralus 20260720.247.2 / westus2
Podman / Buildah / conmon 4.9.3 / 1.33.7 / 2.1.10 same
default runtime /usr/bin/crun 1.14.1 same
selected/effective runtime /usr/bin/runc 1.3.6 same
direct runtime + minimal run/build success success
repository build + non-root nextjs inspection success success
archive export + Trivy scan success success
SARIF structure + upload success success
diagnostic Schema/classification valid / runtime-ready valid / runtime-ready
workflow conclusion success success

Diagnostic artifact SHA-256 values are a154f27a1a86e5f0c044301f15780c346afcb38265cab4acf89df89cfb6771de and 02ae66794141b6fb038a77127671aeca1da6280fb1d6fa229b937b35092eecfc; the bytes differ only in observation-specific fields such as timestamp/duration, while both closed semantic check sets contain 12 passes and zero failures.

Local validation

Completed on repository-pinned pnpm 10.0.0:

  • clean isolated-store frozen install
  • prior runtime/workflow contract tests: 51/51
  • hardened evidence-contract/workflow tests: 83/83
  • related workflow/container security tests: 29/29
  • full unit suite: 1,401 passed / 1 skipped (1,402 total)
  • 101 Schema self-validations and all fixtures
  • pnpm -s run types:check
  • pnpm -s run build
  • pnpm -s run api:check
  • pnpm -s run check:schemas
  • pnpm -s run check:doc-consistency
  • pnpm -s run verify:lite
  • Context Pack validation and Boundary Map verification
  • actionlint 1.7.12
  • git diff --check
  • local Podman 4.9.3 / crun 1.14.1: preflight, manifest binding, production image build, non-root user check, archive export, Trivy 0.72.0 scan and SARIF structural validation

The repository has no pnpm check command; it exits 254 because no such script exists. Its constituent checks were run explicitly.

Acceptance

  • runtime/toolchain inventory and stable classification are materialized
  • compatible runtime selection is explicit and smoke-tested
  • minimum run and minimum build succeed
  • repository image build and non-root user inspection succeed
  • archive export, Trivy scan, SARIF validation and SARIF upload succeed
  • normal events cannot silently skip Container Security
  • no continue-on-error, || true, warning conversion, permission expansion, or threshold relaxation was added
  • two independent current exact-head focused dispatches conclude success with pipelineComplete=true
  • current exact-head Full CI and required checks succeed
  • Context Pack and Boundary Map validation succeed with no conflict
  • review completeness: 1 review / 0 inline comments / 0 review threads / 0 unresolved
  • Final authority snapshot x2 is captured after this mutable PR metadata is frozen and recorded in the local task ledger.

Prior reviewed-head CI and authority (superseded)

Prior evidence-contract exact-head acceptance (superseded by da5e996)

  • Exact head: 2b480412d329888917b62c7d9b8c0226d142f05f
  • Required CI: success — Verify Lite, Policy Gate, Copilot Review Gate, coverage gate, Security gate, and Deploy-Time Profiles
  • Full CI: success
  • Quality Gates: success
  • Focused Container Security dispatch 1: 30594994868, attempt 1, success
  • Focused Container Security dispatch 2: 30595150591, attempt 1, success
  • Downloaded diagnostics: pipelineComplete=true, 12/12 checks pass, hashes 3a27c9689b5cb43c76c8a6d3ccfb5d46a2eb09eb25a7437d1485c5ee6b98e098 and cd1fc0bfff55c47f65474c156321fa21d7a822612f7a92e437492dbc93f3cec9
  • Runner evidence: both accepted runs used ubuntu24 / 20260720.247.2, Podman 4.9.3, selected /usr/bin/runc 1.3.6. GitHub did not allocate 20260726.254.1; no allocation is inferred.
  • Non-counting diagnostic dispatch 30594991421 was cancelled by same-branch workflow concurrency after the second dispatch was started too early; it is retained as evidence and is not counted among the two successes.
  • Final authority snapshot digest: captured after PR body/comment/check completion and recorded in the local task ledger without mutating this body afterward.

Trust, compatibility and rollback

  • Minimum permissions remain contents: read, actions: read, security-events: write.
  • Checkout remains persist-credentials: false.
  • No external action or floating binary download was added; full-SHA action policy remains the separate [ACP-HARDEN-260] GitHub Actions supply-chain policyをfull-SHA基準で強化する #3664 scope.
  • No security threshold, scan, upload, or normal-event gate was weakened.
  • Compatibility impact is confined to this unmerged Draft contract: pipelineComplete is now required and previous Draft-head artifacts are not final evidence. Existing required check names are unchanged.
  • Rollback follow-up hardening: revert 2b480412; full runtime repair rollback remains d75a4853, then f17e8094.

Rejected alternatives

  • Ubuntu tuple replacement: unnecessary while the hosted runtime candidates pass closed preflight; no package-source mutation is added.
  • Docker/alternative builder: rejected because the verified Podman path preserves the existing build/export/scan boundary.
  • Self-hosted runner: not required by current evidence.
  • Pinning repository node:22-alpine: not included because the same config digest was observed in success and failure; broad image freshness policy is outside [MAIN-HEALTH-CI-003] Restore Container Security after Podman/crun runtime incompatibility #3672.
  • Warning/continue-on-error: prohibited and not used.

Remaining limitations

  • The two exact-head acceptance runs were scheduled on the currently served 20260720.247.2 image, not the failing 20260726.254.1 image. The preflight supports the reviewed /usr/local/bin/runc 1.4.3 bundle on the latter image, but GitHub did not schedule that image during acceptance; this external image-allocation fact is retained rather than inferred away.

  • The diagnostic source value is a bounded path class (/usr/local runner bundle vs /usr system package path), not cryptographic package-ownership provenance. Content-addressed binary provenance is not claimed.

  • The repository production base image remains tag-based; this PR intentionally does not broaden into unrelated image-pinning policy.

  • [MAIN-HEALTH-SEC-002] Eliminate current high dependency vulnerabilities and restore enforced security gates #3671 dependency findings remain a separate baseline until PR [MAIN-HEALTH-SEC-002] Restore dependency security gates #3673 is completed; focused [MAIN-HEALTH-CI-003] Restore Container Security after Podman/crun runtime incompatibility #3672 runs skip that lane and do not reinterpret it as Container Security evidence.

  • Artifact validation is a non-atomic pre-read check. Concurrent filesystem mutation and hard-link inode provenance are not claimed; the workflow-controlled artifact directory and exact-head job boundary remain the current mitigation.

Human decisions required

None. If later hosted images cannot supply any runtime that passes direct, minimal and repository execution, the workflow fails closed and the builder/runner migration decision returns to the bounded human-decision boundary in #3672.

@github-actions

Copy link
Copy Markdown
Contributor

❓ Code Generation Drift Detection

Status:
Regeneration needed: No


Automated by AE-Framework Codegen

@ootakazuhiko ootakazuhiko added risk:high High risk PR (approval and gate labels required) security Security-related issue ci GenAI Repo Auditor label run-security Run SBOM/Security jobs on PR run-ci-extended Run CI Extended suites for this PR enforce-artifacts Make artifact validation strict/blocking enforce-testing Make testing DDD scripts strict/blocking labels Jul 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

❓ Code Generation Drift Detection

Status:
Regeneration needed: No


Automated by AE-Framework Codegen

@github-actions

Copy link
Copy Markdown
Contributor

❓ Code Generation Drift Detection

Status:
Regeneration needed: No


Automated by AE-Framework Codegen

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Verification Summary

  • Traceability: 0 scenarios
    • Tests: 0 (0%)
    • Impl: 0 (0%)
    • Formal: 0 (0%)
Unlinked (top 5)
Linked examples (up to 3)
Hit basis (tests/formal) - Test hits: title=0 id=0 tag=0 - Formal hits: title=0 id=0 tag=0
- Model Check execution report: contract=model-check-report/v1 status=executed ok=true - Model Check (TLC): 5/5 (100%) completed modules ok
Non-OK completed modules (top 5)
- Alloy: 3/3 (100%) completed specs ok
Alloy non-OK completed executions (top 5)
- Contracts: schemas=true conditions=true machine=true - Contracts exec: parseIn=false pre=false post=false parseOut=false

@github-actions

Copy link
Copy Markdown
Contributor

CodeX Artifacts Summary

  • • Contract/E2E templates: 1 files (dir: tests/api/generated)
  • • Tests: PBT files=123, BDD features=0
  • • Formal specs: TLA=1, Alloy=1

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Verification Summary

  • Traceability: 0 scenarios
    • Tests: 0 (0%)
    • Impl: 0 (0%)
    • Formal: 0 (0%)
Unlinked (top 5)
Linked examples (up to 3)
Hit basis (tests/formal) - Test hits: title=0 id=0 tag=0 - Formal hits: title=0 id=0 tag=0
- Model Check execution report: contract=model-check-report/v1 status=executed ok=true - Model Check (TLC): 5/5 (100%) completed modules ok
Non-OK completed modules (top 5)
- Alloy: 3/3 (100%) completed specs ok
Alloy non-OK completed executions (top 5)
- Contracts: schemas=true conditions=true machine=true - Contracts exec: parseIn=false pre=false post=false parseOut=false

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Generate Artifacts Preview

Generated at: 2026-07-31T03:42:37.742Z

  • tests/api/generated: clean
  • artifacts/codex: clean
  • artifacts/spec: clean

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

AE-Spec Validation Report

Status: ✅ Passed
Timestamp: 2026-07-31 02:15:04 UTC
Branch: refs/pull/3674/merge
Commit: 3e4d844

Validation Results

  • Compilation: AE-Spec → AE-IR successful
  • Linting: No critical issues found
  • Structure: All required fields present

AE-IR Summary

  • Version: 1.0.0
  • Entities: 1
  • API Endpoints: 2
  • Use Cases: 1
  • Invariants: 0

BDD Step Lint (non-blocking)

Usecases: 1

Issues: 1

  • Register User: no-validation — Usecase has no validation step

@github-actions

Copy link
Copy Markdown
Contributor

KvOnce Trace Validation

  • OTLP: ✅ Success (Issues: 0)
  • NDJSON: ✅ Success (Issues: 0)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restores deterministic, fail-closed execution for the Security Analysis → Container Security lane on GitHub-hosted Ubuntu runners by introducing a bounded container runtime preflight contract and wiring it into the workflow so runtime/toolchain incompatibilities are diagnosed (and surfaced) before the repository image build/scan path runs.

Changes:

  • Add a new container-runtime-diagnostic/v1 schema + producer (container-runtime-preflight.mjs) to inventory tool/runtime state, enforce digest-pinned smoke checks, and record stable failure classifications.
  • Update security.yml Container Security job to use the preflight outputs (explicit runtime binding, bounded artifact validation, fail-closed SARIF behavior, artifact upload on success/failure).
  • Add unit tests + fixtures validating the contract semantics and asserting workflow behavior/ordering.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated no comments.

Show a summary per file
File Description
.github/workflows/security.yml Adds focused workflow_dispatch mode and rewires Container Security to run the runtime preflight, bind runtime paths, validate artifacts, and upload the diagnostic artifact.
scripts/ci/container-runtime-preflight.mjs New preflight/runner that inventories Podman + OCI runtimes, runs minimal smoke/build checks, enforces bounded evidence, and records stage outcomes.
scripts/ci/lib/container-runtime-diagnostic.mjs New shared contract logic: schema constants, sanitization, bounded artifact inspection, and semantic validation helpers.
schema/container-runtime-diagnostic-v1.schema.json New JSON Schema defining the container runtime diagnostic evidence contract.
fixtures/container-runtime/valid-runc.container-runtime-diagnostic.json Adds a reviewed passing fixture for runc selection path (used in schema/semantic validation).
fixtures/container-runtime/valid-crun.container-runtime-diagnostic.json Adds a reviewed passing fixture for crun selection path (used in schema/semantic validation).
scripts/ci/validate-json.mjs Registers the new schema + semantic validator in the JSON validation suite.
tests/unit/ci/container-runtime-preflight.test.ts Adds unit tests covering semantic invariants, bounded sanitization, artifact checks, and timeout behavior.
tests/unit/ci/container-security-runtime-workflow.test.ts Adds workflow contract tests asserting fail-closed semantics, ordering, and runtime binding in security.yml.
docs/reference/CONTRACT-CATALOG.md Documents the new artifact/schema producer/consumer mapping in the contract catalog (EN/JA sections).
docs/infra/container-runtime.md Updates the SSOT runbook with the GitHub-hosted Container Security runtime/preflight model and update procedure.
docs/ci/ci-troubleshooting-guide.md Updates troubleshooting guidance to reflect fail-closed SARIF behavior and the diagnostic artifact.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@ootakazuhiko

Copy link
Copy Markdown
Collaborator Author

Issue #3672 verification summary

Exact fix head: d75a4853f2f7c6e863118330708eddb0b59f5e50

Runtime correction

  • Removed the job-time Podman package mutation that mixed the 20260726.254.1 hosted bundle with Ubuntu Podman/crun configuration.
  • Added the closed container-runtime-diagnostic/v1 contract and a bounded, shell-free preflight.
  • Explicit runtime selection now requires direct OCI feature parsing, minimal podman run, explicit effective-runtime binding, and a digest-pinned minimal RUN true build before the repository build.
  • Build, nextjs user inspection, archive export, Trivy scan, SARIF validation, and SARIF upload remain fail-closed; normal push/schedule gates were not weakened.

Validation

  • focused runtime/workflow contract: 51/51
  • related workflow/container tests: 29/29
  • full unit: 1,401 passed / 1 skipped
  • build, API/types, Schemas, docs consistency, Verify Lite, Context Pack, Boundary Map, actionlint, and diff check: success
  • Copilot review: 12/12 changed files, no inline comments
  • Full CI: 30578091595 — success
  • required Policy Gate: 30578107408 attempt 2 — success
  • required Copilot Review Gate: 30578107555 attempt 2 — success

Independent exact-head Container Security runs

  1. 30578425829 / job 90992397296 — workflow/job success
  2. 30578788418 / job 90993602146 — workflow/job success

Both are attempt 1 at exact head d75a4853..., on separate hosted runners/regions. Each diagnostic is Schema-valid and records 12/12 passing stages: runtime inventory, manifest, direct runtime smoke, minimal run/build, repository build, non-root user, export, Trivy pull/scan, SARIF validation/upload.

Remaining limitations

@github-actions

Copy link
Copy Markdown
Contributor

❓ Code Generation Drift Detection

Status:
Regeneration needed: No


Automated by AE-Framework Codegen

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Verification Summary

  • Traceability: 0 scenarios
    • Tests: 0 (0%)
    • Impl: 0 (0%)
    • Formal: 0 (0%)
Unlinked (top 5)
Linked examples (up to 3)
Hit basis (tests/formal) - Test hits: title=0 id=0 tag=0 - Formal hits: title=0 id=0 tag=0
- Model Check execution report: contract=model-check-report/v1 status=executed ok=true - Model Check (TLC): 5/5 (100%) completed modules ok
Non-OK completed modules (top 5)
- Alloy: 3/3 (100%) completed specs ok
Alloy non-OK completed executions (top 5)
- Contracts: schemas=true conditions=true machine=true - Contracts exec: parseIn=false pre=false post=false parseOut=false

@github-actions

Copy link
Copy Markdown
Contributor

❓ Code Generation Drift Detection

Status:
Regeneration needed: No


Automated by AE-Framework Codegen

@github-actions

Copy link
Copy Markdown
Contributor

Cedar Policies (report-only)

Files: 1 (json=0, cedar=0)
Results: ok=0, ng=0
Tool: cedar-validator

Policy: report-only
Docs: docs/quality/cedar-quality-gates.md

@github-actions

Copy link
Copy Markdown
Contributor

CodeX Artifacts Summary

  • • Contract/E2E templates: 1 files (dir: tests/api/generated)
  • • Tests: PBT files=123, BDD features=0
  • • Formal specs: TLA=1, Alloy=1

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Verification Summary

  • Traceability: 0 scenarios
    • Tests: 0 (0%)
    • Impl: 0 (0%)
    • Formal: 0 (0%)
Unlinked (top 5)
Linked examples (up to 3)
Hit basis (tests/formal) - Test hits: title=0 id=0 tag=0 - Formal hits: title=0 id=0 tag=0
- Model Check execution report: contract=model-check-report/v1 status=executed ok=true - Model Check (TLC): 5/5 (100%) completed modules ok
Non-OK completed modules (top 5)
- Alloy: 3/3 (100%) completed specs ok
Alloy non-OK completed executions (top 5)
- Contracts: schemas=true conditions=true machine=true - Contracts exec: parseIn=false pre=false post=false parseOut=false

@ootakazuhiko

Copy link
Copy Markdown
Collaborator Author

Human review response — Container Security evidence contract

Exact fix commit: 2b480412d329888917b62c7d9b8c0226d142f05f

The requested evidence-contract hardening is complete on the existing Draft PR:

  1. Artifact path boundary: archive, SARIF, and diagnostic JSON now use one repository-relative resolver that walks every component with lstat, rejects intermediate/final symlinks and traversal/backslash/absolute paths, verifies a regular non-zero file, and checks canonical containment under artifacts/container-security.
  2. Bounded structured reads: diagnostic JSON is limited to 256 KiB and SARIF to 16 MiB. Size is checked before reading or parsing; oversize artifacts fail closed without truncation.
  3. Stage prerequisite graph: archive-export now requires image-user=pass; missing, not-run, or failed non-root verification is rejected.
  4. Status semantics: one semantic validator closes status/detail/classification/exit-code combinations for top-level checks and runtime candidates. Timeout, malformed-output, and missing-output classifications are preserved without conversion.
  5. Completion boundary: preflight and failures keep pipelineComplete=false; the explicit finalizer requires all 12 reviewed stages exactly once and all passing before setting pipelineComplete=true. Finalization occurs after recorded SARIF upload success and before diagnostic upload.

Validation:

  • Focused contract/workflow tests: 83/83 pass
  • Schema/fixture self-validation, deterministic rendering, types, build, API snapshot, docs consistency, Verify Lite, actionlint 1.7.12, Context Pack, Boundary Map, workflow security assertions, and git diff --check: pass
  • Full CI: 30594922595 — success
  • Quality Gates: 30594922409 — success
  • Required Policy Gate after PR-body update: 30595410011 — success
  • Focused dispatch 1: 30594994868, attempt 1 — success; downloaded diagnostic pipelineComplete=true, 12/12 pass
  • Focused dispatch 2: 30595150591, attempt 1 — success; downloaded diagnostic pipelineComplete=true, 12/12 pass

Remaining limitations:

  • Both accepted hosted runs used ubuntu24 / 20260720.247.2; GitHub did not allocate 20260726.254.1, so no such allocation is inferred.
  • Artifact validation is an explicit bounded pre-read check, not an atomic guarantee against concurrent filesystem mutation; hard-link inode provenance is not claimed.
  • Dispatch 30594991421 was concurrency-cancelled and is retained as non-counting evidence; the two accepted runs are subsequent independent attempt-1 successes.

@ootakazuhiko
ootakazuhiko marked this pull request as ready for review July 31, 2026 01:21
@github-actions

Copy link
Copy Markdown
Contributor

🔍 Verification Summary

  • Traceability: 0 scenarios
    • Tests: 0 (0%)
    • Impl: 0 (0%)
    • Formal: 0 (0%)
Unlinked (top 5)
Linked examples (up to 3)
Hit basis (tests/formal) - Test hits: title=0 id=0 tag=0 - Formal hits: title=0 id=0 tag=0
- Model Check execution report: contract=model-check-report/v1 status=executed ok=true - Model Check (TLC): 5/5 (100%) completed modules ok
Non-OK completed modules (top 5)
- Alloy: 3/3 (100%) completed specs ok
Alloy non-OK completed executions (top 5)
- Contracts: schemas=true conditions=true machine=true - Contracts exec: parseIn=false pre=false post=false parseOut=false

@github-actions

Copy link
Copy Markdown
Contributor

CodeX Artifacts Summary

  • • Contract/E2E templates: 1 files (dir: tests/api/generated)
  • • Tests: PBT files=123, BDD features=0
  • • Formal specs: TLA=1, Alloy=1

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2b480412d3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/ci/container-runtime-preflight.mjs Outdated
@ootakazuhiko
ootakazuhiko marked this pull request as draft July 31, 2026 02:00
@github-actions

Copy link
Copy Markdown
Contributor

❓ Code Generation Drift Detection

Status:
Regeneration needed: No


Automated by AE-Framework Codegen

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Verification Summary

  • Traceability: 0 scenarios
    • Tests: 0 (0%)
    • Impl: 0 (0%)
    • Formal: 0 (0%)
Unlinked (top 5)
Linked examples (up to 3)
Hit basis (tests/formal) - Test hits: title=0 id=0 tag=0 - Formal hits: title=0 id=0 tag=0
- Model Check execution report: contract=model-check-report/v1 status=executed ok=true - Model Check (TLC): 5/5 (100%) completed modules ok
Non-OK completed modules (top 5)
- Alloy: 3/3 (100%) completed specs ok
Alloy non-OK completed executions (top 5)
- Contracts: schemas=true conditions=true machine=true - Contracts exec: parseIn=false pre=false post=false parseOut=false

@github-actions

Copy link
Copy Markdown
Contributor

CodeX Artifacts Summary

  • • Contract/E2E templates: 1 files (dir: tests/api/generated)
  • • Tests: PBT files=123, BDD features=0
  • • Formal specs: TLA=1, Alloy=1

@ootakazuhiko

Copy link
Copy Markdown
Collaborator Author

Latest runtime-evidence review response

Exact fix: da5e996594729d2734900e21e368399b8b3eb0b0

The unresolved review finding is addressed and its thread has been replied to individually and resolved.

  • A single deterministic helper now chooses the authoritative requested-runtime failure candidate.
  • A direct-smoke failure remains direct-runtime-smoke, even when minimal run passes.
  • A direct-smoke pass followed by timeout/nonzero minimal run preserves the exact minimal-run status, exit code, duration, and detail.
  • Invalid version invocation and both-fail cases retain their actual normalized results.
  • Later-stage failure takes precedence; ties use /usr/local before /usr, matching success selection.
  • Failure diagnostics leave all candidates unselected, selectedRuntime=null, and pipelineComplete=false.
  • Semantic validation rejects substituted check identity, zeroed duration, or other candidate/check result mismatches.

Validation:

  • focused runtime/workflow matrix: 91/91 pass
  • full unit: 213 files; 1443 pass / 1 skipped
  • types, build, API snapshot, 101 Schemas and fixtures, docs consistency, Verify Lite, actionlint 1.7.12, Context Pack, Boundary Map, workflow security assertions, and diff check: pass
  • Verify Lite, Policy Gate, Copilot Review Gate, coverage, Security, Quality Gates, and Full CI: exact-head success
  • focused dispatch 30598437848: attempt 1, success, downloaded diagnostic pipelineComplete=true, 12/12 pass
  • focused dispatch 30598620836: attempt 1, success, downloaded diagnostic pipelineComplete=true, 12/12 pass

Remaining limitation: both accepted hosted jobs used ubuntu24 / 20260720.247.2; no allocation of the prior failing 20260726.254.1 image is inferred. Raw stdout/stderr remain intentionally excluded from the bounded evidence contract.

@ootakazuhiko

Copy link
Copy Markdown
Collaborator Author

Solo-maintainer merge decision

  • Exact head reviewed: da5e996594729d2734900e21e368399b8b3eb0b0
  • Runtime failure Evidence review feedback: resolved
  • Required checks: successful on this exact head
  • Full CI and Quality Gates: successful on this exact head
  • Two independent focused Container Security dispatches: successful
  • Both downloaded diagnostics: pipelineComplete=true / 12 of 12 checks passed
  • Review threads: resolved
  • Independent human reviewer: unavailable in the declared solo-maintainer topology
  • AI/Copilot reviews: advisory Evidence only, not human approval
  • Human decision: approve this exact head for regular merge, contingent on the final post-Ready authority snapshot remaining stable and all required checks succeeding

This supersedes any earlier decision associated with a previous PR head.

@ootakazuhiko
ootakazuhiko marked this pull request as ready for review July 31, 2026 03:41
@github-actions

Copy link
Copy Markdown
Contributor

🔍 Verification Summary

  • Traceability: 0 scenarios
    • Tests: 0 (0%)
    • Impl: 0 (0%)
    • Formal: 0 (0%)
Unlinked (top 5)
Linked examples (up to 3)
Hit basis (tests/formal) - Test hits: title=0 id=0 tag=0 - Formal hits: title=0 id=0 tag=0
- Model Check execution report: contract=model-check-report/v1 status=executed ok=true - Model Check (TLC): 5/5 (100%) completed modules ok
Non-OK completed modules (top 5)
- Alloy: 3/3 (100%) completed specs ok
Alloy non-OK completed executions (top 5)
- Contracts: schemas=true conditions=true machine=true - Contracts exec: parseIn=false pre=false post=false parseOut=false

@github-actions

Copy link
Copy Markdown
Contributor

CodeX Artifacts Summary

  • • Contract/E2E templates: 1 files (dir: tests/api/generated)
  • • Tests: PBT files=123, BDD features=0
  • • Formal specs: TLA=1, Alloy=1

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: da5e996594

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +237 to +239
if (result.exitCode !== 0 || !version) {
return { name, path: null, version: null, source: 'unknown', available: false };
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve Podman version-probe failures

When an existing Podman executable’s --version probe times out or exits nonzero, this branch discards the observed exit code, duration, timeout state, and executable path; the later missing-Podman branch consequently records a fabricated zero-duration podman-info failure with runtime-unavailable. The fresh evidence beyond the prior runtime-candidate fix is this separate inventory path, which still converts an observed probe failure instead of preserving it in the normalized diagnostic.

AGENTS.md reference: AGENTS.md:L27-L27

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci GenAI Repo Auditor label enforce-artifacts Make artifact validation strict/blocking enforce-testing Make testing DDD scripts strict/blocking risk:high High risk PR (approval and gate labels required) run-ci-extended Run CI Extended suites for this PR run-security Run SBOM/Security jobs on PR security Security-related issue

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants