Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 1393 files, 94.9 MB |
| Latest run log | run-20261010-154933-927.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261010-154933-927.log | 316 KB | 2026-10-10 15:00:30 |
| run-20261010-151418-926.log | 180 KB | 2026-10-10 13:39:24 |
| run-20261010-125933-925.log | 666 KB | 2026-10-10 13:04:08 |
| run-20261010-123337-924.log | 152 KB | 2026-10-10 10:49:24 |
| run-20261010-115741-923.log | 208 KB | 2026-10-10 10:23:28 |
| run-20261010-112119-922.log | 259 KB | 2026-10-10 09:47:32 |
| run-20261010-104503-921.log | 231 KB | 2026-10-10 09:11:10 |
| run-20261010-100305-920.log | 243 KB | 2026-10-10 08:34:54 |
| run-20261010-090754-919.log | 608 KB | 2026-10-10 07:52:55 |
| run-20261010-081222-918.log | 384 KB | 2026-10-10 06:57:44 |
| run-20261010-074045-917.log | 404 KB | 2026-10-10 06:02:12 |
| run-20261010-064359-916.log | 252 KB | 2026-10-10 05:30:35 |
| run-20261010-061545-915.log | 131 KB | 2026-10-10 04:33:49 |
| run-20261010-041808-914.log | 422 KB | 2026-10-10 04:05:36 |
| run-20261010-032250-913.log | 225 KB | 2026-10-10 02:07:59 |
| run-20261010-023524-912.log | 340 KB | 2026-10-10 01:12:41 |
| run-20261010-020034-911.log | 121 KB | 2026-10-10 00:25:15 |
| run-20261010-015024-910.log | 153 B | 2026-10-09 23:50:25 |
| run-20261010-014014-909.log | 153 B | 2026-10-09 23:40:15 |
| run-20261010-013004-908.log | 153 B | 2026-10-09 23:30:05 |
| run-20261010-011954-907.log | 153 B | 2026-10-09 23:19:55 |
| run-20261010-010944-906.log | 153 B | 2026-10-09 23:09:45 |
| run-20261010-005935-905.log | 153 B | 2026-10-09 22:59:35 |
| run-20261010-004925-904.log | 153 B | 2026-10-09 22:49:26 |
| run-20261010-003915-903.log | 153 B | 2026-10-09 22:39:16 |
| run-20261010-002906-902.log | 153 B | 2026-10-09 22:29:06 |
| run-20261010-001856-901.log | 153 B | 2026-10-09 22:18:57 |
| run-20261010-000846-900.log | 153 B | 2026-10-09 22:08:47 |
| run-20261009-235837-899.log | 153 B | 2026-10-09 21:58:37 |
| run-20261009-234827-898.log | 153 B | 2026-10-09 21:48:28 |
| run-20261009-233817-897.log | 153 B | 2026-10-09 21:38:18 |
| run-20261009-232808-896.log | 153 B | 2026-10-09 21:28:08 |
| run-20261009-231758-895.log | 153 B | 2026-10-09 21:17:59 |
| run-20261009-230748-894.log | 153 B | 2026-10-09 21:07:49 |
| run-20261009-225738-893.log | 153 B | 2026-10-09 20:57:39 |
| run-20261009-224729-892.log | 153 B | 2026-10-09 20:47:29 |
| run-20261009-223719-891.log | 153 B | 2026-10-09 20:37:20 |
| run-20261009-222709-890.log | 153 B | 2026-10-09 20:27:10 |
| run-20261009-221659-889.log | 153 B | 2026-10-09 20:17:00 |
| run-20261009-220649-888.log | 190 B | 2026-10-09 20:06:50 |
| run-20261009-215639-887.log | 153 B | 2026-10-09 19:56:40 |
| run-20261009-214628-886.log | 153 B | 2026-10-09 19:46:29 |
| run-20261009-213618-885.log | 153 B | 2026-10-09 19:36:19 |
| run-20261009-212608-884.log | 153 B | 2026-10-09 19:26:09 |
| run-20261009-211558-883.log | 153 B | 2026-10-09 19:15:59 |
| run-20261009-210548-882.log | 153 B | 2026-10-09 19:05:49 |
| run-20261009-205539-881.log | 190 B | 2026-10-09 18:55:39 |
| run-20261009-204528-880.log | 190 B | 2026-10-09 18:45:29 |
| run-20261009-203518-879.log | 153 B | 2026-10-09 18:35:19 |
| run-20261009-202508-878.log | 190 B | 2026-10-09 18:25:09 |
Tail — run-20261010-154933-927.log (last 200 lines)
local bin="$1" sb="$2"
shift 2
OUT=$(GLADEX_REPO_DIR="$sb/repo" GLADEX_DEV_ROOT="$sb/dev" GLADEX_PROD_ROOT="$sb/prod" \
+ GLADEX_PROMOTE_LEDGER="$sb/ledger.jsonl" \
LINT_STUB_MODE="$LINT_STUB_MODE" LINT_STUB_SLEEP="$LINT_STUB_SLEEP" \
PATH="$SAFETY_BIN:$PATH" \
"$bin" "$@" --format json 2>"$sb/stderr.txt")
RC=$?
[0m← [0mEdit repo/tests/test_promote_json.sh
Index: repo/tests/test_promote_json.sh
===================================================================
--- repo/tests/test_promote_json.sh
+++ repo/tests/test_promote_json.sh
@@ -380,8 +380,9 @@
write_verdict "$SB" "VERDICT-20260924-150500-probe.md" "VERDICT: APPROVE
" '2026-09-24 15:05:00'
LINT_STUB_MODE=ok
OUT=$(GLADEX_REPO_DIR="$SB/repo" GLADEX_DEV_ROOT="$SB/dev" GLADEX_PROD_ROOT="$SB/prod" \
+ GLADEX_PROMOTE_LEDGER="$SB/ledger.jsonl" \
LINT_STUB_MODE="$LINT_STUB_MODE" GLADEX_GATE_PROBE=1 PATH="$SAFETY_BIN:$PATH" \
"$TOOL" --force --format json 2>"$SB/stderr.txt")
RC=$?
ERR=$(cat "$SB/stderr.txt" 2>/dev/null || true)
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_promote_json.sh
Index: repo/tests/test_promote_json.sh
===================================================================
--- repo/tests/test_promote_json.sh
+++ repo/tests/test_promote_json.sh
@@ -839,12 +839,14 @@
" '2026-09-24 15:07:00'
if plant M4 ' args.dry_run = True' \
's/ args.dry_run = True/ pass # MUTANT: M4 probe ignored/'; then
OUT=$(GLADEX_REPO_DIR="$SB/repo" GLADEX_DEV_ROOT="$SB/dev" GLADEX_PROD_ROOT="$SB/prod" \
+ GLADEX_PROMOTE_LEDGER="$SB/ledger.jsonl" \
GLADEX_GATE_PROBE=1 PATH="$SAFETY_BIN:$PATH" \
"$PLANTED" --force --format json 2>"$SB/m4.err")
mut_val=$(json_get "$OUT" "dry_run")
OUT=$(GLADEX_REPO_DIR="$SB/repo" GLADEX_DEV_ROOT="$SB/dev" GLADEX_PROD_ROOT="$SB/prod" \
+ GLADEX_PROMOTE_LEDGER="$SB/ledger.jsonl" \
GLADEX_GATE_PROBE=1 PATH="$SAFETY_BIN:$PATH" \
"$TOOL" --force --format json 2>"$SB/m4real.err")
real_val=$(json_get "$OUT" "dry_run")
if [ "$real_val" = "True" ] && [ "$mut_val" = "False" ]; then
[0m$ [0mcd /data/repo && grep -n '"\$TOOL"\|"\$PLANTED"\|"\$bin"' tests/test_promote_json.sh | grep -v -- '--dry-run' | grep -v '> *\$\|grep\|sed\|awk'
224: "$TOOL" "$@" --format json 2>"$sb/stderr.txt")
237: "$bin" "$@" --format json 2>"$sb/stderr.txt")
249:if [ ! -x "$TOOL" ]; then
257:"$TOOL" --help > "$SB/help.txt" 2>&1
386: "$TOOL" --force --format json 2>"$SB/stderr.txt")
407:OUT=$(PATH="$SAFETY_BIN:$PATH" GLADEX_REPO_DIR="$SB/repo" "$TOOL" --format xml 2>"$SB/xml.err")
503:"$TOOL" --help > "$SB/help2.txt" 2>&1
549:"$TOOL" --help > "$SB/help3.txt" 2>&1
762: chmod +x "$PLANTED"
768: if ! python3 -c "import ast,sys; ast.parse(open(sys.argv[1]).read())" "$PLANTED" 2>/dev/null; then
785: run_mutant "$PLANTED" "$sb" "$@"
845: "$PLANTED" --force --format json 2>"$SB/m4.err")
850: "$TOOL" --force --format json 2>"$SB/m4real.err")
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n '380,392p' tests/test_promote_json.sh; echo "=== 405-410 ==="; sed -n '403,410p' tests/test_promote_json.sh; echo "=== 843-853 ==="; sed -n '843,853p' tests/test_promote_json.sh
write_verdict "$SB" "VERDICT-20260924-150500-probe.md" "VERDICT: APPROVE
" '2026-09-24 15:05:00'
LINT_STUB_MODE=ok
OUT=$(GLADEX_REPO_DIR="$SB/repo" GLADEX_DEV_ROOT="$SB/dev" GLADEX_PROD_ROOT="$SB/prod" \
GLADEX_PROMOTE_LEDGER="$SB/ledger.jsonl" \
LINT_STUB_MODE="$LINT_STUB_MODE" GLADEX_GATE_PROBE=1 PATH="$SAFETY_BIN:$PATH" \
"$TOOL" --force --format json 2>"$SB/stderr.txt")
RC=$?
ERR=$(cat "$SB/stderr.txt" 2>/dev/null || true)
assert_rc "probe run exits 0" 0 "$RC"
assert_eq "probe reports dry_run true although --dry-run was NOT passed" "True" "$(json_get "$OUT" "dry_run")"
assert_eq "probe is reported" "True" "$(json_get "$OUT" "probe")"
assert_contains "the mutating phase was suppressed" "[DRY-RUN] Would run: systemctl restart" "$ERR"
=== 405-410 ===
assert_rc "default format keeps exit 5 on a refusal" 5 "$RC"
assert_contains "default format keeps its human banner on stdout" "Starting promotion dev -> prod" "$OUT"
assert_contains "default format reports the refusal on stderr" "GATE REFUSED (exit 5): no verdict in" "$HERR"
assert_not_contains "default format emits no JSON object" '"tool":"promote-dev-to-prod"' "$OUT"
OUT=$(PATH="$SAFETY_BIN:$PATH" GLADEX_REPO_DIR="$SB/repo" "$TOOL" --format xml 2>"$SB/xml.err")
RC=$?
assert_rc "--format xml is a usage error (exit 2)" 2 "$RC"
assert_contains "--format xml explains the choices" "invalid choice" "$(cat "$SB/xml.err")"
=== 843-853 ===
GLADEX_PROMOTE_LEDGER="$SB/ledger.jsonl" \
GLADEX_GATE_PROBE=1 PATH="$SAFETY_BIN:$PATH" \
"$PLANTED" --force --format json 2>"$SB/m4.err")
mut_val=$(json_get "$OUT" "dry_run")
OUT=$(GLADEX_REPO_DIR="$SB/repo" GLADEX_DEV_ROOT="$SB/dev" GLADEX_PROD_ROOT="$SB/prod" \
GLADEX_PROMOTE_LEDGER="$SB/ledger.jsonl" \
GLADEX_GATE_PROBE=1 PATH="$SAFETY_BIN:$PATH" \
"$TOOL" --force --format json 2>"$SB/m4real.err")
real_val=$(json_get "$OUT" "dry_run")
if [ "$real_val" = "True" ] && [ "$mut_val" = "False" ]; then
ok "mutation M4 caught (dry_run real=$real_val mutant=$mut_val — the mutant would run for real)"
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_promote_json.sh
Index: repo/tests/test_promote_json.sh
===================================================================
--- repo/tests/test_promote_json.sh
+++ repo/tests/test_promote_json.sh
@@ -403,9 +403,10 @@
assert_rc "default format keeps exit 5 on a refusal" 5 "$RC"
assert_contains "default format keeps its human banner on stdout" "Starting promotion dev -> prod" "$OUT"
assert_contains "default format reports the refusal on stderr" "GATE REFUSED (exit 5): no verdict in" "$HERR"
assert_not_contains "default format emits no JSON object" '"tool":"promote-dev-to-prod"' "$OUT"
-OUT=$(PATH="$SAFETY_BIN:$PATH" GLADEX_REPO_DIR="$SB/repo" "$TOOL" --format xml 2>"$SB/xml.err")
+OUT=$(PATH="$SAFETY_BIN:$PATH" GLADEX_REPO_DIR="$SB/repo" \
+ GLADEX_PROMOTE_LEDGER="$SB/ledger.jsonl" "$TOOL" --format xml 2>"$SB/xml.err")
RC=$?
assert_rc "--format xml is a usage error (exit 2)" 2 "$RC"
assert_contains "--format xml explains the choices" "invalid choice" "$(cat "$SB/xml.err")"
[0m← [0mEdit repo/tests/test_promote_json.sh
Index: repo/tests/test_promote_json.sh
===================================================================
--- repo/tests/test_promote_json.sh
+++ repo/tests/test_promote_json.sh
@@ -1185,8 +1185,34 @@
fail "Z6 the pre-(128) cleanup does not reproduce the leak"
fi
rm -rf "$Z_O1"
+# === AA. the LIVE promote ledger is never this suite's to write ==============
+# Measured 2026-10-10T14:06:30Z and again on a direct replay at 14:53:55Z:
+# every run of this suite appended FOUR records to the live
+# /data/agent-logs/promote-ledger.jsonl — one per env for `src/php/a.php` and
+# `examples/workflows/hello-workflow.json`, carrying sandbox git commits
+# 2305452b / d0caef73. Cause, not guessed: M4's mutant replaces
+# `args.dry_run = True` with `pass`, so its probe run is a REAL promotion that
+# reaches step 3, where `ledger_record_promote` defaults to the live path; the
+# section-I probe run and every helper already stopped short of that, which is
+# why `[0.4.294]`'s pin landed in test_promote_gate.sh and missed this file.
+# The children are now pinned (run_json, run_mutant, section I, M4, section J);
+# these two assertions are what reddens if a future call site forgets again.
+LIVE_NOW=$(md5sum "$LIVE_LEDGER" 2>/dev/null | awk '{print $1}')
+if [ -z "${LIVE_LEDGER_MD5_START:-}" ]; then
+ ok "AA1 there is no live ledger on this box, so this suite cannot have written it"
+elif [ "$LIVE_NOW" = "$LIVE_LEDGER_MD5_START" ]; then
+ ok "AA1 the live promote ledger is byte-identical after the whole suite ($LIVE_NOW)"
+else
+ fail "AA1 this suite WROTE the live ledger ($LIVE_LEDGER_MD5_START -> $LIVE_NOW)"
+fi
+if [ -f "$LIVE_LEDGER" ] && grep -q '"path":"src/php/a.php"' "$LIVE_LEDGER"; then
+ fail "AA2 no live-ledger record may name a fixture-only path (src/php/a.php is in $LIVE_LEDGER)"
+else
+ ok "AA2 no live-ledger record names the fixture-only path src/php/a.php"
+fi
+
echo ""
echo "==============================="
echo "promote --format json suite: $PASS passed, $FAIL failed"
echo "==============================="
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && python3 - <<'PY'
import json, hashlib, shutil
p = "/data/agent-logs/promote-ledger.jsonl"
lines = open(p).read().splitlines()
keep = [l for l in lines if '"path":"src/php/a.php"' not in l]
strays = [l for l in lines if '"path":"src/php/a.php"' in l]
# the fixture leak writes both paths in one batch; drop the hello-workflow
# records that arrived in those same two batches too (same ts+commit pairs)
pairs = {(json.loads(l)["ts"], json.loads(l)["commit"]) for l in strays}
final = [l for l in keep if (json.loads(l)["ts"], json.loads(l)["commit"]) not in pairs]
removed = len(lines) - len(final)
tmp = p + ".tmp"
open(tmp, "w").write("\n".join(final) + "\n")
shutil.move(tmp, p)
print("before:", len(lines), "removed:", removed, "after:", len(final))
print("md5:", hashlib.md5(open(p, "rb").read()).hexdigest())
print("expect: db301fb4bc250f65e32ca98108d10e74")
PY
echo "=== ledger-check ==="; ./tools/promote-dev-to-prod --ledger-check; echo "rc=$?"; ./tools/system-status 2>&1 | grep deploy-path
before: 54 removed: 8 after: 46
md5: db301fb4bc250f65e32ca98108d10e74
expect: db301fb4bc250f65e32ca98108d10e74
=== ledger-check ===
ledger OK - 46 file(s) across dev+prod attested (/data/agent-logs/promote-ledger.jsonl; source: baseline)
rc=0
deploy-path [OK] ledger OK - 46 file(s) across dev+prod attested (/data/agent-logs/promote-ledger.jsonl; source: baseline)
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && timeout 600 bash tests/test_promote_json.sh > /tmp/opencode/promote_json-883.log 2>&1; echo "rc=$?"; tail -5 /tmp/opencode/promote_json-883.log; echo "--- live ledger:"; wc -l < /data/agent-logs/promote-ledger.jsonl; md5sum /data/agent-logs/promote-ledger.jsonl; grep -c '"path":"src/php/a.php"' /data/agent-logs/promote-ledger.jsonl || echo "0 junk hits (good)"
rc=0
PASS: AA2 no live-ledger record names the fixture-only path src/php/a.php
===============================
promote --format json suite: 183 passed, 0 failed
===============================
--- live ledger:
46
db301fb4bc250f65e32ca98108d10e74 /data/agent-logs/promote-ledger.jsonl
0
0 junk hits (good)
> build · mimo-v2.6-flash-free
183 passed / 0 failed, live ledger untouched (46 records, pristine md5, 0 junk hits). Now the neighbour suites:
Select another run log from the list above. Only files matching run-YYYYMMDD-HHMMSS-N.log are readable.
App log tail — prod-8001.log (last 60 lines)
[Sat Oct 10 16:50:57 2026] 127.0.0.1:54464 Accepted [Sat Oct 10 16:50:57 2026] 127.0.0.1:54464 Closing [Sat Oct 10 16:51:06 2026] 127.0.0.1:43236 Accepted [Sat Oct 10 16:51:06 2026] 127.0.0.1:43236 Closing [Sat Oct 10 16:57:36 2026] 127.0.0.1:36008 Accepted [Sat Oct 10 16:57:36 2026] 127.0.0.1:36008 Closing [Sat Oct 10 16:57:36 2026] 127.0.0.1:36014 Accepted [Sat Oct 10 16:57:36 2026] 127.0.0.1:36014 Closing [Sat Oct 10 16:57:37 2026] 127.0.0.1:36026 Accepted [Sat Oct 10 16:57:37 2026] 127.0.0.1:36026 Closing [Sat Oct 10 16:57:40 2026] 127.0.0.1:36040 Accepted [Sat Oct 10 16:57:40 2026] 127.0.0.1:36040 Closing [Sat Oct 10 16:57:40 2026] 127.0.0.1:36042 Accepted [Sat Oct 10 16:57:40 2026] 127.0.0.1:36042 Closing [Sat Oct 10 16:57:40 2026] 127.0.0.1:36054 Accepted [Sat Oct 10 16:57:40 2026] 127.0.0.1:36054 Closing [Sat Oct 10 16:57:40 2026] 127.0.0.1:36066 Accepted [Sat Oct 10 16:57:40 2026] 127.0.0.1:36066 Closing [Sat Oct 10 16:57:40 2026] 127.0.0.1:36076 Accepted [Sat Oct 10 16:57:40 2026] 127.0.0.1:36076 Closing [Sat Oct 10 16:57:40 2026] 127.0.0.1:36092 Accepted [Sat Oct 10 16:57:40 2026] 127.0.0.1:36092 Closing [Sat Oct 10 16:57:40 2026] 127.0.0.1:36096 Accepted [Sat Oct 10 16:57:40 2026] 127.0.0.1:36096 Closing [Sat Oct 10 16:57:41 2026] 127.0.0.1:36104 Accepted [Sat Oct 10 16:57:41 2026] 127.0.0.1:36104 Closing [Sat Oct 10 16:57:41 2026] 127.0.0.1:36108 Accepted [Sat Oct 10 16:57:41 2026] 127.0.0.1:36108 Closing [Sat Oct 10 16:57:41 2026] 127.0.0.1:36112 Accepted [Sat Oct 10 16:57:41 2026] 127.0.0.1:36112 Closing [Sat Oct 10 16:58:00 2026] 127.0.0.1:49514 Accepted [Sat Oct 10 16:58:00 2026] 127.0.0.1:49516 Accepted [Sat Oct 10 16:58:00 2026] 127.0.0.1:49514 Closing [Sat Oct 10 16:58:00 2026] 127.0.0.1:49516 Closing [Sat Oct 10 16:58:00 2026] 127.0.0.1:49528 Accepted [Sat Oct 10 16:58:00 2026] 127.0.0.1:49528 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39344 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39344 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39358 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39358 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39370 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39370 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39378 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39378 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39388 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39388 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39404 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39404 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39420 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39420 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39424 Accepted [Sat Oct 10 17:00:11 2026] 127.0.0.1:39424 Closing [Sat Oct 10 17:00:11 2026] 127.0.0.1:39440 Accepted [Sat Oct 10 17:00:12 2026] 127.0.0.1:39440 Closing [Sat Oct 10 17:00:12 2026] 127.0.0.1:39448 Accepted [Sat Oct 10 17:00:12 2026] 127.0.0.1:39448 Closing [Sat Oct 10 17:00:37 2026] 127.0.0.1:46778 Accepted [Sat Oct 10 17:00:37 2026] 127.0.0.1:46778 Closing [Sat Oct 10 17:00:37 2026] 127.0.0.1:46782 Accepted
Generated 2026-10-10 15:00:37 UTC · Gladex.de