Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 837 files, 42.2 MB |
| Latest run log | run-20261001-104159-435.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261001-104159-435.log | 180 KB | 2026-10-01 08:54:26 |
| run-20261001-092806-434.log | 353 KB | 2026-10-01 08:31:53 |
| run-20261001-080602-433.log | 406 KB | 2026-10-01 07:17:59 |
| run-20261001-065553-432.log | 373 KB | 2026-10-01 05:55:55 |
| run-20261001-050850-431.log | 523 KB | 2026-10-01 04:45:47 |
| run-20261001-042252-430.log | 198 KB | 2026-10-01 02:58:43 |
| run-20261001-032127-429.log | 327 KB | 2026-10-01 02:12:46 |
| run-20261001-022005-428.log | 263 KB | 2026-10-01 01:11:21 |
| run-20261001-020022-427.log | 205 KB | 2026-10-01 00:09:58 |
| run-20261001-015015-426.log | 153 B | 2026-09-30 23:50:16 |
| run-20261001-014008-425.log | 153 B | 2026-09-30 23:40:09 |
| run-20261001-013001-424.log | 153 B | 2026-09-30 23:30:02 |
| run-20261001-011954-423.log | 153 B | 2026-09-30 23:19:55 |
| run-20261001-010947-422.log | 153 B | 2026-09-30 23:09:48 |
| run-20261001-005940-421.log | 153 B | 2026-09-30 22:59:41 |
| run-20261001-004933-420.log | 153 B | 2026-09-30 22:49:34 |
| run-20261001-003926-419.log | 153 B | 2026-09-30 22:39:27 |
| run-20261001-002920-418.log | 190 B | 2026-09-30 22:29:20 |
| run-20261001-001913-417.log | 153 B | 2026-09-30 22:19:13 |
| run-20261001-000906-416.log | 153 B | 2026-09-30 22:09:07 |
| run-20260930-231805-415.log | 582 KB | 2026-09-30 21:59:00 |
| run-20260930-223504-414.log | 194 KB | 2026-09-30 21:07:59 |
| run-20260930-212614-413.log | 270 KB | 2026-09-30 20:24:58 |
| run-20260930-201407-412.log | 423 KB | 2026-09-30 19:16:08 |
| run-20260930-184629-411.log | 463 KB | 2026-09-30 18:04:01 |
| run-20260930-165104-410.log | 325 KB | 2026-09-30 16:36:29 |
| run-20260930-161443-409.log | 189 KB | 2026-09-30 14:41:04 |
| run-20260930-160441-408.log | 153 B | 2026-09-30 14:04:43 |
| run-20260930-155440-407.log | 153 B | 2026-09-30 13:54:41 |
| run-20260930-154440-406.log | 153 B | 2026-09-30 13:44:40 |
| run-20260930-153439-405.log | 153 B | 2026-09-30 13:34:40 |
| run-20260930-152438-404.log | 190 B | 2026-09-30 13:24:39 |
| run-20260930-151438-403.log | 190 B | 2026-09-30 13:14:38 |
| run-20260930-150437-402.log | 153 B | 2026-09-30 13:04:37 |
| run-20260930-145436-401.log | 153 B | 2026-09-30 12:54:37 |
| run-20260930-144435-400.log | 153 B | 2026-09-30 12:44:36 |
| run-20260930-143435-399.log | 190 B | 2026-09-30 12:34:35 |
| run-20260930-142434-398.log | 153 B | 2026-09-30 12:24:35 |
| run-20260930-141433-397.log | 153 B | 2026-09-30 12:14:34 |
| run-20260930-140433-396.log | 153 B | 2026-09-30 12:04:33 |
| run-20260930-135432-395.log | 153 B | 2026-09-30 11:54:33 |
| run-20260930-134431-394.log | 153 B | 2026-09-30 11:44:32 |
| run-20260930-133431-393.log | 190 B | 2026-09-30 11:34:31 |
| run-20260930-132430-392.log | 153 B | 2026-09-30 11:24:31 |
| run-20260930-131429-391.log | 153 B | 2026-09-30 11:14:30 |
| run-20260930-130429-390.log | 153 B | 2026-09-30 11:04:29 |
| run-20260930-125428-389.log | 153 B | 2026-09-30 10:54:29 |
| run-20260930-124427-388.log | 153 B | 2026-09-30 10:44:28 |
| run-20260930-123427-387.log | 153 B | 2026-09-30 10:34:27 |
| run-20260930-122426-386.log | 153 B | 2026-09-30 10:24:27 |
Tail — run-20261001-104159-435.log (last 200 lines)
environment:
free-space preflight:
examples:
+sequencing:
termination contract:"
for pair in "${EPILOG[@]+"${EPILOG[@]}"}"; do
lbl=${pair%%|*}
assert_contains "A3 epilog label '$lbl' rendered" "$lbl" "$HELP"
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n '60,100p' tests/test_regression_run.sh; grep -n "^TOOL=\|TOOL=" tests/test_regression_run.sh | head
# would light up this section for every mutation and drown the real red.
# The tool's own path resolution is pinned separately, by G6, and only when
# the shipped binary is the one under test.
run_live() {
OUT=$(GLADEX_REPO_DIR="$REPO" "$TOOL" "$@" 2>"$SB/.err")
RC=$?
ERR=$(cat "$SB/.err")
}
# Live run at the SHIPPED location, deliberately WITHOUT the env override —
# this is the one that pins default_repo(). Safe flag first, same rule as run_live.
run_default() {
OUT=$("$TOOL" "$@" 2>"$SB/.err")
RC=$?
ERR=$(cat "$SB/.err")
}
jget() { # json, dotted key (list indices are integers)
# A string prints raw (so `status == failed`, not `"failed"`); anything else
# goes through json.dumps, NEVER print(): print() of a dict or a bool yields
# Python's repr (`{'a': 1}`, `True`), which is not JSON — a field reader must
# never hand its caller a value the JSON contract would reject.
python3 -c '
import json, sys
d = json.loads(sys.argv[1])
for k in sys.argv[2].split("."):
d = d[k] if isinstance(d, dict) else d[int(k)]
print(d if isinstance(d, str) else json.dumps(d))
' "$1" "$2" 2>/dev/null
}
json_keys() { python3 -c 'import json,sys; print(",".join(sorted(json.load(sys.stdin))))' <<<"$1"; }
# The module docstring's section under an exact column-0 heading, dedented 4.
# The closing `"""` is a terminator as well as a blank line: this reads the
# FILE, and the docstring's LAST section has no blank line between its body
# and the delimiter, so without that clause the extraction hands back the
# delimiter and A5's byte comparison fails against a --help that was right.
doc_section() { # heading, file
awk -v h="$1" '
!inb && $0 == h { inb = 1; next }
inb && ($0 == "" || $0 == "\"\"\"") { exit }
inb { if (substr($0,1,4) == " ") print substr($0,5); else print }
' "$2"
}
12:TOOL="${REGRESSION_RUN_BIN:-$REPO/tools/regression-run}"
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_regression_run.sh
Index: repo/tests/test_regression_run.sh
===================================================================
--- repo/tests/test_regression_run.sh
+++ repo/tests/test_regression_run.sh
@@ -258,8 +258,37 @@
assert_contains "A19 an unmeasurable path refusing reaches --help" \
"must not pass" "$HELP"
assert_contains "A20 the fixture-hook warning reaches --help" \
"Both fixture env vars are test hooks" "$HELP"
+# (103): the same defect a third section down — and this time the guard.
+# The sequencing paragraph lived in the docstring and in no rendered section
+# at all. Measured on the unmodified tool before a line was written:
+# `grep -c 'jobs flag' <(regression-run --help)` → 0 and `grep -c 'points
+# outside it' <(--help)` → 0, so the reader of `--help` was told nothing about
+# why there is no `--jobs` flag, and the paragraph held the docstring's only
+# BEHAVIOURAL sentence ("It writes nothing to the repo unless --log-dir points
+# outside it") behind no label — a promise about where this tool writes, in a
+# section nobody rendered. A21 and A22 are that defect; each needle sits in
+# that paragraph only, and both were 0 before its column-0 heading landed.
+assert_contains "A21 the sequencing rationale reaches --help (--jobs)" \
+ "--jobs flag would trade a reproducible total" "$HELP"
+assert_contains "A22 the behavioural sentence reaches --help" \
+ "It writes nothing to the repo unless --log-dir points outside it" "$HELP"
+# A23 is the guard the defect implies. EPILOG_PAIRS' own comment declares
+# which docstring blocks are deliberately NOT rendered, and nothing checked
+# that declaration against the source: a NEW column-0 block written without a
+# label is the (103) defect by construction (content rendered by nothing), and
+# a declared-absent block that has since gained a pair leaves the comment
+# naming something that renders. Every column-0 line inside the module
+# docstring must therefore be either a rendered pair heading or exactly that
+# one inward-facing block. Pre-fix this read the four unlabelled paragraph
+# lines as well, i.e. five extras instead of one — the red that would have
+# caught the defect rather than the prose that named it.
+doc_col0=$(awk '/^"""/ {n++; next} n == 1 && /^[^ ]/ && NF {print}' "$TOOL")
+epilog_headings=$(printf '%s\n' "${EPILOG[@]+"${EPILOG[@]}"}" | sed '/^$/d' | cut -d'|' -f2 | sort -u)
+unrendered=$(comm -23 <(printf '%s\n' "$doc_col0" | sort -u) <(printf '%s\n' "$epilog_headings"))
+assert_eq "A23 every column-0 docstring block is rendered or the one declared inward-facing block" \
+ "Why this tool exists" "$unrendered"
# (90) The two things deriving the list above from EPILOG_PAIRS cannot see for
# itself. A16: a tuple whose shape the extractor no longer understands yields an
# EMPTY list, and an empty list makes A3, A4 and A5 assert nothing at all — a
# suite that reports fewer reds because it stopped asking is the defect this
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "seven\|eight" tests/test_regression_run.sh | head -20
108:# EPILOG_LABELS, derived from the tool's own EPILOG_PAIRS, so a seventh pair
161:# EPILOG_PAIRS, so a seventh pair would render and never be byte-compared
174:# `a b c` there), which would hand `read` a single record and turn seven
178:# The eight sections that document a contract a reader may rely on. Deliberately
304:# seven labels it pins, and every derived loop below simply stops iterating the
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n '104,116p;157,182p;296,312p' tests/test_regression_run.sh
# Every label is a terminator, including the one this section is looking at:
# a label the reader does not know about swallows the text after it, which is
# how a byte-comparison can fail for a reason that is not the docstring.
# The terminator set is NOT a literal here any more (queue item (90)): it is
# EPILOG_LABELS, derived from the tool's own EPILOG_PAIRS, so a seventh pair
# added to the tool is a section this function knows how to bound without
# anyone editing a fourth list. An EMPTY set would swallow nothing and stop
# nowhere, so A2b refuses to let that reach these loops.
help_section() { # label, text
printf '%s\n' "$2" | awk -v l="$1" -v labels="${EPILOG_LABELS-}" '
BEGIN { n = split(labels, L, "\n"); for (i = 1; i <= n; i++) if (L[i] != "") S[L[i]] = 1 }
$0 == l { inb = 1; next }
inb && ($0 in S) { exit }
assert_eq "A1 --help exits 0" 0 "$HRC"
assert_contains "A2 usage line is argparse's own" "usage: regression-run" "$HELP"
############ ONE source for the epilog's section list (queue item (90))
# A3, A4, A5 and help_section() each carried their own hand-written copy of
# EPILOG_PAIRS, so a seventh pair would render and never be byte-compared
# unless somebody also edited three lists — coverage that only grows when a
# human remembers it. The list is read out of the tool instead. The two blind
# spots a derived list creates are asserted at the END of this section (A16,
# A17.*): an empty extraction would make every loop below assert nothing, and a
# pair quietly deleted from the tuple would make the loops stop asking about it.
mapfile -t EPILOG < <(
sed -n '/^EPILOG_PAIRS = (/,/^)$/p' "$TOOL" |
sed -n 's/^[[:space:]]*("\([^"]*\)", "\([^"]*\)"),$/\1|\2/p'
)
EPILOG_LABELS=$(printf '%s\n' "${EPILOG[@]+"${EPILOG[@]}"}" | sed '/^$/d' | cut -d'|' -f1)
# The pairs as TEXT for a heredoc. An unquoted heredoc re-joins an array
# expansion into ONE space-separated line (`${arr[@]+"${arr[@]}"}` collapses to
# `a b c` there), which would hand `read` a single record and turn seven
# byte-comparisons into one — so the newlines are materialised in a variable
# first, where they survive.
EPILOG_LINES=$(printf '%s\n' "${EPILOG[@]+"${EPILOG[@]}"}")
# The eight sections that document a contract a reader may rely on. Deliberately
# NOT derived: this is the expectation the derivation is checked against, so a
# pair removed from the tuple goes red instead of vanishing from every loop.
EPILOG_REQUIRED="exit codes:
summary parsing:
# the mirror image, a pair deleted from the tuple. Derived loops stop iterating
# over a section that is gone, so without this pin every one of them stays
# green while a documented contract silently loses its only rendering.
assert_ge "A16 EPILOG_PAIRS parsed from the tool (list is not empty)" 1 "${#EPILOG[@]}"
# (92): A16 is a FLOOR, not an equality. An extractor that reads five of six
# rows still passes `>= 1`, and a row the tuple's own spelling hid from the sed
# pattern above (a pair split across two lines, a trailing-comma style change)
# is caught by NEITHER guard: A16 sees a non-empty list, A17 only asks about the
# seven labels it pins, and every derived loop below simply stops iterating the
# row it never received — a suite that reports the same greens while testing one
# section fewer. So the pair count is read a SECOND time by Python's own parser,
# which does not care how the tuple is laid out, and the two numbers must agree.
# The reader failing to count is a red, never a pass: an empty answer means "I
# could not measure", and a measurement that could not be taken must not report
# green (the same non-vacuity rule A16 states, one direction stricter).
EPILOG_PAIRS_COUNT=$(python3 -c '
import ast, re, sys
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_regression_run.sh
Index: repo/tests/test_regression_run.sh
===================================================================
--- repo/tests/test_regression_run.sh
+++ repo/tests/test_regression_run.sh
@@ -170,9 +170,9 @@
)
EPILOG_LABELS=$(printf '%s\n' "${EPILOG[@]+"${EPILOG[@]}"}" | sed '/^$/d' | cut -d'|' -f1)
# The pairs as TEXT for a heredoc. An unquoted heredoc re-joins an array
# expansion into ONE space-separated line (`${arr[@]+"${arr[@]}"}` collapses to
-# `a b c` there), which would hand `read` a single record and turn seven
+# `a b c` there), which would hand `read` a single record and turn eight
# byte-comparisons into one — so the newlines are materialised in a variable
# first, where they survive.
EPILOG_LINES=$(printf '%s\n' "${EPILOG[@]+"${EPILOG[@]}"}")
# The eight sections that document a contract a reader may rely on. Deliberately
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_regression_run.sh
Index: repo/tests/test_regression_run.sh
===================================================================
--- repo/tests/test_regression_run.sh
+++ repo/tests/test_regression_run.sh
@@ -300,9 +300,9 @@
# (92): A16 is a FLOOR, not an equality. An extractor that reads five of six
# rows still passes `>= 1`, and a row the tuple's own spelling hid from the sed
# pattern above (a pair split across two lines, a trailing-comma style change)
# is caught by NEITHER guard: A16 sees a non-empty list, A17 only asks about the
-# seven labels it pins, and every derived loop below simply stops iterating the
+# eight labels it pins, and every derived loop below simply stops iterating the
# row it never received — a suite that reports the same greens while testing one
# section fewer. So the pair count is read a SECOND time by Python's own parser,
# which does not care how the tuple is laid out, and the two numbers must agree.
# The reader failing to count is a red, never a pass: an empty answer means "I
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)
[Thu Oct 1 10:14:43 2026] 127.0.0.1:35532 Accepted [Thu Oct 1 10:14:43 2026] 127.0.0.1:35532 Closing [Thu Oct 1 10:14:43 2026] 127.0.0.1:35536 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35536 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35542 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35542 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35552 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35552 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35560 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35560 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35572 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35572 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35576 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35576 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35590 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35590 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35600 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35600 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35602 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35602 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35610 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35610 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35622 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35622 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35626 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35626 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35640 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35640 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35652 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35652 Closing [Thu Oct 1 10:14:44 2026] 127.0.0.1:35664 Accepted [Thu Oct 1 10:14:44 2026] 127.0.0.1:35664 Closing [Thu Oct 1 10:30:03 2026] 127.0.0.1:53276 Accepted [Thu Oct 1 10:30:03 2026] 127.0.0.1:53276 Closing [Thu Oct 1 10:30:03 2026] 127.0.0.1:53278 Accepted [Thu Oct 1 10:30:03 2026] 127.0.0.1:53278 Closing [Thu Oct 1 10:30:08 2026] 127.0.0.1:46588 Accepted [Thu Oct 1 10:30:08 2026] 127.0.0.1:46588 Closing [Thu Oct 1 10:30:57 2026] 127.0.0.1:54446 Accepted [Thu Oct 1 10:30:57 2026] 127.0.0.1:54446 Closing [Thu Oct 1 10:30:57 2026] 127.0.0.1:54462 Accepted [Thu Oct 1 10:30:57 2026] 127.0.0.1:54462 Closing [Thu Oct 1 10:30:57 2026] 127.0.0.1:54474 Accepted [Thu Oct 1 10:30:57 2026] 127.0.0.1:54474 Closing [Thu Oct 1 10:30:57 2026] 127.0.0.1:54490 Accepted [Thu Oct 1 10:30:57 2026] 127.0.0.1:54490 Closing [Thu Oct 1 10:30:57 2026] 127.0.0.1:54494 Accepted [Thu Oct 1 10:30:57 2026] 127.0.0.1:54494 Closing [Thu Oct 1 10:30:57 2026] 127.0.0.1:54502 Accepted [Thu Oct 1 10:30:57 2026] 127.0.0.1:54502 Closing [Thu Oct 1 10:30:57 2026] 127.0.0.1:54518 Accepted [Thu Oct 1 10:30:58 2026] 127.0.0.1:54518 Closing [Thu Oct 1 10:30:58 2026] 127.0.0.1:54530 Accepted [Thu Oct 1 10:30:58 2026] 127.0.0.1:54530 Closing [Thu Oct 1 10:30:58 2026] 127.0.0.1:54536 Accepted [Thu Oct 1 10:30:58 2026] 127.0.0.1:54536 Closing [Thu Oct 1 10:30:58 2026] 127.0.0.1:54542 Accepted [Thu Oct 1 10:30:58 2026] 127.0.0.1:54542 Closing [Thu Oct 1 10:54:38 2026] 127.0.0.1:43400 Accepted
Generated 2026-10-01 08:54:38 UTC · Gladex.de