gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1182Shell 87Rust 63Markdown 541592 Definiciones

⎇ 24c6ab455eb785338667e2b73bf30f76665648dd scripts/harkaq/q2-runtime-base.sh Shell · 100 líneas · 4.2 KB Historia crudo

harkaq: §4 corregido (política POR FICHERO) + Q2 con método y primeros datos reales 24c6ab455 · sergio ·

1#!/bin/sh
2# Q2 — ¿qué es el "runtime base" implícito? (SDD 16 §8)
3#
4# La pregunta de diseño que decide si la métrica de la Fase 2 mide deuda real de de-Alpinización
5# o mide ruido. Ninguna receta declara /bin/sh, la libc o /opt/zig, y ninguna debería. Pero si el
6# runtime base se define de más, la política concede Alpine entero y la evidencia no vale nada.
7#
8# Método: NO adivinarlo. Correr un build real con `política = clausura declarada` y dejar que
9# las denegaciones lo nombren. Lo que aparezca es, por definición, lo que todo build necesita y
10# nadie declara.
11#
12# Replica el sandbox real (`Sandbox::bwrap_args`): overlay del rootfs Alpine + las deps apiladas,
13# `--tmp-overlay /`, /proc, /dev, /tmp, zig en /opt/zig, fuentes en /src, salida en /out.
14set -eu
15cd "$(dirname "$0")/../.."
16
17BIN="${HARKAQ_BIN:-$HOME/.cache/harkaq}"
18ROOTFS=.dev-fs/alpine
19ZIG=.dev-fs/tools/zig
20DEP=$(ls -d store/*-zlib | head -1)
21
22[ -d "$ROOTFS" ] || { echo "falta $ROOTFS"; exit 1; }
23[ -d "$ZIG" ] || { echo "falta $ZIG"; exit 1; }
24
25WORK=$(mktemp -d); trap 'rm -rf "$WORK"' EXIT
26mkdir -p "$WORK/src" "$WORK/out"
27cat > "$WORK/src/hello.c" <<'EOF'
28#include <zlib.h>
29#include <stdio.h>
30int main(void) { printf("zlib %s\n", zlibVersion()); return 0; }
31EOF
32
33# La clausura DECLARADA (D1) + las superficies que el sandbox define por contrato, no la receta:
34# /src (fuentes), /out (DESTDIR), /tmp (HOME). Nada de Alpine.
35POLICY="$WORK/policy"
36scripts/harkaq/harkaq-policy.sh "$DEP" > "$POLICY"
37{
38    echo "rw /src"
39    echo "rw /out"
40    echo "rw /tmp"
41    echo "ro /opt/zig"
42    # BASE_EXTRA: lo que las corridas previas demostraron que hace falta. Empieza vacío y se
43    # llena SÓLO con lo que el kernel denunció — nunca por corazonada. Cada línea de acá es una
44    # respuesta medida a Q2, no una conjetura.
45    [ -n "${BASE_EXTRA:-}" ] && printf '%s\n' "$BASE_EXTRA"
46} >> "$POLICY"
47
48echo "── política: $(grep -c '^ro ' "$POLICY") ro, $(grep -c '^list ' "$POLICY") list, $(grep -c '^rw ' "$POLICY") rw" >&2
49
50NONCE="q2-$$"
51# El canario va en la RAÍZ, no en /tmp: la política concede `rw /tmp` (es el HOME del build), así
52# que un canario ahí caería DENTRO de la clausura, se leería sin problema y no generaría ninguna
53# denegación ⇒ SinEvidencia eterno. El canario tiene que vivir donde la política NO alcanza, por
54# construcción. En el sandbox real la raíz es escribible (`--tmp-overlay /`) y bwrap puede crear
55# ahí el punto de montaje. (Lo cazó el propio D9: el lector se negó a certificar.)
56CANARY="/harkaq-canary-$NONCE"
57CSRC=$(mktemp); echo canario > "$CSRC"
58FIFO=$(mktemp -u); mkfifo "$FIFO"
59VERDICT=$(mktemp)
60trap 'rm -rf "$WORK" "$CSRC" "$FIFO" "$VERDICT"' EXIT
61
62"$BIN/harkaq-audit" --canary "$CANARY" --timeout "${HARKAQ_TIMEOUT:-60}" --ready-fd 3 \
63    3>"$FIFO" >"$VERDICT" &
64AUDIT_PID=$!
65read -r _ < "$FIFO" || true
66
67# El probe del canario usa SÓLO builtins del shell: `read` + redirección. Con `cat` dependía de
68# /bin/cat (otro applet de busybox) y, si no estaba en la clausura, el probe moría sin probar
69# nada — el canario tiene que ser lo más barato e independiente del sistema.
70CMD="read _ < $CANARY || true; cd /src && zig cc -mcpu=baseline hello.c -lz -o /out/hello && echo BUILD-OK"
71
72set +e
73bwrap --overlay-src "$ROOTFS" --overlay-src "$DEP" --tmp-overlay / \
74      --proc /proc --dev /dev --tmpfs /tmp \
75      --ro-bind "$ZIG" /opt/zig \
76      --bind "$WORK/src" /src --bind "$WORK/out" /out \
77      --ro-bind "$CSRC" "$CANARY" \
78      --ro-bind "$BIN/harkaq-exec" /tmp/harkaq-exec \
79      --ro-bind "$POLICY" /tmp/harkaq.policy \
80      --chdir /src --unshare-all --die-with-parent \
81      --setenv PATH /opt/zig:/usr/bin:/bin \
82      --setenv HOME /tmp \
83      /tmp/harkaq-exec --policy /tmp/harkaq.policy -- /bin/sh -c "$CMD"
84RC=$?
85set -e
86
87sleep 2
88kill -TERM "$AUDIT_PID" 2>/dev/null || true
89wait "$AUDIT_PID" 2>/dev/null || true
90
91echo "── build rc=$RC" >&2
92echo "── denegaciones (= candidatos a runtime base):" >&2
93python3 -c '
94import json,sys
95v=json.load(open(sys.argv[1]))
96print("  estado:", v["estado"], "| canario:", v["canario_visto"], "| contador kernel:", v["contador_kernel"])
97for d in v["denials"]:
98    print("   ", d["blockers"], d["path"])
99if not v["denials"]: print("    (ninguna)")
100' "$VERDICT"