Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 1450 files, 97.5 MB |
| Latest run log | run-20261011-115914-984.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261011-115914-984.log | 153 KB | 2026-10-11 10:39:45 |
| run-20261011-104852-983.log | 238 KB | 2026-10-11 09:49:04 |
| run-20261011-093636-982.log | 244 KB | 2026-10-11 08:38:43 |
| run-20261011-081553-981.log | 219 KB | 2026-10-11 07:26:27 |
| run-20261011-073720-980.log | 129 KB | 2026-10-11 06:05:43 |
| run-20261011-062820-979.log | 165 KB | 2026-10-11 05:27:10 |
| run-20261011-053212-978.log | 280 KB | 2026-10-11 04:18:09 |
| run-20261011-043228-977.log | 241 KB | 2026-10-11 03:22:02 |
| run-20261011-035202-976.log | 343 KB | 2026-10-11 02:22:19 |
| run-20261011-024404-975.log | 285 KB | 2026-10-11 01:41:52 |
| run-20261011-020130-974.log | 152 KB | 2026-10-11 00:33:55 |
| run-20261011-015120-973.log | 153 B | 2026-10-10 23:51:21 |
| run-20261011-014110-972.log | 153 B | 2026-10-10 23:41:11 |
| run-20261011-013059-971.log | 153 B | 2026-10-10 23:30:59 |
| run-20261011-012049-970.log | 153 B | 2026-10-10 23:20:49 |
| run-20261011-011039-969.log | 153 B | 2026-10-10 23:10:39 |
| run-20261011-010028-968.log | 153 B | 2026-10-10 23:00:28 |
| run-20261011-005018-967.log | 190 B | 2026-10-10 22:50:18 |
| run-20261011-004007-966.log | 153 B | 2026-10-10 22:40:08 |
| run-20261011-002957-965.log | 153 B | 2026-10-10 22:29:58 |
| run-20261011-001947-964.log | 153 B | 2026-10-10 22:19:48 |
| run-20261011-000937-963.log | 153 B | 2026-10-10 22:09:38 |
| run-20261010-235927-962.log | 153 B | 2026-10-10 21:59:28 |
| run-20261010-234917-961.log | 153 B | 2026-10-10 21:49:18 |
| run-20261010-233907-960.log | 153 B | 2026-10-10 21:39:08 |
| run-20261010-232857-959.log | 153 B | 2026-10-10 21:28:58 |
| run-20261010-231847-958.log | 153 B | 2026-10-10 21:18:48 |
| run-20261010-230837-957.log | 153 B | 2026-10-10 21:08:38 |
| run-20261010-225827-956.log | 153 B | 2026-10-10 20:58:28 |
| run-20261010-224817-955.log | 190 B | 2026-10-10 20:48:18 |
| run-20261010-223807-954.log | 153 B | 2026-10-10 20:38:08 |
| run-20261010-222757-953.log | 153 B | 2026-10-10 20:27:58 |
| run-20261010-221747-952.log | 153 B | 2026-10-10 20:17:48 |
| run-20261010-220737-951.log | 153 B | 2026-10-10 20:07:38 |
| run-20261010-215727-950.log | 153 B | 2026-10-10 19:57:27 |
| run-20261010-214717-949.log | 190 B | 2026-10-10 19:47:17 |
| run-20261010-213706-948.log | 153 B | 2026-10-10 19:37:07 |
| run-20261010-212656-947.log | 190 B | 2026-10-10 19:26:57 |
| run-20261010-211646-946.log | 190 B | 2026-10-10 19:16:46 |
| run-20261010-210636-945.log | 153 B | 2026-10-10 19:06:36 |
| run-20261010-205626-944.log | 153 B | 2026-10-10 18:56:26 |
| run-20261010-204615-943.log | 190 B | 2026-10-10 18:46:15 |
| run-20261010-203605-942.log | 153 B | 2026-10-10 18:36:05 |
| run-20261010-202555-941.log | 153 B | 2026-10-10 18:25:55 |
| run-20261010-201544-940.log | 153 B | 2026-10-10 18:15:45 |
| run-20261010-200534-939.log | 153 B | 2026-10-10 18:05:34 |
| run-20261010-195524-938.log | 190 B | 2026-10-10 17:55:24 |
| run-20261010-194513-937.log | 153 B | 2026-10-10 17:45:14 |
| run-20261010-193503-936.log | 153 B | 2026-10-10 17:35:03 |
| run-20261010-192453-935.log | 153 B | 2026-10-10 17:24:54 |
Tail — run-20261011-115914-984.log (last 200 lines)
}
g() { git -C "$SB/repo" "$@"; } # git in the sandbox repo
# Every sandbox commit MUST carry content. An empty commit means this test's
# own flow is broken (it once silently no-op'd and left HEAD on the broken
# commit, cascading wrong verdicts through every later section) — abort
# loudly instead of asserting against the wrong tree.
commit() {
g add -A
if ! g -c user.email=t@t -c user.name=t commit -qm "$1" >/dev/null 2>&1; then
echo "FATAL: sandbox commit '$1' had nothing to commit (test bug)" >&2
exit 1
fi
}
reset_clean() { g reset -q --hard "$SHA_CLEAN"; }
new_sandbox() {
local base="${TMPDIR:-/tmp}/opencode"
mkdir -p "$base" 2>/dev/null || base="/tmp"
SB=$(mktemp -d "$base/rl.XXXXXX") || { echo "cannot create sandbox" >&2; exit 1; }
SB_ALL="${SB_ALL}${SB}"$'\n'
mkdir -p "$SB/repo/tools" "$SB/repo/vendor"
g init -q -b main
g config user.email "sandbox@test"
g config user.name "sandbox"
# --- fixtures: exactly one file per linted language + every skip reason ----
printf '<?php echo 1;\n' > "$SB/repo/app.php"
printf 'echo ok\n' > "$SB/repo/run.sh"
printf 'x = 1\n' > "$SB/repo/m.py"
printf '{"a":1}\n' > "$SB/repo/w.json"
printf 'package m\nfunc x() {}\n' > "$SB/repo/main.go"
printf '#!/usr/bin/env python3\nprint(1)\n' > "$SB/repo/tools/pytool"
printf '#!/bin/bash\necho tool\n' > "$SB/repo/tools/shtool"
printf '#!/usr/bin/env node\nconsole.log(1)\n' > "$SB/repo/tools/nodetool"
printf '# docs\n' > "$SB/repo/README.md"
printf 'MIT License\n' > "$SB/repo/LICENSE"
printf 'junk\n' > "$SB/repo/blob.bin"
python3 -c "import sys; sys.stdout.buffer.write(b'\x7fELF\x00bin')" > "$SB/repo/data.bin"
: > "$SB/repo/empty.txt"
ln -s app.php "$SB/repo/link"
commit "seed"
local seed_sha
seed_sha=$(g rev-parse HEAD)
# submodule gitlink: stage it, then commit the INDEX AS-IS. Never follow
# with `git add -A`: vendor/dep has no worktree presence, so add -A stages
# its deletion and silently drops the gitlink (verified empirically).
g update-index --add --cacheinfo "160000,$seed_sha,vendor/dep"
g -c user.email=t@t -c user.name=t commit -qm "gitlink" \
|| { echo "FATAL: gitlink commit failed (test bug)" >&2; exit 1; }
SHA_CLEAN=$(g rev-parse HEAD)
}
# --- Go module fixture: a real (tiny, stdlib-only) module in its own repo ----
# Separate from $SB/repo on purpose: every OTHER section asserts that a repo
> build · mimo-v2.6-flash-free
Let me check how section M sets up its baseline (does it call `new_sandbox`/`reset_clean`, or reuse the prior sandbox?).
[0m$ [0mcd /data/repo && sed -n '1969,2010p' tests/test_repo_lint.sh
# --- M: mutations (copies only; precondition -> divergence -> surgical) -------
# M1: exit gate defeated — failures no longer produce exit 1
n=$(grep -cF '(1 if failures else 0)' "$TOOL")
if [ "$n" = "1" ]; then
ok "M1 precondition: exit-gate expression occurs exactly once"
sed 's|(1 if failures else 0)|(0 if failures else 0)|' "$TOOL" > "$SB/mut1"
chmod +x "$SB/mut1"
if grep -qF '(0 if failures else 0)' "$SB/mut1"; then
printf '<?php foreach ($x as $label, ) {\n}\n' > "$SB/repo/app.php"
commit "m1 broken"
real_out=$(GLADEX_REPO_DIR="$SB/repo" "$TOOL" 2>/dev/null); real_rc=$?
mut_out=$(GLADEX_REPO_DIR="$SB/repo" "$SB/mut1" 2>/dev/null); mut_rc=$?
[ "$real_rc" = "1" ] && [ "$mut_rc" = "0" ] \
&& ok "M1 caught: real=$real_rc mutant=$mut_rc on a broken commit" \
|| fail "M1 NOT caught: real=$real_rc mutant=$mut_rc"
# restore by writing known-good content: `checkout` would restore the
# BROKEN blob (HEAD is the broken commit) → empty commit → cascade.
printf '<?php echo 1;\n' > "$SB/repo/app.php"
commit "m1 undone"
real_out=$(GLADEX_REPO_DIR="$SB/repo" "$TOOL" 2>/dev/null); real_rc=$?
mut_out=$(GLADEX_REPO_DIR="$SB/repo" "$SB/mut1" 2>/dev/null); mut_rc=$?
[ "$real_rc" = "0" ] && [ "$mut_rc" = "0" ] \
&& ok "M1 surgical: mutant still exits 0 on a clean commit" \
|| fail "M1 not surgical: real=$real_rc mutant=$mut_rc on clean"
else
fail "M1 mutation setup: sed did not plant the mutation"
fi
else
fail "M1 precondition: exit-gate expression found $n times (want 1)"
fi
# M2: --sha ignored — mutant always lints HEAD
n=$(grep -cF 'f"{args.sha}^{{commit}}"' "$TOOL")
if [ "$n" = "1" ]; then
ok "M2 precondition: --sha rev-parse target occurs exactly once"
sed 's|f"{args.sha}^{{commit}}"|f"HEAD^{{commit}}"|' "$TOOL" > "$SB/mut2"
chmod +x "$SB/mut2"
if grep -cF 'f"HEAD^{{commit}}"' "$SB/mut2" | grep -q '^1$'; then
# HEAD is clean; a broken php commit exists as an ancestor ($SHA_BAD_PHP)
real_out=$(GLADEX_REPO_DIR="$SB/repo" "$TOOL" --sha "$SHA_BAD_PHP" 2>/dev/null); real_rc=$?
mut_out=$(GLADEX_REPO_DIR="$SB/repo" "$SB/mut2" --sha "$SHA_BAD_PHP" 2>/dev/null); mut_rc=$?
[ "$real_rc" = "1" ] && [ "$mut_rc" = "0" ] \
> build · mimo-v2.6-flash-free
Section M reuses the current `$SB` and references `SHA_BAD_PHP` from an earlier sandbox — so inserting a `new_sandbox` before M would break it. The safe slot is **after M, before Z**. Let me confirm Z creates its own sandboxes and doesn't depend on M's state.
[0m$ [0mcd /data/repo && sed -n '3170,3200p' tests/test_repo_lint.sh
# --- Z: the EXIT trap's claim, read while the run is still alive ---------------
# `cleanup` runs from the EXIT trap AFTER the summary printed below, so
# nothing above it can see whether the trap did its job. This suite is
# the (128) inventory's near-zero case, measured on the untouched file
# 2026-10-03T22:45Z: `463 passed, 0 failed`, rc 0, while the DIRECTORY
# count of `rl.*`/`rlgo.*` under ${TMPDIR:-/tmp}/opencode did not move -
# both factories ran exactly once per run, so the two `rm -rf` lines the
# pre-fix `cleanup` carried happened to remove everything. "Leaks nothing
# today" is not a claim a suite can make about itself: the ledger below
# is what makes the claim checkable, and Z proves it bites by calling
# cleanup() directly, twice, while the run is still alive. Both (131)
# corrections are load-bearing HERE rather than hypothetically: this file
# is the standing example of a SECOND sandbox factory (`GO_SB`), so Z7
# guards a real second recorder, and the real /tmp/opencode reader
# overcounts this suite's own prefix (`ls -d rl.*` reads 6 matches of
# which 1 is a directory - the other five are the stray rl.err/rl.json/
# rl.log/rl.out/rl.txt files earlier runs left beside the sandboxes),
# which is why every reader below counts DIRECTORIES only.
SELF="$TESTS_DIR/$(basename "$0")"
# count_sandboxes <parent> <name-pattern> — DIRECTORIES only, never files.
count_sandboxes() { find "$1" -maxdepth 1 -type d -name "$2" 2>/dev/null | wc -l | tr -d ' '; }
new_sandbox; Z_A="$SB"
new_sandbox; Z_B="$SB"
# The expectation is derived from THIS file, not from a number written in
# a comment: every section's factory statement sits at column 0 on its own
# line (no loop or conditional wraps one) and each ran once by the time Z
# is reached, while Z's own calls carry a `; Z_x="$…"` suffix and so are
# not counted by the patterns. This file has TWO factories.
z_ns_calls=$(grep -c '^new_sandbox$' "$SELF")
> build · mimo-v2.6-flash-free
Confirmed: Z creates its own sandboxes (`new_sandbox; Z_A="$SB"`), so a bare `new_sandbox` in a new section Y (between M and Z) auto-increments the Z1 ledger correctly. Let me insert section Y pinning the gate's GREEN and RED paths.
[0m← [0mEdit repo/tests/test_repo_lint.sh
Index: repo/tests/test_repo_lint.sh
===================================================================
--- repo/tests/test_repo_lint.sh
+++ repo/tests/test_repo_lint.sh
@@ -3166,8 +3166,56 @@
else
fail "M26 precondition: current-series test found $n time(s) (want 1)"
fi
+# --- Y: the shipped-binary (ELF) gate — a committed build artefact is a defect --
+# 2026-11-11 queue item: a `git add -A` in a shared worktree swept a
+# 13,599,012-byte build artefact (a binary literally named `--nonsense`) into a
+# commit. build.sh now refuses a flag-shaped argv, but that guards ONE argv
+# shape, not the CLASS — any build output that lands in a commit. The honest
+# gate lives at the COMMITTED-tree layer (elf_gate), beside the Go compile and
+# CHANGELOG gates: every tracked ELF file must be one of the two SHIPPED
+# binaries (app/bin/gladex, app/src/go/gladex). Y pins the GREEN and RED paths
+# hermetically; M25 defeats the hand-off to prove Y's red assertion
+# discriminates rather than passing by accident.
+new_sandbox
+# GREEN: an ALLOWLISTED ELF (a shipped binary's own path) must not trip it
+mkdir -p "$SB/repo/app/bin"
+head -c 64 /bin/true > "$SB/repo/app/bin/gladex"
+commit "y shipped elf"
+run_tool "$SB/repo"
+assert_rc "Y1: a committed allowlisted ELF stays green" 0 "$RC"
+run_tool "$SB/repo" --format json
+json_ok "Y2: the elf gate is ok and lists the one shipped binary" \
+ "d['elf_allowlist']['ok'] is True and d['elf_allowlist']['tracked_elf'] == ['app/bin/gladex'] and d['elf_allowlist']['unexpected'] == []"
+# the class-0 fixture (data.bin, b'\x7fELF\x00bin') is NOT judged as ELF — it
+# has the 4-byte magic but no valid class byte at offset 4, so it stays a mere
+# NUL-byte "binary" skip, never a stray-artefact verdict.
+json_ok "Y3: the NUL-byte magic stub is skipped, never judged as a stray ELF" \
+ "d['elf_allowlist']['tracked_elf'] == ['app/bin/gladex'] and d['skipped'].get('binary', 0) >= 1"
+
+# RED: a stray REAL ELF at a non-allowlisted path — the swept artefact itself
+head -c 64 /bin/true > "$SB/repo/build-artefact.bin"
+commit "y stray elf artefact"
+run_tool "$SB/repo"
+assert_rc "Y4: a committed stray ELF exits 1 (a build artefact is a defect)" 1 "$RC"
+assert_contains "Y5: the FAIL line names the artefact and the elf rule" \
+ "FAIL build-artefact.bin [elf]" "$OUT"
+assert_contains "Y6: the FAIL line names the allowlist so the fix is obvious" \
+ "allowlist: app/bin/gladex, app/src/go/gladex" "$OUT"
+assert_contains "Y7: the closing line reports a lint RULE, not a parse error" \
+ "result: 1 file(s) fail lint (elf) (exit 1)" "$OUT"
+run_tool "$SB/repo" --format json
+assert_rc "Y8: json exit_code mirrors the process" 1 "$RC"
+json_ok "Y9: the elf gate names the unexpected artefact and is not ok" \
+ "d['elf_allowlist']['ok'] is False and d['elf_allowlist']['unexpected'] == ['build-artefact.bin'] and d['exit_code'] == 1 and d['ok'] is False"
+json_ok "Y10: the failure blames the artefact with lang elf" \
+ "d['failures'] and d['failures'][0]['path'] == 'build-artefact.bin' and d['failures'][0]['lang'] == 'elf'"
+# cleanup: back to the seed so the trap and Z inherit a clean sandbox
+reset_clean
+run_tool "$SB/repo"
+assert_rc "Y11: sandbox clean again after the section" 0 "$RC"
+
# --- Z: the EXIT trap's claim, read while the run is still alive ---------------
# `cleanup` runs from the EXIT trap AFTER the summary printed below, so
# nothing above it can see whether the trap did its job. This suite is
# the (128) inventory's near-zero case, measured on the untouched file
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)
[Sun Oct 11 12:16:04 2026] 127.0.0.1:51886 Accepted [Sun Oct 11 12:16:04 2026] 127.0.0.1:51886 Closing [Sun Oct 11 12:16:04 2026] 127.0.0.1:51890 Accepted [Sun Oct 11 12:16:04 2026] 127.0.0.1:51890 Closing [Sun Oct 11 12:16:04 2026] 127.0.0.1:51898 Accepted [Sun Oct 11 12:16:04 2026] 127.0.0.1:51898 Closing [Sun Oct 11 12:16:05 2026] 127.0.0.1:51908 Accepted [Sun Oct 11 12:16:05 2026] 127.0.0.1:51908 Closing [Sun Oct 11 12:16:05 2026] 127.0.0.1:51912 Accepted [Sun Oct 11 12:16:05 2026] 127.0.0.1:51912 Closing [Sun Oct 11 12:16:05 2026] 127.0.0.1:51914 Accepted [Sun Oct 11 12:16:05 2026] 127.0.0.1:51914 Closing [Sun Oct 11 12:16:05 2026] 127.0.0.1:51922 Accepted [Sun Oct 11 12:16:05 2026] 127.0.0.1:51922 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60714 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60714 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60720 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60720 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60728 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60728 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60730 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60730 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60734 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60734 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60738 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60738 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60746 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60746 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60754 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60754 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60770 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60770 Closing [Sun Oct 11 12:30:12 2026] 127.0.0.1:60784 Accepted [Sun Oct 11 12:30:12 2026] 127.0.0.1:60784 Closing [Sun Oct 11 12:31:05 2026] 127.0.0.1:41256 Accepted [Sun Oct 11 12:31:05 2026] 127.0.0.1:41256 Closing [Sun Oct 11 12:31:05 2026] 127.0.0.1:41262 Accepted [Sun Oct 11 12:31:05 2026] 127.0.0.1:41262 Closing [Sun Oct 11 12:31:05 2026] 127.0.0.1:41270 Accepted [Sun Oct 11 12:31:05 2026] 127.0.0.1:41270 Closing [Sun Oct 11 12:31:05 2026] 127.0.0.1:41284 Accepted [Sun Oct 11 12:31:05 2026] 127.0.0.1:41284 Closing [Sun Oct 11 12:31:05 2026] 127.0.0.1:41290 Accepted [Sun Oct 11 12:31:05 2026] 127.0.0.1:41290 Closing [Sun Oct 11 12:31:05 2026] 127.0.0.1:41292 Accepted [Sun Oct 11 12:31:05 2026] 127.0.0.1:41292 Closing [Sun Oct 11 12:31:05 2026] 127.0.0.1:41304 Accepted [Sun Oct 11 12:31:06 2026] 127.0.0.1:41304 Closing [Sun Oct 11 12:31:06 2026] 127.0.0.1:41314 Accepted [Sun Oct 11 12:31:06 2026] 127.0.0.1:41314 Closing [Sun Oct 11 12:31:06 2026] 127.0.0.1:41326 Accepted [Sun Oct 11 12:31:06 2026] 127.0.0.1:41326 Closing [Sun Oct 11 12:31:06 2026] 127.0.0.1:41342 Accepted [Sun Oct 11 12:31:06 2026] 127.0.0.1:41342 Closing [Sun Oct 11 12:34:19 2026] 127.0.0.1:34896 Accepted [Sun Oct 11 12:34:19 2026] 127.0.0.1:34896 Closing [Sun Oct 11 12:37:49 2026] 127.0.0.1:52250 Accepted [Sun Oct 11 12:37:49 2026] 127.0.0.1:52250 Closing [Sun Oct 11 12:39:45 2026] 127.0.0.1:40646 Accepted
Generated 2026-10-11 10:39:45 UTC · Gladex.de