Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 1492 files, 98.9 MB |
| Latest run log | run-20261012-030041-1026.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261012-030041-1026.log | 129 KB | 2026-10-12 01:29:37 |
| run-20261012-020830-1025.log | 211 KB | 2026-10-12 00:50:32 |
| run-20261012-015820-1024.log | 154 B | 2026-10-11 23:58:21 |
| run-20261012-014810-1023.log | 154 B | 2026-10-11 23:48:11 |
| run-20261012-013800-1022.log | 154 B | 2026-10-11 23:38:01 |
| run-20261012-012750-1021.log | 154 B | 2026-10-11 23:27:50 |
| run-20261012-011740-1020.log | 191 B | 2026-10-11 23:17:40 |
| run-20261012-010729-1019.log | 154 B | 2026-10-11 23:07:30 |
| run-20261012-005719-1018.log | 154 B | 2026-10-11 22:57:20 |
| run-20261012-004709-1017.log | 154 B | 2026-10-11 22:47:10 |
| run-20261012-003659-1016.log | 154 B | 2026-10-11 22:37:00 |
| run-20261012-002649-1015.log | 154 B | 2026-10-11 22:26:49 |
| run-20261012-001638-1014.log | 154 B | 2026-10-11 22:16:38 |
| run-20261012-000627-1013.log | 154 B | 2026-10-11 22:06:28 |
| run-20261011-235617-1012.log | 154 B | 2026-10-11 21:56:18 |
| run-20261011-234606-1011.log | 154 B | 2026-10-11 21:46:07 |
| run-20261011-233556-1010.log | 154 B | 2026-10-11 21:35:57 |
| run-20261011-232546-1009.log | 154 B | 2026-10-11 21:25:47 |
| run-20261011-231535-1008.log | 154 B | 2026-10-11 21:15:36 |
| run-20261011-230525-1007.log | 154 B | 2026-10-11 21:05:25 |
| run-20261011-225514-1006.log | 154 B | 2026-10-11 20:55:15 |
| run-20261011-224503-1005.log | 154 B | 2026-10-11 20:45:04 |
| run-20261011-223453-1004.log | 154 B | 2026-10-11 20:34:54 |
| run-20261011-222443-1003.log | 154 B | 2026-10-11 20:24:44 |
| run-20261011-221433-1002.log | 154 B | 2026-10-11 20:14:33 |
| run-20261011-220422-1001.log | 154 B | 2026-10-11 20:04:23 |
| run-20261011-215412-1000.log | 154 B | 2026-10-11 19:54:13 |
| run-20261011-214402-999.log | 153 B | 2026-10-11 19:44:03 |
| run-20261011-213352-998.log | 153 B | 2026-10-11 19:33:53 |
| run-20261011-212342-997.log | 153 B | 2026-10-11 19:23:42 |
| run-20261011-211332-996.log | 153 B | 2026-10-11 19:13:32 |
| run-20261011-210321-995.log | 153 B | 2026-10-11 19:03:22 |
| run-20261011-205311-994.log | 153 B | 2026-10-11 18:53:12 |
| run-20261011-204301-993.log | 153 B | 2026-10-11 18:43:02 |
| run-20261011-203251-992.log | 153 B | 2026-10-11 18:32:52 |
| run-20261011-202241-991.log | 153 B | 2026-10-11 18:22:42 |
| run-20261011-201231-990.log | 190 B | 2026-10-11 18:12:31 |
| run-20261011-200220-989.log | 190 B | 2026-10-11 18:02:21 |
| run-20261011-195210-988.log | 153 B | 2026-10-11 17:52:11 |
| run-20261011-185748-987.log | 194 KB | 2026-10-11 17:42:01 |
| run-20261011-170546-986.log | 441 KB | 2026-10-11 16:47:38 |
| run-20261011-142655-985.log | 223 KB | 2026-10-11 14:55:36 |
| run-20261011-115914-984.log | 359 KB | 2026-10-11 12:16:44 |
| 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 |
Tail — run-20261012-030041-1026.log (last 200 lines)
+plant_run "$LE2" 3 1 rate-limit
+plant_run "$LE2" 4 1 rate-limit
+plant_run "$LE2" 5 # in flight: must NOT pad the streak to the threshold
+lexpect "16e-inflight-not-streak" "$LE2" "warning" "streak=4 consecutive non-zero runs 1..4" "0" "ok" "0"
+
+echo "--- 16f. nothing measured is never ok: a directory with no run logs ---"
+LF="$SANDBOX/runlogs-f"
+mkdir -p "$LF"
+lexpect "16f-empty" "$LF" "warning" "cannot verify: no run-*.log" "0" "ok" "0"
+
+echo "--- 16g. a sandboxed run (no hook, stub systemctl) must NOT read the live directory ---"
+OUT=$(env PATH="$STUB:$PATH" GLADEX_REPO_DIR="$REPOF" \
+ GLADEX_DEV_DB="$SANDBOX/no.db" GLADEX_PROD_DB="$SANDBOX/no.db" \
+ GLADEX_GO_BIN="$STUB/go" GLADEX_GO_TIMEOUT=3 \
+ GLADEX_REDWATCH_STATE="$SANDBOX/no-red-watch-state" \
+ "$TOOL" --format json 2>/dev/null || true)
+case "$(lstatus_of "$OUT")" in
+ warning) ok "16g-sandbox: row warns in a sandboxed run" ;;
+ *) bad "16g-sandbox: row should warn in a sandboxed run (got '$(lstatus_of "$OUT")')" ;;
+esac
+case "$(ldetail_of "$OUT")" in
+ *"sandboxed run"*) ok "16g-sandbox: the detail says the live directory was NOT read" ;;
+ *) bad "16g-sandbox: the detail should say the live dir was not read (got '$(ldetail_of "$OUT")')" ;;
+esac
+
+echo "--- 16h. a green about the past is a warning: the newest log past the stale bound ---"
+LH="$SANDBOX/runlogs-h"
+plant_run "$LH" 1 0
+plant_run "$LH" 2 0
+touch -d '2 hours ago' "$LH"/run-*.log
+lexpect "16h-stale" "$LH" "warning" "stale: newest run log" "0" "ok" "0"
+OUT=$(loop_run "$LH")
+case "$(ldetail_of "$OUT")" in
+ *"green about the past"*) ok "16h-stale: the detail says what kind of green it is" ;;
+ *) bad "16h-stale: the detail should say 'green about the past' (got '$(ldetail_of "$OUT")')" ;;
+esac
+
+echo "--- 16i. a markerless log that is not fresh is a run that DIED, not one that lives ---"
+LI="$SANDBOX/runlogs-i"
+plant_run "$LI" 1 0
+plant_run "$LI" 2 # no marker, and stale below: died mid-run
+touch -d '2 hours ago' "$LI"/run-20261012-000002-2.log
+lexpect "16i-dead-midrun" "$LI" "warning" "streak=1 consecutive non-zero runs 2" "0" "ok" "0"
+OUT=$(loop_run "$LI")
+case "$(ldetail_of "$OUT")" in
+ *"without exit marker"*) ok "16i-dead-midrun: the dead run is named as such" ;;
+ *) bad "16i-dead-midrun: the dead run should be named (got '$(ldetail_of "$OUT")')" ;;
+esac
+
+echo "--- 16j. the help text must describe the row that exists ---"
+HELP=$("$TOOL" --help 2>/dev/null)
+for tok in "loop-outcomes verdicts" "queue item (4)" "GLADEX_RUNLOG_STREAK"; do
+ printf '%s' "$HELP" | grep -qF "$tok" \
+ && ok "16j help: documents '$tok'" \
+ || bad "16j help: documents '$tok'"
+done
+
+echo "--- M8. dropping the row's call site must be visible, not silent ---"
+MUT8="$SANDBOX/system-status-no-loop-row"
+python3 - "$TOOL" "$MUT8" <<'PYMUT' >/dev/null 2>&1
+import sys
+src = open(sys.argv[1], encoding="utf-8").read()
+old = "check_loop_outcomes\n"
+n = src.count(old)
+assert n == 1, "call site not unique: %d matches" % n
+open(sys.argv[2], "w", encoding="utf-8").write(src.replace(old, ": # M8: row never emitted\n"))
+PYMUT
+chmod +x "$MUT8" 2>/dev/null || true
+if [ ! -f "$MUT8" ] || cmp -s "$TOOL" "$MUT8" 2>/dev/null; then
+ bad "M8 plant failed: the mutated copy is byte-identical to the tool"
+else
+ out=$(loop_run "$LC" "$MUT8")
+ case "$(lstatus_of "$out")" in
+ "") ok "M8 control: the mutant emits NO loop-outcomes row on the dead-loop fixture" ;;
+ *) bad "M8 control: the mutant should emit no row (got status '$(lstatus_of "$out")')" ;;
+ esac
+ out=$(loop_run "$LC")
+ case "$(lstatus_of "$out")" in
+ error) ok "M8 and the real tool still reds the dead loop on the same bytes - the call is load-bearing" ;;
+ *) bad "M8 and the real tool should still error (got '$(lstatus_of "$out")')" ;;
+ esac
+fi
+
+echo "--- M9. the streak threshold is load-bearing: 5 reds must trip a 5 gate and not a 99 one ---"
+MUT9="$SANDBOX/system-status-loose-streak-threshold"
+python3 - "$TOOL" "$MUT9" <<'PYMUT' >/dev/null 2>&1
+import sys
+src = open(sys.argv[1], encoding="utf-8").read()
+old = "(( lo_streak >= lo_thr ))"
+n = src.count(old)
+assert n == 1, "threshold not unique: %d matches" % n
+open(sys.argv[2], "w", encoding="utf-8").write(
+ src.replace(old, "(( lo_streak >= 99 ))"))
+PYMUT
+chmod +x "$MUT9" 2>/dev/null || true
+if [ ! -f "$MUT9" ] || cmp -s "$TOOL" "$MUT9" 2>/dev/null; then
+ bad "M9 plant failed: the mutated copy is byte-identical to the tool"
+else
+ out=$(loop_run "$LC" "$MUT9")
+ case "$(lstatus_of "$out")" in
+ warning) ok "M9 control: a 99 gate reads warning on the 5-red fixture the real tool reds" ;;
+ *) bad "M9 control: a 99 gate should warn (got '$(lstatus_of "$out")')" ;;
+ esac
+ out=$(loop_run "$LC")
+ case "$(lstatus_of "$out")" in
+ error) ok "M9 and the real tool still errors on the same bytes - the threshold is load-bearing, not decorative" ;;
+ *) bad "M9 and the real tool should error (got '$(lstatus_of "$out")')" ;;
+ esac
+ printf '%s' "$out" | python3 -c "import json,sys; json.load(sys.stdin)" 2>/dev/null \
+ && ok "M9 and the mutant are not a broken row: output is still valid JSON" \
+ || bad "M9 and the mutant should still emit valid JSON"
+fi
+
+echo ""
echo "assertions: $((PASS + FAIL))"
echo "passed: $PASS"
echo "failed: $FAIL"
echo "summary: $((PASS + FAIL)) assertions, $PASS passed, $FAIL failed"
> build · mimo-v2.6-flash-free
One bug in my own code: the ok branch appends the `without exit marker` suffix inline *and* the post-chain append would add it again. Removing the inline one:
[0m← [0mEdit repo/tools/system-status
Index: repo/tools/system-status
===================================================================
--- repo/tools/system-status
+++ repo/tools/system-status
@@ -1102,11 +1102,8 @@
lo_detail="run ${lo_lastid} exit=0, streak=0, window $((lo_total - lo_start)): ${lo_ok} ok / ${lo_red} red"
if (( lo_rl > 0 )); then
lo_detail="${lo_detail}, ${lo_rl} rate-limited"
fi
- if (( lo_nomarker > 0 )); then
- lo_detail="${lo_detail}, ${lo_nomarker} without exit marker"
- fi
lo_detail="${lo_detail}, ${lo_inflight} in-flight"
if [[ -n "$lo_age" ]] && (( lo_age > lo_stale )); then
# The green is measured, but about the past: the loop stopped
# writing logs long enough ago that "the last run went fine" says
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && bash -n tools/system-status && bash -n tests/test_system_status_failed_units.sh && echo "SYNTAX OK" && timeout 600 bash tests/test_system_status_failed_units.sh 2>&1 | tail -40
SYNTAX OK
ok - 16f-empty: errors 0
ok - 16f-empty: overall ok
ok - 16f-empty: exit 0
--- 16g. a sandboxed run (no hook, stub systemctl) must NOT read the live directory ---
ok - 16g-sandbox: row warns in a sandboxed run
ok - 16g-sandbox: the detail says the live directory was NOT read
--- 16h. a green about the past is a warning: the newest log past the stale bound ---
ok - 16h-stale: tool emitted JSON
ok - 16h-stale: output is valid JSON (the row's detail did not break it)
ok - 16h-stale: row status is 'warning'
ok - 16h-stale: detail carries 'stale: newest run log'
ok - 16h-stale: errors 0
ok - 16h-stale: overall ok
ok - 16h-stale: exit 0
ok - 16h-stale: the detail says what kind of green it is
--- 16i. a markerless log that is not fresh is a run that DIED, not one that lives ---
ok - 16i-dead-midrun: tool emitted JSON
ok - 16i-dead-midrun: output is valid JSON (the row's detail did not break it)
ok - 16i-dead-midrun: row status is 'warning'
ok - 16i-dead-midrun: detail carries 'streak=1 consecutive non-zero runs 2'
ok - 16i-dead-midrun: errors 0
ok - 16i-dead-midrun: overall ok
ok - 16i-dead-midrun: exit 0
ok - 16i-dead-midrun: the dead run is named as such
--- 16j. the help text must describe the row that exists ---
ok - 16j help: documents 'loop-outcomes verdicts'
ok - 16j help: documents 'queue item (4)'
ok - 16j help: documents 'GLADEX_RUNLOG_STREAK'
--- M8. dropping the row's call site must be visible, not silent ---
ok - M8 control: the mutant emits NO loop-outcomes row on the dead-loop fixture
ok - M8 and the real tool still reds the dead loop on the same bytes - the call is load-bearing
--- M9. the streak threshold is load-bearing: 5 reds must trip a 5 gate and not a 99 one ---
ok - M9 control: a 99 gate reads warning on the 5-red fixture the real tool reds
ok - M9 and the real tool still errors on the same bytes - the threshold is load-bearing, not decorative
ok - M9 and the mutant are not a broken row: output is still valid JSON
assertions: 330
passed: 330
failed: 0
summary: 330 assertions, 330 passed, 0 failed
> build · mimo-v2.6-flash-free
330/0 (was 244/0). Now check the risky neighbour — `test_system_status_ip_drift.sh` has row-count pins:
[0m$ [0mcd /data/repo && grep -n "row-count\|rows ->\|count_rows\|24 rows\|18 rows\|row_count" tests/test_system_status_ip_drift.sh | head -15
196:# over their for-lists = 24 rows, 12 anchor + 12
218:# row-count expectation from `4 / 24` to dec2's shrunk
2741: # (12 calls -> 9, 24 rows -> 18) counted by nobody
2757: # expanded over its own for-list into its two needles — 24 rows, 12
2857: && ok "control31 src: the 24 rows are exactly the contract — four groups x three scenarios x (own-kind anchor + foreign-kind absence), needles by body" \
3260: # helper no longer reads the foreign kind's absence`; M15 (the row-count
3360: # M15 — the contract's row-count expectation edited DOWN to dec2's shrunk
3364: # row-count assertion and nothing else (the contract diff still matches:
3365: # 24 rows against 24 rows).
3368: run_suite_plant M15 "M15 the row-count expectation is edited down" \
3496: # extraction still returns 24 rows while the contract holds 23, so
3497: # only the CONTRACT assertion reddens (the row-count assertion counts
> build · mimo-v2.6-flash-free
Those pins are about a fixture contract, not dashboard rows — safe. 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)
[Mon Oct 12 03:29:04 2026] 127.0.0.1:39264 Accepted [Mon Oct 12 03:29:04 2026] 127.0.0.1:39264 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42890 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42890 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42892 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42892 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42904 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42904 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42912 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42912 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42924 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42924 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42928 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42928 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42936 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42936 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42940 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42940 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42952 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42952 Closing [Mon Oct 12 03:30:20 2026] 127.0.0.1:42964 Accepted [Mon Oct 12 03:30:20 2026] 127.0.0.1:42964 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57656 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57656 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57668 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57668 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57682 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57682 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57698 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57698 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57700 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57700 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57710 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57710 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57716 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57716 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57720 Accepted [Mon Oct 12 03:31:21 2026] 127.0.0.1:57720 Closing [Mon Oct 12 03:31:21 2026] 127.0.0.1:57728 Accepted [Mon Oct 12 03:31:22 2026] 127.0.0.1:57728 Closing [Mon Oct 12 03:31:22 2026] 127.0.0.1:57742 Accepted [Mon Oct 12 03:31:22 2026] 127.0.0.1:57742 Closing [Mon Oct 12 03:32:23 2026] 127.0.0.1:37956 Accepted [Mon Oct 12 03:32:23 2026] 127.0.0.1:37956 Closing [Mon Oct 12 03:32:30 2026] 127.0.0.1:38736 Accepted [Mon Oct 12 03:32:30 2026] 127.0.0.1:38736 Closing [Mon Oct 12 03:33:58 2026] 127.0.0.1:49876 Accepted [Mon Oct 12 03:33:58 2026] 127.0.0.1:49876 Closed without sending a request; it was probably just an unused speculative preconnection [Mon Oct 12 03:33:58 2026] 127.0.0.1:49876 Closing [Mon Oct 12 03:34:00 2026] 127.0.0.1:49892 Accepted [Mon Oct 12 03:34:00 2026] 127.0.0.1:49892 Closed without sending a request; it was probably just an unused speculative preconnection [Mon Oct 12 03:34:00 2026] 127.0.0.1:49892 Closing [Mon Oct 12 03:34:38 2026] 127.0.0.1:32816 Accepted [Mon Oct 12 03:34:38 2026] 127.0.0.1:32816 Closed without sending a request; it was probably just an unused speculative preconnection [Mon Oct 12 03:34:38 2026] 127.0.0.1:32816 Closing [Mon Oct 12 03:34:39 2026] 127.0.0.1:32826 Accepted [Mon Oct 12 03:34:39 2026] 127.0.0.1:32826 Closed without sending a request; it was probably just an unused speculative preconnection [Mon Oct 12 03:34:39 2026] 127.0.0.1:32826 Closing [Mon Oct 12 03:38:56 2026] 127.0.0.1:55010 Accepted
Generated 2026-10-12 01:38:56 UTC · Gladex.de