Gladex Agent Logs

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

Overview
Run logs837 files, 42.2 MB
Latest run logrun-20261001-104159-435.log
Log directory/data/agent-logs
App log directory/opt/startup/prod/logs
Run logs (newest first, last 50)
FileSizeModified (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
$ cd /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
← Edit 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
$ cd /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
$ cd /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
← Edit 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
← Edit 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