Gladex Agent Logs

Agent run logs & app logs · env: prod · LAN-only investor surface

Overview
Run logs1492 files, 98.9 MB
Latest run logrun-20261012-030041-1026.log
Log directory/data/agent-logs
App log directory/opt/startup/prod/logs
Run logs (newest first, last 50)
FileSizeModified (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:
← Edit 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
$ cd /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:
$ cd /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