From 4a4eae353f07fe16d9febf02d0ce57cb3247814d Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:01:58 +0200 Subject: [PATCH 1/9] Implement beta8 compiler functionality gate --- .brik/manifest.json | 2 +- .../beta8-compiler-functionality/report.json | 49 ++ package.json | 3 +- scripts/beta8-compiler-functionality-gate.sh | 189 +++++++ src/brik.js | 460 ++++++++++++++++-- tests/smoke.sh | 4 +- 6 files changed, 665 insertions(+), 42 deletions(-) create mode 100644 evidence/beta8-compiler-functionality/report.json create mode 100755 scripts/beta8-compiler-functionality-gate.sh diff --git a/.brik/manifest.json b/.brik/manifest.json index e092fd5a..225e72b6 100644 --- a/.brik/manifest.json +++ b/.brik/manifest.json @@ -2,7 +2,7 @@ "schema": "brik64.cli_project_manifest.v1", "schemaVersion": "brik64.cli_project_manifest.v1", "project": "brik64-cli", - "cliVersion": "0.1.0-beta.7", + "cliVersion": "0.1.0-beta.8", "lane": "cli_0_1_beta", "generationClaim": "assisted_generation_non_claim", "preferred_engine": "auto", diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json new file mode 100644 index 00000000..d463fb2b --- /dev/null +++ b/evidence/beta8-compiler-functionality/report.json @@ -0,0 +1,49 @@ +{ + "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", + "generatedAt": "2026-06-06T02:01:42Z", + "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", + "lane": "cli_0_1_beta8", + "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", + "rc": 0, + "cliVersion": "0.1.0-beta.8", + "cliSha256": "sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee", + "fixture": { + "path": "pcd/branch_math.pcd", + "sha256": "sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404" + }, + "executedTargets": { + "typescript": { + "programSha256": "sha256:22a0904178aaba0faa8a5392a1750e636fd6d42537e69ecf166596e8269cae98", + "test": "node out-ts/program.test.ts", + "passed": true + }, + "rust": { + "programSha256": "sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d", + "test": "rustc out-rust/program_test.rs && ./out-rust/program_test", + "passed": true + }, + "python": { + "programSha256": "sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6", + "test": "PYTHONPATH=out-python python3 out-python/test_program.py", + "passed": true + } + }, + "adversarial": { + "unknown_identifier_fail_closed": true, + "unsupported_target_fail_closed": true, + "path_traversal_fail_closed": true, + "stack_trace_leaked": false + }, + "claim_boundary": { + "public_claims_allowed": false, + "public_release_allowed": false, + "compiler_functionality_claim_allowed": true, + "compiler_functionality_scope": "supported_beta8_pcd_subset_only", + "fixpoint_claim_allowed": false, + "n5_formal_claim_allowed": false, + "rust_independence_claim_allowed": false + }, + "blockers": [], + "warnings": [], + "next_action": "run beta8 adversarial gate and package smoke before public release train" +} diff --git a/package.json b/package.json index c75cc4d3..1695efd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@brik64/cli", - "version": "0.1.0-beta.7", + "version": "0.1.0-beta.8", "private": true, "description": "BRIK64 CLI public beta for local PCD workflows, bounded evidence review, and claim-safe project scaffolding.", "homepage": "https://brik64.com", @@ -51,6 +51,7 @@ "gate:beta7:marketplace-packages": "node scripts/beta7-marketplace-package-gate.js", "gate:beta7:docs-web-sync": "node scripts/beta7-docs-web-sync-gate.js", "gate:beta7:skills-sync": "node scripts/beta7-skills-sync-gate.js", + "gate:beta8:compiler-functionality": "bash scripts/beta8-compiler-functionality-gate.sh", "release:manifest:validate": "node scripts/release-manifest-validate.js", "release:flow:audit": "node scripts/release-flow-audit.js", "release:train:dry-run": "node scripts/release-train-dry-run.js", diff --git a/scripts/beta8-compiler-functionality-gate.sh b/scripts/beta8-compiler-functionality-gate.sh new file mode 100755 index 00000000..88bbc396 --- /dev/null +++ b/scripts/beta8-compiler-functionality-gate.sh @@ -0,0 +1,189 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BRIK="$ROOT_DIR/src/brik.js" +ITER_ID="${ITER_ID:-BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1}" +EVIDENCE_DIR="${EVIDENCE_DIR:-$ROOT_DIR/evidence/beta8-compiler-functionality}" +REPORT_JSON="$EVIDENCE_DIR/report.json" +TMP_DIR="$(mktemp -d)" + +cleanup() { rm -rf "$TMP_DIR"; } +trap cleanup EXIT + +need_cmd() { + command -v "$1" >/dev/null 2>&1 || { + echo "missing command: $1" >&2 + exit 2 + } +} + +need_cmd node +need_cmd python3 +need_cmd rustc +need_cmd jq +need_cmd shasum + +sha256_file() { shasum -a 256 "$1" | awk '{print $1}'; } + +json_array() { + if [[ "$#" -eq 0 ]]; then + printf '[]' + else + printf '%s\n' "$@" | jq -Rsc 'split("\n") | map(select(length > 0))' + fi +} + +mkdir -p "$EVIDENCE_DIR" + +decision="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" +rc=0 +blockers=() +warnings=() + +block() { + blockers+=("$1") + decision="BLOCKED_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" + rc=2 +} + +run_expect_fail() { + local id="$1" + local expected="$2" + shift 2 + set +e + "$@" >"$TMP_DIR/$id.stdout" 2>"$TMP_DIR/$id.stderr" + local cmd_rc=$? + set -e + if [[ "$cmd_rc" -eq 0 ]]; then + block "$id:unexpected_success" + return + fi + if ! grep -q "$expected" "$TMP_DIR/$id.stderr"; then + block "$id:missing_expected_error:$expected" + fi +} + +export BRIK64_CONFIG_HOME="$TMP_DIR/config" +WORK_DIR="$TMP_DIR/work" +mkdir -p "$WORK_DIR" + +pushd "$WORK_DIR" >/dev/null + node "$BRIK" init >/dev/null + mkdir -p pcd + cat > pcd/branch_math.pcd <<'PCD' +PC branch_math { + fn branch_math(input) { + if ((input > 10) && (input != 13)) { + return input + 2; + } else { + if (input == 1) { + return 8; + } + return input - 1; + } + } +} +PCD + + node "$BRIK" certify pcd/branch_math.pcd >/tmp/beta8-certify.out + for target in ts rust python; do + node "$BRIK" emit pcd/branch_math.pcd --target "$target" --out "out-$target" --tests >"/tmp/beta8-emit-$target.out" + done + + node out-ts/program.test.ts >"$TMP_DIR/ts.stdout" 2>"$TMP_DIR/ts.stderr" || block "ts_generated_test_failed" + rustc out-rust/program_test.rs -o out-rust/program_test >"$TMP_DIR/rustc.stdout" 2>"$TMP_DIR/rustc.stderr" \ + && ./out-rust/program_test >"$TMP_DIR/rust.stdout" 2>"$TMP_DIR/rust.stderr" \ + || block "rust_generated_test_failed" + PYTHONPATH=out-python python3 out-python/test_program.py >"$TMP_DIR/python.stdout" 2>"$TMP_DIR/python.stderr" \ + || block "python_generated_test_failed" + + grep -q "brik64 generated ts test: PASS" "$TMP_DIR/ts.stdout" || block "ts_generated_test_missing_pass" + grep -q "brik64 generated rust test: PASS" "$TMP_DIR/rust.stdout" || block "rust_generated_test_missing_pass" + grep -q "brik64 generated python test: PASS" "$TMP_DIR/python.stdout" || block "python_generated_test_missing_pass" + + cat > pcd/unknown_identifier.pcd <<'PCD' +PC bad_identifier { + fn bad_identifier(input) { + return missing + 1; + } +} +PCD + run_expect_fail unknown_identifier "pcd_parse_error:unknown_identifier:missing" node "$BRIK" certify pcd/unknown_identifier.pcd + run_expect_fail unsupported_target "unsupported_target" node "$BRIK" emit pcd/branch_math.pcd --target go --out out-go --tests + run_expect_fail path_traversal "path_outside_workspace" node "$BRIK" emit pcd/branch_math.pcd --target ts --out ../escaped --tests +popd >/dev/null + +if grep -q "Node.js\\|at .*src/brik" "$TMP_DIR"/*.stderr 2>/dev/null; then + block "stack_trace_leaked_to_stderr" +fi + +program_ts_sha="sha256:$(sha256_file "$WORK_DIR/out-ts/program.ts")" +program_rust_sha="sha256:$(sha256_file "$WORK_DIR/out-rust/program.rs")" +program_python_sha="sha256:$(sha256_file "$WORK_DIR/out-python/program.py")" +pcd_sha="sha256:$(sha256_file "$WORK_DIR/pcd/branch_math.pcd")" +cli_sha="sha256:$(sha256_file "$BRIK")" +package_version="$(node -e "const fs=require('fs'); process.stdout.write(JSON.parse(fs.readFileSync('$ROOT_DIR/package.json','utf8')).version)")" +generated_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)" +if [[ "${#blockers[@]}" -eq 0 ]]; then + blockers_json='[]' +else + blockers_json="$(json_array "${blockers[@]}")" +fi +if [[ "${#warnings[@]}" -eq 0 ]]; then + warnings_json='[]' +else + warnings_json="$(json_array "${warnings[@]}")" +fi + +jq -n \ + --arg schemaVersion "brik64.cli_beta8_compiler_functionality_gate.v1" \ + --arg generatedAt "$generated_at" \ + --arg iter_id "$ITER_ID" \ + --arg decision "$decision" \ + --arg version "$package_version" \ + --arg cli_sha "$cli_sha" \ + --arg pcd_sha "$pcd_sha" \ + --arg ts_sha "$program_ts_sha" \ + --arg rust_sha "$program_rust_sha" \ + --arg python_sha "$program_python_sha" \ + --argjson blockers "$blockers_json" \ + --argjson warnings "$warnings_json" \ + --argjson rc "$rc" \ + '{ + schemaVersion:$schemaVersion, + generatedAt:$generatedAt, + iter_id:$iter_id, + lane:"cli_0_1_beta8", + decision:$decision, + rc:$rc, + cliVersion:$version, + cliSha256:$cli_sha, + fixture:{path:"pcd/branch_math.pcd", sha256:$pcd_sha}, + executedTargets:{ + typescript:{programSha256:$ts_sha, test:"node out-ts/program.test.ts", passed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY")}, + rust:{programSha256:$rust_sha, test:"rustc out-rust/program_test.rs && ./out-rust/program_test", passed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY")}, + python:{programSha256:$python_sha, test:"PYTHONPATH=out-python python3 out-python/test_program.py", passed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY")} + }, + adversarial:{ + unknown_identifier_fail_closed:true, + unsupported_target_fail_closed:true, + path_traversal_fail_closed:true, + stack_trace_leaked:false + }, + claim_boundary:{ + public_claims_allowed:false, + public_release_allowed:false, + compiler_functionality_claim_allowed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY"), + compiler_functionality_scope:"supported_beta8_pcd_subset_only", + fixpoint_claim_allowed:false, + n5_formal_claim_allowed:false, + rust_independence_claim_allowed:false + }, + blockers:$blockers, + warnings:$warnings, + next_action:(if $decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" then "run beta8 adversarial gate and package smoke before public release train" else "resolve compiler functionality blockers" end) + }' >"$REPORT_JSON" + +cat "$REPORT_JSON" +exit "$rc" diff --git a/src/brik.js b/src/brik.js index 615d6d7a..1621b856 100755 --- a/src/brik.js +++ b/src/brik.js @@ -8,7 +8,7 @@ process.stdout.on('error', (error) => { throw error; }); -const version = '0.1.0-beta.7'; +const version = '0.1.0-beta.8'; const SESSION_SCHEMA = 'brik64.cli_session.v1'; const RESET = '\x1b[0m'; const BRIK = '\x1b[38;2;180;180;180m'; @@ -182,6 +182,218 @@ function stripPcdComments(source) { .join('\n'); } +function findMatchingBrace(source, openIndex) { + let depth = 0; + for (let index = openIndex; index < source.length; index += 1) { + const char = source[index]; + if (char === '{') depth += 1; + if (char === '}') { + depth -= 1; + if (depth === 0) return index; + } + } + return -1; +} + +function tokenizeExpression(source) { + const tokens = []; + let index = 0; + while (index < source.length) { + const char = source[index]; + if (/\s/.test(char)) { + index += 1; + continue; + } + const two = source.slice(index, index + 2); + if (['>=', '<=', '==', '!=', '&&', '||'].includes(two)) { + tokens.push({ type: 'op', value: two }); + index += 2; + continue; + } + if ('()+-*/%<>'.includes(char)) { + tokens.push({ type: char === '(' || char === ')' ? 'paren' : 'op', value: char }); + index += 1; + continue; + } + const number = source.slice(index).match(/^\d+/); + if (number) { + tokens.push({ type: 'number', value: Number(number[0]) }); + index += number[0].length; + continue; + } + const ident = source.slice(index).match(/^[A-Za-z_][A-Za-z0-9_]*/); + if (ident) { + tokens.push({ type: 'identifier', value: ident[0] }); + index += ident[0].length; + continue; + } + fail(65, 'pcd_parse_error:unsupported_expression_token'); + } + return tokens; +} + +function parseExpression(source, params) { + const tokens = tokenizeExpression(source); + let index = 0; + const precedence = { + '||': 1, + '&&': 2, + '==': 3, + '!=': 3, + '>': 4, + '<': 4, + '>=': 4, + '<=': 4, + '+': 5, + '-': 5, + '*': 6, + '/': 6, + '%': 6, + }; + + function peek() { + return tokens[index]; + } + + function consume(value) { + const token = tokens[index]; + if (!token || (value && token.value !== value)) { + fail(65, 'pcd_parse_error:malformed_expression'); + } + index += 1; + return token; + } + + function parsePrimary() { + const token = peek(); + if (!token) fail(65, 'pcd_parse_error:malformed_expression'); + if (token.type === 'number') { + consume(); + return { type: 'NumberLiteral', value: token.value }; + } + if (token.type === 'identifier') { + consume(); + if (!params.includes(token.value)) { + fail(65, `pcd_parse_error:unknown_identifier:${token.value}`); + } + return { type: 'Identifier', name: token.value }; + } + if (token.value === '-') { + consume('-'); + return { type: 'UnaryExpression', operator: '-', argument: parsePrimary() }; + } + if (token.value === '(') { + consume('('); + const expression = parseBinary(1); + consume(')'); + return expression; + } + fail(65, 'pcd_parse_error:malformed_expression'); + } + + function parseBinary(minPrecedence) { + let left = parsePrimary(); + while (peek() && peek().type === 'op' && precedence[peek().value] >= minPrecedence) { + const operator = consume().value; + const operatorPrecedence = precedence[operator]; + const right = parseBinary(operatorPrecedence + 1); + left = { type: 'BinaryExpression', operator, left, right }; + } + return left; + } + + const expression = parseBinary(1); + if (index !== tokens.length) { + fail(65, 'pcd_parse_error:malformed_expression'); + } + return expression; +} + +function parseStatements(body, params) { + const statements = []; + let index = 0; + + function skipWhitespace() { + while (index < body.length && /\s/.test(body[index])) index += 1; + } + + function readBalanced(openChar, closeChar) { + if (body[index] !== openChar) fail(65, 'pcd_parse_error:malformed_block'); + let depth = 0; + const start = index; + for (; index < body.length; index += 1) { + if (body[index] === openChar) depth += 1; + if (body[index] === closeChar) { + depth -= 1; + if (depth === 0) { + const content = body.slice(start + 1, index); + index += 1; + return content; + } + } + } + fail(65, 'pcd_parse_error:unclosed_block'); + } + + while (index < body.length) { + skipWhitespace(); + if (index >= body.length) break; + if (body.slice(index).startsWith('return')) { + index += 'return'.length; + const semi = body.indexOf(';', index); + if (semi === -1) fail(65, 'pcd_parse_error:missing_return_semicolon'); + const value = body.slice(index, semi).trim(); + if (!value) fail(65, 'pcd_parse_error:missing_return_value'); + statements.push({ type: 'ReturnStatement', argument: parseExpression(value, params) }); + index = semi + 1; + continue; + } + if (body.slice(index).startsWith('if')) { + index += 'if'.length; + skipWhitespace(); + const condition = readBalanced('(', ')').trim(); + skipWhitespace(); + const consequentBody = readBalanced('{', '}'); + skipWhitespace(); + let alternate = []; + if (body.slice(index).startsWith('else')) { + index += 'else'.length; + skipWhitespace(); + alternate = parseStatements(readBalanced('{', '}'), params); + } + statements.push({ + type: 'IfStatement', + condition: parseExpression(condition, params), + consequent: parseStatements(consequentBody, params), + alternate, + }); + continue; + } + fail(65, 'pcd_parse_error:unsupported_statement'); + } + return statements; +} + +function collectReturns(statements, values = []) { + for (const statement of statements) { + if (statement.type === 'ReturnStatement') { + values.push(statement.argument); + } + if (statement.type === 'IfStatement') { + collectReturns(statement.consequent, values); + collectReturns(statement.alternate, values); + } + } + return values; +} + +function countBranches(statements) { + return statements.reduce((count, statement) => { + if (statement.type !== 'IfStatement') return count; + return count + 1 + countBranches(statement.consequent) + countBranches(statement.alternate); + }, 0); +} + function parsePcd(source) { if (source.length === 0 || source.trim().length === 0) { fail(65, 'pcd_empty'); @@ -202,34 +414,50 @@ function parsePcd(source) { } fail(65, 'pcd_parse_error:missing_pc_block'); } - const [, pcName, pcBody] = pcMatch; - const fnMatch = pcBody.match(/\bfn\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(([^)]*)\)\s*\{([\s\S]*)\}\s*$/m); + const pcStart = stripped.search(/\bPC\s+[A-Za-z_][A-Za-z0-9_]*\s*\{/m); + const pcOpen = stripped.indexOf('{', pcStart); + const pcClose = findMatchingBrace(stripped, pcOpen); + if (pcClose === -1 || stripped.slice(pcClose + 1).trim().length > 0) { + fail(65, 'pcd_parse_error:malformed_pc_block'); + } + const pcName = pcMatch[1]; + const pcBody = stripped.slice(pcOpen + 1, pcClose); + const fnMatch = pcBody.match(/\bfn\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(([^)]*)\)\s*\{/m); if (!fnMatch) { fail(65, 'pcd_parse_error:missing_fn_block'); } - const [, fnName, paramsRaw, fnBody] = fnMatch; + const fnStart = fnMatch.index; + const fnOpen = pcBody.indexOf('{', fnStart); + const fnClose = findMatchingBrace(pcBody, fnOpen); + if (fnClose === -1 || pcBody.slice(fnClose + 1).trim().length > 0) { + fail(65, 'pcd_parse_error:malformed_fn_block'); + } + const [, fnName, paramsRaw] = fnMatch; + const fnBody = pcBody.slice(fnOpen + 1, fnClose); const params = paramsRaw .split(',') .map((param) => param.trim()) .filter(Boolean); - const returns = [...fnBody.matchAll(/\breturn\s+(-?\d+)\s*;/g)].map((match) => Number(match[1])); + if (params.length > 1) { + fail(65, 'pcd_parse_error:too_many_params_beta8'); + } + if (params.some((param) => !/^[A-Za-z_][A-Za-z0-9_]*$/.test(param))) { + fail(65, 'pcd_parse_error:invalid_param'); + } + const body = parseStatements(fnBody, params); + const returns = collectReturns(body); if (returns.length === 0) { fail(65, 'pcd_parse_error:missing_return'); } - const unsupported = fnBody - .replace(/\bif\s*\([^)]*\)\s*\{/g, '') - .replace(/\breturn\s+-?\d+\s*;/g, '') - .replace(/[{}\s;]/g, ''); - if (unsupported.length > 0) { - fail(65, 'pcd_parse_error:unsupported_tokens'); - } return { schemaVersion: 'brik64.cli_ast.v1', pcName, fnName, params, - returnValues: returns, - branchCount: (fnBody.match(/\bif\s*\(/g) || []).length, + body, + returnValues: returns.map((expression) => (expression.type === 'NumberLiteral' ? expression.value : null)), + branchCount: countBranches(body), + expressionDialect: 'brik64.cli_expr.v1', }; } @@ -443,7 +671,7 @@ function login(args = []) { const parsed = parseArgs(args, { '--token-env': 'value' }); const envName = parsed['--token-env']; if (!envName) { - fail(64, 'login_requires_token_env_for_beta7'); + fail(64, 'login_requires_token_env_for_beta8'); } const token = process.env[envName]; if (!token) { @@ -507,27 +735,176 @@ function encodedAst(ast) { return JSON.stringify(ast); } +function renderExpression(expression, target) { + if (expression.type === 'NumberLiteral') return String(expression.value); + if (expression.type === 'Identifier') return expression.name; + if (expression.type === 'UnaryExpression') return `(-${renderExpression(expression.argument, target)})`; + if (expression.type === 'BinaryExpression') { + const left = renderExpression(expression.left, target); + const right = renderExpression(expression.right, target); + let operator = expression.operator; + if (target === 'ts' && operator === '==') operator = '==='; + if (target === 'ts' && operator === '!=') operator = '!=='; + if (target === 'python' && operator === '&&') operator = 'and'; + if (target === 'python' && operator === '||') operator = 'or'; + return `(${left} ${operator} ${right})`; + } + fail(70, 'internal_codegen_error:unknown_expression'); +} + +function renderStatements(statements, target, indentLevel) { + const unit = target === 'python' ? ' ' : ' '; + const indent = unit.repeat(indentLevel); + const lines = []; + for (const statement of statements) { + if (statement.type === 'ReturnStatement') { + lines.push(`${indent}return ${renderExpression(statement.argument, target)}${target === 'python' ? '' : ';'}`); + continue; + } + if (statement.type === 'IfStatement') { + const condition = renderExpression(statement.condition, target); + if (target === 'python') { + lines.push(`${indent}if ${condition}:`); + lines.push(...renderStatements(statement.consequent, target, indentLevel + 1)); + if (statement.alternate.length > 0) { + lines.push(`${indent}else:`); + lines.push(...renderStatements(statement.alternate, target, indentLevel + 1)); + } + } else { + lines.push(`${indent}if ${condition} {`); + lines.push(...renderStatements(statement.consequent, target, indentLevel + 1)); + if (statement.alternate.length > 0) { + lines.push(`${indent}} else {`); + lines.push(...renderStatements(statement.alternate, target, indentLevel + 1)); + } + lines.push(`${indent}}`); + } + continue; + } + fail(70, 'internal_codegen_error:unknown_statement'); + } + return lines; +} + +function evaluateExpression(expression, env) { + if (expression.type === 'NumberLiteral') return expression.value; + if (expression.type === 'Identifier') return env[expression.name] ?? 0; + if (expression.type === 'UnaryExpression') return -evaluateExpression(expression.argument, env); + if (expression.type === 'BinaryExpression') { + const left = evaluateExpression(expression.left, env); + if (expression.operator === '&&') return Boolean(left) && Boolean(evaluateExpression(expression.right, env)); + if (expression.operator === '||') return Boolean(left) || Boolean(evaluateExpression(expression.right, env)); + const right = evaluateExpression(expression.right, env); + if (expression.operator === '+') return left + right; + if (expression.operator === '-') return left - right; + if (expression.operator === '*') return left * right; + if (expression.operator === '/') return Math.trunc(left / right); + if (expression.operator === '%') return left % right; + if (expression.operator === '==') return left === right; + if (expression.operator === '!=') return left !== right; + if (expression.operator === '>') return left > right; + if (expression.operator === '<') return left < right; + if (expression.operator === '>=') return left >= right; + if (expression.operator === '<=') return left <= right; + } + fail(70, 'internal_eval_error:unknown_expression'); +} + +function evaluateStatements(statements, env) { + for (const statement of statements) { + if (statement.type === 'ReturnStatement') { + return evaluateExpression(statement.argument, env); + } + if (statement.type === 'IfStatement') { + if (evaluateExpression(statement.condition, env)) { + const consequent = evaluateStatements(statement.consequent, env); + if (consequent !== undefined) return consequent; + } else { + const alternate = evaluateStatements(statement.alternate, env); + if (alternate !== undefined) return alternate; + } + } + } + return undefined; +} + +function collectConditionValues(expression, values = new Set([0, 1, 2, 10])) { + if (expression.type === 'NumberLiteral') { + values.add(expression.value); + values.add(expression.value + 1); + values.add(expression.value - 1); + } + if (expression.type === 'UnaryExpression') collectConditionValues(expression.argument, values); + if (expression.type === 'BinaryExpression') { + collectConditionValues(expression.left, values); + collectConditionValues(expression.right, values); + } + return values; +} + +function collectStatementValues(statements, values = new Set([0, 1, 2, 10])) { + for (const statement of statements) { + if (statement.type === 'IfStatement') { + collectConditionValues(statement.condition, values); + collectStatementValues(statement.consequent, values); + collectStatementValues(statement.alternate, values); + } + } + return values; +} + +function generatedCases(ast) { + const param = ast.params[0] || 'input'; + const inputs = [...collectStatementValues(ast.body)] + .filter((value) => Number.isInteger(value) && Math.abs(value) < 100000) + .slice(0, 12); + return inputs + .map((input) => ({ input, expected: evaluateStatements(ast.body, { [param]: input }) })) + .filter((testCase) => testCase.expected !== undefined) + .slice(0, 8); +} + +function ensureExecutable(ast) { + const cases = generatedCases(ast); + if (cases.length === 0) { + fail(65, 'pcd_parse_error:no_executable_return_path'); + } + return cases; +} + function targetSpec(target, ast) { const astJson = encodedAst(ast); + const cases = ensureExecutable(ast); + const param = ast.params[0] || 'input'; + const tsStatements = renderStatements(ast.body, 'ts', 1); + const rustStatements = renderStatements(ast.body, 'rust', 1); + const pythonStatements = renderStatements(ast.body, 'python', 1); const specs = { ts: { program: 'program.ts', test: 'program.test.ts', code: (hash) => [ - '// BRIK64 beta7 functional emission candidate', + '// BRIK64 beta8 functional emission candidate', '// claim: local candidate evidence only', `export const pcdSha256 = "${hash}";`, `export const pcdAst = ${astJson} as const;`, - 'export function run(input = 0): string {', - ' return `brik:${pcdAst.pcName}:${pcdAst.fnName}:${pcdAst.returnValues.join(",")}:${input}:${pcdSha256}`;', + `export function run(${param} = 0): number {`, + ...tsStatements, + ' throw new Error("pcd execution reached non-returning path");', '}', '', ].join('\n'), testCode: (hash) => [ - 'import { pcdAst, pcdSha256, run } from "./program";', + 'import { pcdSha256, run } from "./program.ts";', '', 'if (pcdSha256 !== "' + hash + '") throw new Error("pcd hash mismatch");', - 'if (!run().includes(pcdAst.pcName)) throw new Error("run mismatch");', + `const cases = ${JSON.stringify(cases)};`, + 'for (const testCase of cases) {', + ' const actual = run(testCase.input);', + ' if (actual !== testCase.expected) {', + ' throw new Error(`case ${testCase.input} expected ${testCase.expected} got ${actual}`);', + ' }', + '}', 'console.log("brik64 generated ts test: PASS");', '', ].join('\n'), @@ -536,25 +913,28 @@ function targetSpec(target, ast) { program: 'program.rs', test: 'program_test.rs', code: (hash) => [ - '// BRIK64 beta7 functional emission candidate', + '// BRIK64 beta8 functional emission candidate', '// claim: local candidate evidence only', `pub const PCD_SHA256: &str = "${hash}";`, `pub const PCD_AST_JSON: &str = r#"${astJson}"#;`, - 'pub fn run() -> String {', - ' format!("brik:{}:{}", PCD_AST_JSON, PCD_SHA256)', + `pub fn run(${param}: i64) -> i64 {`, + ...rustStatements.map((line) => line.replace(/^ /, ' ')), + ' panic!("pcd execution reached non-returning path");', '}', '', ].join('\n'), testCode: (hash) => [ `const PCD_SHA256: &str = "${hash}";`, `const PCD_AST_JSON: &str = r#"${astJson}"#;`, - 'fn run() -> String {', - ' format!("brik:{}:{}", PCD_AST_JSON, PCD_SHA256)', + `fn run(${param}: i64) -> i64 {`, + ...rustStatements.map((line) => line.replace(/^ /, ' ')), + ' panic!("pcd execution reached non-returning path");', '}', '', 'fn main() {', ` assert_eq!(PCD_SHA256, "${hash}");`, - ' assert!(run().contains(PCD_AST_JSON));', + ' assert!(PCD_AST_JSON.contains("body"));', + ...cases.map((testCase) => ` assert_eq!(run(${testCase.input}), ${testCase.expected});`), ' println!("brik64 generated rust test: PASS");', '}', '', @@ -564,20 +944,24 @@ function targetSpec(target, ast) { program: 'program.py', test: 'test_program.py', code: (hash) => [ - '# BRIK64 beta7 functional emission candidate', + '# BRIK64 beta8 functional emission candidate', '# claim: local candidate evidence only', `PCD_SHA256 = "${hash}"`, - `PCD_AST = ${astJson}`, + `PCD_AST_JSON = ${JSON.stringify(JSON.stringify(ast))}`, '', - 'def run(input=0):', - ' return f"brik:{PCD_AST[\'pcName\']}:{PCD_AST[\'fnName\']}:{PCD_AST[\'returnValues\']}:{input}:{PCD_SHA256}"', + `def run(${param}=0):`, + ...pythonStatements, + ' raise RuntimeError("pcd execution reached non-returning path")', '', ].join('\n'), testCode: (hash) => [ - 'from program import PCD_AST, PCD_SHA256, run', + 'from program import PCD_SHA256, run', '', `assert PCD_SHA256 == "${hash}"`, - 'assert PCD_AST["pcName"] in run()', + `cases = ${JSON.stringify(cases)}`, + 'for case in cases:', + ' actual = run(case["input"])', + ' assert actual == case["expected"], f"case {case[\'input\']} expected {case[\'expected\']} got {actual}"', 'print("brik64 generated python test: PASS")', '', ].join('\n'), @@ -652,7 +1036,7 @@ function emit(file, args = []) { if (options.tests) process.stdout.write(`tests=${path.relative(process.cwd(), testPath)}\n`); return; } - process.stdout.write('// BRIK64 beta7 functional emission candidate\n'); + process.stdout.write('// BRIK64 beta8 functional emission candidate\n'); process.stdout.write('// claim: local candidate evidence only\n'); process.stdout.write(`// pcd_sha256=${cert.semantic_pcd_sha256}\n`); process.stdout.write(`// ast_sha256=${cert.ast_sha256}\n`); @@ -666,7 +1050,7 @@ function verify(file, args = []) { } requireLocalOrEntitled(parsed); if (parsed['--cloud']) { - fail(69, 'managed_verify_endpoint_unavailable_beta7'); + fail(69, 'managed_verify_endpoint_unavailable_beta8'); } const source = readFileRequired(file); const ast = parsePcd(source); @@ -714,7 +1098,7 @@ function polymerize(rawArgs = []) { } requireLocalOrEntitled(parsed); if (parsed['--cloud']) { - fail(69, 'managed_polymerize_endpoint_unavailable_beta7'); + fail(69, 'managed_polymerize_endpoint_unavailable_beta8'); } const files = parsed._; if (files.length === 0) { @@ -743,7 +1127,7 @@ function polymerize(rawArgs = []) { const polymerName = 'brik64_polymer'; const content = [ '// brik64.pcd_file.v1', - '// generated_by: brik64-cli beta7 polymerize local', + '// generated_by: brik64-cli beta8 polymerize local', '// claim_boundary: local_candidate_only', ...sourceLines, '', @@ -781,7 +1165,7 @@ function migrate(file, args = []) { const source = readFileRequired(file); const oldHash = sha256(source); let migrated = source; - let syntax = 'beta7'; + let syntax = 'beta8'; if (/\bcircuit\s+[A-Za-z_][A-Za-z0-9_]*\s*\{/m.test(source)) { migrated = migrated.replace(/\bcircuit\s+([A-Za-z_][A-Za-z0-9_]*)\s*\{/m, 'PC $1 {'); syntax = 'legacy_circuit'; @@ -799,7 +1183,7 @@ function migrate(file, args = []) { } outPath = inputPath; } else { - outPath = workspacePath(parsed['--out'] || `${file.replace(/\.pcd$/, '')}.beta7.pcd`); + outPath = workspacePath(parsed['--out'] || `${file.replace(/\.pcd$/, '')}.beta8.pcd`); if (fs.existsSync(outPath)) { fail(73, `output_exists:${path.relative(process.cwd(), outPath)}`); } diff --git a/tests/smoke.sh b/tests/smoke.sh index ec6f91b7..1f7804b6 100755 --- a/tests/smoke.sh +++ b/tests/smoke.sh @@ -9,7 +9,7 @@ cleanup() { rm -rf "$tmpdir"; } trap cleanup EXIT export BRIK64_CONFIG_HOME="$tmpdir/config" -node "$BRIK" --version | grep -q "BRIK64 CLI 0.1.0-beta.7" +node "$BRIK" --version | grep -q "BRIK64 CLI 0.1.0-beta.8" node "$BRIK" --version | node -e 'let s=""; process.stdin.on("data", (d) => { s += d; }); process.stdin.on("end", () => { s = s.replace(/\x1b\[[0-9;]*m/g, ""); if (!s.includes("█████████████") || !s.includes("▒▒▒▒▒▒▒▒▒▒▒▒")) process.exit(1); });' node "$BRIK" --help | grep -q "status=public_beta" node "$BRIK" --help | grep -q "polymerize " @@ -134,7 +134,7 @@ fi cp program.pcd stale.pcd node "$BRIK" certify stale.pcd -printf '\n return 3;\n' >> stale.pcd +perl -0pi -e 's/return 2;/return 3;/' stale.pcd if node "$BRIK" emit stale.pcd >/tmp/brik-stale.out 2>/tmp/brik-stale.err; then echo "stale certificate should fail closed" >&2 exit 1 From 6c2008fa13fad917e333f7bd44ddf7a06b07ba35 Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:07:18 +0200 Subject: [PATCH 2/9] Add beta8 adversarial compiler gate --- evidence/beta8-adversarial/report.json | 47 +++ .../beta8-compiler-functionality/report.json | 2 +- package.json | 1 + scripts/beta8-adversarial-gate.sh | 278 ++++++++++++++++++ 4 files changed, 327 insertions(+), 1 deletion(-) create mode 100644 evidence/beta8-adversarial/report.json create mode 100644 scripts/beta8-adversarial-gate.sh diff --git a/evidence/beta8-adversarial/report.json b/evidence/beta8-adversarial/report.json new file mode 100644 index 00000000..f2cccea3 --- /dev/null +++ b/evidence/beta8-adversarial/report.json @@ -0,0 +1,47 @@ +{ + "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", + "generatedAt": "2026-06-06T02:06:55Z", + "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", + "lane": "cli_0_1_beta8", + "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", + "rc": 0, + "cliVersion": "0.1.0-beta.8", + "cliSha256": "sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee", + "executableEdgeFixture": { + "path": "pcd/edge_precedence.pcd", + "sha256": "sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63" + }, + "passChecks": 9, + "failClosedChecks": 12, + "generatedTargetExecution": { + "typescript": true, + "rust": true, + "python": true + }, + "failClosedSurface": [ + "empty_pcd", + "binary_input", + "too_large_input", + "legacy_syntax", + "missing_fn", + "too_many_params", + "invalid_param", + "missing_return", + "unsupported_statement", + "unsupported_expression_token", + "malformed_expression", + "unclosed_block" + ], + "claim_boundary": { + "public_claims_allowed": false, + "public_release_allowed": false, + "adversarial_gate_passed": true, + "compiler_functionality_scope": "supported_beta8_pcd_subset_only", + "fixpoint_claim_allowed": false, + "n5_formal_claim_allowed": false, + "rust_independence_claim_allowed": false + }, + "blockers": [], + "warnings": [], + "next_action": "run beta8 package smoke and release-train sync gates" +} diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json index d463fb2b..29e8c656 100644 --- a/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:01:42Z", + "generatedAt": "2026-06-06T02:06:52Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/package.json b/package.json index 1695efd6..404600b4 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "gate:beta7:docs-web-sync": "node scripts/beta7-docs-web-sync-gate.js", "gate:beta7:skills-sync": "node scripts/beta7-skills-sync-gate.js", "gate:beta8:compiler-functionality": "bash scripts/beta8-compiler-functionality-gate.sh", + "gate:beta8:adversarial": "bash scripts/beta8-adversarial-gate.sh", "release:manifest:validate": "node scripts/release-manifest-validate.js", "release:flow:audit": "node scripts/release-flow-audit.js", "release:train:dry-run": "node scripts/release-train-dry-run.js", diff --git a/scripts/beta8-adversarial-gate.sh b/scripts/beta8-adversarial-gate.sh new file mode 100644 index 00000000..ff64f341 --- /dev/null +++ b/scripts/beta8-adversarial-gate.sh @@ -0,0 +1,278 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BRIK="$ROOT_DIR/src/brik.js" +ITER_ID="${ITER_ID:-BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1}" +EVIDENCE_DIR="${EVIDENCE_DIR:-$ROOT_DIR/evidence/beta8-adversarial}" +REPORT_JSON="$EVIDENCE_DIR/report.json" +TMP_DIR="$(mktemp -d)" + +cleanup() { rm -rf "$TMP_DIR"; } +trap cleanup EXIT + +need_cmd() { + command -v "$1" >/dev/null 2>&1 || { + echo "missing command: $1" >&2 + exit 2 + } +} + +need_cmd node +need_cmd python3 +need_cmd rustc +need_cmd jq +need_cmd shasum + +sha256_file() { shasum -a 256 "$1" | awk '{print $1}'; } + +json_array() { + if [[ "$#" -eq 0 ]]; then + printf '[]' + else + printf '%s\n' "$@" | jq -Rsc 'split("\n") | map(select(length > 0))' + fi +} + +mkdir -p "$EVIDENCE_DIR" + +decision="PASS_BRIK64_CLI_BETA8_ADVERSARIAL" +rc=0 +blockers=() +warnings=() +pass_checks=0 +fail_closed_checks=0 + +block() { + blockers+=("$1") + decision="BLOCKED_BRIK64_CLI_BETA8_ADVERSARIAL" + rc=2 +} + +pass() { + local id="$1" + shift + set +e + "$@" >"$TMP_DIR/$id.stdout" 2>"$TMP_DIR/$id.stderr" + local cmd_rc=$? + set -e + if [[ "$cmd_rc" -ne 0 ]]; then + block "$id:unexpected_failure" + return + fi + pass_checks=$((pass_checks + 1)) +} + +expect_fail() { + local id="$1" + local expected="$2" + shift 2 + set +e + "$@" >"$TMP_DIR/$id.stdout" 2>"$TMP_DIR/$id.stderr" + local cmd_rc=$? + set -e + if [[ "$cmd_rc" -eq 0 ]]; then + block "$id:unexpected_success" + return + fi + if ! grep -q "$expected" "$TMP_DIR/$id.stderr"; then + block "$id:missing_expected_error:$expected" + return + fi + fail_closed_checks=$((fail_closed_checks + 1)) +} + +export BRIK64_CONFIG_HOME="$TMP_DIR/config" +WORK_DIR="$TMP_DIR/work" +mkdir -p "$WORK_DIR" + +pushd "$WORK_DIR" >/dev/null + pass init node "$BRIK" init + mkdir -p pcd + + cat > pcd/edge_precedence.pcd <<'PCD' +PC edge_precedence { + fn edge_precedence(input) { + if (((input + 2) * 3 >= 15) || (input == -4)) { + return (input * input) - 1; + } else { + return -input + 7; + } + } +} +PCD + + pass certify_edge node "$BRIK" certify pcd/edge_precedence.pcd + for target in ts rust python; do + pass "emit_edge_$target" node "$BRIK" emit pcd/edge_precedence.pcd --target "$target" --out "edge-$target" --tests + done + pass ts_edge node edge-ts/program.test.ts + pass rust_compile_edge rustc edge-rust/program_test.rs -o edge-rust/program_test + pass rust_edge ./edge-rust/program_test + pass python_edge env PYTHONPATH=edge-python python3 edge-python/test_program.py + + : > pcd/empty.pcd + printf 'PC zero { fn zero(input) { return input; } }\0' > pcd/binary.pcd + python3 - <<'PY' +from pathlib import Path +Path("pcd/too_large.pcd").write_text("PC huge { fn huge(input) { return input; } }\n" + ("//x\n" * 300000)) +PY + cat > pcd/legacy.pcd <<'PCD' +pc legacy { + fn legacy(input) { + return input; + } +} +PCD + cat > pcd/missing_fn.pcd <<'PCD' +PC missing_fn { + return 1; +} +PCD + cat > pcd/too_many_params.pcd <<'PCD' +PC too_many_params { + fn too_many_params(input, other) { + return input; + } +} +PCD + cat > pcd/invalid_param.pcd <<'PCD' +PC invalid_param { + fn invalid_param(9bad) { + return 1; + } +} +PCD + cat > pcd/missing_return.pcd <<'PCD' +PC missing_return { + fn missing_return(input) { + if (input > 1) { + } + } +} +PCD + cat > pcd/unsupported_statement.pcd <<'PCD' +PC unsupported_statement { + fn unsupported_statement(input) { + let x = input; + return x; + } +} +PCD + cat > pcd/unsupported_expression_token.pcd <<'PCD' +PC unsupported_expression_token { + fn unsupported_expression_token(input) { + return input ? 1 : 0; + } +} +PCD + cat > pcd/malformed_expression.pcd <<'PCD' +PC malformed_expression { + fn malformed_expression(input) { + return input + ; + } +} +PCD + cat > pcd/unclosed_block.pcd <<'PCD' +PC unclosed_block { + fn unclosed_block(input) { + if (input > 1) { + return 1; + } +} +PCD + + expect_fail empty "pcd_empty" node "$BRIK" certify pcd/empty.pcd + expect_fail binary "pcd_binary_input" node "$BRIK" certify pcd/binary.pcd + expect_fail too_large "pcd_too_large" node "$BRIK" certify pcd/too_large.pcd + expect_fail legacy "legacy syntax detected" node "$BRIK" certify pcd/legacy.pcd + expect_fail missing_fn "pcd_parse_error:missing_fn_block" node "$BRIK" certify pcd/missing_fn.pcd + expect_fail too_many_params "pcd_parse_error:too_many_params_beta8" node "$BRIK" certify pcd/too_many_params.pcd + expect_fail invalid_param "pcd_parse_error:invalid_param" node "$BRIK" certify pcd/invalid_param.pcd + expect_fail missing_return "pcd_parse_error:missing_return" node "$BRIK" certify pcd/missing_return.pcd + expect_fail unsupported_statement "pcd_parse_error:unsupported_statement" node "$BRIK" certify pcd/unsupported_statement.pcd + expect_fail unsupported_expression_token "pcd_parse_error:unsupported_expression_token" node "$BRIK" certify pcd/unsupported_expression_token.pcd + expect_fail malformed_expression "pcd_parse_error:malformed_expression" node "$BRIK" certify pcd/malformed_expression.pcd + expect_fail unclosed_block "pcd_parse_error:malformed_pc_block" node "$BRIK" certify pcd/unclosed_block.pcd +popd >/dev/null + +if grep -q "Node.js\\|at .*src/brik" "$TMP_DIR"/*.stderr 2>/dev/null; then + block "stack_trace_leaked_to_stderr" +fi + +if [[ "${#blockers[@]}" -eq 0 ]]; then + blockers_json='[]' +else + blockers_json="$(json_array "${blockers[@]}")" +fi +if [[ "${#warnings[@]}" -eq 0 ]]; then + warnings_json='[]' +else + warnings_json="$(json_array "${warnings[@]}")" +fi + +package_version="$(node -e "const fs=require('fs'); process.stdout.write(JSON.parse(fs.readFileSync('$ROOT_DIR/package.json','utf8')).version)")" +cli_sha="sha256:$(sha256_file "$BRIK")" +edge_sha="sha256:$(sha256_file "$WORK_DIR/pcd/edge_precedence.pcd")" +generated_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)" + +jq -n \ + --arg schemaVersion "brik64.cli_beta8_adversarial_gate.v1" \ + --arg generatedAt "$generated_at" \ + --arg iter_id "$ITER_ID" \ + --arg decision "$decision" \ + --arg version "$package_version" \ + --arg cli_sha "$cli_sha" \ + --arg edge_sha "$edge_sha" \ + --argjson pass_checks "$pass_checks" \ + --argjson fail_closed_checks "$fail_closed_checks" \ + --argjson blockers "$blockers_json" \ + --argjson warnings "$warnings_json" \ + --argjson rc "$rc" \ + '{ + schemaVersion:$schemaVersion, + generatedAt:$generatedAt, + iter_id:$iter_id, + lane:"cli_0_1_beta8", + decision:$decision, + rc:$rc, + cliVersion:$version, + cliSha256:$cli_sha, + executableEdgeFixture:{path:"pcd/edge_precedence.pcd", sha256:$edge_sha}, + passChecks:$pass_checks, + failClosedChecks:$fail_closed_checks, + generatedTargetExecution:{ + typescript:true, + rust:true, + python:true + }, + failClosedSurface:[ + "empty_pcd", + "binary_input", + "too_large_input", + "legacy_syntax", + "missing_fn", + "too_many_params", + "invalid_param", + "missing_return", + "unsupported_statement", + "unsupported_expression_token", + "malformed_expression", + "unclosed_block" + ], + claim_boundary:{ + public_claims_allowed:false, + public_release_allowed:false, + adversarial_gate_passed:($decision=="PASS_BRIK64_CLI_BETA8_ADVERSARIAL"), + compiler_functionality_scope:"supported_beta8_pcd_subset_only", + fixpoint_claim_allowed:false, + n5_formal_claim_allowed:false, + rust_independence_claim_allowed:false + }, + blockers:$blockers, + warnings:$warnings, + next_action:(if $decision=="PASS_BRIK64_CLI_BETA8_ADVERSARIAL" then "run beta8 package smoke and release-train sync gates" else "resolve beta8 adversarial blockers" end) + }' >"$REPORT_JSON" + +cat "$REPORT_JSON" +exit "$rc" From 2673a5b0b3c11bf30be2cda2c9ea558d0b7c6a45 Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:11:43 +0200 Subject: [PATCH 3/9] Add beta8 local package smoke gate --- evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- evidence/beta8-package-smoke/report.json | 35 + evidence/beta8-package/SHA256SUMS | 3 + .../beta8-package/brik64-cli-0.1.0-beta.8.tgz | Bin 0 -> 24217 bytes evidence/beta8-package/package.manifest.json | 28 + evidence/beta8-package/stage-checksums.tsv | 19 + .../.brik/manifest.json | 53 + .../brik64-cli-0.1.0-beta.8/CHANGELOG.md | 108 ++ .../stage/brik64-cli-0.1.0-beta.8/LICENSE | 71 + .../stage/brik64-cli-0.1.0-beta.8/NOTICE | 18 + .../stage/brik64-cli-0.1.0-beta.8/README.md | 118 ++ .../stage/brik64-cli-0.1.0-beta.8/SECURITY.md | 54 + .../engines/l4plus-n5/checksums.tsv | 42 + .../l4plus-n5/runtime-bundle.manifest.json | 147 ++ .../engines/l4plus-n5/serial.txt | 1 + .../evidence/beta8-adversarial/report.json | 47 + .../beta8-compiler-functionality/report.json | 49 + .../brik64-cli-0.1.0-beta.8/package.json | 13 + .../pcd/cli_account_session.pcd | 31 + .../brik64-cli-0.1.0-beta.8/pcd/cli_core.pcd | 33 + .../pcd/cli_migrate.pcd | 27 + .../pcd/cli_polymer.pcd | 59 + .../pcd/cli_polymerize.pcd | 29 + .../pcd/cli_verify.pcd | 30 + .../stage/brik64-cli-0.1.0-beta.8/src/brik.js | 1231 +++++++++++++++++ package.json | 2 + scripts/beta8-package-smoke.sh | 155 +++ scripts/build-beta8-package.sh | 160 +++ 29 files changed, 2565 insertions(+), 2 deletions(-) create mode 100644 evidence/beta8-package-smoke/report.json create mode 100644 evidence/beta8-package/SHA256SUMS create mode 100644 evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz create mode 100644 evidence/beta8-package/package.manifest.json create mode 100644 evidence/beta8-package/stage-checksums.tsv create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/.brik/manifest.json create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/CHANGELOG.md create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/LICENSE create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/NOTICE create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/SECURITY.md create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/checksums.tsv create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/runtime-bundle.manifest.json create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/serial.txt create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/package.json create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_account_session.pcd create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_core.pcd create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_migrate.pcd create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymer.pcd create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymerize.pcd create mode 100644 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_verify.pcd create mode 100755 evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/src/brik.js create mode 100644 scripts/beta8-package-smoke.sh create mode 100644 scripts/build-beta8-package.sh diff --git a/evidence/beta8-adversarial/report.json b/evidence/beta8-adversarial/report.json index f2cccea3..4b8dd231 100644 --- a/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:06:55Z", + "generatedAt": "2026-06-06T02:11:12Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json index 29e8c656..e2289ed7 100644 --- a/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:06:52Z", + "generatedAt": "2026-06-06T02:11:07Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/beta8-package-smoke/report.json b/evidence/beta8-package-smoke/report.json new file mode 100644 index 00000000..76e3b4b3 --- /dev/null +++ b/evidence/beta8-package-smoke/report.json @@ -0,0 +1,35 @@ +{ + "schemaVersion": "brik64.cli_beta8_package_smoke.v1", + "version": "0.1.0-beta.8", + "decision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", + "releaseEligible": false, + "lane": "cli_0_1_beta8", + "package": { + "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", + "sha256": "49aba57ce02a706f5fb4ead64e420a2f636847a637916f2ec75e9240df7dfdca" + }, + "checks": [ + "extract", + "version", + "help", + "init", + "certify", + "emit_ts", + "emit_rust", + "emit_python", + "generated_ts_exec", + "generated_rust_exec", + "generated_python_exec", + "verify", + "cloud_verify_no_entitlement" + ], + "claim_boundary": { + "public_claims_allowed": false, + "public_release_allowed": false, + "local_package_smoke_passed": true, + "fixpoint_claim_allowed": false, + "n5_formal_claim_allowed": false, + "rust_independence_claim_allowed": false + }, + "next_action": "run platform smoke, sync gates and public release train" +} diff --git a/evidence/beta8-package/SHA256SUMS b/evidence/beta8-package/SHA256SUMS new file mode 100644 index 00000000..2ba3da85 --- /dev/null +++ b/evidence/beta8-package/SHA256SUMS @@ -0,0 +1,3 @@ +49aba57ce02a706f5fb4ead64e420a2f636847a637916f2ec75e9240df7dfdca brik64-cli-0.1.0-beta.8.tgz +79b4d8af0509d0829178e5fc928b0e73a6982d2c6f4a40300823a75362ab91dd package.manifest.json +a3ec8a78d2d029d331d99a282233347067a228851eca40f83eb80fb91b6e1093 stage-checksums.tsv diff --git a/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz b/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1f795fcb2decdb528b655e9c3a446dbe49b077a0 GIT binary patch literal 24217 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. +- Added package checksums and local install smoke coverage for the public beta + package. +- Added matching beta SDK package coordinates for TypeScript, Python, and Rust. +- Added public release-train validation so CLI, SDK, docs, web, skills, + release notes, and installer metadata can be checked from one manifest. + +### Changed + +- Updates public install guidance from beta4 to beta5. +- Clarifies that npm is used for SDK packages, while the CLI install path is + the curl installer and GitHub Release assets. +- Improves failure boundaries for stale certificates, tampered runtime metadata, + and mismatched generated outputs. +- Aligns public docs, website install surfaces, skills, SDK references, and + release notes to beta5. + +### Fixed + +- Fixes stale beta references in local seed metadata and public install + surfaces. +- Fixes release notes that previously mixed public functionality with internal + operating details. +- Fixes docs and skills drift where older beta package coordinates could remain + visible. + +### Compatibility + +- macOS and Linux are the current installable CLI lanes for beta5. +- Node.js 20 or newer is required. +- Windows native executables are not published in this beta. + +## 0.1.0-beta.4 - Published Beta Reference + +Status: latest prior public release reference. + +Use GitHub Releases, curl installer metadata and published docs as the authority +for what beta4 made publicly installable. diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/LICENSE b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/LICENSE new file mode 100644 index 00000000..fd2655d7 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/LICENSE @@ -0,0 +1,71 @@ +BRIK64 CLI PUBLIC BETA EVALUATION LICENSE + +Copyright (c) 2026 BRIK64 INC. All rights reserved. + +This package, including the BRIK64 CLI source, bundled PCD seed material, +examples, package metadata, documentation, evidence artifacts, and release +materials, is proprietary software and confidential know-how of BRIK64 INC +except where a file explicitly states otherwise. + +1. Evaluation Permission + +BRIK64 INC grants you a limited, revocable, non-exclusive, non-transferable +permission to download, install, and run this public beta release only for +internal evaluation, local workflow testing, compatibility review, and feedback +to BRIK64. + +2. Reserved Rights + +BRIK64 INC reserves all rights not expressly granted in this license. This +license does not grant any ownership interest, patent license, trademark license, +commercial distribution right, sublicensing right, hosted service right, resale +right, or right to create derivative works for public or commercial use. + +3. Restrictions + +Without prior written permission from BRIK64 INC, you may not: + +- redistribute, mirror, sell, sublicense, rent, lease, or commercially exploit + this software; +- publish modified versions or derivative works; +- remove copyright, trademark, provenance, release, checksum, or evidence + notices; +- use BRIK64 names, logos, marks, or release artifacts to imply endorsement or + certification; +- use the beta in regulated, safety-critical, mission-critical, or production + systems as a certification authority. + +4. Beta Scope + +This public beta is provided for evaluation of local BRIK64 CLI workflows, +PCD-oriented project structure, package validation, and bounded evidence review. +Expanded platform support, production certification surfaces, and advanced +compiler-methodology scopes are governed by BRIK64 release gates and written +commercial terms. + +5. Feedback + +If you provide feedback, bug reports, ideas, or suggestions to BRIK64, you grant +BRIK64 INC a perpetual, irrevocable, worldwide, royalty-free right to use that +feedback to improve BRIK64 products and services without obligation to you. + +6. No Warranty + +This beta is provided as-is for evaluation. BRIK64 INC disclaims all warranties, +express or implied, including merchantability, fitness for a particular purpose, +non-infringement, and uninterrupted or error-free operation. + +7. Limitation Of Liability + +To the maximum extent permitted by law, BRIK64 INC is not liable for indirect, +incidental, special, consequential, exemplary, punitive, or business interruption +damages arising from this beta, even if advised of the possibility of such +damages. + +8. Commercial Licensing + +For production, commercial, hosted, redistribution, partner, enterprise, +regulated, or certification-oriented use, contact BRIK64 INC through the public +company channels listed at https://brik64.com. + +This is not an open source license. diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/NOTICE b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/NOTICE new file mode 100644 index 00000000..aa404714 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/NOTICE @@ -0,0 +1,18 @@ +BRIK64 CLI Public Beta Notice + +Copyright (c) 2026 BRIK64 INC. All rights reserved. + +BRIK64 CLI 0.1 public beta is proprietary software published for evaluation of +local PCD workflows, bounded evidence review, and claim-safe project scaffolding. +The current public beta surface is focused on macOS local CLI usage, package +validation, and versioned release evidence. Expanded platform support and +stronger certification surfaces remain governed by the BRIK64 evidence process +and commercial licensing terms. + +Public product information: https://brik64.com +Documentation: https://docs.brik64.com/cli/install +Repository: https://github.com/brik64/brik64-cli +Package: https://www.npmjs.com/package/@brik64/cli + +License: BRIK64 CLI Public Beta Evaluation License. This is not an open source +license. See LICENSE for evaluation terms and reserved rights. diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md new file mode 100644 index 00000000..735d2041 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md @@ -0,0 +1,118 @@ +# BRIK64 CLI + +BRIK64 CLI is the public beta command-line surface for local BRIK64 project +workflows. It helps developers initialize `.brik` metadata, work with PCD files, +create local candidate evidence, emit supported language targets, and prepare +artifacts for managed platform workflows. + +Current public beta: `0.1.0-beta.7` + +## Install + +The public CLI install path is curl-only: + +```sh +curl -fsSL https://brik64.com/cli/install.sh | bash +``` + +After installation: + +```sh +brik64 --version +brik64 help +``` + +The npm package namespace is reserved for SDK libraries, not CLI installation. + +## Beta7 Command Surface + +`0.1.0-beta.7` focuses on local/managed workflow parity and clearer terminal +behavior. + +- `brik64 init` creates `.brik/manifest.json` and does not create `AGENTS.md`. +- `brik64 doctor` prints a human-readable workspace summary. +- `brik64 doctor --json` emits `brik64.cli_doctor_report.v1` for CI. +- `brik64 account status` shows whether the CLI is using local default routing + or a managed session. +- `brik64 login --token-env ` records a managed-session token hash without + printing the token. +- `brik64 logout` returns routing to local default. +- `brik64 certify ` writes a local candidate certificate. +- `brik64 verify ` checks local certificate and AST/hash coherence. +- `brik64 emit --target --out --tests` + emits supported target files and generated tests. +- `brik64 polymerize --out polymer.pcd` combines compatible PCD + files into a deterministic local polymer candidate. +- `brik64 migrate ` converts supported legacy PCD syntax into the + current strict syntax. + +Managed `--cloud` paths are entitlement-gated in this beta. Without a managed +session, those paths fail closed and keep local artifacts unchanged. + +## Platform Support + +| Platform | Status | Notes | +| --- | --- | --- | +| macOS | Available in current beta candidate | Portable Node.js CLI package; requires Node.js 20 or newer. | +| Linux | Available in current beta candidate | Portable Node.js CLI package; requires Node.js 20 or newer. | +| Windows x64 native | Not available in current public beta | No Windows executable is published. | + +The public installer verifies the package SHA-256 before activation. The +authoritative checksum is published with release assets in `package.manifest.json` +and `SHA256SUMS`. + +## SDK Boundary + +SDKs are distributed separately from the CLI. Current beta SDK package +coordinates: + +```sh +npm install @brik64/core@0.1.0-beta.7 +pip install brik64==0.1.0b7 +cargo add brik64-core@0.1.0-beta.7 +``` + +SDK packages are language libraries. They do not install the CLI, issue managed +claims, or replace the CLI workspace workflow. + +## Claim Boundary + +This beta provides local candidate evidence and managed-workflow routing +boundaries. It does not by itself establish formal certification for arbitrary +user code, universal correctness, independent toolchain closure, or native +Windows compatibility. + +## CLI And Agent Skill + +Use the CLI for local project actions and the official `brik64` skill for agent +behavior, claim-safe reporting, `.brik` traceability, PCD workflow, and +consent-based `AGENTS.md` handling. + +`brik64 init` prepares local BRIK64 metadata. It does not create or modify +`AGENTS.md`. + +## Repository Map + +| Path | What it contains | +| --- | --- | +| `src/brik.js` | Node.js entry point for current public beta command behavior. | +| `tests/smoke.sh` | Local smoke test for current beta command behavior. | +| `pcd/` | Candidate PCD seed material for command structure. | +| `evidence/` | Public beta evidence notes and generated-review placeholders. | +| `packaging/` | Platform packaging notes and release-lane material. | +| `docs/` | Release, distribution, governance, platform, and testing docs. | +| `.brik/manifest.json` | Local traceability metadata. It is not a certificate. | + +## Release Evidence + +Use GitHub Release assets, release manifest, and `SHA256SUMS` to review the +latest published package. + +https://github.com/brik64/brik64-cli/releases + +## Copyright And License + +Copyright (c) 2026 BRIK64 INC. All rights reserved. + +See [LICENSE](LICENSE) and [NOTICE](NOTICE). BRIK64 CLI public beta is +proprietary evaluation software from BRIK64 INC. diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/SECURITY.md b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/SECURITY.md new file mode 100644 index 00000000..142c352b --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/SECURITY.md @@ -0,0 +1,54 @@ +# Security Policy + +BRIK64 CLI is public beta evaluation software from BRIK64 INC. + +## Supported Versions + +| Version | Status | +| --- | --- | +| `0.1.0-beta.x` | Public beta security review and patch lane | +| Earlier beta artifacts | Superseded | + +## Reporting A Vulnerability + +Report suspected vulnerabilities through GitHub Security Advisories for this +repository when available, or contact BRIK64 through the public company website: + +https://brik64.com + +Do not include secrets, private source code, customer data, raw credentials, or +unredacted infrastructure details in public issues. + +Use public issues only for non-sensitive bugs, docs mismatches, package metadata, +install failures, or release evidence questions. If an issue may expose a token, +private path, customer data, unpublished source, infrastructure detail, or +exploit path, use a private security report path instead. + +## Public Beta Scope + +Security review for this repository covers the public CLI package surface, +release metadata, package workflows, local smoke tests, PCD seed files, and +bounded evidence artifacts included with the beta. + +`brik64-prod` remains the authority for methodology, certification boundaries, +evidence gates, compiler claim authorization, and release approval. + +## Disclosure Handling + +BRIK64 will triage reports by affected version, exploitability, package +surface, and evidence impact. Fixes may be shipped as new beta versions, +repository advisories, release notes, or docs updates depending on scope. + +## Maintainer Controls + +The public repository is maintained through the `brik64-cli-maintainers` team. +External pull requests are not accepted. Changes to package metadata, release +evidence, license text, workflows, public claims, or install paths must land +through authorized maintainers, protected branch rules, and passing checks. + +## Dependency And Workflow Security + +Dependabot is configured for npm and GitHub Actions update detection. CodeQL +default setup and CI smoke/package checks provide repository-level regression +signals. These checks are operational security controls; they do not certify the +CLI or expand the public beta claim boundary. diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/checksums.tsv b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/checksums.tsv new file mode 100644 index 00000000..7acbde74 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/checksums.tsv @@ -0,0 +1,42 @@ +1c0f49c9454496d88541927ccaf750df5f93d64ae9a6195d5bffa79d2aa2930c ./.brik/logic-ledger.jsonl +99edba6a784b4f274d80cef615542aac9dcfe455afe8155edd5cbef0b3543c72 ./README.md +246ad453d40d60c216b0afd113258bb4e81595de2edd39d69a23a27218098315 ./checksums.tsv +f08013a913983ac5f9de3684e6715b46447a5fd1ba9b2c42ed3ad7c75cadb581 ./evidence/l4plus_n5_burn_in_report.json +5359afe66a536a649fc01f8695a30741b5314f27b2f7136dfdf310caf49dc906 ./evidence/l4plus_n5_critical_artifact_lock.json +86828d4fe8bad314e4eb34662f7023cc7bb155223d24af160f7d45ee0cd2726c ./evidence/l4plus_n5_critical_freeze_certificate.json +ab9f691b1f0525c8e0a1c47be87f58691e8969b34e1c0fbd9620fd96fd33fe65 ./evidence/l4plus_n5_critical_freeze_report.json +9f9f293ddd34a066e36fb28c703f9de810c53517a7b2e34899eb2617294a88c5 ./manifest/claim_boundary.json +470454a0ab21fb6629838d91a4b410c48d669446fd2e213090510669bcb9435c ./pcd/engine.manifest.json +8e87f92ce267f33aa1fcd3e8815502e08f887637300030cc8b565e508a7b7668 ./pcd/engine.pcd +51a256276984c44fac6a1f4fc5e05148b05e9bdf3381014df292b58a505722c2 ./pcd/evidence_pack.manifest.json +80f9d64ed801138fb4b7dbf5c10b778adc3c3da790727c8c7036bdb9ddc3dfc2 ./pcd/evidence_pack.pcd +d2cbabbc96440bdadae2cfe42acc32bd27bd6689f8635fc6df07d34eb64b5fc7 ./pcd/generated_tests_fixtures.json +bfd213dc99445a1687f95962524ba22509c099852fe31eb69f8c25f1faf7ba06 ./pcd/generated_tests_harness.pcd +adec2a5f643dc52381d08efae3fa9da791ec1af35e4e44d9a1eb3d9a9195fb63 ./pcd/harness.manifest.json +b9dc97d75637ff69eef7489a2825c166d43ff2cc73d1b59a4e1bef2ee27a6c34 ./pcd/harness.pcd +14645419bdfde549122d0df9537b806d8620be6953222feb66fd5134c5c6d6cf ./pcd/l4plus_engine_runtime.bir +0c7d54c6f4e35ef099eb463e817606bb54f4349fcd2ada3646fa19ae76b14779 ./pcd/l4plus_engine_runtime.bir.asm +cb69bb34b595120b983959139204ccf6dd33cd246364e5a9d30cc206069fda71 ./pcd/l4plus_engine_runtime.cert.json +6e6681fa5d2ccdc4ab99c4dafe8d6dd1fdf41e7b83dc347426c7c64f7a87be20 ./pcd/l4plus_n5_evidence_pack.bir +74e8b295611381de74dbbd052d4021e020d185dbcd62f996852db653b24336aa ./pcd/l4plus_n5_evidence_pack.bir.asm +b87a48dc37a859064b8c6bd8e22a2fada02b16ab22d9bb0809880cba02bbd871 ./pcd/l4plus_n5_evidence_pack.cert.json +9b67badac2ac26677885e5f0372f1d37a7432c86b35ff4467f5c9b0f16805dd0 ./pcd/l4plus_n5_generated_tests_harness.bir +dd38c327deae28c27d143eb8b8e59d659b5da58afbc06b36fa6954b8222892a6 ./pcd/l4plus_n5_generated_tests_harness.bir.asm +6dbd379d6b7bbe8d5a31612f80c1b67984f6de1bc6fb2bd974d5e206861ee38f ./pcd/l4plus_n5_generated_tests_harness.cert.json +e8bd3e86c3a3de5affb28396c2cc54906dd036a177a33859f27fec9df0791ec5 ./pcd/l4plus_n5_generated_tests_harness.generated-test.sh +f24945f5832aa377f4a49fc00c10522f8a2590424743f09455047adad515cf06 ./pcd/l4plus_n5_generated_tests_harness.tests.manifest.json +670d64da83a7b606d2b9d1474382df4b1ff73ae2174b74e315edd2783ae782f2 ./pcd/l4plus_n5_harness.bir +bdc9d30d0d512ba090f4ce561ec75357b3b1d481ee05a41d6d07f3de6fa48673 ./pcd/l4plus_n5_harness.bir.asm +01f560f9e89e616031ede3db46e73e8927b6b18e3fd74702c62520d81e514365 ./pcd/l4plus_n5_harness.cert.json +a0964fc1309466012128de4c4fcdac87a5f6bc40bc7c6e566b0a4fc77229d70b ./pcd/l4plus_n5_proof_binder.bir +6f7bb3a734cf07cb971550076c9f6fda9a471d7dedf0cea5b38c455a6cccabfd ./pcd/l4plus_n5_proof_binder.bir.asm +63d263a507e6e1e7d40f99284a8bd3ce57ee16836048a73542a294df99aa6aea ./pcd/l4plus_n5_proof_binder.cert.json +3a44add012a1832428aba24e3a53b1f4b1198571d926db9da6c031ba4ae3855c ./pcd/l4plus_n5_reconstruction.pcd +9a92f5136cf375eefdddfd926585eca411149b2e4bc5b9653aca9004c85ddee4 ./pcd/l4plus_n5_runtime_adapter.bir +8639bfcf9e7e7daf105e50b3922ab52a67bd63a28202140615ba3fc322abe249 ./pcd/l4plus_n5_runtime_adapter.bir.asm +628b196cdef72a7c5cf8e50dc350f4f72cabfec3eea1324985e2400fd5eededb ./pcd/l4plus_n5_runtime_adapter.cert.json +a81a905a0ce8d3a84fbe94d843c1274a193e7329eb69ffbbd22d2c9f842fde9d ./pcd/proof_binder.manifest.json +f3b0691d9d8323e263cef5255d0f7123a1206c5802ddb28e02683c84dec32704 ./pcd/proof_binder.pcd +659cb4738f3fcaf702aa7808aca00704c82b0649714f5f289d2ef48a491ef0c3 ./pcd/runtime_adapter.manifest.json +c7354811628f1c323151788f37d388c3c5baeda328de06504997eed71c82513b ./pcd/runtime_adapter.pcd +6f2a3eff7b3cbf80debb823f1771df5364d6f1fdf2c0b6c2dab8e109c04dc757 ./serial.txt diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/runtime-bundle.manifest.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/runtime-bundle.manifest.json new file mode 100644 index 00000000..f28b9f95 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/runtime-bundle.manifest.json @@ -0,0 +1,147 @@ +{ + "schemaVersion": "brik64.cli_l4plus_n5_portable_runtime_bundle.v1", + "decision": "PASS_PORTABLE_L4_BUNDLE_PACKAGED", + "releaseEligible": false, + "runtimeMode": "portable_bir_bundle", + "nativeExecutableIncluded": false, + "cliVersion": "0.1.0-beta.5", + "engine": "L4+N5", + "serial": "BRIK64-L4PLUS-N5-20260525-12d8e4662dec74a4", + "sourceRepo": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5", + "claimBoundary": { + "publicClaimsAllowed": true, + "n5Authorized": true, + "r99_9ClaimAllowed": true, + "r99_999999ClaimAllowed": false, + "universalCorrectnessClaimAllowed": false, + "platformCanIssueCertification": false + }, + "artifacts": [ + { + "path": "engines/l4plus-n5/serial.txt", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/serial.txt", + "sha256": "6f2a3eff7b3cbf80debb823f1771df5364d6f1fdf2c0b6c2dab8e109c04dc757", + "bytes": 43 + }, + { + "path": "engines/l4plus-n5/checksums.tsv", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/checksums.tsv", + "sha256": "11a5eadb7ec6f7d07e329c767026ae9576bdaf99c1d411781e5f88108e7d852e", + "bytes": 4234 + }, + { + "path": "engines/l4plus-n5/manifest/claim_boundary.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/manifest/claim_boundary.json", + "sha256": "9f9f293ddd34a066e36fb28c703f9de810c53517a7b2e34899eb2617294a88c5", + "bytes": 372 + }, + { + "path": "engines/l4plus-n5/evidence/l4plus_n5_critical_artifact_lock.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/evidence/l4plus_n5_critical_artifact_lock.json", + "sha256": "5359afe66a536a649fc01f8695a30741b5314f27b2f7136dfdf310caf49dc906", + "bytes": 4000 + }, + { + "path": "engines/l4plus-n5/evidence/l4plus_n5_critical_freeze_certificate.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/evidence/l4plus_n5_critical_freeze_certificate.json", + "sha256": "86828d4fe8bad314e4eb34662f7023cc7bb155223d24af160f7d45ee0cd2726c", + "bytes": 4890 + }, + { + "path": "engines/l4plus-n5/evidence/l4plus_n5_critical_freeze_report.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/evidence/l4plus_n5_critical_freeze_report.json", + "sha256": "ab9f691b1f0525c8e0a1c47be87f58691e8969b34e1c0fbd9620fd96fd33fe65", + "bytes": 1215 + }, + { + "path": "engines/l4plus-n5/evidence/l4plus_n5_burn_in_report.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/evidence/l4plus_n5_burn_in_report.json", + "sha256": "f08013a913983ac5f9de3684e6715b46447a5fd1ba9b2c42ed3ad7c75cadb581", + "bytes": 4127 + }, + { + "path": "engines/l4plus-n5/pcd/engine.manifest.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/engine.manifest.json", + "sha256": "470454a0ab21fb6629838d91a4b410c48d669446fd2e213090510669bcb9435c", + "bytes": 6066 + }, + { + "path": "engines/l4plus-n5/pcd/engine.pcd", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/engine.pcd", + "sha256": "8e87f92ce267f33aa1fcd3e8815502e08f887637300030cc8b565e508a7b7668", + "bytes": 341 + }, + { + "path": "engines/l4plus-n5/pcd/l4plus_engine_runtime.bir", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/l4plus_engine_runtime.bir", + "sha256": "14645419bdfde549122d0df9537b806d8620be6953222feb66fd5134c5c6d6cf", + "bytes": 300 + }, + { + "path": "engines/l4plus-n5/pcd/l4plus_engine_runtime.bir.asm", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/l4plus_engine_runtime.bir.asm", + "sha256": "0c7d54c6f4e35ef099eb463e817606bb54f4349fcd2ada3646fa19ae76b14779", + "bytes": 405 + }, + { + "path": "engines/l4plus-n5/pcd/l4plus_engine_runtime.cert.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/l4plus_engine_runtime.cert.json", + "sha256": "cb69bb34b595120b983959139204ccf6dd33cd246364e5a9d30cc206069fda71", + "bytes": 6611 + }, + { + "path": "engines/l4plus-n5/pcd/harness.manifest.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/harness.manifest.json", + "sha256": "adec2a5f643dc52381d08efae3fa9da791ec1af35e4e44d9a1eb3d9a9195fb63", + "bytes": 6061 + }, + { + "path": "engines/l4plus-n5/pcd/harness.pcd", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/harness.pcd", + "sha256": "b9dc97d75637ff69eef7489a2825c166d43ff2cc73d1b59a4e1bef2ee27a6c34", + "bytes": 558 + }, + { + "path": "engines/l4plus-n5/pcd/l4plus_n5_harness.bir", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/l4plus_n5_harness.bir", + "sha256": "670d64da83a7b606d2b9d1474382df4b1ff73ae2174b74e315edd2783ae782f2", + "bytes": 378 + }, + { + "path": "engines/l4plus-n5/pcd/l4plus_n5_harness.cert.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/l4plus_n5_harness.cert.json", + "sha256": "01f560f9e89e616031ede3db46e73e8927b6b18e3fd74702c62520d81e514365", + "bytes": 6604 + }, + { + "path": "engines/l4plus-n5/pcd/runtime_adapter.manifest.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/runtime_adapter.manifest.json", + "sha256": "659cb4738f3fcaf702aa7808aca00704c82b0649714f5f289d2ef48a491ef0c3", + "bytes": 6085 + }, + { + "path": "engines/l4plus-n5/pcd/runtime_adapter.pcd", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/runtime_adapter.pcd", + "sha256": "c7354811628f1c323151788f37d388c3c5baeda328de06504997eed71c82513b", + "bytes": 749 + }, + { + "path": "engines/l4plus-n5/pcd/l4plus_n5_runtime_adapter.bir", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/l4plus_n5_runtime_adapter.bir", + "sha256": "9a92f5136cf375eefdddfd926585eca411149b2e4bc5b9653aca9004c85ddee4", + "bytes": 521 + }, + { + "path": "engines/l4plus-n5/pcd/l4plus_n5_runtime_adapter.cert.json", + "sourcePath": "/Users/carlosjperez/Documents/GitHub/brik64-engine-l4plus-n5/pcd/l4plus_n5_runtime_adapter.cert.json", + "sha256": "628b196cdef72a7c5cf8e50dc350f4f72cabfec3eea1324985e2400fd5eededb", + "bytes": 6628 + } + ], + "blockers": [], + "limitations": [ + "This bundle packages portable PCD/BIR/certificate evidence for offline CLI binding.", + "It does not include a native executable runtime.", + "It does not authorize universal correctness claims." + ] +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/serial.txt b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/serial.txt new file mode 100644 index 00000000..dd274e13 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/engines/l4plus-n5/serial.txt @@ -0,0 +1 @@ +BRIK64-L4PLUS-N5-20260525-12d8e4662dec74a4 diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json new file mode 100644 index 00000000..4b8dd231 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json @@ -0,0 +1,47 @@ +{ + "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", + "generatedAt": "2026-06-06T02:11:12Z", + "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", + "lane": "cli_0_1_beta8", + "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", + "rc": 0, + "cliVersion": "0.1.0-beta.8", + "cliSha256": "sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee", + "executableEdgeFixture": { + "path": "pcd/edge_precedence.pcd", + "sha256": "sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63" + }, + "passChecks": 9, + "failClosedChecks": 12, + "generatedTargetExecution": { + "typescript": true, + "rust": true, + "python": true + }, + "failClosedSurface": [ + "empty_pcd", + "binary_input", + "too_large_input", + "legacy_syntax", + "missing_fn", + "too_many_params", + "invalid_param", + "missing_return", + "unsupported_statement", + "unsupported_expression_token", + "malformed_expression", + "unclosed_block" + ], + "claim_boundary": { + "public_claims_allowed": false, + "public_release_allowed": false, + "adversarial_gate_passed": true, + "compiler_functionality_scope": "supported_beta8_pcd_subset_only", + "fixpoint_claim_allowed": false, + "n5_formal_claim_allowed": false, + "rust_independence_claim_allowed": false + }, + "blockers": [], + "warnings": [], + "next_action": "run beta8 package smoke and release-train sync gates" +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json new file mode 100644 index 00000000..e2289ed7 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json @@ -0,0 +1,49 @@ +{ + "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", + "generatedAt": "2026-06-06T02:11:07Z", + "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", + "lane": "cli_0_1_beta8", + "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", + "rc": 0, + "cliVersion": "0.1.0-beta.8", + "cliSha256": "sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee", + "fixture": { + "path": "pcd/branch_math.pcd", + "sha256": "sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404" + }, + "executedTargets": { + "typescript": { + "programSha256": "sha256:22a0904178aaba0faa8a5392a1750e636fd6d42537e69ecf166596e8269cae98", + "test": "node out-ts/program.test.ts", + "passed": true + }, + "rust": { + "programSha256": "sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d", + "test": "rustc out-rust/program_test.rs && ./out-rust/program_test", + "passed": true + }, + "python": { + "programSha256": "sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6", + "test": "PYTHONPATH=out-python python3 out-python/test_program.py", + "passed": true + } + }, + "adversarial": { + "unknown_identifier_fail_closed": true, + "unsupported_target_fail_closed": true, + "path_traversal_fail_closed": true, + "stack_trace_leaked": false + }, + "claim_boundary": { + "public_claims_allowed": false, + "public_release_allowed": false, + "compiler_functionality_claim_allowed": true, + "compiler_functionality_scope": "supported_beta8_pcd_subset_only", + "fixpoint_claim_allowed": false, + "n5_formal_claim_allowed": false, + "rust_independence_claim_allowed": false + }, + "blockers": [], + "warnings": [], + "next_action": "run beta8 adversarial gate and package smoke before public release train" +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/package.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/package.json new file mode 100644 index 00000000..59b4b3a3 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/package.json @@ -0,0 +1,13 @@ +{ + "name": "@brik64/cli", + "version": "0.1.0-beta.8", + "private": true, + "description": "BRIK64 CLI public beta candidate for local PCD workflows and bounded compiler emission.", + "bin": { + "brik": "src/brik.js" + }, + "engines": { + "node": ">=20" + }, + "distribution": "curl_and_github_release_assets" +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_account_session.pcd b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_account_session.pcd new file mode 100644 index 00000000..29ae155d --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_account_session.pcd @@ -0,0 +1,31 @@ +// brik64.pcd_file.v1 +// name: brik_cli_account_session +// status: candidate_pcd_seed +// certifiesFormalCorrectness: false +// certifiesTests: false +// certifiesFixpoint: false +// commands = "login,logout,account status" +// token_policy = "never_print_secret" +// storage = "local_config_token_hash_only_beta" +// claim_boundary = "session_routing_only" + +PC brik_cli_account_session { + fn brik_cli_account_session(command_code, token_present, session_present) { + if (command_code == 1) { + if (token_present == 0) { + return 67; + } + return 0; + } + if (command_code == 2) { + return 0; + } + if (command_code == 3) { + if (session_present == 1) { + return 1; + } + return 0; + } + return 64; + } +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_core.pcd b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_core.pcd new file mode 100644 index 00000000..69561fab --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_core.pcd @@ -0,0 +1,33 @@ +// brik64.pcd_file.v1 +// name: brik_cli_core +// status: candidate_pcd_seed +// certifiesFormalCorrectness: false +// certifiesTests: false +// certifiesFixpoint: false +// product = "brik64-cli" +// cli_version = "0.1.0-beta.7" +// public_binary = "brik" +// execution_status = "public_beta" +// ascii_banner = "BRIK64" +// public_runtime = "local" +// managed_runtime = "platform" +// internal_artifact_factory = "private" +// claim_boundary = "local_candidate_only" + +PC brik_cli_core { + fn brik_cli_core(command_code, json_mode, ci_mode) { + if (json_mode == 1) { + return 0; + } + if (ci_mode == 1) { + return 0; + } + if (command_code == 0) { + return 1; + } + if (command_code == 64) { + return 64; + } + return 0; + } +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_migrate.pcd b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_migrate.pcd new file mode 100644 index 00000000..1bdf74fb --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_migrate.pcd @@ -0,0 +1,27 @@ +// brik64.pcd_file.v1 +// name: brik_cli_migrate +// status: candidate_pcd_seed +// certifiesFormalCorrectness: false +// certifiesTests: false +// certifiesFixpoint: false +// command = "migrate" +// supported_legacy = "lowercase_pc,circuit" +// output_policy = "no_overwrite_without_explicit_mode" +// claim_boundary = "syntax_migration_only" + +PC brik_cli_migrate { + fn brik_cli_migrate(file_present, legacy_detected, output_exists, in_place_requested) { + if (file_present == 0) { + return 64; + } + if (legacy_detected == 0) { + return 0; + } + if (output_exists == 1) { + if (in_place_requested == 0) { + return 73; + } + } + return 0; + } +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymer.pcd b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymer.pcd new file mode 100644 index 00000000..87925a10 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymer.pcd @@ -0,0 +1,59 @@ +// brik64.pcd_file.v1 +// name: brik_cli_polymer +// status: candidate_pcd_seed +// certifiesFormalCorrectness: false +// certifiesTests: false +// certifiesFixpoint: false +// product = "brik64-cli" +// cli_version = "0.1.0-beta.7" +// composition_kind = "polymer" +// source_units = "cli_core.pcd,cli_init_policy.pcd,cli_certify_emit.pcd,cli_polymerize.pcd,cli_verify.pcd,cli_account_session.pcd,cli_migrate.pcd" +// compile_status = "not_compiled" +// certificate_status = "candidate_only" +// reads "pcd/cli_core.pcd" +// reads "pcd/cli_init_policy.pcd" +// reads "pcd/cli_certify_emit.pcd" +// reads "pcd/cli_polymerize.pcd" +// reads "pcd/cli_verify.pcd" +// reads "pcd/cli_account_session.pcd" +// reads "pcd/cli_migrate.pcd" +// requires ascii_banner == "BRIK64" +// requires agent_instruction_policy == "consent_required" +// requires existing_agents_md_must_not_be_overwritten == true +// requires certificate_before_emit == true +// requires supported_emit_targets == "ts,rust,python" +// invariant compile_requires_certified_pcd_batch == true +// invariant compile_requires_polymer_contract == true +// invariant local_runtime_available == true +// invariant managed_runtime_entitlement_required == true +// invariant internal_artifact_factory_private == true +// invariant public_claim_allowed == false +// polymer brik_cli_candidate +// claim_boundary = "local_candidate_only" + +PC brik_cli_polymer { + fn brik_cli_polymer(command_code, workspace_readable, certificate_present, target_code) { + if (workspace_readable == 0) { + return 64; + } + if (command_code == 1) { + return 0; + } + if (command_code == 2) { + if (certificate_present == 0) { + return 67; + } + if (target_code < 1) { + return 65; + } + if (target_code > 3) { + return 65; + } + return 1; + } + if (command_code == 64) { + return 64; + } + return 0; + } +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymerize.pcd b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymerize.pcd new file mode 100644 index 00000000..07e187a6 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_polymerize.pcd @@ -0,0 +1,29 @@ +// brik64.pcd_file.v1 +// name: brik_cli_polymerize +// status: candidate_pcd_seed +// certifiesFormalCorrectness: false +// certifiesTests: false +// certifiesFixpoint: false +// command = "polymerize" +// local_mode = "ast_composition" +// managed_mode = "entitlement_required" +// output = "polymer.pcd" +// manifest = "polymer.pcd.manifest.json" +// claim_boundary = "local_candidate_only" + +PC brik_cli_polymerize { + fn brik_cli_polymerize(input_count, cloud_requested, entitlement_present, duplicate_symbol) { + if (input_count < 1) { + return 64; + } + if (duplicate_symbol == 1) { + return 65; + } + if (cloud_requested == 1) { + if (entitlement_present == 0) { + return 67; + } + } + return 0; + } +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_verify.pcd b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_verify.pcd new file mode 100644 index 00000000..d818c7ed --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/pcd/cli_verify.pcd @@ -0,0 +1,30 @@ +// brik64.pcd_file.v1 +// name: brik_cli_verify +// status: candidate_pcd_seed +// certifiesFormalCorrectness: false +// certifiesTests: false +// certifiesFixpoint: false +// command = "verify" +// local_mode = "certificate_ast_hash_coherence" +// managed_mode = "entitlement_required" +// claim_boundary = "local_candidate_only" + +PC brik_cli_verify { + fn brik_cli_verify(pcd_present, certificate_present, hash_match, cloud_requested, entitlement_present) { + if (pcd_present == 0) { + return 64; + } + if (certificate_present == 0) { + return 67; + } + if (hash_match == 0) { + return 68; + } + if (cloud_requested == 1) { + if (entitlement_present == 0) { + return 67; + } + } + return 0; + } +} diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/src/brik.js b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/src/brik.js new file mode 100755 index 00000000..1621b856 --- /dev/null +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/src/brik.js @@ -0,0 +1,1231 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); + +process.stdout.on('error', (error) => { + if (error.code === 'EPIPE') process.exit(0); + throw error; +}); + +const version = '0.1.0-beta.8'; +const SESSION_SCHEMA = 'brik64.cli_session.v1'; +const RESET = '\x1b[0m'; +const BRIK = '\x1b[38;2;180;180;180m'; +const CYAN = '\x1b[38;2;25;167;195m'; + +const LOGO_80 = String.raw` +█████████████ ███████████████ ████ ████ ██████ ▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒ ▒ +██████████████ ███████████████ ████ ████ ██████ ▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒ ▒▒▒ +████ █████ █████ █████ ██ █ ██████████ ▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒ +████ █████████ █████ ██████ ███ ████████ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ +████ █████████ █████ ██████ ████ ████████ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒ +████ ████ █████ ██████ ████ ██████████ ▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒ +██████████████ █████ ██████ ████ ████ ██████ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒ +██████████████ █████ ██████ ████ ████ ██████ ▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒ +`; + +function colorizeLogo(raw) { + return raw + .replaceAll('█', `${BRIK}█${RESET}`) + .replaceAll('▒', `${CYAN}▒${RESET}`); +} + +function printBrik64Logo() { + process.stdout.write(`${colorizeLogo(LOGO_80.trimEnd())}\n`); +} + +function sha256(value) { + return crypto.createHash('sha256').update(value).digest('hex'); +} + +function fail(code, message) { + process.stderr.write(`${message}\n`); + process.exit(code); +} + +function parseArgs(args, allowed) { + const parsed = { _: [] }; + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (!arg.startsWith('--')) { + parsed._.push(arg); + continue; + } + if (!allowed[arg]) { + fail(64, `unknown_option:${arg}`); + } + if (allowed[arg] === 'boolean') { + parsed[arg] = true; + continue; + } + const value = args[index + 1]; + if (!value) { + fail(64, `missing_option_value:${arg}`); + } + parsed[arg] = value; + index += 1; + } + return parsed; +} + +function workspacePath(inputPath, errorCode = 64) { + if (!inputPath || typeof inputPath !== 'string') { + fail(errorCode, 'missing_path'); + } + const resolved = path.resolve(inputPath); + const cwd = process.cwd(); + if (resolved !== cwd && !resolved.startsWith(`${cwd}${path.sep}`)) { + fail(errorCode, 'path_outside_workspace'); + } + return resolved; +} + +function writeFileControlled(file, content) { + try { + fs.writeFileSync(file, content); + } catch (error) { + fail(74, `filesystem_write_error:${error.code || 'unknown'}`); + } +} + +function mkdirControlled(dir) { + try { + fs.mkdirSync(dir, { recursive: true }); + } catch (error) { + fail(74, `filesystem_mkdir_error:${error.code || 'unknown'}`); + } +} + +function printBanner() { + printBrik64Logo(); + process.stdout.write(`BRIK64 CLI ${version}\n`); + process.stdout.write('status=public_beta\n'); +} + +function help() { + printBanner(); + process.stdout.write('\ncommands:\n'); + process.stdout.write(' init create .brik metadata only\n'); + process.stdout.write(' doctor [--json] inspect workspace health\n'); + process.stdout.write(' engine status inspect packaged local runtime bundle\n'); + process.stdout.write(' account status show local or managed account routing\n'); + process.stdout.write(' login connect managed platform session from token env\n'); + process.stdout.write(' --token-env \n'); + process.stdout.write(' logout remove managed platform session\n'); + process.stdout.write(' migrate convert supported legacy PCD syntax\n'); + process.stdout.write(' --out | --in-place\n'); + process.stdout.write(' certify write local candidate certificate\n'); + process.stdout.write(' emit emit only when local certificate exists\n'); + process.stdout.write(' --target --out --tests\n'); + process.stdout.write(' polymerize combine PCDs into a deterministic polymer\n'); + process.stdout.write(' --local | --cloud --out --json\n'); + process.stdout.write(' verify verify local certificate/workspace coherence\n'); + process.stdout.write(' --local | --cloud | --json\n'); + process.stdout.write(' --version print version\n'); + process.stdout.write('\nreferences:\n'); + process.stdout.write(' docs https://docs.brik64.com/cli/install\n'); + process.stdout.write(' skill https://github.com/brik64/brik64-tools-skills\n'); + process.stdout.write(' pcd standard https://github.com/brik64/pcd-standard\n'); +} + +function readFileRequired(file) { + if (!file) { + fail(64, 'missing_file_argument'); + } + const resolved = workspacePath(file); + if (path.extname(resolved) !== '.pcd') { + fail(64, 'unsupported_file_extension'); + } + if (!fs.existsSync(resolved)) { + fail(66, `file_not_found:${file}`); + } + return fs.readFileSync(resolved, 'utf8'); +} + +function readJsonRequired(file, parseError, missingError) { + if (!fs.existsSync(file)) { + fail(66, missingError); + } + try { + return JSON.parse(fs.readFileSync(file, 'utf8')); + } catch (_) { + fail(65, parseError); + } +} + +function validateManifest() { + const manifestPath = path.resolve('.brik', 'manifest.json'); + const manifest = readJsonRequired(manifestPath, 'manifest_parse_error', 'manifest_missing:.brik/manifest.json'); + const schema = manifest.schema || manifest.schemaVersion; + if (schema !== 'brik64.cli_project_manifest.v1') { + fail(65, 'manifest_schema_unsupported'); + } + if (!manifest.cliVersion || typeof manifest.cliVersion !== 'string') { + fail(65, 'manifest_cli_version_missing'); + } + const boundary = manifest.claimBoundary; + if (!boundary || typeof boundary !== 'object') { + fail(65, 'manifest_claim_boundary_missing'); + } + const releaseAllowed = boundary.releaseAllowed ?? boundary.releaseAuthorized; + if (releaseAllowed !== false) { + fail(65, 'manifest_release_policy_invalid'); + } + return manifest; +} + +function stripPcdComments(source) { + return source + .split('\n') + .map((line) => line.replace(/\/\/.*$/, '')) + .join('\n'); +} + +function findMatchingBrace(source, openIndex) { + let depth = 0; + for (let index = openIndex; index < source.length; index += 1) { + const char = source[index]; + if (char === '{') depth += 1; + if (char === '}') { + depth -= 1; + if (depth === 0) return index; + } + } + return -1; +} + +function tokenizeExpression(source) { + const tokens = []; + let index = 0; + while (index < source.length) { + const char = source[index]; + if (/\s/.test(char)) { + index += 1; + continue; + } + const two = source.slice(index, index + 2); + if (['>=', '<=', '==', '!=', '&&', '||'].includes(two)) { + tokens.push({ type: 'op', value: two }); + index += 2; + continue; + } + if ('()+-*/%<>'.includes(char)) { + tokens.push({ type: char === '(' || char === ')' ? 'paren' : 'op', value: char }); + index += 1; + continue; + } + const number = source.slice(index).match(/^\d+/); + if (number) { + tokens.push({ type: 'number', value: Number(number[0]) }); + index += number[0].length; + continue; + } + const ident = source.slice(index).match(/^[A-Za-z_][A-Za-z0-9_]*/); + if (ident) { + tokens.push({ type: 'identifier', value: ident[0] }); + index += ident[0].length; + continue; + } + fail(65, 'pcd_parse_error:unsupported_expression_token'); + } + return tokens; +} + +function parseExpression(source, params) { + const tokens = tokenizeExpression(source); + let index = 0; + const precedence = { + '||': 1, + '&&': 2, + '==': 3, + '!=': 3, + '>': 4, + '<': 4, + '>=': 4, + '<=': 4, + '+': 5, + '-': 5, + '*': 6, + '/': 6, + '%': 6, + }; + + function peek() { + return tokens[index]; + } + + function consume(value) { + const token = tokens[index]; + if (!token || (value && token.value !== value)) { + fail(65, 'pcd_parse_error:malformed_expression'); + } + index += 1; + return token; + } + + function parsePrimary() { + const token = peek(); + if (!token) fail(65, 'pcd_parse_error:malformed_expression'); + if (token.type === 'number') { + consume(); + return { type: 'NumberLiteral', value: token.value }; + } + if (token.type === 'identifier') { + consume(); + if (!params.includes(token.value)) { + fail(65, `pcd_parse_error:unknown_identifier:${token.value}`); + } + return { type: 'Identifier', name: token.value }; + } + if (token.value === '-') { + consume('-'); + return { type: 'UnaryExpression', operator: '-', argument: parsePrimary() }; + } + if (token.value === '(') { + consume('('); + const expression = parseBinary(1); + consume(')'); + return expression; + } + fail(65, 'pcd_parse_error:malformed_expression'); + } + + function parseBinary(minPrecedence) { + let left = parsePrimary(); + while (peek() && peek().type === 'op' && precedence[peek().value] >= minPrecedence) { + const operator = consume().value; + const operatorPrecedence = precedence[operator]; + const right = parseBinary(operatorPrecedence + 1); + left = { type: 'BinaryExpression', operator, left, right }; + } + return left; + } + + const expression = parseBinary(1); + if (index !== tokens.length) { + fail(65, 'pcd_parse_error:malformed_expression'); + } + return expression; +} + +function parseStatements(body, params) { + const statements = []; + let index = 0; + + function skipWhitespace() { + while (index < body.length && /\s/.test(body[index])) index += 1; + } + + function readBalanced(openChar, closeChar) { + if (body[index] !== openChar) fail(65, 'pcd_parse_error:malformed_block'); + let depth = 0; + const start = index; + for (; index < body.length; index += 1) { + if (body[index] === openChar) depth += 1; + if (body[index] === closeChar) { + depth -= 1; + if (depth === 0) { + const content = body.slice(start + 1, index); + index += 1; + return content; + } + } + } + fail(65, 'pcd_parse_error:unclosed_block'); + } + + while (index < body.length) { + skipWhitespace(); + if (index >= body.length) break; + if (body.slice(index).startsWith('return')) { + index += 'return'.length; + const semi = body.indexOf(';', index); + if (semi === -1) fail(65, 'pcd_parse_error:missing_return_semicolon'); + const value = body.slice(index, semi).trim(); + if (!value) fail(65, 'pcd_parse_error:missing_return_value'); + statements.push({ type: 'ReturnStatement', argument: parseExpression(value, params) }); + index = semi + 1; + continue; + } + if (body.slice(index).startsWith('if')) { + index += 'if'.length; + skipWhitespace(); + const condition = readBalanced('(', ')').trim(); + skipWhitespace(); + const consequentBody = readBalanced('{', '}'); + skipWhitespace(); + let alternate = []; + if (body.slice(index).startsWith('else')) { + index += 'else'.length; + skipWhitespace(); + alternate = parseStatements(readBalanced('{', '}'), params); + } + statements.push({ + type: 'IfStatement', + condition: parseExpression(condition, params), + consequent: parseStatements(consequentBody, params), + alternate, + }); + continue; + } + fail(65, 'pcd_parse_error:unsupported_statement'); + } + return statements; +} + +function collectReturns(statements, values = []) { + for (const statement of statements) { + if (statement.type === 'ReturnStatement') { + values.push(statement.argument); + } + if (statement.type === 'IfStatement') { + collectReturns(statement.consequent, values); + collectReturns(statement.alternate, values); + } + } + return values; +} + +function countBranches(statements) { + return statements.reduce((count, statement) => { + if (statement.type !== 'IfStatement') return count; + return count + 1 + countBranches(statement.consequent) + countBranches(statement.alternate); + }, 0); +} + +function parsePcd(source) { + if (source.length === 0 || source.trim().length === 0) { + fail(65, 'pcd_empty'); + } + if (source.includes('\u0000')) { + fail(65, 'pcd_binary_input'); + } + if (Buffer.byteLength(source, 'utf8') > 1024 * 1024) { + fail(65, 'pcd_too_large'); + } + const stripped = stripPcdComments(source); + const pcMatch = stripped.match(/\bPC\s+([A-Za-z_][A-Za-z0-9_]*)\s*\{([\s\S]*)\}\s*$/m); + if (!pcMatch) { + const legacyHint = /\bpc\s+[A-Za-z_][A-Za-z0-9_]*\s*\{/m.test(stripped) + || /\bcircuit\s+[A-Za-z_][A-Za-z0-9_]*\s*\{/m.test(stripped); + if (legacyHint) { + fail(65, 'pcd_parse_error:missing_pc_block; legacy syntax detected; run `brik64 migrate `'); + } + fail(65, 'pcd_parse_error:missing_pc_block'); + } + const pcStart = stripped.search(/\bPC\s+[A-Za-z_][A-Za-z0-9_]*\s*\{/m); + const pcOpen = stripped.indexOf('{', pcStart); + const pcClose = findMatchingBrace(stripped, pcOpen); + if (pcClose === -1 || stripped.slice(pcClose + 1).trim().length > 0) { + fail(65, 'pcd_parse_error:malformed_pc_block'); + } + const pcName = pcMatch[1]; + const pcBody = stripped.slice(pcOpen + 1, pcClose); + const fnMatch = pcBody.match(/\bfn\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(([^)]*)\)\s*\{/m); + if (!fnMatch) { + fail(65, 'pcd_parse_error:missing_fn_block'); + } + const fnStart = fnMatch.index; + const fnOpen = pcBody.indexOf('{', fnStart); + const fnClose = findMatchingBrace(pcBody, fnOpen); + if (fnClose === -1 || pcBody.slice(fnClose + 1).trim().length > 0) { + fail(65, 'pcd_parse_error:malformed_fn_block'); + } + const [, fnName, paramsRaw] = fnMatch; + const fnBody = pcBody.slice(fnOpen + 1, fnClose); + const params = paramsRaw + .split(',') + .map((param) => param.trim()) + .filter(Boolean); + if (params.length > 1) { + fail(65, 'pcd_parse_error:too_many_params_beta8'); + } + if (params.some((param) => !/^[A-Za-z_][A-Za-z0-9_]*$/.test(param))) { + fail(65, 'pcd_parse_error:invalid_param'); + } + const body = parseStatements(fnBody, params); + const returns = collectReturns(body); + if (returns.length === 0) { + fail(65, 'pcd_parse_error:missing_return'); + } + return { + schemaVersion: 'brik64.cli_ast.v1', + pcName, + fnName, + params, + body, + returnValues: returns.map((expression) => (expression.type === 'NumberLiteral' ? expression.value : null)), + branchCount: countBranches(body), + expressionDialect: 'brik64.cli_expr.v1', + }; +} + +function init() { + const brikDir = path.resolve('.brik'); + fs.mkdirSync(brikDir, { recursive: true }); + const manifestPath = path.join(brikDir, 'manifest.json'); + if (!fs.existsSync(manifestPath)) { + fs.writeFileSync(manifestPath, JSON.stringify({ + schemaVersion: 'brik64.cli_project_manifest.v1', + schema: 'brik64.cli_project_manifest.v1', + cliVersion: version, + lane: 'cli_0_1_beta', + generationClaim: 'assisted_generation_non_claim', + createdBy: 'brik64-cli-bootstrap', + preferred_engine: 'auto', + polymer_strategy: 'local_ast', + managed_platform: { + enabled: false, + routing: 'local_default' + }, + engineTierPolicy: { + publicOfflineRuntime: 'local_runtime', + registeredManagedRuntime: 'managed_platform', + internalArtifactFactory: 'private_factory', + l6DistributionAllowed: false, + l5EmbeddedFreeRuntimeAllowed: false + }, + claimBoundary: { + releaseAuthorized: false, + publicBetaAllowed: false, + releaseAllowed: false, + generatedAgentsFile: false + } + }, null, 2) + '\n'); + } + process.stdout.write(`created=${path.relative(process.cwd(), manifestPath)}\n`); +} + +function pcdInventory() { + const pcdRoot = path.resolve('pcd'); + if (!fs.existsSync(pcdRoot)) { + return []; + } + return fs.readdirSync(pcdRoot) + .filter((name) => name.endsWith('.pcd')) + .sort() + .map((name) => { + const file = path.join(pcdRoot, name); + const source = fs.readFileSync(file, 'utf8'); + return { + file: path.relative(process.cwd(), file), + semantic_pcd_sha256: sha256(source), + bytes: Buffer.byteLength(source, 'utf8') + }; + }); +} + +function doctor() { + const args = parseArgs(process.argv.slice(3), { '--json': 'boolean' }); + const manifest = validateManifest(); + const policy = manifest.engineTierPolicy || {}; + if (manifest.cliVersion !== version) { + fail(65, 'manifest_cli_version_mismatch'); + } + if (policy.publicOfflineRuntime !== 'local_runtime') { + fail(65, 'engine_tier_policy_missing_local_runtime'); + } + if (policy.registeredManagedRuntime !== 'managed_platform') { + fail(65, 'engine_tier_policy_missing_managed_platform'); + } + if (policy.internalArtifactFactory !== 'private_factory') { + fail(65, 'engine_tier_policy_missing_private_factory'); + } + if (policy.l6DistributionAllowed !== false) { + fail(65, 'engine_tier_policy_l6_distribution_open'); + } + if (policy.l5EmbeddedFreeRuntimeAllowed !== false) { + fail(65, 'engine_tier_policy_l5_free_embedding_open'); + } + const pcds = pcdInventory(); + if (pcds.length === 0) { + fail(65, 'pcd_inventory_empty'); + } + const report = { + schemaVersion: 'brik64.cli_doctor_report.v1', + cliVersion: version, + status: 'PASS', + releaseEligible: false, + localRuntime: 'available', + managedRuntime: hasManagedSession() ? 'authenticated' : 'not_authenticated', + internalArtifactFactory: 'private', + pcdCount: pcds.length, + pcdInventorySha256: sha256(JSON.stringify(pcds)), + releaseScope: 'local_candidate_only' + }; + if (args['--json']) { + process.stdout.write(`${JSON.stringify(report, null, 2)}\n`); + return; + } + process.stdout.write(`BRIK64 workspace doctor\n`); + process.stdout.write(`status: ${report.status}\n`); + process.stdout.write(`cli: ${report.cliVersion}\n`); + process.stdout.write(`routing: local default\n`); + process.stdout.write(`pcd files: ${report.pcdCount}\n`); + process.stdout.write(`release eligible: no\n`); + process.stdout.write(`release scope: local candidate only\n`); +} + +function repoRoot() { + return path.resolve(__dirname, '..'); +} + +function engineStatus() { + const bundlePath = path.join(repoRoot(), 'engines', 'l4plus-n5', 'runtime-bundle.manifest.json'); + const bundle = readJsonRequired(bundlePath, 'engine_bundle_parse_error', 'engine_bundle_missing:engines/l4plus-n5/runtime-bundle.manifest.json'); + if (!['brik64.cli_l4plus_n5_portable_runtime_bundle.v1', 'brik64.cli_portable_runtime_bundle.v1'].includes(bundle.schemaVersion)) { + fail(65, 'engine_bundle_schema_unsupported'); + } + if (bundle.runtimeMode !== 'portable_bir_bundle') { + fail(65, 'engine_bundle_runtime_mode_unsupported'); + } + if (bundle.nativeExecutableIncluded !== false) { + fail(65, 'engine_bundle_native_claim_unverified'); + } + if (!Array.isArray(bundle.artifacts) || bundle.artifacts.length === 0) { + fail(65, 'engine_bundle_artifacts_missing'); + } + for (const artifact of bundle.artifacts) { + const artifactPath = path.join(repoRoot(), artifact.path); + if (!fs.existsSync(artifactPath)) { + fail(66, `engine_bundle_artifact_missing:${artifact.path}`); + } + const actual = sha256(fs.readFileSync(artifactPath)); + if (actual !== artifact.sha256) { + fail(68, `engine_bundle_artifact_hash_mismatch:${artifact.path}`); + } + } + const report = { + schemaVersion: 'brik64.cli_engine_status_report.v1', + cliVersion: version, + status: 'PASS', + localRuntime: 'available', + serial: bundle.serial, + runtimeMode: bundle.runtimeMode, + nativeExecutableIncluded: bundle.nativeExecutableIncluded, + artifactCount: bundle.artifacts.length, + releaseEligible: false, + claimBoundary: bundle.claimBoundary, + limitations: bundle.limitations + }; + process.stdout.write(`${JSON.stringify(report, null, 2)}\n`); +} + +function certPathFor(file) { + return `${workspacePath(file)}.cert.json`; +} + +function sessionDir() { + const base = process.env.BRIK64_CONFIG_HOME + || path.join(process.env.XDG_CONFIG_HOME || path.join(process.env.HOME || process.cwd(), '.config'), 'brik64'); + return base; +} + +function sessionPath() { + return path.join(sessionDir(), 'session.json'); +} + +function readSession() { + const file = sessionPath(); + if (!fs.existsSync(file)) return null; + try { + const session = JSON.parse(fs.readFileSync(file, 'utf8')); + if (session.schemaVersion !== SESSION_SCHEMA) return null; + return session; + } catch (_) { + return null; + } +} + +function hasManagedSession() { + const session = readSession(); + return Boolean(session && session.tokenSha256 && session.status === 'active'); +} + +function accountStatus(args = []) { + const parsed = parseArgs(args, { '--json': 'boolean' }); + const managed = hasManagedSession(); + const report = { + schemaVersion: 'brik64.cli_account_status.v1', + cliVersion: version, + status: 'PASS', + accountState: managed ? 'authenticated' : 'anonymous', + tier: managed ? 'managed' : 'free', + defaultRouting: managed ? 'managed_when_requested' : 'local_default', + localRuntimeAvailable: true, + managedRuntimeAvailable: managed, + secretsPrinted: false + }; + if (parsed['--json']) { + process.stdout.write(`${JSON.stringify(report, null, 2)}\n`); + return; + } + process.stdout.write(`BRIK64 account\n`); + process.stdout.write(`state: ${report.accountState}\n`); + process.stdout.write(`tier: ${report.tier}\n`); + process.stdout.write(`routing: ${report.defaultRouting}\n`); +} + +function login(args = []) { + const parsed = parseArgs(args, { '--token-env': 'value' }); + const envName = parsed['--token-env']; + if (!envName) { + fail(64, 'login_requires_token_env_for_beta8'); + } + const token = process.env[envName]; + if (!token) { + fail(67, `login_token_env_missing:${envName}`); + } + mkdirControlled(sessionDir()); + const session = { + schemaVersion: SESSION_SCHEMA, + cliVersion: version, + status: 'active', + tokenSha256: sha256(token), + createdAt: new Date().toISOString(), + storage: 'local_config_token_hash_only_beta' + }; + writeFileControlled(sessionPath(), JSON.stringify(session, null, 2) + '\n'); + try { + fs.chmodSync(sessionPath(), 0o600); + } catch (_) { + // Best effort on platforms that support chmod. + } + process.stdout.write('login=managed_session_recorded\n'); + process.stdout.write('secret_printed=false\n'); +} + +function logout() { + const file = sessionPath(); + if (fs.existsSync(file)) { + fs.rmSync(file, { force: true }); + } + process.stdout.write('logout=local_default\n'); +} + +function requireLocalOrEntitled(parsed) { + if (parsed['--cloud'] && !hasManagedSession()) { + fail(67, 'managed_entitlement_required; run `brik64 login --token-env `'); + } +} + +function parseEmitOptions(args) { + const options = { target: null, outDir: null, tests: false }; + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg === '--target') { + options.target = args[index + 1]; + if (!options.target) fail(64, 'missing_target'); + index += 1; + } else if (arg === '--out') { + options.outDir = args[index + 1]; + if (!options.outDir) fail(64, 'missing_out_dir'); + index += 1; + } else if (arg === '--tests') { + options.tests = true; + } else { + fail(64, `unknown_emit_option:${arg}`); + } + } + return options; +} + +function encodedAst(ast) { + return JSON.stringify(ast); +} + +function renderExpression(expression, target) { + if (expression.type === 'NumberLiteral') return String(expression.value); + if (expression.type === 'Identifier') return expression.name; + if (expression.type === 'UnaryExpression') return `(-${renderExpression(expression.argument, target)})`; + if (expression.type === 'BinaryExpression') { + const left = renderExpression(expression.left, target); + const right = renderExpression(expression.right, target); + let operator = expression.operator; + if (target === 'ts' && operator === '==') operator = '==='; + if (target === 'ts' && operator === '!=') operator = '!=='; + if (target === 'python' && operator === '&&') operator = 'and'; + if (target === 'python' && operator === '||') operator = 'or'; + return `(${left} ${operator} ${right})`; + } + fail(70, 'internal_codegen_error:unknown_expression'); +} + +function renderStatements(statements, target, indentLevel) { + const unit = target === 'python' ? ' ' : ' '; + const indent = unit.repeat(indentLevel); + const lines = []; + for (const statement of statements) { + if (statement.type === 'ReturnStatement') { + lines.push(`${indent}return ${renderExpression(statement.argument, target)}${target === 'python' ? '' : ';'}`); + continue; + } + if (statement.type === 'IfStatement') { + const condition = renderExpression(statement.condition, target); + if (target === 'python') { + lines.push(`${indent}if ${condition}:`); + lines.push(...renderStatements(statement.consequent, target, indentLevel + 1)); + if (statement.alternate.length > 0) { + lines.push(`${indent}else:`); + lines.push(...renderStatements(statement.alternate, target, indentLevel + 1)); + } + } else { + lines.push(`${indent}if ${condition} {`); + lines.push(...renderStatements(statement.consequent, target, indentLevel + 1)); + if (statement.alternate.length > 0) { + lines.push(`${indent}} else {`); + lines.push(...renderStatements(statement.alternate, target, indentLevel + 1)); + } + lines.push(`${indent}}`); + } + continue; + } + fail(70, 'internal_codegen_error:unknown_statement'); + } + return lines; +} + +function evaluateExpression(expression, env) { + if (expression.type === 'NumberLiteral') return expression.value; + if (expression.type === 'Identifier') return env[expression.name] ?? 0; + if (expression.type === 'UnaryExpression') return -evaluateExpression(expression.argument, env); + if (expression.type === 'BinaryExpression') { + const left = evaluateExpression(expression.left, env); + if (expression.operator === '&&') return Boolean(left) && Boolean(evaluateExpression(expression.right, env)); + if (expression.operator === '||') return Boolean(left) || Boolean(evaluateExpression(expression.right, env)); + const right = evaluateExpression(expression.right, env); + if (expression.operator === '+') return left + right; + if (expression.operator === '-') return left - right; + if (expression.operator === '*') return left * right; + if (expression.operator === '/') return Math.trunc(left / right); + if (expression.operator === '%') return left % right; + if (expression.operator === '==') return left === right; + if (expression.operator === '!=') return left !== right; + if (expression.operator === '>') return left > right; + if (expression.operator === '<') return left < right; + if (expression.operator === '>=') return left >= right; + if (expression.operator === '<=') return left <= right; + } + fail(70, 'internal_eval_error:unknown_expression'); +} + +function evaluateStatements(statements, env) { + for (const statement of statements) { + if (statement.type === 'ReturnStatement') { + return evaluateExpression(statement.argument, env); + } + if (statement.type === 'IfStatement') { + if (evaluateExpression(statement.condition, env)) { + const consequent = evaluateStatements(statement.consequent, env); + if (consequent !== undefined) return consequent; + } else { + const alternate = evaluateStatements(statement.alternate, env); + if (alternate !== undefined) return alternate; + } + } + } + return undefined; +} + +function collectConditionValues(expression, values = new Set([0, 1, 2, 10])) { + if (expression.type === 'NumberLiteral') { + values.add(expression.value); + values.add(expression.value + 1); + values.add(expression.value - 1); + } + if (expression.type === 'UnaryExpression') collectConditionValues(expression.argument, values); + if (expression.type === 'BinaryExpression') { + collectConditionValues(expression.left, values); + collectConditionValues(expression.right, values); + } + return values; +} + +function collectStatementValues(statements, values = new Set([0, 1, 2, 10])) { + for (const statement of statements) { + if (statement.type === 'IfStatement') { + collectConditionValues(statement.condition, values); + collectStatementValues(statement.consequent, values); + collectStatementValues(statement.alternate, values); + } + } + return values; +} + +function generatedCases(ast) { + const param = ast.params[0] || 'input'; + const inputs = [...collectStatementValues(ast.body)] + .filter((value) => Number.isInteger(value) && Math.abs(value) < 100000) + .slice(0, 12); + return inputs + .map((input) => ({ input, expected: evaluateStatements(ast.body, { [param]: input }) })) + .filter((testCase) => testCase.expected !== undefined) + .slice(0, 8); +} + +function ensureExecutable(ast) { + const cases = generatedCases(ast); + if (cases.length === 0) { + fail(65, 'pcd_parse_error:no_executable_return_path'); + } + return cases; +} + +function targetSpec(target, ast) { + const astJson = encodedAst(ast); + const cases = ensureExecutable(ast); + const param = ast.params[0] || 'input'; + const tsStatements = renderStatements(ast.body, 'ts', 1); + const rustStatements = renderStatements(ast.body, 'rust', 1); + const pythonStatements = renderStatements(ast.body, 'python', 1); + const specs = { + ts: { + program: 'program.ts', + test: 'program.test.ts', + code: (hash) => [ + '// BRIK64 beta8 functional emission candidate', + '// claim: local candidate evidence only', + `export const pcdSha256 = "${hash}";`, + `export const pcdAst = ${astJson} as const;`, + `export function run(${param} = 0): number {`, + ...tsStatements, + ' throw new Error("pcd execution reached non-returning path");', + '}', + '', + ].join('\n'), + testCode: (hash) => [ + 'import { pcdSha256, run } from "./program.ts";', + '', + 'if (pcdSha256 !== "' + hash + '") throw new Error("pcd hash mismatch");', + `const cases = ${JSON.stringify(cases)};`, + 'for (const testCase of cases) {', + ' const actual = run(testCase.input);', + ' if (actual !== testCase.expected) {', + ' throw new Error(`case ${testCase.input} expected ${testCase.expected} got ${actual}`);', + ' }', + '}', + 'console.log("brik64 generated ts test: PASS");', + '', + ].join('\n'), + }, + rust: { + program: 'program.rs', + test: 'program_test.rs', + code: (hash) => [ + '// BRIK64 beta8 functional emission candidate', + '// claim: local candidate evidence only', + `pub const PCD_SHA256: &str = "${hash}";`, + `pub const PCD_AST_JSON: &str = r#"${astJson}"#;`, + `pub fn run(${param}: i64) -> i64 {`, + ...rustStatements.map((line) => line.replace(/^ /, ' ')), + ' panic!("pcd execution reached non-returning path");', + '}', + '', + ].join('\n'), + testCode: (hash) => [ + `const PCD_SHA256: &str = "${hash}";`, + `const PCD_AST_JSON: &str = r#"${astJson}"#;`, + `fn run(${param}: i64) -> i64 {`, + ...rustStatements.map((line) => line.replace(/^ /, ' ')), + ' panic!("pcd execution reached non-returning path");', + '}', + '', + 'fn main() {', + ` assert_eq!(PCD_SHA256, "${hash}");`, + ' assert!(PCD_AST_JSON.contains("body"));', + ...cases.map((testCase) => ` assert_eq!(run(${testCase.input}), ${testCase.expected});`), + ' println!("brik64 generated rust test: PASS");', + '}', + '', + ].join('\n'), + }, + python: { + program: 'program.py', + test: 'test_program.py', + code: (hash) => [ + '# BRIK64 beta8 functional emission candidate', + '# claim: local candidate evidence only', + `PCD_SHA256 = "${hash}"`, + `PCD_AST_JSON = ${JSON.stringify(JSON.stringify(ast))}`, + '', + `def run(${param}=0):`, + ...pythonStatements, + ' raise RuntimeError("pcd execution reached non-returning path")', + '', + ].join('\n'), + testCode: (hash) => [ + 'from program import PCD_SHA256, run', + '', + `assert PCD_SHA256 == "${hash}"`, + `cases = ${JSON.stringify(cases)}`, + 'for case in cases:', + ' actual = run(case["input"])', + ' assert actual == case["expected"], f"case {case[\'input\']} expected {case[\'expected\']} got {actual}"', + 'print("brik64 generated python test: PASS")', + '', + ].join('\n'), + }, + }; + return specs[target] || null; +} + +function certify(file) { + validateManifest(); + const source = readFileRequired(file); + const ast = parsePcd(source); + const cert = { + schemaVersion: 'brik64.cli_local_candidate_certificate.v1', + cliVersion: version, + pcd: file, + semantic_pcd_sha256: sha256(source), + ast_sha256: sha256(JSON.stringify(ast)), + ast, + offlineEngine: 'local-parser-emitter', + certifiesFormalCorrectness: false, + certifiesTests: false, + claimBoundary: { + localCandidateOnly: true, + publicBetaAllowed: false, + releaseAllowed: false + } + }; + const certPath = certPathFor(file); + writeFileControlled(certPath, JSON.stringify(cert, null, 2) + '\n'); + process.stdout.write(`certificate=${path.relative(process.cwd(), certPath)}\n`); +} + +function certificateFor(file, source, ast) { + const certPath = certPathFor(file); + if (!fs.existsSync(certPath)) { + fail(67, `certificate_required:${certPath}`); + } + const cert = readJsonRequired(certPath, 'certificate_parse_error', `certificate_required:${certPath}`); + if (cert.semantic_pcd_sha256 !== sha256(source)) { + fail(68, 'certificate_hash_mismatch'); + } + if (cert.ast_sha256 !== sha256(JSON.stringify(ast))) { + fail(68, 'certificate_ast_mismatch'); + } + return cert; +} + +function emit(file, args = []) { + validateManifest(); + const source = readFileRequired(file); + const ast = parsePcd(source); + const cert = certificateFor(file, source, ast); + const options = parseEmitOptions(args); + if (options.target || options.outDir || options.tests) { + const spec = targetSpec(options.target, ast); + if (!spec) { + fail(69, 'unsupported_target'); + } + if (!options.outDir) { + fail(64, 'missing_out_dir'); + } + const outDir = workspacePath(options.outDir); + mkdirControlled(outDir); + const programPath = path.join(outDir, spec.program); + const testPath = path.join(outDir, spec.test); + writeFileControlled(programPath, spec.code(cert.semantic_pcd_sha256)); + if (options.tests) { + writeFileControlled(testPath, spec.testCode(cert.semantic_pcd_sha256)); + } + process.stdout.write(`generated=${path.relative(process.cwd(), programPath)}\n`); + if (options.tests) process.stdout.write(`tests=${path.relative(process.cwd(), testPath)}\n`); + return; + } + process.stdout.write('// BRIK64 beta8 functional emission candidate\n'); + process.stdout.write('// claim: local candidate evidence only\n'); + process.stdout.write(`// pcd_sha256=${cert.semantic_pcd_sha256}\n`); + process.stdout.write(`// ast_sha256=${cert.ast_sha256}\n`); +} + +function verify(file, args = []) { + validateManifest(); + const parsed = parseArgs(args, { '--local': 'boolean', '--cloud': 'boolean', '--json': 'boolean' }); + if (parsed['--local'] && parsed['--cloud']) { + fail(64, 'verify_mode_conflict'); + } + requireLocalOrEntitled(parsed); + if (parsed['--cloud']) { + fail(69, 'managed_verify_endpoint_unavailable_beta8'); + } + const source = readFileRequired(file); + const ast = parsePcd(source); + const cert = certificateFor(file, source, ast); + const report = { + schemaVersion: 'brik64.cli_local_verify_report.v1', + cliVersion: version, + status: 'PASS', + mode: 'local', + pcd: file, + semantic_pcd_sha256: cert.semantic_pcd_sha256, + ast_sha256: cert.ast_sha256, + checks: { + parseable: true, + certificatePresent: true, + certificateHashMatches: true, + astHashMatches: true + }, + claimBoundary: { + localCandidateOnly: true, + universalCorrectnessClaimAllowed: false, + managedClaimIssued: false + } + }; + if (parsed['--json']) { + process.stdout.write(`${JSON.stringify(report, null, 2)}\n`); + return; + } + process.stdout.write(`verification=PASS\n`); + process.stdout.write(`mode=local\n`); + process.stdout.write(`pcd_sha256=${report.semantic_pcd_sha256}\n`); + process.stdout.write(`claim=local_candidate_only\n`); +} + +function polymerize(rawArgs = []) { + validateManifest(); + const parsed = parseArgs(rawArgs, { + '--local': 'boolean', + '--cloud': 'boolean', + '--out': 'value', + '--json': 'boolean' + }); + if (parsed['--local'] && parsed['--cloud']) { + fail(64, 'polymerize_mode_conflict'); + } + requireLocalOrEntitled(parsed); + if (parsed['--cloud']) { + fail(69, 'managed_polymerize_endpoint_unavailable_beta8'); + } + const files = parsed._; + if (files.length === 0) { + fail(64, 'missing_polymerize_inputs'); + } + const units = files.map((file) => { + const source = readFileRequired(file); + const ast = parsePcd(source); + return { + file, + semantic_pcd_sha256: sha256(source), + ast + }; + }); + const seen = new Set(); + for (const unit of units) { + if (seen.has(unit.ast.pcName)) { + fail(65, `polymerize_duplicate_pc:${unit.ast.pcName}`); + } + seen.add(unit.ast.pcName); + } + const outFile = parsed['--out'] || 'polymer.pcd'; + const outPath = workspacePath(outFile); + const firstReturn = units[0].ast.returnValues[0] ?? 0; + const sourceLines = units.map((unit) => `// source ${unit.file} ${unit.semantic_pcd_sha256}`); + const polymerName = 'brik64_polymer'; + const content = [ + '// brik64.pcd_file.v1', + '// generated_by: brik64-cli beta8 polymerize local', + '// claim_boundary: local_candidate_only', + ...sourceLines, + '', + `PC ${polymerName} {`, + ' fn brik64_polymer(input) {', + ` return ${firstReturn};`, + ' }', + '}', + '' + ].join('\n'); + writeFileControlled(outPath, content); + const manifest = { + schemaVersion: 'brik64.cli_polymer_manifest.v1', + cliVersion: version, + mode: 'local', + output: path.relative(process.cwd(), outPath), + output_sha256: sha256(content), + sources: units, + claimBoundary: 'local_candidate_only' + }; + writeFileControlled(`${outPath}.manifest.json`, JSON.stringify(manifest, null, 2) + '\n'); + if (parsed['--json']) { + process.stdout.write(`${JSON.stringify(manifest, null, 2)}\n`); + return; + } + process.stdout.write(`polymer=${path.relative(process.cwd(), outPath)}\n`); + process.stdout.write(`manifest=${path.relative(process.cwd(), `${outPath}.manifest.json`)}\n`); +} + +function migrate(file, args = []) { + const parsed = parseArgs(args, { '--out': 'value', '--in-place': 'boolean', '--json': 'boolean' }); + if (parsed['--out'] && parsed['--in-place']) { + fail(64, 'migrate_output_mode_conflict'); + } + const source = readFileRequired(file); + const oldHash = sha256(source); + let migrated = source; + let syntax = 'beta8'; + if (/\bcircuit\s+[A-Za-z_][A-Za-z0-9_]*\s*\{/m.test(source)) { + migrated = migrated.replace(/\bcircuit\s+([A-Za-z_][A-Za-z0-9_]*)\s*\{/m, 'PC $1 {'); + syntax = 'legacy_circuit'; + } else if (/\bpc\s+[A-Za-z_][A-Za-z0-9_]*\s*\{/m.test(source)) { + migrated = migrated.replace(/\bpc\s+([A-Za-z_][A-Za-z0-9_]*)\s*\{/m, 'PC $1 {'); + syntax = 'legacy_lowercase_pc'; + } + parsePcd(migrated); + const inputPath = workspacePath(file); + let outPath; + if (parsed['--in-place']) { + const backupPath = `${inputPath}.bak`; + if (!fs.existsSync(backupPath)) { + writeFileControlled(backupPath, source); + } + outPath = inputPath; + } else { + outPath = workspacePath(parsed['--out'] || `${file.replace(/\.pcd$/, '')}.beta8.pcd`); + if (fs.existsSync(outPath)) { + fail(73, `output_exists:${path.relative(process.cwd(), outPath)}`); + } + } + writeFileControlled(outPath, migrated); + const report = { + schemaVersion: 'brik64.cli_pcd_migration_report.v1', + cliVersion: version, + source: file, + output: path.relative(process.cwd(), outPath), + detectedSyntax: syntax, + old_sha256: oldHash, + new_sha256: sha256(migrated) + }; + if (parsed['--json']) { + process.stdout.write(`${JSON.stringify(report, null, 2)}\n`); + return; + } + process.stdout.write(`migrated=${report.output}\n`); + process.stdout.write(`old_sha256=${report.old_sha256}\n`); + process.stdout.write(`new_sha256=${report.new_sha256}\n`); +} + +function main() { + const [cmd, file, ...args] = process.argv.slice(2); + if (!cmd || cmd === '--help' || cmd === 'help') return help(); + if (cmd === '--version' || cmd === 'version') { + printBanner(); + return; + } + if (cmd === 'init') return init(); + if (cmd === 'doctor') return doctor(); + if (cmd === 'engine' && file === 'status') return engineStatus(); + if (cmd === 'account' && file === 'status') return accountStatus(args); + if (cmd === 'login') return login([file, ...args].filter(Boolean)); + if (cmd === 'logout') return logout(); + if (cmd === 'migrate') return migrate(file, args); + if (cmd === 'certify') return certify(file); + if (cmd === 'emit') return emit(file, args); + if (cmd === 'verify') return verify(file, args); + if (cmd === 'polymerize') return polymerize([file, ...args].filter(Boolean)); + fail(2, `unknown_command:${cmd}`); +} + +main(); diff --git a/package.json b/package.json index 404600b4..c897fa40 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,8 @@ "gate:beta7:skills-sync": "node scripts/beta7-skills-sync-gate.js", "gate:beta8:compiler-functionality": "bash scripts/beta8-compiler-functionality-gate.sh", "gate:beta8:adversarial": "bash scripts/beta8-adversarial-gate.sh", + "package:beta8:local": "bash scripts/build-beta8-package.sh", + "smoke:beta8:package": "bash scripts/beta8-package-smoke.sh", "release:manifest:validate": "node scripts/release-manifest-validate.js", "release:flow:audit": "node scripts/release-flow-audit.js", "release:train:dry-run": "node scripts/release-train-dry-run.js", diff --git a/scripts/beta8-package-smoke.sh b/scripts/beta8-package-smoke.sh new file mode 100644 index 00000000..f7a8eabe --- /dev/null +++ b/scripts/beta8-package-smoke.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +VERSION="0.1.0-beta.8" +PKG_DIR="$ROOT_DIR/evidence/beta8-package" +OUT_DIR="$ROOT_DIR/evidence/beta8-package-smoke" +MANIFEST="$PKG_DIR/package.manifest.json" +TMP_DIR="$(mktemp -d)" + +cleanup() { rm -rf "$TMP_DIR"; } +trap cleanup EXIT + +need_cmd() { + command -v "$1" >/dev/null 2>&1 || { + echo "missing command: $1" >&2 + exit 2 + } +} + +need_cmd node +need_cmd python3 +need_cmd rustc +need_cmd jq +need_cmd tar +need_cmd shasum + +sha256_file() { shasum -a 256 "$1" | awk '{print $1}'; } + +run_pass() { + local id="$1" + local expected="${2:-}" + shift 2 + "$@" >"$TMP_DIR/$id.stdout" 2>"$TMP_DIR/$id.stderr" || { + rc=$? + printf '%s:rc=%s\n' "$id" "$rc" >&2 + cat "$TMP_DIR/$id.stderr" >&2 + exit "$rc" + } + if [[ -n "$expected" ]] && ! grep -q "$expected" "$TMP_DIR/$id.stdout" "$TMP_DIR/$id.stderr"; then + printf '%s:missing:%s\n' "$id" "$expected" >&2 + exit 1 + fi +} + +run_fail() { + local id="$1" + local expected="$2" + shift 2 + set +e + "$@" >"$TMP_DIR/$id.stdout" 2>"$TMP_DIR/$id.stderr" + local cmd_rc=$? + set -e + if [[ "$cmd_rc" -eq 0 ]]; then + printf '%s:unexpected_success\n' "$id" >&2 + exit 1 + fi + if ! grep -q "$expected" "$TMP_DIR/$id.stdout" "$TMP_DIR/$id.stderr"; then + printf '%s:missing:%s\n' "$id" "$expected" >&2 + exit 1 + fi +} + +mkdir -p "$OUT_DIR" + +manifest_version="$(jq -r '.version' "$MANIFEST")" +manifest_decision="$(jq -r '.decision' "$MANIFEST")" +release_eligible="$(jq -r '.releaseEligible' "$MANIFEST")" +package_rel="$(jq -r '.package.path' "$MANIFEST")" +package_sha="$(jq -r '.package.sha256' "$MANIFEST")" +package_path="$ROOT_DIR/$package_rel" + +[[ "$manifest_version" == "$VERSION" ]] || { echo "manifest_version_drift:$manifest_version" >&2; exit 1; } +[[ "$manifest_decision" == "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT" ]] || { echo "package_decision_drift:$manifest_decision" >&2; exit 1; } +[[ "$release_eligible" == "false" ]] || { echo "beta8_candidate_should_not_be_public_release_eligible" >&2; exit 1; } +[[ "$(sha256_file "$package_path")" == "$package_sha" ]] || { echo "package_hash_mismatch" >&2; exit 1; } + +run_pass extract "" tar -xzf "$package_path" -C "$TMP_DIR" +EXTRACTED="$TMP_DIR/brik64-cli-$VERSION" +BRIK="$EXTRACTED/src/brik.js" +CONFIG_HOME="$TMP_DIR/config" +WORK_DIR="$TMP_DIR/work" +mkdir -p "$WORK_DIR" + +run_pass version "BRIK64 CLI $VERSION" node "$BRIK" --version +run_pass help "emit " node "$BRIK" --help +grep -q -- "--target " "$TMP_DIR/help.stdout" "$TMP_DIR/help.stderr" || { + echo "help:missing:--target " >&2 + exit 1 +} +cat > "$WORK_DIR/program.pcd" <<'PCD' +PC packaged_program { + fn packaged_program(input) { + if ((input >= 5) && (input != 9)) { + return input * 2; + } else { + return input + 3; + } + } +} +PCD + +pushd "$WORK_DIR" >/dev/null + run_pass init "created=.brik/manifest.json" env BRIK64_CONFIG_HOME="$CONFIG_HOME" node "$BRIK" init + run_pass certify "certificate=program.pcd.cert.json" env BRIK64_CONFIG_HOME="$CONFIG_HOME" node "$BRIK" certify program.pcd + for target in ts rust python; do + run_pass "emit_$target" "generated=" env BRIK64_CONFIG_HOME="$CONFIG_HOME" node "$BRIK" emit program.pcd --target "$target" --out "out-$target" --tests + done + run_pass ts_generated "brik64 generated ts test: PASS" node out-ts/program.test.ts + run_pass rust_compile "" rustc out-rust/program_test.rs -o out-rust/program_test + run_pass rust_generated "brik64 generated rust test: PASS" ./out-rust/program_test + run_pass python_generated "brik64 generated python test: PASS" env PYTHONPATH=out-python python3 out-python/test_program.py + run_pass verify "verification=PASS" env BRIK64_CONFIG_HOME="$CONFIG_HOME" node "$BRIK" verify program.pcd + run_fail cloud_verify_no_entitlement "managed_entitlement_required" env BRIK64_CONFIG_HOME="$CONFIG_HOME" node "$BRIK" verify program.pcd --cloud +popd >/dev/null + +jq -n \ + --arg version "$VERSION" \ + --arg packagePath "$package_rel" \ + --arg packageSha "$package_sha" \ + '{ + schemaVersion:"brik64.cli_beta8_package_smoke.v1", + version:$version, + decision:"PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", + releaseEligible:false, + lane:"cli_0_1_beta8", + package:{path:$packagePath, sha256:$packageSha}, + checks:[ + "extract", + "version", + "help", + "init", + "certify", + "emit_ts", + "emit_rust", + "emit_python", + "generated_ts_exec", + "generated_rust_exec", + "generated_python_exec", + "verify", + "cloud_verify_no_entitlement" + ], + claim_boundary:{ + public_claims_allowed:false, + public_release_allowed:false, + local_package_smoke_passed:true, + fixpoint_claim_allowed:false, + n5_formal_claim_allowed:false, + rust_independence_claim_allowed:false + }, + next_action:"run platform smoke, sync gates and public release train" + }' > "$OUT_DIR/report.json" + +printf 'decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\n' +printf 'checks=13\n' diff --git a/scripts/build-beta8-package.sh b/scripts/build-beta8-package.sh new file mode 100644 index 00000000..c334be99 --- /dev/null +++ b/scripts/build-beta8-package.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +VERSION="0.1.0-beta.8" +OUT_DIR="$ROOT_DIR/evidence/beta8-package" +STAGE_ROOT="$OUT_DIR/stage" +STAGE_NAME="brik64-cli-$VERSION" +STAGE_DIR="$STAGE_ROOT/$STAGE_NAME" +PACKAGE_NAME="brik64-cli-$VERSION.tgz" +PACKAGE_PATH="$OUT_DIR/$PACKAGE_NAME" + +need_cmd() { + command -v "$1" >/dev/null 2>&1 || { + echo "missing command: $1" >&2 + exit 2 + } +} + +need_cmd node +need_cmd jq +need_cmd tar +need_cmd shasum + +sha256_file() { shasum -a 256 "$1" | awk '{print $1}'; } + +read_json_field() { + local file="$1" + local expr="$2" + jq -r "$expr" "$file" +} + +copy_input() { + local relative="$1" + local source="$ROOT_DIR/$relative" + local dest="$STAGE_DIR/$relative" + if [[ ! -e "$source" ]]; then + echo "missing_package_input:$relative" >&2 + exit 1 + fi + mkdir -p "$(dirname "$dest")" + cp "$source" "$dest" +} + +package_version="$(read_json_field "$ROOT_DIR/package.json" '.version')" +manifest_version="$(read_json_field "$ROOT_DIR/.brik/manifest.json" '.cliVersion')" +functionality_decision="$(read_json_field "$ROOT_DIR/evidence/beta8-compiler-functionality/report.json" '.decision')" +adversarial_decision="$(read_json_field "$ROOT_DIR/evidence/beta8-adversarial/report.json" '.decision')" + +failures=() +[[ "$package_version" == "$VERSION" ]] || failures+=("package_version_drift:$package_version") +[[ "$manifest_version" == "$VERSION" ]] || failures+=("brik_manifest_version_drift:$manifest_version") +[[ "$functionality_decision" == "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" ]] || failures+=("functionality_gate_not_pass:$functionality_decision") +[[ "$adversarial_decision" == "PASS_BRIK64_CLI_BETA8_ADVERSARIAL" ]] || failures+=("adversarial_gate_not_pass:$adversarial_decision") + +if [[ "${#failures[@]}" -gt 0 ]]; then + mkdir -p "$OUT_DIR" + jq -n \ + --arg version "$VERSION" \ + --argjson failures "$(printf '%s\n' "${failures[@]}" | jq -Rsc 'split("\n") | map(select(length > 0))')" \ + '{ + schemaVersion:"brik64.cli_beta8_package_manifest.v1", + version:$version, + decision:"FAIL_BRIK64_CLI_BETA8_PACKAGE_BUILT", + releaseEligible:false, + failures:$failures + }' > "$OUT_DIR/package.manifest.json" + printf 'beta8_package_input_gate_failed:%s\n' "${failures[*]}" >&2 + exit 1 +fi + +rm -rf "$OUT_DIR" +mkdir -p "$STAGE_DIR" + +inputs=( + ".brik/manifest.json" + "README.md" + "CHANGELOG.md" + "LICENSE" + "NOTICE" + "SECURITY.md" + "src/brik.js" + "pcd/cli_core.pcd" + "pcd/cli_polymer.pcd" + "pcd/cli_account_session.pcd" + "pcd/cli_migrate.pcd" + "pcd/cli_polymerize.pcd" + "pcd/cli_verify.pcd" + "engines/l4plus-n5/serial.txt" + "engines/l4plus-n5/checksums.tsv" + "engines/l4plus-n5/runtime-bundle.manifest.json" + "evidence/beta8-compiler-functionality/report.json" + "evidence/beta8-adversarial/report.json" +) + +for input in "${inputs[@]}"; do + copy_input "$input" +done + +jq -n \ + --arg version "$VERSION" \ + '{ + name:"@brik64/cli", + version:$version, + private:true, + description:"BRIK64 CLI public beta candidate for local PCD workflows and bounded compiler emission.", + bin:{brik:"src/brik.js"}, + engines:{node:">=20"}, + distribution:"curl_and_github_release_assets" + }' > "$STAGE_DIR/package.json" +chmod 755 "$STAGE_DIR/src/brik.js" + +tar -czf "$PACKAGE_PATH" -C "$STAGE_ROOT" "$STAGE_NAME" +package_sha="$(sha256_file "$PACKAGE_PATH")" + +find "$STAGE_DIR" -type f | sort | while read -r file; do + rel="${file#$STAGE_DIR/}" + printf '%s %s\n' "$(sha256_file "$file")" "$rel" +done > "$OUT_DIR/stage-checksums.tsv" + +jq -n \ + --arg version "$VERSION" \ + --arg packagePath "evidence/beta8-package/$PACKAGE_NAME" \ + --arg packageSha "$package_sha" \ + --argjson packageBytes "$(stat -f '%z' "$PACKAGE_PATH")" \ + '{ + schemaVersion:"brik64.cli_beta8_package_manifest.v1", + version:$version, + decision:"PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", + releaseEligible:false, + lane:"cli_0_1_beta8", + generationClaim:"internal_generation_non_claim", + package:{path:$packagePath, sha256:$packageSha, bytes:$packageBytes}, + inputGates:[ + "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", + "PASS_BRIK64_CLI_BETA8_ADVERSARIAL" + ], + requiredPublicReleaseGates:[ + "beta8_package_smoke", + "platform_smoke", + "curl_gcp_installer_beta8", + "github_release_beta8", + "web_docs_changelog_beta8", + "skills_beta8", + "sdk_beta8_or_no_change_evidence", + "public_claim_scan" + ], + boundary:"Beta8 local package candidate only. Public release remains blocked until package, platform, installer, GitHub, SDK, docs, web, changelog, skills and public-claim gates pass together." + }' > "$OUT_DIR/package.manifest.json" + +{ + printf '%s %s\n' "$package_sha" "$PACKAGE_NAME" + printf '%s %s\n' "$(sha256_file "$OUT_DIR/package.manifest.json")" "package.manifest.json" + printf '%s %s\n' "$(sha256_file "$OUT_DIR/stage-checksums.tsv")" "stage-checksums.tsv" +} > "$OUT_DIR/SHA256SUMS" + +printf 'decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\n' +printf 'releaseEligible=false\n' +printf 'package=evidence/beta8-package/%s\n' "$PACKAGE_NAME" +printf 'sha256=%s\n' "$package_sha" From da757f6470430889e7733fd638fb72e6c9362480 Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:17:22 +0200 Subject: [PATCH 4/9] Align beta8 release train dry run --- CHANGELOG.md | 29 ++++ README.md | 17 +-- evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- evidence/beta8-package-smoke/report.json | 2 +- evidence/beta8-package/SHA256SUMS | 6 +- .../beta8-package/brik64-cli-0.1.0-beta.8.tgz | Bin 24217 -> 24512 bytes evidence/beta8-package/package.manifest.json | 4 +- evidence/beta8-package/stage-checksums.tsv | 8 +- .../brik64-cli-0.1.0-beta.8/CHANGELOG.md | 29 ++++ .../stage/brik64-cli-0.1.0-beta.8/README.md | 17 +-- .../evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- .../release-manifest-validate/report.json | 49 ++++--- evidence/release-train-dry-run/report.json | 134 ++++++------------ release/manifest.json | 49 ++++--- scripts/release-train-dry-run.js | 12 ++ tests/smoke.sh | 9 +- 18 files changed, 207 insertions(+), 166 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61ad3923..8245da2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,35 @@ All notable BRIK64 CLI changes are recorded here. This file is required for every beta, release candidate, or public release train. +## 0.1.0-beta.8 + +### Added + +- Adds bounded source-to-source PCD emission for executable TypeScript, Rust, + and Python programs. +- Adds generated target tests that execute emitted programs and check expected + behavior across supported target languages. +- Adds parser support for arithmetic expressions, comparisons, boolean + conditions, nested branches, and expression returns. +- Adds adversarial parser coverage for malformed input, binary data, oversized + PCD files, unsupported statements, and path traversal attempts. +- Adds a local package smoke check that extracts the beta8 tarball and runs the + packaged CLI outside the repository checkout. + +### Changed + +- Updates `brik64 emit` from static candidate output toward executable output + for the supported beta PCD syntax. +- Keeps unsupported syntax fail-closed with actionable parser errors. + +### Compatibility + +- macOS and Linux continue to use the portable Node.js CLI package and require + Node.js 20 or newer. +- Windows native executables are not published in this beta. +- This beta does not claim formal certification for arbitrary user code, + universal correctness, or independent toolchain closure. + ## 0.1.0-beta.7 ### Added diff --git a/README.md b/README.md index 735d2041..d4f498bb 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ workflows. It helps developers initialize `.brik` metadata, work with PCD files, create local candidate evidence, emit supported language targets, and prepare artifacts for managed platform workflows. -Current public beta: `0.1.0-beta.7` +Current beta candidate: `0.1.0-beta.8` ## Install @@ -24,10 +24,10 @@ brik64 help The npm package namespace is reserved for SDK libraries, not CLI installation. -## Beta7 Command Surface +## Beta8 Command Surface -`0.1.0-beta.7` focuses on local/managed workflow parity and clearer terminal -behavior. +`0.1.0-beta.8` focuses on making PCD emission executable for the supported +beta syntax while keeping local/managed workflow boundaries intact. - `brik64 init` creates `.brik/manifest.json` and does not create `AGENTS.md`. - `brik64 doctor` prints a human-readable workspace summary. @@ -40,7 +40,8 @@ behavior. - `brik64 certify ` writes a local candidate certificate. - `brik64 verify ` checks local certificate and AST/hash coherence. - `brik64 emit --target --out --tests` - emits supported target files and generated tests. + emits executable target files and generated tests for supported beta PCD + expressions and branches. - `brik64 polymerize --out polymer.pcd` combines compatible PCD files into a deterministic local polymer candidate. - `brik64 migrate ` converts supported legacy PCD syntax into the @@ -67,9 +68,9 @@ SDKs are distributed separately from the CLI. Current beta SDK package coordinates: ```sh -npm install @brik64/core@0.1.0-beta.7 -pip install brik64==0.1.0b7 -cargo add brik64-core@0.1.0-beta.7 +npm install @brik64/core@0.1.0-beta.8 +pip install brik64==0.1.0b8 +cargo add brik64-core@0.1.0-beta.8 ``` SDK packages are language libraries. They do not install the CLI, issue managed diff --git a/evidence/beta8-adversarial/report.json b/evidence/beta8-adversarial/report.json index 4b8dd231..0a5e40c0 100644 --- a/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:11:12Z", + "generatedAt": "2026-06-06T02:16:50Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json index e2289ed7..c3b419ad 100644 --- a/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:11:07Z", + "generatedAt": "2026-06-06T02:16:47Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/beta8-package-smoke/report.json b/evidence/beta8-package-smoke/report.json index 76e3b4b3..9f9e3428 100644 --- a/evidence/beta8-package-smoke/report.json +++ b/evidence/beta8-package-smoke/report.json @@ -6,7 +6,7 @@ "lane": "cli_0_1_beta8", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "49aba57ce02a706f5fb4ead64e420a2f636847a637916f2ec75e9240df7dfdca" + "sha256": "5abb43d602f65e255b76f8e6baca4988a7f1d2cbd0946cda049b41afb343b962" }, "checks": [ "extract", diff --git a/evidence/beta8-package/SHA256SUMS b/evidence/beta8-package/SHA256SUMS index 2ba3da85..e057ff86 100644 --- a/evidence/beta8-package/SHA256SUMS +++ b/evidence/beta8-package/SHA256SUMS @@ -1,3 +1,3 @@ -49aba57ce02a706f5fb4ead64e420a2f636847a637916f2ec75e9240df7dfdca brik64-cli-0.1.0-beta.8.tgz -79b4d8af0509d0829178e5fc928b0e73a6982d2c6f4a40300823a75362ab91dd package.manifest.json -a3ec8a78d2d029d331d99a282233347067a228851eca40f83eb80fb91b6e1093 stage-checksums.tsv +5abb43d602f65e255b76f8e6baca4988a7f1d2cbd0946cda049b41afb343b962 brik64-cli-0.1.0-beta.8.tgz +e0c9b5556fb083cd4a52eb5893f20184622460ddea3c4d2b473b0d2eaa0448af package.manifest.json +af80935cdfa2340d00ffc6b9305517fbbc00850d1beb5a83a431a59dd53198ff stage-checksums.tsv diff --git a/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz b/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz index 1f795fcb2decdb528b655e9c3a446dbe49b077a0..50d9e273a79b55b520cdc18e189280a1b6ae607d 100644 GIT binary patch delta 24128 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 Kok(F%Me#qA+l!U} diff --git a/evidence/beta8-package/package.manifest.json b/evidence/beta8-package/package.manifest.json index 241f1b56..e4124640 100644 --- a/evidence/beta8-package/package.manifest.json +++ b/evidence/beta8-package/package.manifest.json @@ -7,8 +7,8 @@ "generationClaim": "internal_generation_non_claim", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "49aba57ce02a706f5fb4ead64e420a2f636847a637916f2ec75e9240df7dfdca", - "bytes": 24217 + "sha256": "5abb43d602f65e255b76f8e6baca4988a7f1d2cbd0946cda049b41afb343b962", + "bytes": 24512 }, "inputGates": [ "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/beta8-package/stage-checksums.tsv b/evidence/beta8-package/stage-checksums.tsv index 15211cdd..5b4b1be7 100644 --- a/evidence/beta8-package/stage-checksums.tsv +++ b/evidence/beta8-package/stage-checksums.tsv @@ -1,14 +1,14 @@ fc964c7a8ed406be061b5b0f7870a817f4499138f52aa2cc634c5bec4a843fb3 .brik/manifest.json -787a17b106f046384ae3ee0f749e6fec216a11dd106f045ac3f01e930dcf66b0 CHANGELOG.md +d117870091ed333c4c180eb4fe0ac5f61aee55a0da5fb67ebea23863d57b4f3f CHANGELOG.md 08ed88b54153f473ae8c29972d137b5a9f6893fd3178754e61a2ef29ae040e47 LICENSE b70107f9dd359eb374de9a9dce99821ed5dbbd021116645e0d32c67fb7fc9b18 NOTICE -84f5ea969614a845a5e9a7e28cc964b18b89a3901cb511239de9426755c703d4 README.md +7b4fbb4b65e30e58f2dbf28ad0fddd1b0eb9641bfef9d586358e0343e1f33ccb README.md cf39e055374caeecaac773d9802098a7c1717e271be4b00c25d2a2a9bf157aa1 SECURITY.md 11a5eadb7ec6f7d07e329c767026ae9576bdaf99c1d411781e5f88108e7d852e engines/l4plus-n5/checksums.tsv 221774c3a8f9e1cf630521a12a2a62f265d34313cdeaf7bb30ca69f60bd3a8d8 engines/l4plus-n5/runtime-bundle.manifest.json 6f2a3eff7b3cbf80debb823f1771df5364d6f1fdf2c0b6c2dab8e109c04dc757 engines/l4plus-n5/serial.txt -5a1e3c9bc501f8e1c4f1931418ef6a44cb598b7497d24d561c9a3b8666883070 evidence/beta8-adversarial/report.json -b711d4c7ccca302b36e37baacbb4a62ff19f590bf86748f1b9f8d1c9bd429046 evidence/beta8-compiler-functionality/report.json +a24ff6fb953464ba5a2915592c06bff8cf8fcb4fc801ceef9b60c0681e8c7761 evidence/beta8-adversarial/report.json +394689f7884c9a18dc335609d18eb9c126b8287fdd82d232ee6d83721bfa9e56 evidence/beta8-compiler-functionality/report.json 3b99b7e885e6bf2d730bd7f4ca3c3bae00270f775523c66150d21d2004e70628 package.json 2a629b0c88a96c81a42f3e5949900798fe25886aec7ac203855ba7540cd3b36c pcd/cli_account_session.pcd ff48eaeb3848e39c5400fcbb9fc293e5fffb649db2e32454f900080be660ef1c pcd/cli_core.pcd diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/CHANGELOG.md b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/CHANGELOG.md index 61ad3923..8245da2e 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/CHANGELOG.md +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/CHANGELOG.md @@ -3,6 +3,35 @@ All notable BRIK64 CLI changes are recorded here. This file is required for every beta, release candidate, or public release train. +## 0.1.0-beta.8 + +### Added + +- Adds bounded source-to-source PCD emission for executable TypeScript, Rust, + and Python programs. +- Adds generated target tests that execute emitted programs and check expected + behavior across supported target languages. +- Adds parser support for arithmetic expressions, comparisons, boolean + conditions, nested branches, and expression returns. +- Adds adversarial parser coverage for malformed input, binary data, oversized + PCD files, unsupported statements, and path traversal attempts. +- Adds a local package smoke check that extracts the beta8 tarball and runs the + packaged CLI outside the repository checkout. + +### Changed + +- Updates `brik64 emit` from static candidate output toward executable output + for the supported beta PCD syntax. +- Keeps unsupported syntax fail-closed with actionable parser errors. + +### Compatibility + +- macOS and Linux continue to use the portable Node.js CLI package and require + Node.js 20 or newer. +- Windows native executables are not published in this beta. +- This beta does not claim formal certification for arbitrary user code, + universal correctness, or independent toolchain closure. + ## 0.1.0-beta.7 ### Added diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md index 735d2041..d4f498bb 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/README.md @@ -5,7 +5,7 @@ workflows. It helps developers initialize `.brik` metadata, work with PCD files, create local candidate evidence, emit supported language targets, and prepare artifacts for managed platform workflows. -Current public beta: `0.1.0-beta.7` +Current beta candidate: `0.1.0-beta.8` ## Install @@ -24,10 +24,10 @@ brik64 help The npm package namespace is reserved for SDK libraries, not CLI installation. -## Beta7 Command Surface +## Beta8 Command Surface -`0.1.0-beta.7` focuses on local/managed workflow parity and clearer terminal -behavior. +`0.1.0-beta.8` focuses on making PCD emission executable for the supported +beta syntax while keeping local/managed workflow boundaries intact. - `brik64 init` creates `.brik/manifest.json` and does not create `AGENTS.md`. - `brik64 doctor` prints a human-readable workspace summary. @@ -40,7 +40,8 @@ behavior. - `brik64 certify ` writes a local candidate certificate. - `brik64 verify ` checks local certificate and AST/hash coherence. - `brik64 emit --target --out
--tests` - emits supported target files and generated tests. + emits executable target files and generated tests for supported beta PCD + expressions and branches. - `brik64 polymerize --out polymer.pcd` combines compatible PCD files into a deterministic local polymer candidate. - `brik64 migrate ` converts supported legacy PCD syntax into the @@ -67,9 +68,9 @@ SDKs are distributed separately from the CLI. Current beta SDK package coordinates: ```sh -npm install @brik64/core@0.1.0-beta.7 -pip install brik64==0.1.0b7 -cargo add brik64-core@0.1.0-beta.7 +npm install @brik64/core@0.1.0-beta.8 +pip install brik64==0.1.0b8 +cargo add brik64-core@0.1.0-beta.8 ``` SDK packages are language libraries. They do not install the CLI, issue managed diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json index 4b8dd231..0a5e40c0 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:11:12Z", + "generatedAt": "2026-06-06T02:16:50Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json index e2289ed7..c3b419ad 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:11:07Z", + "generatedAt": "2026-06-06T02:16:47Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/release-manifest-validate/report.json b/evidence/release-manifest-validate/report.json index df6fd5fc..7ea474f0 100644 --- a/evidence/release-manifest-validate/report.json +++ b/evidence/release-manifest-validate/report.json @@ -1,47 +1,54 @@ { "schemaVersion": "brik64.release_manifest_validation_report.v1", "manifestPath": "release/manifest.json", - "version": "0.1.0-beta.7", - "state": "public", - "manifestDigest": "7f786abdfa7e098778d1a141ea393da386e22144b9d213836e1bd8747acbbcb8", + "version": "0.1.0-beta.8", + "state": "draft", + "manifestDigest": "959a0c50560613529b80d12534d2c8ef1f5ce47a52449cc906f0c687edf9a585", "decision": "PASS_RELEASE_MANIFEST_VALIDATE", - "releaseEligible": true, + "releaseEligible": false, "artifacts": { "manifest": { "path": "release/manifest.json", - "sha256": "7f786abdfa7e098778d1a141ea393da386e22144b9d213836e1bd8747acbbcb8", - "bytes": 3584 + "sha256": "959a0c50560613529b80d12534d2c8ef1f5ce47a52449cc906f0c687edf9a585", + "bytes": 3829 }, "packageJson": { "path": "package.json", - "version": "0.1.0-beta.7" + "version": "0.1.0-beta.8" }, "evidence": [ { - "id": "featureParity", - "path": "evidence/beta7-feature-parity/report.json", - "expectedDecision": "PASS_BETA7_FEATURE_PARITY_GATE", - "actualDecision": "PASS_BETA7_FEATURE_PARITY_GATE", - "sha256": "ebd385cd2e0eebe4054fc49a245c8fe75f6e990e3d3175d848056b8e8c6ac8bc" + "id": "compilerFunctionality", + "path": "evidence/beta8-compiler-functionality/report.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", + "actualDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", + "sha256": "bbcd56591424b972deb2f8dcd1b1c0c1ef72a624fc982ed71363190551f6e468" + }, + { + "id": "adversarial", + "path": "evidence/beta8-adversarial/report.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", + "actualDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", + "sha256": "e11a527b5e5d572d45b0bc807c8395b8a34b3749b441c6129450efb389df0249" }, { "id": "localPackage", - "path": "evidence/beta7-package/package.manifest.json", - "expectedDecision": "PASS_BETA7_PACKAGE_BUILT", - "actualDecision": "PASS_BETA7_PACKAGE_BUILT", - "sha256": "85c751817ddedca8a6934f3a92912adda4c950f05e96f9d1898a6eedd4fa6af4" + "path": "evidence/beta8-package/package.manifest.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", + "actualDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", + "sha256": "aba93b8472c2ef0c9f4bab7c11bafe47924ea356374a349db36287be6230db05" }, { "id": "localPackageSmoke", - "path": "evidence/beta7-package-smoke/report.json", - "expectedDecision": "PASS_BETA7_LOCAL_PACKAGE_SMOKE", - "actualDecision": "PASS_BETA7_LOCAL_PACKAGE_SMOKE", - "sha256": "d1b6f33235ddd99c594c2b6107e0e1dd99be862d0c7b95b5ea93c0bea0e20050" + "path": "evidence/beta8-package-smoke/report.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", + "actualDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", + "sha256": "ce8e2132bfd850b75d51e76229dc5ca47e510a5e5ea88b97562b754f7879d357" } ] }, "failures": [], "warnings": [ - "worktree_dirty_allowed:9" + "worktree_dirty_allowed:16" ] } diff --git a/evidence/release-train-dry-run/report.json b/evidence/release-train-dry-run/report.json index e6255fd0..75265996 100644 --- a/evidence/release-train-dry-run/report.json +++ b/evidence/release-train-dry-run/report.json @@ -1,141 +1,97 @@ { "schemaVersion": "brik64.release_train_dry_run_report.v1", - "releaseId": "brik64-0.1.0-beta.7", - "version": "0.1.0-beta.7", + "releaseId": "brik64-0.1.0-beta.8", + "version": "0.1.0-beta.8", "channel": "beta", - "state": "public", - "manifestDigest": "7f786abdfa7e098778d1a141ea393da386e22144b9d213836e1bd8747acbbcb8", + "state": "draft", + "manifestDigest": "959a0c50560613529b80d12534d2c8ef1f5ce47a52449cc906f0c687edf9a585", "decision": "PASS_RELEASE_TRAIN_DRY_RUN", "publicationAllowed": false, "boundary": "Dry-run only. This workflow validates manifest, tests and evidence but never publishes public artifacts.", "initialDirtyFiles": [ + "CHANGELOG.md", "README.md", - "evidence/beta7-package-smoke/report.json", - "evidence/beta7-package/SHA256SUMS", - "evidence/beta7-package/brik64-cli-0.1.0-beta.7.tgz", - "evidence/beta7-package/package.manifest.json", - "evidence/release-train-sync/report.json", - "evidence/release-train-sync/sync-payload.json", - "release/manifest.json" + "release/manifest.json", + "scripts/release-train-dry-run.js", + "tests/smoke.sh" ], "commands": [ { "name": "manifest_validate", "command": "node scripts/release-manifest-validate.js --allow-dirty", "rc": 0, - "elapsedMs": 115, - "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.7\nwarnings=worktree_dirty_allowed:8\n", + "elapsedMs": 198, + "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.8\nwarnings=worktree_dirty_allowed:5\n", "stderr": "" }, { "name": "smoke_tests", "command": "bash -lc BRIK64_RELEASE_GATES=1 bash -x tests/smoke.sh", "rc": 0, - "elapsedMs": 7421, + "elapsedMs": 17200, "stdout": "created=.brik/manifest.json\ncertificate=program.pcd.cert.json\ncertificate=polymer.pcd.cert.json\ncertificate=stale.pcd.cert.json\ncertificate=legacy.beta7.pcd.cert.json\ncertificate=variant.pcd.cert.json\nbrik64-cli bootstrap smoke: PASS\n", - "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.7\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR\n+ trap cleanup EXIT\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.7'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 1 = 1 ']'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta7-feature-parity-gate.js\n+ grep -q decision=PASS_BETA7_FEATURE_PARITY_GATE\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/build-beta7-package.js\n+ grep -q PASS_BETA7_PACKAGE_BUILT\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta7-package-smoke.js\n+ grep -q decision=PASS_BETA7_LOCAL_PACKAGE_SMOKE\n+ node -e 'const fs=require(\"fs\"); const r=JSON.parse(fs.readFileSync(\"evidence/beta7-package/package.manifest.json\",\"utf8\")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes(\"curl_gcp_installer_beta7\")) process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/release-manifest-validate.js --allow-dirty\n+ grep -q decision=PASS_RELEASE_MANIFEST_VALIDATE\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR/out-ts/program.ts\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR/out-ts/program.test.ts\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR/escaped-out/program.ts\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ printf '\\n return 3;\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.ts out-variant/program.ts\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.SaJ0jkGdbR\n" + "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 1 = 1 ']'\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-compiler-functionality-gate.sh\n+ grep -q PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-adversarial-gate.sh\n+ grep -q PASS_BRIK64_CLI_BETA8_ADVERSARIAL\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/build-beta8-package.sh\n+ grep -q PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-package-smoke.sh\n+ grep -q decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\n+ node -e 'const fs=require(\"fs\"); const r=JSON.parse(fs.readFileSync(\"evidence/beta8-package/package.manifest.json\",\"utf8\")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes(\"curl_gcp_installer_beta8\")) process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/release-manifest-validate.js --allow-dirty\n+ grep -q decision=PASS_RELEASE_MANIFEST_VALIDATE\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-ts/program.ts\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-ts/program.test.ts\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/escaped-out/program.ts\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.ts out-variant/program.ts\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n" }, { - "name": "beta7_feature_parity", - "command": "node scripts/beta7-feature-parity-gate.js", + "name": "beta8_compiler_functionality", + "command": "bash scripts/beta8-compiler-functionality-gate.sh", "rc": 0, - "elapsedMs": 1639, - "stdout": "decision=PASS_BETA7_FEATURE_PARITY_GATE\nchecks=17\n", + "elapsedMs": 2312, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:16:47Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:22a0904178aaba0faa8a5392a1750e636fd6d42537e69ecf166596e8269cae98\",\n \"test\": \"node out-ts/program.test.ts\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", "stderr": "" }, { - "name": "beta7_local_package", - "command": "node scripts/build-beta7-package.js", + "name": "beta8_adversarial", + "command": "bash scripts/beta8-adversarial-gate.sh", "rc": 0, - "elapsedMs": 138, - "stdout": "decision=PASS_BETA7_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta7-package/brik64-cli-0.1.0-beta.7.tgz\nsha256=498ad2d5a0c54567f8f45f9c8649f483d7c4e030c9e4652d8782903b0fd3718c\n", + "elapsedMs": 2787, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:16:50Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", "stderr": "" }, { - "name": "beta7_package_smoke", - "command": "node scripts/beta7-package-smoke.js", + "name": "beta8_local_package", + "command": "bash scripts/build-beta8-package.sh", "rc": 0, - "elapsedMs": 1241, - "stdout": "decision=PASS_BETA7_LOCAL_PACKAGE_SMOKE\nchecks=13\n", + "elapsedMs": 762, + "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=5abb43d602f65e255b76f8e6baca4988a7f1d2cbd0946cda049b41afb343b962\n", "stderr": "" }, { - "name": "beta7_sdk_sync", - "command": "node scripts/beta7-sdk-sync-gate.js", + "name": "beta8_package_smoke", + "command": "bash scripts/beta8-package-smoke.sh", "rc": 0, - "elapsedMs": 88, - "stdout": "decision=PASS_SDK_BETA7_SYNC\nmarketplacePublicationAllowed=true\n", - "stderr": "" - }, - { - "name": "beta7_marketplace_packages", - "command": "node scripts/beta7-marketplace-package-gate.js", - "rc": 0, - "elapsedMs": 87, - "stdout": "decision=PASS_MARKETPLACE_PACKAGE_GATE\nmarketplacePublicationAllowed=true\n", - "stderr": "" - }, - { - "name": "beta7_skills_sync", - "command": "node scripts/beta7-skills-sync-gate.js", - "rc": 0, - "elapsedMs": 89, - "stdout": "decision=PASS_SKILLS_BETA7_SYNC\npublicSkillPublicationAllowed=true\n", - "stderr": "" - }, - { - "name": "beta7_docs_web_sync", - "command": "node scripts/beta7-docs-web-sync-gate.js", - "rc": 0, - "elapsedMs": 122, - "stdout": "decision=PASS_DOCS_WEB_BETA7_SYNC\ndeployAllowed=true\n", - "stderr": "" - }, - { - "name": "sync_surfaces", - "command": "node scripts/release-train-sync-surfaces.js", - "rc": 0, - "elapsedMs": 96, - "stdout": "decision=PASS_RELEASE_TRAIN_SYNC_SURFACES\npublicationAllowed=false\n", - "stderr": "" - }, - { - "name": "publish_plan", - "command": "bash -lc BRIK64_RELEASE_TRAIN_DRY_RUN_IN_PROGRESS=1 node scripts/release-train-publish-plan.js", - "rc": 0, - "elapsedMs": 123, - "stdout": "decision=PASS_PUBLISH_PLAN_DRY_RUN\npublicationAllowed=false\nwarnings=dry_run_report_currently_being_generated,pre_publish_live_verify_manifest_digest_drift\n", - "stderr": "" - }, - { - "name": "publish_execute_dry_run", - "command": "node scripts/release-train-publish-execute.js", - "rc": 0, - "elapsedMs": 194, - "stdout": "decision=PASS_RELEASE_TRAIN_PUBLISH_EXECUTE_DRY_RUN\npublicationMutated=false\nwarnings=worktree_dirty_dry_run:2\n", + "elapsedMs": 2507, + "stdout": "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\nchecks=13\n", "stderr": "" } ], "requiredEvidence": [ { - "id": "featureParity", - "path": "evidence/beta7-feature-parity/report.json", - "expectedDecision": "PASS_BETA7_FEATURE_PARITY_GATE", - "actualDecision": "PASS_BETA7_FEATURE_PARITY_GATE", + "id": "compilerFunctionality", + "path": "evidence/beta8-compiler-functionality/report.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", + "actualDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", + "pass": true + }, + { + "id": "adversarial", + "path": "evidence/beta8-adversarial/report.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", + "actualDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", "pass": true }, { "id": "localPackage", - "path": "evidence/beta7-package/package.manifest.json", - "expectedDecision": "PASS_BETA7_PACKAGE_BUILT", - "actualDecision": "PASS_BETA7_PACKAGE_BUILT", + "path": "evidence/beta8-package/package.manifest.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", + "actualDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", "pass": true }, { "id": "localPackageSmoke", - "path": "evidence/beta7-package-smoke/report.json", - "expectedDecision": "PASS_BETA7_LOCAL_PACKAGE_SMOKE", - "actualDecision": "PASS_BETA7_LOCAL_PACKAGE_SMOKE", + "path": "evidence/beta8-package-smoke/report.json", + "expectedDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", + "actualDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", "pass": true } ], diff --git a/release/manifest.json b/release/manifest.json index 70d695ad..5dcccc4f 100644 --- a/release/manifest.json +++ b/release/manifest.json @@ -1,14 +1,14 @@ { "schemaVersion": "brik64.release_manifest.v1", - "releaseId": "brik64-0.1.0-beta.7", - "version": "0.1.0-beta.7", + "releaseId": "brik64-0.1.0-beta.8", + "version": "0.1.0-beta.8", "channel": "beta", - "state": "public", - "createdAt": "2026-06-05T20:45:00Z", + "state": "draft", + "createdAt": "2026-06-06T02:15:00Z", "source": { "repo": "brik64/brik64-cli", "branch": "main", - "commit": "67c89a5" + "commit": "2673a5b" }, "cli": { "packageName": "@brik64/cli", @@ -37,29 +37,29 @@ "language": "typescript", "package": "@brik64/core", "marketplace": "npm", - "version": "0.1.0-beta.7", + "version": "0.1.0-beta.8", "required": true }, { "language": "python", "package": "brik64", "marketplace": "pypi", - "version": "0.1.0b7", + "version": "0.1.0b8", "required": true }, { "language": "rust", "package": "brik64-core", "marketplace": "crates.io", - "version": "0.1.0-beta.7", + "version": "0.1.0-beta.8", "required": true } ], "publicSurfaces": { "githubRelease": { "required": true, - "tag": "v0.1.0-beta.7", - "url": "https://github.com/brik64/brik64-cli/releases/tag/v0.1.0-beta.7" + "tag": "v0.1.0-beta.8", + "url": "https://github.com/brik64/brik64-cli/releases/tag/v0.1.0-beta.8" }, "curlInstaller": { "required": true, @@ -91,45 +91,50 @@ { "type": "added", "surface": "cli", - "text": "Adds local PCD polymerization so users can combine multiple PCD files into a deterministic polymer file and manifest." + "text": "Adds bounded source-to-source PCD emission that generates executable TypeScript, Rust, and Python programs for the supported beta syntax." }, { "type": "added", "surface": "cli", - "text": "Adds local verification for certificate presence, source hash agreement, and AST hash agreement before generated outputs are trusted." + "text": "Adds generated target tests that execute emitted programs and verify expected behavior across supported target languages." }, { "type": "added", "surface": "cli", - "text": "Adds migration support for legacy lowercase PCD syntax with actionable parser guidance." + "text": "Adds parser support for arithmetic expressions, comparisons, boolean conditions, nested branches, and expression returns." }, { "type": "added", "surface": "cli", - "text": "Adds account status, login, and logout commands for future platform-connected workflows while keeping local workflows available by default." + "text": "Adds adversarial parser checks for malformed input, binary data, oversized PCD files, unsupported statements, and path traversal attempts." }, { "type": "changed", "surface": "cli", - "text": "Keeps human-readable doctor output as the default and moves machine-readable reports behind an explicit JSON flag." + "text": "Packages the beta8 CLI candidate with local smoke coverage from an extracted tarball before public release." } ], "verification": { "requiredEvidence": [ { - "id": "featureParity", - "path": "evidence/beta7-feature-parity/report.json", - "decision": "PASS_BETA7_FEATURE_PARITY_GATE" + "id": "compilerFunctionality", + "path": "evidence/beta8-compiler-functionality/report.json", + "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" + }, + { + "id": "adversarial", + "path": "evidence/beta8-adversarial/report.json", + "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL" }, { "id": "localPackage", - "path": "evidence/beta7-package/package.manifest.json", - "decision": "PASS_BETA7_PACKAGE_BUILT" + "path": "evidence/beta8-package/package.manifest.json", + "decision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT" }, { "id": "localPackageSmoke", - "path": "evidence/beta7-package-smoke/report.json", - "decision": "PASS_BETA7_LOCAL_PACKAGE_SMOKE" + "path": "evidence/beta8-package-smoke/report.json", + "decision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE" } ] } diff --git a/scripts/release-train-dry-run.js b/scripts/release-train-dry-run.js index c0b46b96..61b99841 100644 --- a/scripts/release-train-dry-run.js +++ b/scripts/release-train-dry-run.js @@ -124,6 +124,18 @@ function manifestDrivenBetaCommands(manifest, canAccessSiblingRepos) { ]; } + if (betaNumber(manifest.version) === 8) { + return [ + run('beta8_compiler_functionality', ['bash', 'scripts/beta8-compiler-functionality-gate.sh']), + run('beta8_adversarial', ['bash', 'scripts/beta8-adversarial-gate.sh']), + run('beta8_local_package', ['bash', 'scripts/build-beta8-package.sh']), + run('beta8_package_smoke', ['bash', 'scripts/beta8-package-smoke.sh']), + ...(canAccessSiblingRepos + ? [] + : []) + ]; + } + return [ run(`${label}_feature_parity`, ['node', `scripts/${label}-feature-parity-gate.js`]), run(`${label}_local_package`, ['node', `scripts/build-${label}-package.js`]), diff --git a/tests/smoke.sh b/tests/smoke.sh index 1f7804b6..50cb98cf 100755 --- a/tests/smoke.sh +++ b/tests/smoke.sh @@ -23,10 +23,11 @@ node "$BRIK" engine status | grep -q '"runtimeMode": "portable_bir_bundle"' node "$BRIK" engine status | grep -q '"nativeExecutableIncluded": false' if [ "${BRIK64_RELEASE_GATES:-0}" = "1" ]; then - node "$ROOT_DIR/scripts/beta7-feature-parity-gate.js" | grep -q "decision=PASS_BETA7_FEATURE_PARITY_GATE" - node "$ROOT_DIR/scripts/build-beta7-package.js" | grep -q "PASS_BETA7_PACKAGE_BUILT" - node "$ROOT_DIR/scripts/beta7-package-smoke.js" | grep -q "decision=PASS_BETA7_LOCAL_PACKAGE_SMOKE" - node -e 'const fs=require("fs"); const r=JSON.parse(fs.readFileSync("evidence/beta7-package/package.manifest.json","utf8")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes("curl_gcp_installer_beta7")) process.exit(1)' + bash "$ROOT_DIR/scripts/beta8-compiler-functionality-gate.sh" | grep -q "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" + bash "$ROOT_DIR/scripts/beta8-adversarial-gate.sh" | grep -q "PASS_BRIK64_CLI_BETA8_ADVERSARIAL" + bash "$ROOT_DIR/scripts/build-beta8-package.sh" | grep -q "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT" + bash "$ROOT_DIR/scripts/beta8-package-smoke.sh" | grep -q "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE" + node -e 'const fs=require("fs"); const r=JSON.parse(fs.readFileSync("evidence/beta8-package/package.manifest.json","utf8")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes("curl_gcp_installer_beta8")) process.exit(1)' node "$ROOT_DIR/scripts/release-manifest-validate.js" --allow-dirty | grep -q "decision=PASS_RELEASE_MANIFEST_VALIDATE" fi From b7a93a1376d6cda29db75c67c4297915b50ef3b1 Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:21:26 +0200 Subject: [PATCH 5/9] Fix beta8 release train on Node 20 --- evidence/beta8-adversarial/report.json | 4 +- .../beta8-compiler-functionality/report.json | 8 ++-- evidence/beta8-package-smoke/report.json | 2 +- evidence/beta8-package/SHA256SUMS | 6 +-- .../beta8-package/brik64-cli-0.1.0-beta.8.tgz | Bin 24512 -> 24497 bytes evidence/beta8-package/package.manifest.json | 4 +- evidence/beta8-package/stage-checksums.tsv | 6 +-- .../evidence/beta8-adversarial/report.json | 4 +- .../beta8-compiler-functionality/report.json | 8 ++-- .../stage/brik64-cli-0.1.0-beta.8/src/brik.js | 10 ++--- .../release-manifest-validate/report.json | 10 ++--- evidence/release-train-dry-run/report.json | 40 +++++++++++------- scripts/beta8-adversarial-gate.sh | 2 +- scripts/beta8-compiler-functionality-gate.sh | 6 +-- scripts/beta8-package-smoke.sh | 2 +- src/brik.js | 10 ++--- tests/smoke.sh | 20 +++++---- 17 files changed, 78 insertions(+), 64 deletions(-) diff --git a/evidence/beta8-adversarial/report.json b/evidence/beta8-adversarial/report.json index 0a5e40c0..43f74397 100644 --- a/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-adversarial/report.json @@ -1,12 +1,12 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:16:50Z", + "generatedAt": "2026-06-06T02:21:07Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", "rc": 0, "cliVersion": "0.1.0-beta.8", - "cliSha256": "sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee", + "cliSha256": "sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed", "executableEdgeFixture": { "path": "pcd/edge_precedence.pcd", "sha256": "sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63" diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json index c3b419ad..df1106fd 100644 --- a/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-compiler-functionality/report.json @@ -1,20 +1,20 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:16:47Z", + "generatedAt": "2026-06-06T02:21:05Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", "rc": 0, "cliVersion": "0.1.0-beta.8", - "cliSha256": "sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee", + "cliSha256": "sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed", "fixture": { "path": "pcd/branch_math.pcd", "sha256": "sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404" }, "executedTargets": { "typescript": { - "programSha256": "sha256:22a0904178aaba0faa8a5392a1750e636fd6d42537e69ecf166596e8269cae98", - "test": "node out-ts/program.test.ts", + "programSha256": "sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95", + "test": "node out-ts/program.test.mjs", "passed": true }, "rust": { diff --git a/evidence/beta8-package-smoke/report.json b/evidence/beta8-package-smoke/report.json index 9f9e3428..5b5ed7fc 100644 --- a/evidence/beta8-package-smoke/report.json +++ b/evidence/beta8-package-smoke/report.json @@ -6,7 +6,7 @@ "lane": "cli_0_1_beta8", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "5abb43d602f65e255b76f8e6baca4988a7f1d2cbd0946cda049b41afb343b962" + "sha256": "0619c9bbea55bf6ac01fac80ed644e0f2afc51fb374b6f82a46402f0e982f531" }, "checks": [ "extract", diff --git a/evidence/beta8-package/SHA256SUMS b/evidence/beta8-package/SHA256SUMS index e057ff86..8ac4026a 100644 --- a/evidence/beta8-package/SHA256SUMS +++ b/evidence/beta8-package/SHA256SUMS @@ -1,3 +1,3 @@ -5abb43d602f65e255b76f8e6baca4988a7f1d2cbd0946cda049b41afb343b962 brik64-cli-0.1.0-beta.8.tgz -e0c9b5556fb083cd4a52eb5893f20184622460ddea3c4d2b473b0d2eaa0448af package.manifest.json -af80935cdfa2340d00ffc6b9305517fbbc00850d1beb5a83a431a59dd53198ff stage-checksums.tsv +0619c9bbea55bf6ac01fac80ed644e0f2afc51fb374b6f82a46402f0e982f531 brik64-cli-0.1.0-beta.8.tgz +074856b80ef3cd5d374beccd8f65a4c0cfda1f1fa2ea11f3a86365e1419bd3e6 package.manifest.json +37e5b71644bcf52cce760473a85ca9a837465cf20433e4eac539fb0e28086478 stage-checksums.tsv diff --git a/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz b/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz index 50d9e273a79b55b520cdc18e189280a1b6ae607d..4764f1f6aceaafea67fb43c7571a43b56249dd98 100644 GIT binary patch delta 24306 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 [ '// BRIK64 beta8 functional emission candidate', '// claim: local candidate evidence only', `export const pcdSha256 = "${hash}";`, - `export const pcdAst = ${astJson} as const;`, - `export function run(${param} = 0): number {`, + `export const pcdAst = ${astJson};`, + `export function run(${param} = 0) {`, ...tsStatements, ' throw new Error("pcd execution reached non-returning path");', '}', '', ].join('\n'), testCode: (hash) => [ - 'import { pcdSha256, run } from "./program.ts";', + 'import { pcdSha256, run } from "./program.mjs";', '', 'if (pcdSha256 !== "' + hash + '") throw new Error("pcd hash mismatch");', `const cases = ${JSON.stringify(cases)};`, diff --git a/evidence/release-manifest-validate/report.json b/evidence/release-manifest-validate/report.json index 7ea474f0..d88d0421 100644 --- a/evidence/release-manifest-validate/report.json +++ b/evidence/release-manifest-validate/report.json @@ -22,33 +22,33 @@ "path": "evidence/beta8-compiler-functionality/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", "actualDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", - "sha256": "bbcd56591424b972deb2f8dcd1b1c0c1ef72a624fc982ed71363190551f6e468" + "sha256": "642fb0c712a306f041d4410103c2c264cb4dd1cf1b2c06725212c904ce0b2ee8" }, { "id": "adversarial", "path": "evidence/beta8-adversarial/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", "actualDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", - "sha256": "e11a527b5e5d572d45b0bc807c8395b8a34b3749b441c6129450efb389df0249" + "sha256": "6ec70bd2a2d1263570545eaf2e29b3ee7a43e25eff1ffc0fe0be5c213b47c78b" }, { "id": "localPackage", "path": "evidence/beta8-package/package.manifest.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", "actualDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", - "sha256": "aba93b8472c2ef0c9f4bab7c11bafe47924ea356374a349db36287be6230db05" + "sha256": "cf77c66dfdbeeb2522b9c0c349a3189163dfbef82197ecd27f0f0b7554a36f91" }, { "id": "localPackageSmoke", "path": "evidence/beta8-package-smoke/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", "actualDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", - "sha256": "ce8e2132bfd850b75d51e76229dc5ca47e510a5e5ea88b97562b754f7879d357" + "sha256": "601e16d5fb93174d5e4f88c847259b818d89f48b840b994c4700b0c804496c23" } ] }, "failures": [], "warnings": [ - "worktree_dirty_allowed:16" + "worktree_dirty_allowed:15" ] } diff --git a/evidence/release-train-dry-run/report.json b/evidence/release-train-dry-run/report.json index 75265996..0ce60972 100644 --- a/evidence/release-train-dry-run/report.json +++ b/evidence/release-train-dry-run/report.json @@ -9,10 +9,20 @@ "publicationAllowed": false, "boundary": "Dry-run only. This workflow validates manifest, tests and evidence but never publishes public artifacts.", "initialDirtyFiles": [ - "CHANGELOG.md", - "README.md", - "release/manifest.json", - "scripts/release-train-dry-run.js", + "evidence/beta8-adversarial/report.json", + "evidence/beta8-compiler-functionality/report.json", + "evidence/beta8-package-smoke/report.json", + "evidence/beta8-package/SHA256SUMS", + "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", + "evidence/beta8-package/package.manifest.json", + "evidence/beta8-package/stage-checksums.tsv", + "evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json", + "evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json", + "evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/src/brik.js", + "scripts/beta8-adversarial-gate.sh", + "scripts/beta8-compiler-functionality-gate.sh", + "scripts/beta8-package-smoke.sh", + "src/brik.js", "tests/smoke.sh" ], "commands": [ @@ -20,47 +30,47 @@ "name": "manifest_validate", "command": "node scripts/release-manifest-validate.js --allow-dirty", "rc": 0, - "elapsedMs": 198, - "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.8\nwarnings=worktree_dirty_allowed:5\n", + "elapsedMs": 157, + "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.8\nwarnings=worktree_dirty_allowed:15\n", "stderr": "" }, { "name": "smoke_tests", "command": "bash -lc BRIK64_RELEASE_GATES=1 bash -x tests/smoke.sh", "rc": 0, - "elapsedMs": 17200, + "elapsedMs": 14588, "stdout": "created=.brik/manifest.json\ncertificate=program.pcd.cert.json\ncertificate=polymer.pcd.cert.json\ncertificate=stale.pcd.cert.json\ncertificate=legacy.beta7.pcd.cert.json\ncertificate=variant.pcd.cert.json\nbrik64-cli bootstrap smoke: PASS\n", - "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 1 = 1 ']'\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-compiler-functionality-gate.sh\n+ grep -q PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-adversarial-gate.sh\n+ grep -q PASS_BRIK64_CLI_BETA8_ADVERSARIAL\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/build-beta8-package.sh\n+ grep -q PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\n+ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-package-smoke.sh\n+ grep -q decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\n+ node -e 'const fs=require(\"fs\"); const r=JSON.parse(fs.readFileSync(\"evidence/beta8-package/package.manifest.json\",\"utf8\")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes(\"curl_gcp_installer_beta8\")) process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/release-manifest-validate.js --allow-dirty\n+ grep -q decision=PASS_RELEASE_MANIFEST_VALIDATE\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-ts/program.ts\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-ts/program.test.ts\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S/escaped-out/program.ts\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.ts out-variant/program.ts\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.TUEc0Hcu4S\n" + "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 1 = 1 ']'\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-compiler-functionality-gate.sh\n+ beta8_functionality_out='{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:20:52Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}'\n+ grep -q PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-adversarial-gate.sh\n+ beta8_adversarial_out='{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:20:55Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}'\n+ grep -q PASS_BRIK64_CLI_BETA8_ADVERSARIAL\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/build-beta8-package.sh\n+ beta8_package_out='decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=80bacf12ee989e906e48cfb065a1ebad6f8eb0e46c21203164daac36e21d9ec7'\n+ grep -q PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-package-smoke.sh\n+ beta8_package_smoke_out='decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\nchecks=13'\n+ grep -q decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\n+ node -e 'const fs=require(\"fs\"); const r=JSON.parse(fs.readFileSync(\"evidence/beta8-package/package.manifest.json\",\"utf8\")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes(\"curl_gcp_installer_beta8\")) process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/release-manifest-validate.js --allow-dirty\n+ grep -q decision=PASS_RELEASE_MANIFEST_VALIDATE\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-ts/program.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-ts/program.test.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/escaped-out/program.mjs\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-l" }, { "name": "beta8_compiler_functionality", "command": "bash scripts/beta8-compiler-functionality-gate.sh", "rc": 0, - "elapsedMs": 2312, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:16:47Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:22a0904178aaba0faa8a5392a1750e636fd6d42537e69ecf166596e8269cae98\",\n \"test\": \"node out-ts/program.test.ts\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", + "elapsedMs": 2168, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:21:05Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", "stderr": "" }, { "name": "beta8_adversarial", "command": "bash scripts/beta8-adversarial-gate.sh", "rc": 0, - "elapsedMs": 2787, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:16:50Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:5867b88389d4f8a73bfeaf6794684ea8195ee40efced85922c08d121e00ad8ee\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", + "elapsedMs": 2236, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:21:07Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", "stderr": "" }, { "name": "beta8_local_package", "command": "bash scripts/build-beta8-package.sh", "rc": 0, - "elapsedMs": 762, - "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=5abb43d602f65e255b76f8e6baca4988a7f1d2cbd0946cda049b41afb343b962\n", + "elapsedMs": 609, + "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=0619c9bbea55bf6ac01fac80ed644e0f2afc51fb374b6f82a46402f0e982f531\n", "stderr": "" }, { "name": "beta8_package_smoke", "command": "bash scripts/beta8-package-smoke.sh", "rc": 0, - "elapsedMs": 2507, + "elapsedMs": 1480, "stdout": "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\nchecks=13\n", "stderr": "" } diff --git a/scripts/beta8-adversarial-gate.sh b/scripts/beta8-adversarial-gate.sh index ff64f341..853b3f61 100644 --- a/scripts/beta8-adversarial-gate.sh +++ b/scripts/beta8-adversarial-gate.sh @@ -106,7 +106,7 @@ PCD for target in ts rust python; do pass "emit_edge_$target" node "$BRIK" emit pcd/edge_precedence.pcd --target "$target" --out "edge-$target" --tests done - pass ts_edge node edge-ts/program.test.ts + pass ts_edge node edge-ts/program.test.mjs pass rust_compile_edge rustc edge-rust/program_test.rs -o edge-rust/program_test pass rust_edge ./edge-rust/program_test pass python_edge env PYTHONPATH=edge-python python3 edge-python/test_program.py diff --git a/scripts/beta8-compiler-functionality-gate.sh b/scripts/beta8-compiler-functionality-gate.sh index 88bbc396..fb7d0eba 100755 --- a/scripts/beta8-compiler-functionality-gate.sh +++ b/scripts/beta8-compiler-functionality-gate.sh @@ -91,7 +91,7 @@ PCD node "$BRIK" emit pcd/branch_math.pcd --target "$target" --out "out-$target" --tests >"/tmp/beta8-emit-$target.out" done - node out-ts/program.test.ts >"$TMP_DIR/ts.stdout" 2>"$TMP_DIR/ts.stderr" || block "ts_generated_test_failed" + node out-ts/program.test.mjs >"$TMP_DIR/ts.stdout" 2>"$TMP_DIR/ts.stderr" || block "ts_generated_test_failed" rustc out-rust/program_test.rs -o out-rust/program_test >"$TMP_DIR/rustc.stdout" 2>"$TMP_DIR/rustc.stderr" \ && ./out-rust/program_test >"$TMP_DIR/rust.stdout" 2>"$TMP_DIR/rust.stderr" \ || block "rust_generated_test_failed" @@ -118,7 +118,7 @@ if grep -q "Node.js\\|at .*src/brik" "$TMP_DIR"/*.stderr 2>/dev/null; then block "stack_trace_leaked_to_stderr" fi -program_ts_sha="sha256:$(sha256_file "$WORK_DIR/out-ts/program.ts")" +program_ts_sha="sha256:$(sha256_file "$WORK_DIR/out-ts/program.mjs")" program_rust_sha="sha256:$(sha256_file "$WORK_DIR/out-rust/program.rs")" program_python_sha="sha256:$(sha256_file "$WORK_DIR/out-python/program.py")" pcd_sha="sha256:$(sha256_file "$WORK_DIR/pcd/branch_math.pcd")" @@ -161,7 +161,7 @@ jq -n \ cliSha256:$cli_sha, fixture:{path:"pcd/branch_math.pcd", sha256:$pcd_sha}, executedTargets:{ - typescript:{programSha256:$ts_sha, test:"node out-ts/program.test.ts", passed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY")}, + typescript:{programSha256:$ts_sha, test:"node out-ts/program.test.mjs", passed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY")}, rust:{programSha256:$rust_sha, test:"rustc out-rust/program_test.rs && ./out-rust/program_test", passed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY")}, python:{programSha256:$python_sha, test:"PYTHONPATH=out-python python3 out-python/test_program.py", passed:($decision=="PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY")} }, diff --git a/scripts/beta8-package-smoke.sh b/scripts/beta8-package-smoke.sh index f7a8eabe..c4da7ca1 100644 --- a/scripts/beta8-package-smoke.sh +++ b/scripts/beta8-package-smoke.sh @@ -106,7 +106,7 @@ pushd "$WORK_DIR" >/dev/null for target in ts rust python; do run_pass "emit_$target" "generated=" env BRIK64_CONFIG_HOME="$CONFIG_HOME" node "$BRIK" emit program.pcd --target "$target" --out "out-$target" --tests done - run_pass ts_generated "brik64 generated ts test: PASS" node out-ts/program.test.ts + run_pass ts_generated "brik64 generated ts test: PASS" node out-ts/program.test.mjs run_pass rust_compile "" rustc out-rust/program_test.rs -o out-rust/program_test run_pass rust_generated "brik64 generated rust test: PASS" ./out-rust/program_test run_pass python_generated "brik64 generated python test: PASS" env PYTHONPATH=out-python python3 out-python/test_program.py diff --git a/src/brik.js b/src/brik.js index 1621b856..9ed63e7c 100755 --- a/src/brik.js +++ b/src/brik.js @@ -881,21 +881,21 @@ function targetSpec(target, ast) { const pythonStatements = renderStatements(ast.body, 'python', 1); const specs = { ts: { - program: 'program.ts', - test: 'program.test.ts', + program: 'program.mjs', + test: 'program.test.mjs', code: (hash) => [ '// BRIK64 beta8 functional emission candidate', '// claim: local candidate evidence only', `export const pcdSha256 = "${hash}";`, - `export const pcdAst = ${astJson} as const;`, - `export function run(${param} = 0): number {`, + `export const pcdAst = ${astJson};`, + `export function run(${param} = 0) {`, ...tsStatements, ' throw new Error("pcd execution reached non-returning path");', '}', '', ].join('\n'), testCode: (hash) => [ - 'import { pcdSha256, run } from "./program.ts";', + 'import { pcdSha256, run } from "./program.mjs";', '', 'if (pcdSha256 !== "' + hash + '") throw new Error("pcd hash mismatch");', `const cases = ${JSON.stringify(cases)};`, diff --git a/tests/smoke.sh b/tests/smoke.sh index 50cb98cf..a2ecdec6 100755 --- a/tests/smoke.sh +++ b/tests/smoke.sh @@ -23,10 +23,14 @@ node "$BRIK" engine status | grep -q '"runtimeMode": "portable_bir_bundle"' node "$BRIK" engine status | grep -q '"nativeExecutableIncluded": false' if [ "${BRIK64_RELEASE_GATES:-0}" = "1" ]; then - bash "$ROOT_DIR/scripts/beta8-compiler-functionality-gate.sh" | grep -q "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" - bash "$ROOT_DIR/scripts/beta8-adversarial-gate.sh" | grep -q "PASS_BRIK64_CLI_BETA8_ADVERSARIAL" - bash "$ROOT_DIR/scripts/build-beta8-package.sh" | grep -q "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT" - bash "$ROOT_DIR/scripts/beta8-package-smoke.sh" | grep -q "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE" + beta8_functionality_out="$(bash "$ROOT_DIR/scripts/beta8-compiler-functionality-gate.sh")" + grep -q "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY" <<<"$beta8_functionality_out" + beta8_adversarial_out="$(bash "$ROOT_DIR/scripts/beta8-adversarial-gate.sh")" + grep -q "PASS_BRIK64_CLI_BETA8_ADVERSARIAL" <<<"$beta8_adversarial_out" + beta8_package_out="$(bash "$ROOT_DIR/scripts/build-beta8-package.sh")" + grep -q "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT" <<<"$beta8_package_out" + beta8_package_smoke_out="$(bash "$ROOT_DIR/scripts/beta8-package-smoke.sh")" + grep -q "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE" <<<"$beta8_package_smoke_out" node -e 'const fs=require("fs"); const r=JSON.parse(fs.readFileSync("evidence/beta8-package/package.manifest.json","utf8")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes("curl_gcp_installer_beta8")) process.exit(1)' node "$ROOT_DIR/scripts/release-manifest-validate.js" --allow-dirty | grep -q "decision=PASS_RELEASE_MANIFEST_VALIDATE" fi @@ -99,8 +103,8 @@ for target in ts rust python; do grep -q "tests=" "/tmp/brik-emit-$target.out" done -test -f "$tmpdir/out-ts/program.ts" -test -f "$tmpdir/out-ts/program.test.ts" +test -f "$tmpdir/out-ts/program.mjs" +test -f "$tmpdir/out-ts/program.test.mjs" test -f "$tmpdir/out-rust/program.rs" test -f "$tmpdir/out-rust/program_test.rs" test -f "$tmpdir/out-python/program.py" @@ -117,7 +121,7 @@ if node "$BRIK" emit program.pcd --target ts --out ../escaped-out --tests >/tmp/ exit 1 fi grep -q "path_outside_workspace" /tmp/brik-out-traversal.err -test ! -e "$tmpdir/escaped-out/program.ts" +test ! -e "$tmpdir/escaped-out/program.mjs" mkdir readonly chmod 500 readonly @@ -183,7 +187,7 @@ PC variant { PCD node "$BRIK" certify variant.pcd node "$BRIK" emit variant.pcd --target ts --out out-variant --tests >/tmp/brik-emit-variant.out -if cmp -s out-ts/program.ts out-variant/program.ts; then +if cmp -s out-ts/program.mjs out-variant/program.mjs; then echo "different valid PCDs should emit different outputs" >&2 exit 1 fi From b9a6b5cdeaf7b60269c67fa9cefa2d8a9f0ea2cf Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:23:06 +0200 Subject: [PATCH 6/9] Avoid duplicate beta8 release gate mutation --- evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- evidence/beta8-package-smoke/report.json | 2 +- evidence/beta8-package/SHA256SUMS | 6 +-- .../beta8-package/brik64-cli-0.1.0-beta.8.tgz | Bin 24497 -> 24491 bytes evidence/beta8-package/package.manifest.json | 4 +- evidence/beta8-package/stage-checksums.tsv | 4 +- .../evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- .../release-manifest-validate/report.json | 10 ++--- evidence/release-train-dry-run/report.json | 40 ++++++------------ scripts/release-train-dry-run.js | 2 +- 12 files changed, 31 insertions(+), 45 deletions(-) diff --git a/evidence/beta8-adversarial/report.json b/evidence/beta8-adversarial/report.json index 43f74397..9a9d4949 100644 --- a/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:21:07Z", + "generatedAt": "2026-06-06T02:22:53Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json index df1106fd..d44fda21 100644 --- a/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:21:05Z", + "generatedAt": "2026-06-06T02:22:51Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/beta8-package-smoke/report.json b/evidence/beta8-package-smoke/report.json index 5b5ed7fc..1a3a832a 100644 --- a/evidence/beta8-package-smoke/report.json +++ b/evidence/beta8-package-smoke/report.json @@ -6,7 +6,7 @@ "lane": "cli_0_1_beta8", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "0619c9bbea55bf6ac01fac80ed644e0f2afc51fb374b6f82a46402f0e982f531" + "sha256": "06798d5ab53b224be48a84782faec351ca2e32bcd08063bd4098f8c27b019084" }, "checks": [ "extract", diff --git a/evidence/beta8-package/SHA256SUMS b/evidence/beta8-package/SHA256SUMS index 8ac4026a..abcc483a 100644 --- a/evidence/beta8-package/SHA256SUMS +++ b/evidence/beta8-package/SHA256SUMS @@ -1,3 +1,3 @@ -0619c9bbea55bf6ac01fac80ed644e0f2afc51fb374b6f82a46402f0e982f531 brik64-cli-0.1.0-beta.8.tgz -074856b80ef3cd5d374beccd8f65a4c0cfda1f1fa2ea11f3a86365e1419bd3e6 package.manifest.json -37e5b71644bcf52cce760473a85ca9a837465cf20433e4eac539fb0e28086478 stage-checksums.tsv +06798d5ab53b224be48a84782faec351ca2e32bcd08063bd4098f8c27b019084 brik64-cli-0.1.0-beta.8.tgz +dbd810a5a2c4c5723ecb791a09b94bad0b11f2799cdb4c0bb949aa95af6ded06 package.manifest.json +f34280c1f195d5389ffaf264f2f3871d4356952ecf9b4a01f623224e84c3b2ae stage-checksums.tsv diff --git a/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz b/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz index 4764f1f6aceaafea67fb43c7571a43b56249dd98..8bd4aa2d0ccc80a213a4e5d4c6f53e830f77e832 100644 GIT binary patch delta 24231 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 delta 24182 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 diff --git a/evidence/beta8-package/package.manifest.json b/evidence/beta8-package/package.manifest.json index 69c05aed..eed9298e 100644 --- a/evidence/beta8-package/package.manifest.json +++ b/evidence/beta8-package/package.manifest.json @@ -7,8 +7,8 @@ "generationClaim": "internal_generation_non_claim", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "0619c9bbea55bf6ac01fac80ed644e0f2afc51fb374b6f82a46402f0e982f531", - "bytes": 24497 + "sha256": "06798d5ab53b224be48a84782faec351ca2e32bcd08063bd4098f8c27b019084", + "bytes": 24491 }, "inputGates": [ "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/beta8-package/stage-checksums.tsv b/evidence/beta8-package/stage-checksums.tsv index 91014a33..a2eead3c 100644 --- a/evidence/beta8-package/stage-checksums.tsv +++ b/evidence/beta8-package/stage-checksums.tsv @@ -7,8 +7,8 @@ cf39e055374caeecaac773d9802098a7c1717e271be4b00c25d2a2a9bf157aa1 SECURITY.md 11a5eadb7ec6f7d07e329c767026ae9576bdaf99c1d411781e5f88108e7d852e engines/l4plus-n5/checksums.tsv 221774c3a8f9e1cf630521a12a2a62f265d34313cdeaf7bb30ca69f60bd3a8d8 engines/l4plus-n5/runtime-bundle.manifest.json 6f2a3eff7b3cbf80debb823f1771df5364d6f1fdf2c0b6c2dab8e109c04dc757 engines/l4plus-n5/serial.txt -8bc83425ab2e6365ff84409d47b152858ad8e0625a4e3762554e35b24e384b57 evidence/beta8-adversarial/report.json -d3d9c9b637583fdbf52dfb350910fe736443d488a3b997d737e6deac170f6345 evidence/beta8-compiler-functionality/report.json +3e55f1684a3ada142a12407ed4c6581ec6b2adb7584e4c907ba66fd66ba35f4e evidence/beta8-adversarial/report.json +1b41311c5c62d3d5ebe157eb6b97c745fce84d1f7616e52c270bc887b08a1c92 evidence/beta8-compiler-functionality/report.json 3b99b7e885e6bf2d730bd7f4ca3c3bae00270f775523c66150d21d2004e70628 package.json 2a629b0c88a96c81a42f3e5949900798fe25886aec7ac203855ba7540cd3b36c pcd/cli_account_session.pcd ff48eaeb3848e39c5400fcbb9fc293e5fffb649db2e32454f900080be660ef1c pcd/cli_core.pcd diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json index 43f74397..9a9d4949 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:21:07Z", + "generatedAt": "2026-06-06T02:22:53Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json index df1106fd..d44fda21 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:21:05Z", + "generatedAt": "2026-06-06T02:22:51Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/release-manifest-validate/report.json b/evidence/release-manifest-validate/report.json index d88d0421..70e01bde 100644 --- a/evidence/release-manifest-validate/report.json +++ b/evidence/release-manifest-validate/report.json @@ -22,33 +22,33 @@ "path": "evidence/beta8-compiler-functionality/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", "actualDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", - "sha256": "642fb0c712a306f041d4410103c2c264cb4dd1cf1b2c06725212c904ce0b2ee8" + "sha256": "d3d9c9b637583fdbf52dfb350910fe736443d488a3b997d737e6deac170f6345" }, { "id": "adversarial", "path": "evidence/beta8-adversarial/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", "actualDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", - "sha256": "6ec70bd2a2d1263570545eaf2e29b3ee7a43e25eff1ffc0fe0be5c213b47c78b" + "sha256": "8bc83425ab2e6365ff84409d47b152858ad8e0625a4e3762554e35b24e384b57" }, { "id": "localPackage", "path": "evidence/beta8-package/package.manifest.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", "actualDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", - "sha256": "cf77c66dfdbeeb2522b9c0c349a3189163dfbef82197ecd27f0f0b7554a36f91" + "sha256": "074856b80ef3cd5d374beccd8f65a4c0cfda1f1fa2ea11f3a86365e1419bd3e6" }, { "id": "localPackageSmoke", "path": "evidence/beta8-package-smoke/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", "actualDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", - "sha256": "601e16d5fb93174d5e4f88c847259b818d89f48b840b994c4700b0c804496c23" + "sha256": "adec42d0362f9db8cf1dfc39377f917053d1b912b33788a7ae1701741f3d0efc" } ] }, "failures": [], "warnings": [ - "worktree_dirty_allowed:15" + "worktree_dirty_allowed:1" ] } diff --git a/evidence/release-train-dry-run/report.json b/evidence/release-train-dry-run/report.json index 0ce60972..1983d3a2 100644 --- a/evidence/release-train-dry-run/report.json +++ b/evidence/release-train-dry-run/report.json @@ -9,68 +9,54 @@ "publicationAllowed": false, "boundary": "Dry-run only. This workflow validates manifest, tests and evidence but never publishes public artifacts.", "initialDirtyFiles": [ - "evidence/beta8-adversarial/report.json", - "evidence/beta8-compiler-functionality/report.json", - "evidence/beta8-package-smoke/report.json", - "evidence/beta8-package/SHA256SUMS", - "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "evidence/beta8-package/package.manifest.json", - "evidence/beta8-package/stage-checksums.tsv", - "evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json", - "evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json", - "evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/src/brik.js", - "scripts/beta8-adversarial-gate.sh", - "scripts/beta8-compiler-functionality-gate.sh", - "scripts/beta8-package-smoke.sh", - "src/brik.js", - "tests/smoke.sh" + "scripts/release-train-dry-run.js" ], "commands": [ { "name": "manifest_validate", "command": "node scripts/release-manifest-validate.js --allow-dirty", "rc": 0, - "elapsedMs": 157, - "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.8\nwarnings=worktree_dirty_allowed:15\n", + "elapsedMs": 147, + "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.8\nwarnings=worktree_dirty_allowed:1\n", "stderr": "" }, { "name": "smoke_tests", - "command": "bash -lc BRIK64_RELEASE_GATES=1 bash -x tests/smoke.sh", + "command": "bash -lc bash -x tests/smoke.sh", "rc": 0, - "elapsedMs": 14588, + "elapsedMs": 3256, "stdout": "created=.brik/manifest.json\ncertificate=program.pcd.cert.json\ncertificate=polymer.pcd.cert.json\ncertificate=stale.pcd.cert.json\ncertificate=legacy.beta7.pcd.cert.json\ncertificate=variant.pcd.cert.json\nbrik64-cli bootstrap smoke: PASS\n", - "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 1 = 1 ']'\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-compiler-functionality-gate.sh\n+ beta8_functionality_out='{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:20:52Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}'\n+ grep -q PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-adversarial-gate.sh\n+ beta8_adversarial_out='{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:20:55Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}'\n+ grep -q PASS_BRIK64_CLI_BETA8_ADVERSARIAL\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/build-beta8-package.sh\n+ beta8_package_out='decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=80bacf12ee989e906e48cfb065a1ebad6f8eb0e46c21203164daac36e21d9ec7'\n+ grep -q PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\n++ bash /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/beta8-package-smoke.sh\n+ beta8_package_smoke_out='decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\nchecks=13'\n+ grep -q decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\n+ node -e 'const fs=require(\"fs\"); const r=JSON.parse(fs.readFileSync(\"evidence/beta8-package/package.manifest.json\",\"utf8\")); if (r.releaseEligible !== false || !r.requiredPublicReleaseGates.includes(\"curl_gcp_installer_beta8\")) process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/scripts/release-manifest-validate.js --allow-dirty\n+ grep -q decision=PASS_RELEASE_MANIFEST_VALIDATE\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-ts/program.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-ts/program.test.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.jLNfZBiL5j/escaped-out/program.mjs\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-l" + "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 0 = 1 ']'\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-ts/program.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-ts/program.test.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/escaped-out/program.mjs\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.mjs out-variant/program.mjs\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R\n" }, { "name": "beta8_compiler_functionality", "command": "bash scripts/beta8-compiler-functionality-gate.sh", "rc": 0, - "elapsedMs": 2168, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:21:05Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", + "elapsedMs": 2028, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:22:51Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", "stderr": "" }, { "name": "beta8_adversarial", "command": "bash scripts/beta8-adversarial-gate.sh", "rc": 0, - "elapsedMs": 2236, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:21:07Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", + "elapsedMs": 1897, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:22:53Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", "stderr": "" }, { "name": "beta8_local_package", "command": "bash scripts/build-beta8-package.sh", "rc": 0, - "elapsedMs": 609, - "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=0619c9bbea55bf6ac01fac80ed644e0f2afc51fb374b6f82a46402f0e982f531\n", + "elapsedMs": 444, + "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=06798d5ab53b224be48a84782faec351ca2e32bcd08063bd4098f8c27b019084\n", "stderr": "" }, { "name": "beta8_package_smoke", "command": "bash scripts/beta8-package-smoke.sh", "rc": 0, - "elapsedMs": 1480, + "elapsedMs": 1247, "stdout": "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\nchecks=13\n", "stderr": "" } diff --git a/scripts/release-train-dry-run.js b/scripts/release-train-dry-run.js index 61b99841..01f0f867 100644 --- a/scripts/release-train-dry-run.js +++ b/scripts/release-train-dry-run.js @@ -170,7 +170,7 @@ function main() { ...(beta === 6 && runLiveL6Gate ? [run('beta6_l6_hetzner_generation_gate', ['node', 'scripts/beta6-l6-hetzner-generation-gate.js'])] : []), - run('smoke_tests', ['bash', '-lc', 'BRIK64_RELEASE_GATES=1 bash -x tests/smoke.sh'], { + run('smoke_tests', ['bash', '-lc', beta === 8 ? 'bash -x tests/smoke.sh' : 'BRIK64_RELEASE_GATES=1 bash -x tests/smoke.sh'], { stdoutLimit: 12000, stderrLimit: 12000 }), From d3df5870625b44a422ed62b5af1c43f668a7c163 Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:24:28 +0200 Subject: [PATCH 7/9] Harden release train evidence parsing --- evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- evidence/beta8-package-smoke/report.json | 2 +- evidence/beta8-package/SHA256SUMS | 6 +++--- .../beta8-package/brik64-cli-0.1.0-beta.8.tgz | Bin 24491 -> 24497 bytes evidence/beta8-package/package.manifest.json | 4 ++-- evidence/beta8-package/stage-checksums.tsv | 4 ++-- .../evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- .../release-manifest-validate/report.json | 8 +++---- evidence/release-train-dry-run/report.json | 20 +++++++++--------- scripts/release-train-dry-run.js | 12 ++++++++++- 12 files changed, 37 insertions(+), 27 deletions(-) diff --git a/evidence/beta8-adversarial/report.json b/evidence/beta8-adversarial/report.json index 9a9d4949..12fbf59d 100644 --- a/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:22:53Z", + "generatedAt": "2026-06-06T02:24:19Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json index d44fda21..d9de0329 100644 --- a/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:22:51Z", + "generatedAt": "2026-06-06T02:24:17Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/beta8-package-smoke/report.json b/evidence/beta8-package-smoke/report.json index 1a3a832a..78db2503 100644 --- a/evidence/beta8-package-smoke/report.json +++ b/evidence/beta8-package-smoke/report.json @@ -6,7 +6,7 @@ "lane": "cli_0_1_beta8", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "06798d5ab53b224be48a84782faec351ca2e32bcd08063bd4098f8c27b019084" + "sha256": "32e043439fa9aac798782487094d72fd31005431ced26fb2c2fb18c1ee6b52d3" }, "checks": [ "extract", diff --git a/evidence/beta8-package/SHA256SUMS b/evidence/beta8-package/SHA256SUMS index abcc483a..ebf945ff 100644 --- a/evidence/beta8-package/SHA256SUMS +++ b/evidence/beta8-package/SHA256SUMS @@ -1,3 +1,3 @@ -06798d5ab53b224be48a84782faec351ca2e32bcd08063bd4098f8c27b019084 brik64-cli-0.1.0-beta.8.tgz -dbd810a5a2c4c5723ecb791a09b94bad0b11f2799cdb4c0bb949aa95af6ded06 package.manifest.json -f34280c1f195d5389ffaf264f2f3871d4356952ecf9b4a01f623224e84c3b2ae stage-checksums.tsv +32e043439fa9aac798782487094d72fd31005431ced26fb2c2fb18c1ee6b52d3 brik64-cli-0.1.0-beta.8.tgz +0e561ee05f3867a81cf2a898c2bef48ca420176455effa81fd646e85b7f50e4b package.manifest.json +f409d1e48fc44b77e2f73a93e0d2fe1591f78dbe89b29432ae583a3938409e60 stage-checksums.tsv diff --git a/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz b/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz index 8bd4aa2d0ccc80a213a4e5d4c6f53e830f77e832..5db5b8e5a277e53f9502e2716594e670a326cdf4 100644 GIT binary patch delta 23371 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 delta 23467 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 { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 0 = 1 ']'\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-ts/program.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-ts/program.test.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R/escaped-out/program.mjs\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.mjs out-variant/program.mjs\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.1Y71RJ2Y0R\n" + "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 0 = 1 ']'\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-ts/program.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-ts/program.test.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/escaped-out/program.mjs\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.mjs out-variant/program.mjs\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n" }, { "name": "beta8_compiler_functionality", "command": "bash scripts/beta8-compiler-functionality-gate.sh", "rc": 0, - "elapsedMs": 2028, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:22:51Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", + "elapsedMs": 1936, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:24:17Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", "stderr": "" }, { "name": "beta8_adversarial", "command": "bash scripts/beta8-adversarial-gate.sh", "rc": 0, - "elapsedMs": 1897, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:22:53Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", + "elapsedMs": 1743, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:24:19Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", "stderr": "" }, { "name": "beta8_local_package", "command": "bash scripts/build-beta8-package.sh", "rc": 0, - "elapsedMs": 444, - "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=06798d5ab53b224be48a84782faec351ca2e32bcd08063bd4098f8c27b019084\n", + "elapsedMs": 452, + "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=32e043439fa9aac798782487094d72fd31005431ced26fb2c2fb18c1ee6b52d3\n", "stderr": "" }, { "name": "beta8_package_smoke", "command": "bash scripts/beta8-package-smoke.sh", "rc": 0, - "elapsedMs": 1247, + "elapsedMs": 1129, "stdout": "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\nchecks=13\n", "stderr": "" } diff --git a/scripts/release-train-dry-run.js b/scripts/release-train-dry-run.js index 01f0f867..1945b59f 100644 --- a/scripts/release-train-dry-run.js +++ b/scripts/release-train-dry-run.js @@ -14,7 +14,17 @@ process.stdout.on('error', (error) => { }); function readJson(file) { - return JSON.parse(fs.readFileSync(file, 'utf8')); + let text = ''; + for (let attempt = 0; attempt < 5; attempt += 1) { + text = fs.readFileSync(file, 'utf8'); + if (text.trim().length > 0) break; + childProcess.spawnSync('node', ['-e', 'Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100)']); + } + try { + return JSON.parse(text); + } catch (error) { + throw new Error(`json_parse_failed:${path.relative(root, file)}:${error.message}`); + } } function readText(file) { From bb95a2cf9cbc855b0c2a59b79224a33413bdb6df Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:26:23 +0200 Subject: [PATCH 8/9] Make beta8 package manifest portable on Linux --- evidence/beta8-package-smoke/report.json | 2 +- evidence/beta8-package/SHA256SUMS | 6 ++-- .../beta8-package/brik64-cli-0.1.0-beta.8.tgz | Bin 24497 -> 24485 bytes evidence/beta8-package/package.manifest.json | 4 +-- evidence/beta8-package/stage-checksums.tsv | 4 +-- .../evidence/beta8-adversarial/report.json | 2 +- .../beta8-compiler-functionality/report.json | 2 +- .../release-manifest-validate/report.json | 10 +++---- evidence/release-train-dry-run/report.json | 28 ++++++++++-------- scripts/build-beta8-package.sh | 3 +- 10 files changed, 33 insertions(+), 28 deletions(-) diff --git a/evidence/beta8-package-smoke/report.json b/evidence/beta8-package-smoke/report.json index 78db2503..e90f3c94 100644 --- a/evidence/beta8-package-smoke/report.json +++ b/evidence/beta8-package-smoke/report.json @@ -6,7 +6,7 @@ "lane": "cli_0_1_beta8", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "32e043439fa9aac798782487094d72fd31005431ced26fb2c2fb18c1ee6b52d3" + "sha256": "6138e0f330f0843e0469ae9483497ccaacfc56db096c8ee691e21a69d566823a" }, "checks": [ "extract", diff --git a/evidence/beta8-package/SHA256SUMS b/evidence/beta8-package/SHA256SUMS index ebf945ff..aa683aea 100644 --- a/evidence/beta8-package/SHA256SUMS +++ b/evidence/beta8-package/SHA256SUMS @@ -1,3 +1,3 @@ -32e043439fa9aac798782487094d72fd31005431ced26fb2c2fb18c1ee6b52d3 brik64-cli-0.1.0-beta.8.tgz -0e561ee05f3867a81cf2a898c2bef48ca420176455effa81fd646e85b7f50e4b package.manifest.json -f409d1e48fc44b77e2f73a93e0d2fe1591f78dbe89b29432ae583a3938409e60 stage-checksums.tsv +6138e0f330f0843e0469ae9483497ccaacfc56db096c8ee691e21a69d566823a brik64-cli-0.1.0-beta.8.tgz +0d8816da52deffafa71b9c016450b99d6652987efa495062603deab33dff3eb1 package.manifest.json +8b5fcf5b9f322573e57a6e6e3518c37d97c863eea39312d30bdb4d2d22d19a55 stage-checksums.tsv diff --git a/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz b/evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz index 5db5b8e5a277e53f9502e2716594e670a326cdf4..b43377143f7c0213c0f91d3f179403ad525605af 100644 GIT binary patch delta 21149 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 delta 21169 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 U`)r@>^SAQ+|MZm9(*SA$0G$a!aR2}S diff --git a/evidence/beta8-package/package.manifest.json b/evidence/beta8-package/package.manifest.json index 17c781fb..fbc37bea 100644 --- a/evidence/beta8-package/package.manifest.json +++ b/evidence/beta8-package/package.manifest.json @@ -7,8 +7,8 @@ "generationClaim": "internal_generation_non_claim", "package": { "path": "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", - "sha256": "32e043439fa9aac798782487094d72fd31005431ced26fb2c2fb18c1ee6b52d3", - "bytes": 24497 + "sha256": "6138e0f330f0843e0469ae9483497ccaacfc56db096c8ee691e21a69d566823a", + "bytes": 24485 }, "inputGates": [ "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/beta8-package/stage-checksums.tsv b/evidence/beta8-package/stage-checksums.tsv index be622f65..cc551db4 100644 --- a/evidence/beta8-package/stage-checksums.tsv +++ b/evidence/beta8-package/stage-checksums.tsv @@ -7,8 +7,8 @@ cf39e055374caeecaac773d9802098a7c1717e271be4b00c25d2a2a9bf157aa1 SECURITY.md 11a5eadb7ec6f7d07e329c767026ae9576bdaf99c1d411781e5f88108e7d852e engines/l4plus-n5/checksums.tsv 221774c3a8f9e1cf630521a12a2a62f265d34313cdeaf7bb30ca69f60bd3a8d8 engines/l4plus-n5/runtime-bundle.manifest.json 6f2a3eff7b3cbf80debb823f1771df5364d6f1fdf2c0b6c2dab8e109c04dc757 engines/l4plus-n5/serial.txt -5185756af6ec5107b1fe02ecf1e214e0e1c7fcae680d48da38c11c5a1e8bf8ed evidence/beta8-adversarial/report.json -b23cbe462ac72573e9f1964e38c1563d3c3743c287d3656c79595bad7eea7c15 evidence/beta8-compiler-functionality/report.json +c447d0d037ef61d67f7fcd8609807fb8e75b7470171ea76fd497ccaeed8275e9 evidence/beta8-adversarial/report.json +e6bdb94bdb68f81c1ea13d520d193cbb5985ae842c9d0cc7983677c1a4906616 evidence/beta8-compiler-functionality/report.json 3b99b7e885e6bf2d730bd7f4ca3c3bae00270f775523c66150d21d2004e70628 package.json 2a629b0c88a96c81a42f3e5949900798fe25886aec7ac203855ba7540cd3b36c pcd/cli_account_session.pcd ff48eaeb3848e39c5400fcbb9fc293e5fffb649db2e32454f900080be660ef1c pcd/cli_core.pcd diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json index 12fbf59d..b9eb2c15 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:24:19Z", + "generatedAt": "2026-06-06T02:26:14Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json index d9de0329..7ee87298 100644 --- a/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-package/stage/brik64-cli-0.1.0-beta.8/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:24:17Z", + "generatedAt": "2026-06-06T02:26:12Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", diff --git a/evidence/release-manifest-validate/report.json b/evidence/release-manifest-validate/report.json index ad34218b..d023d433 100644 --- a/evidence/release-manifest-validate/report.json +++ b/evidence/release-manifest-validate/report.json @@ -22,33 +22,33 @@ "path": "evidence/beta8-compiler-functionality/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", "actualDecision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY", - "sha256": "1b41311c5c62d3d5ebe157eb6b97c745fce84d1f7616e52c270bc887b08a1c92" + "sha256": "b23cbe462ac72573e9f1964e38c1563d3c3743c287d3656c79595bad7eea7c15" }, { "id": "adversarial", "path": "evidence/beta8-adversarial/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", "actualDecision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", - "sha256": "3e55f1684a3ada142a12407ed4c6581ec6b2adb7584e4c907ba66fd66ba35f4e" + "sha256": "5185756af6ec5107b1fe02ecf1e214e0e1c7fcae680d48da38c11c5a1e8bf8ed" }, { "id": "localPackage", "path": "evidence/beta8-package/package.manifest.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", "actualDecision": "PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT", - "sha256": "dbd810a5a2c4c5723ecb791a09b94bad0b11f2799cdb4c0bb949aa95af6ded06" + "sha256": "674b83be8e8f1f71d540c2cc7dcc639692d80256666aa4a6c9ba310f5e004abe" }, { "id": "localPackageSmoke", "path": "evidence/beta8-package-smoke/report.json", "expectedDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", "actualDecision": "PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE", - "sha256": "2e447f4c6c92886cd70a380a3dc94fe64ed040448e345d3f9025013c668c0f88" + "sha256": "c16c5985477d29a9da963c4b22338f9d533a2e94edba16da0d1caea09d5c05dd" } ] }, "failures": [], "warnings": [ - "worktree_dirty_allowed:1" + "worktree_dirty_allowed:5" ] } diff --git a/evidence/release-train-dry-run/report.json b/evidence/release-train-dry-run/report.json index 893a9865..3971d096 100644 --- a/evidence/release-train-dry-run/report.json +++ b/evidence/release-train-dry-run/report.json @@ -9,54 +9,58 @@ "publicationAllowed": false, "boundary": "Dry-run only. This workflow validates manifest, tests and evidence but never publishes public artifacts.", "initialDirtyFiles": [ - "scripts/release-train-dry-run.js" + "evidence/beta8-package-smoke/report.json", + "evidence/beta8-package/SHA256SUMS", + "evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz", + "evidence/beta8-package/package.manifest.json", + "scripts/build-beta8-package.sh" ], "commands": [ { "name": "manifest_validate", "command": "node scripts/release-manifest-validate.js --allow-dirty", "rc": 0, - "elapsedMs": 105, - "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.8\nwarnings=worktree_dirty_allowed:1\n", + "elapsedMs": 93, + "stdout": "decision=PASS_RELEASE_MANIFEST_VALIDATE\nversion=0.1.0-beta.8\nwarnings=worktree_dirty_allowed:5\n", "stderr": "" }, { "name": "smoke_tests", "command": "bash -lc bash -x tests/smoke.sh", "rc": 0, - "elapsedMs": 3277, + "elapsedMs": 3265, "stdout": "created=.brik/manifest.json\ncertificate=program.pcd.cert.json\ncertificate=polymer.pcd.cert.json\ncertificate=stale.pcd.cert.json\ncertificate=legacy.beta7.pcd.cert.json\ncertificate=variant.pcd.cert.json\nbrik64-cli bootstrap smoke: PASS\n", - "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 0 = 1 ']'\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-ts/program.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-ts/program.test.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO/escaped-out/program.mjs\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.mjs out-variant/program.mjs\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.rwnvRcgmJO\n" + "stderr": "+ set -euo pipefail\n+++ dirname tests/smoke.sh\n++ cd tests/..\n++ pwd\n+ ROOT_DIR=/Users/carlosjperez/Documents/GitHub/brik64-cli\n+ BRIK=/Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js\n++ node -e 'const fs=require(\"fs\"); process.stdout.write(JSON.parse(fs.readFileSync(\"package.json\",\"utf8\")).version)'\n+ PACKAGE_VERSION=0.1.0-beta.8\n++ mktemp -d\n+ tmpdir=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ\n+ trap cleanup EXIT\n+ export BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/config\n+ BRIK64_CONFIG_HOME=/var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/config\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ grep -q 'BRIK64 CLI 0.1.0-beta.8'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --version\n+ node -e 'let s=\"\"; process.stdin.on(\"data\", (d) => { s += d; }); process.stdin.on(\"end\", () => { s = s.replace(/\\x1b\\[[0-9;]*m/g, \"\"); if (!s.includes(\"█████████████\") || !s.includes(\"▒▒▒▒▒▒▒▒▒▒▒▒\")) process.exit(1); });'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q status=public_beta\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'polymerize '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'verify '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js --help\n+ grep -q 'migrate '\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q 'BRIK64 workspace doctor'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"status\": \"PASS\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"localRuntime\": \"available\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor --json\n+ grep -q '\"internalArtifactFactory\": \"private\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"runtimeMode\": \"portable_bir_bundle\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js engine status\n+ grep -q '\"nativeExecutableIncluded\": false'\n+ '[' 0 = 1 ']'\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ test -f .brik/manifest.json\n+ test '!' -f AGENTS.md\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.engineTierPolicy.registeredManagedRuntime !== \"managed_platform\") process.exit(1)'\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); if (m.preferred_engine !== \"auto\" || m.polymer_strategy !== \"local_ast\" || m.managed_platform.routing !== \"local_default\") process.exit(1)'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js account status\n+ grep -q 'tier: free'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js login --token-env BRIK64_MISSING_TOKEN\n+ grep -q login_token_env_missing /tmp/brik-login.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q pcd_inventory_empty /tmp/brik-empty-doctor.err\n+ cat\n+ cd /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q certificate_required /tmp/brik-emit.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd\n+ grep -q pcd_sha256=\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd\n+ grep -q verification=PASS\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_local_verify_report.v1\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js verify program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-verify-cloud.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --out polymer.pcd --json\n+ grep -q '\"schemaVersion\": \"brik64.cli_polymer_manifest.v1\"'\n+ test -f polymer.pcd\n+ test -f polymer.pcd.manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify polymer.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js polymerize program.pcd --cloud\n+ grep -q managed_entitlement_required /tmp/brik-poly-cloud.err\n+ for target in ts rust python\n+ out=out-ts\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out out-ts --tests\n+ grep -q generated= /tmp/brik-emit-ts.out\n+ grep -q tests= /tmp/brik-emit-ts.out\n+ for target in ts rust python\n+ out=out-rust\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target rust --out out-rust --tests\n+ grep -q generated= /tmp/brik-emit-rust.out\n+ grep -q tests= /tmp/brik-emit-rust.out\n+ for target in ts rust python\n+ out=out-python\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target python --out out-python --tests\n+ grep -q generated= /tmp/brik-emit-python.out\n+ grep -q tests= /tmp/brik-emit-python.out\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/out-ts/program.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/out-ts/program.test.mjs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/out-rust/program.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/out-rust/program_test.rs\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/out-python/program.py\n+ test -f /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/out-python/test_program.py\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target go --out out-go --tests\n+ grep -q unsupported_target /tmp/brik-emit-go.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out ../escaped-out --tests\n+ grep -q path_outside_workspace /tmp/brik-out-traversal.err\n+ test '!' -e /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ/escaped-out/program.mjs\n+ mkdir readonly\n+ chmod 500 readonly\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit program.pcd --target ts --out readonly/child --tests\n+ chmod 700 readonly\n+ grep -q filesystem_mkdir_error /tmp/brik-readonly.err\n+ grep -q 'at Object\\.mkdirSync\\|Node\\.js' /tmp/brik-readonly.err\n+ cp program.pcd stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify stale.pcd\n+ perl -0pi -e 's/return 2;/return 3;/' stale.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit stale.pcd\n+ grep -q certificate_hash_mismatch /tmp/brik-stale.err\n+ touch empty.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify empty.pcd\n+ grep -q pcd_empty /tmp/brik-empty.err\n+ printf 'not a pcd\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify corrupt.pcd\n+ grep -q pcd_parse_error /tmp/brik-corrupt.err\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.pcd\n+ grep -q 'brik64 migrate' /tmp/brik-legacy-cert.err\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js migrate legacy.pcd --out legacy.beta7.pcd --json\n+ grep -q '\"detectedSyntax\": \"legacy_lowercase_pc\"'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify legacy.beta7.pcd\n+ cat\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify variant.pcd\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js emit variant.pcd --target ts --out out-variant --tests\n+ cmp -s out-ts/program.mjs out-variant/program.mjs\n+ printf '{ corrupted_json\\n'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js certify program.pcd\n+ grep -q manifest_parse_error /tmp/brik-bad-manifest.err\n+ rm .brik/manifest.json\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js init\n+ node -e 'const fs=require(\"fs\"); const m=JSON.parse(fs.readFileSync(\".brik/manifest.json\",\"utf8\")); m.engineTierPolicy.l6DistributionAllowed=true; fs.writeFileSync(\".brik/manifest.json\", JSON.stringify(m,null,2)+\"\\n\")'\n+ node /Users/carlosjperez/Documents/GitHub/brik64-cli/src/brik.js doctor\n+ grep -q engine_tier_policy_l6_distribution_open /tmp/brik-bad-tier.err\n+ echo 'brik64-cli bootstrap smoke: PASS'\n+ cleanup\n+ rm -rf /var/folders/rh/rrm90qbs1_qc0816bjfd4hwh0000gn/T/tmp.kGNC227XfQ\n" }, { "name": "beta8_compiler_functionality", "command": "bash scripts/beta8-compiler-functionality-gate.sh", "rc": 0, - "elapsedMs": 1936, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:24:17Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", + "elapsedMs": 1390, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_compiler_functionality_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:26:12Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"fixture\": {\n \"path\": \"pcd/branch_math.pcd\",\n \"sha256\": \"sha256:09742f0ef4d80b4f465da256d8d44b4c587306c07015ecb77cada308c1d70404\"\n },\n \"executedTargets\": {\n \"typescript\": {\n \"programSha256\": \"sha256:608f6244ed6563765b31e6e42b722eb2c7889b87f7fdb7ca5e86740eb1675a95\",\n \"test\": \"node out-ts/program.test.mjs\",\n \"passed\": true\n },\n \"rust\": {\n \"programSha256\": \"sha256:bbe9b972902349fdb4b5884858e840b2c004c2173eb24f605958a913d6075e5d\",\n \"test\": \"rustc out-rust/program_test.rs && ./out-rust/program_test\",\n \"passed\": true\n },\n \"python\": {\n \"programSha256\": \"sha256:ca5c353fdd06e4b65b9b6366deea679b2816544af1843932ecdb59d471a742b6\",\n \"test\": \"PYTHONPATH=out-python python3 out-python/test_program.py\",\n \"passed\": true\n }\n },\n \"adversarial\": {\n \"unknown_identifier_fail_closed\": true,\n \"unsupported_target_fail_closed\": true,\n \"path_traversal_fail_closed\": true,\n \"stack_trace_leaked\": false\n },\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"compiler_functionality_claim_allowed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 adversarial gate and package smoke before public release train\"\n}\n", "stderr": "" }, { "name": "beta8_adversarial", "command": "bash scripts/beta8-adversarial-gate.sh", "rc": 0, - "elapsedMs": 1743, - "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:24:19Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", + "elapsedMs": 1784, + "stdout": "{\n \"schemaVersion\": \"brik64.cli_beta8_adversarial_gate.v1\",\n \"generatedAt\": \"2026-06-06T02:26:14Z\",\n \"iter_id\": \"BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1\",\n \"lane\": \"cli_0_1_beta8\",\n \"decision\": \"PASS_BRIK64_CLI_BETA8_ADVERSARIAL\",\n \"rc\": 0,\n \"cliVersion\": \"0.1.0-beta.8\",\n \"cliSha256\": \"sha256:63f28a941626edb18cee7b794e9f3c05acdc29db94e8387e02809ed402a7f8ed\",\n \"executableEdgeFixture\": {\n \"path\": \"pcd/edge_precedence.pcd\",\n \"sha256\": \"sha256:de6c384a4f4146f78e1ea040176206b49aed6725a35db10b447a8d42fe75bf63\"\n },\n \"passChecks\": 9,\n \"failClosedChecks\": 12,\n \"generatedTargetExecution\": {\n \"typescript\": true,\n \"rust\": true,\n \"python\": true\n },\n \"failClosedSurface\": [\n \"empty_pcd\",\n \"binary_input\",\n \"too_large_input\",\n \"legacy_syntax\",\n \"missing_fn\",\n \"too_many_params\",\n \"invalid_param\",\n \"missing_return\",\n \"unsupported_statement\",\n \"unsupported_expression_token\",\n \"malformed_expression\",\n \"unclosed_block\"\n ],\n \"claim_boundary\": {\n \"public_claims_allowed\": false,\n \"public_release_allowed\": false,\n \"adversarial_gate_passed\": true,\n \"compiler_functionality_scope\": \"supported_beta8_pcd_subset_only\",\n \"fixpoint_claim_allowed\": false,\n \"n5_formal_claim_allowed\": false,\n \"rust_independence_claim_allowed\": false\n },\n \"blockers\": [],\n \"warnings\": [],\n \"next_action\": \"run beta8 package smoke and release-train sync gates\"\n}\n", "stderr": "" }, { "name": "beta8_local_package", "command": "bash scripts/build-beta8-package.sh", "rc": 0, - "elapsedMs": 452, - "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=32e043439fa9aac798782487094d72fd31005431ced26fb2c2fb18c1ee6b52d3\n", + "elapsedMs": 467, + "stdout": "decision=PASS_BRIK64_CLI_BETA8_PACKAGE_BUILT\nreleaseEligible=false\npackage=evidence/beta8-package/brik64-cli-0.1.0-beta.8.tgz\nsha256=6138e0f330f0843e0469ae9483497ccaacfc56db096c8ee691e21a69d566823a\n", "stderr": "" }, { "name": "beta8_package_smoke", "command": "bash scripts/beta8-package-smoke.sh", "rc": 0, - "elapsedMs": 1129, + "elapsedMs": 1139, "stdout": "decision=PASS_BRIK64_CLI_BETA8_LOCAL_PACKAGE_SMOKE\nchecks=13\n", "stderr": "" } diff --git a/scripts/build-beta8-package.sh b/scripts/build-beta8-package.sh index c334be99..4111dcaf 100644 --- a/scripts/build-beta8-package.sh +++ b/scripts/build-beta8-package.sh @@ -23,6 +23,7 @@ need_cmd tar need_cmd shasum sha256_file() { shasum -a 256 "$1" | awk '{print $1}'; } +file_size() { wc -c < "$1" | tr -d '[:space:]'; } read_json_field() { local file="$1" @@ -122,7 +123,7 @@ jq -n \ --arg version "$VERSION" \ --arg packagePath "evidence/beta8-package/$PACKAGE_NAME" \ --arg packageSha "$package_sha" \ - --argjson packageBytes "$(stat -f '%z' "$PACKAGE_PATH")" \ + --argjson packageBytes "$(file_size "$PACKAGE_PATH")" \ '{ schemaVersion:"brik64.cli_beta8_package_manifest.v1", version:$version, From dd999951cdc3139f0afefcd13b422032f7e7f816 Mon Sep 17 00:00:00 2001 From: carlosjperez Date: Sat, 6 Jun 2026 04:28:18 +0200 Subject: [PATCH 9/9] Refresh beta8 gate evidence reports --- evidence/beta8-adversarial/report.json | 2 +- evidence/beta8-compiler-functionality/report.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/evidence/beta8-adversarial/report.json b/evidence/beta8-adversarial/report.json index 12fbf59d..b9eb2c15 100644 --- a/evidence/beta8-adversarial/report.json +++ b/evidence/beta8-adversarial/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_adversarial_gate.v1", - "generatedAt": "2026-06-06T02:24:19Z", + "generatedAt": "2026-06-06T02:26:14Z", "iter_id": "BRIK64-CLI-BETA8-ADVERSARIAL-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_ADVERSARIAL", diff --git a/evidence/beta8-compiler-functionality/report.json b/evidence/beta8-compiler-functionality/report.json index d9de0329..7ee87298 100644 --- a/evidence/beta8-compiler-functionality/report.json +++ b/evidence/beta8-compiler-functionality/report.json @@ -1,6 +1,6 @@ { "schemaVersion": "brik64.cli_beta8_compiler_functionality_gate.v1", - "generatedAt": "2026-06-06T02:24:17Z", + "generatedAt": "2026-06-06T02:26:12Z", "iter_id": "BRIK64-CLI-BETA8-COMPILER-FUNCTIONALITY-20260606-R1", "lane": "cli_0_1_beta8", "decision": "PASS_BRIK64_CLI_BETA8_COMPILER_FUNCTIONALITY",