Gladex Agent Logs

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

Overview
Run logs524 files, 17.6 MB
Latest run logrun-20260926-032802-122.log
Log directory/data/agent-logs
App log directory/opt/startup/prod/logs
Run logs (newest first, last 50)
FileSizeModified (UTC)
run-20260926-032802-122.log 166 KB 2026-09-26 01:56:03
run-20260926-024118-121.log 334 KB 2026-09-26 01:18:02
run-20260926-020038-120.log 273 KB 2026-09-26 00:31:18
run-20260926-015037-119.log 153 B 2026-09-25 23:50:38
run-20260926-014036-118.log 153 B 2026-09-25 23:40:37
run-20260926-013035-117.log 153 B 2026-09-25 23:30:36
run-20260926-012035-116.log 153 B 2026-09-25 23:20:35
run-20260926-011034-115.log 153 B 2026-09-25 23:10:35
run-20260926-010033-114.log 153 B 2026-09-25 23:00:34
run-20260926-005033-113.log 190 B 2026-09-25 22:50:33
run-20260926-004031-112.log 153 B 2026-09-25 22:40:33
run-20260926-003030-111.log 153 B 2026-09-25 22:30:31
run-20260926-002029-110.log 153 B 2026-09-25 22:20:30
run-20260926-001029-109.log 153 B 2026-09-25 22:10:29
run-20260926-000025-108.log 190 B 2026-09-25 22:00:29
run-20260925-235025-107.log 153 B 2026-09-25 21:50:25
run-20260925-234024-106.log 153 B 2026-09-25 21:40:25
run-20260925-233023-105.log 153 B 2026-09-25 21:30:24
run-20260925-232022-104.log 153 B 2026-09-25 21:20:23
run-20260925-231021-103.log 153 B 2026-09-25 21:10:22
run-20260925-230021-102.log 153 B 2026-09-25 21:00:21
run-20260925-225020-101.log 190 B 2026-09-25 20:50:21
run-20260925-224019-100.log 153 B 2026-09-25 20:40:19
run-20260925-223018-99.log 152 B 2026-09-25 20:30:19
run-20260925-222017-98.log 152 B 2026-09-25 20:20:18
run-20260925-221016-97.log 152 B 2026-09-25 20:10:17
run-20260925-220015-96.log 152 B 2026-09-25 20:00:16
run-20260925-213653-95.log 141 KB 2026-09-25 19:50:15
run-20260925-205157-94.log 389 KB 2026-09-25 19:26:53
run-20260925-195858-93.log 517 KB 2026-09-25 18:41:57
run-20260925-192850-92.log 321 KB 2026-09-25 17:48:58
run-20260925-185030-91.log 325 KB 2026-09-25 17:18:50
run-20260925-180536-90.log 232 KB 2026-09-25 16:40:30
run-20260925-173957-89.log 252 KB 2026-09-25 15:55:36
run-20260925-171044-88.log 201 KB 2026-09-25 15:29:57
run-20260925-163300-87.log 247 KB 2026-09-25 15:00:44
run-20260925-160013-86.log 175 KB 2026-09-25 14:23:00
run-20260925-153430-85.log 158 KB 2026-09-25 13:50:13
run-20260925-152430-84.log 152 B 2026-09-25 13:24:30
run-20260925-151428-83.log 189 B 2026-09-25 13:14:30
run-20260925-150428-82.log 152 B 2026-09-25 13:04:28
run-20260925-145427-81.log 152 B 2026-09-25 12:54:28
run-20260925-144426-80.log 152 B 2026-09-25 12:44:27
run-20260925-143426-79.log 152 B 2026-09-25 12:34:26
run-20260925-142425-78.log 189 B 2026-09-25 12:24:26
run-20260925-141424-77.log 152 B 2026-09-25 12:14:25
run-20260925-140424-76.log 152 B 2026-09-25 12:04:24
run-20260925-135423-75.log 152 B 2026-09-25 11:54:24
run-20260925-134422-74.log 152 B 2026-09-25 11:44:23
run-20260925-133422-73.log 152 B 2026-09-25 11:34:22
Tail — run-20260926-032802-122.log (last 200 lines)
> build · mimo-v2.6-flash-free
$ cd /data/repo; bash tests/test_regression_run.sh 2>&1 | tee /tmp/opencode/trr.log | grep -E '^(FAIL|===)' ; echo "SUITE_RC=${PIPESTATUS[0]}"; echo "--- totals ---"; tail -2 /tmp/opencode/trr.log
=== A. --help contract
FAIL: A5.1 --help 'exit codes:' differs from docstring 'Exit codes:'
FAIL: A5.2 --help 'summary parsing:' differs from docstring 'Summary parsing (why it is not a format guess):'
FAIL: A5.3 --help 'environment:' differs from docstring 'Environment:'
FAIL: A5.4 --help 'examples:' differs from docstring 'Examples:'
FAIL: A7 silence-is-not-green documented (missing: NEVER)
=== B. exit codes
FAIL: B5 green covers 3 distinct shapes (want=3 got=)
=== C. parsing
=== D. json
=== E. flags
=== F. epilog refusal
=== G. live
=== H. static
=== Results: 96 passed, 6 failed ===
SUITE_RC=1
--- totals ---

=== Results: 96 passed, 6 failed ===
> build · mimo-v2.6-flash-free
96/102. Let me debug the 6 failures.
$ cd /data/repo; R=./tools/regression-run; S=/tmp/opencode/regr-fixtures
echo "=== diff docstring vs help section (exit codes) ==="
awk -v h="Exit codes:" '!inb && $0==h {inb=1; next} inb && $0=="" {exit} inb {if (substr($0,1,4)=="    ") print substr($0,5); else print}' "$R" | sed '/^$/d' > /tmp/opencode/doc.txt
awk -v l="exit codes:" '$0==l {inb=1; next} inb && ($0=="exit codes:"||$0=="summary parsing:"||$0=="environment:"||$0=="examples:") {exit} inb {print}' <($R --help 2>&1) | sed '/^$/d' > /tmp/opencode/helpsec.txt
diff /tmp/opencode/doc.txt /tmp/opencode/helpsec.txt && echo "IDENTICAL"
echo "--- wc ---"; wc -l /tmp/opencode/doc.txt /tmp/opencode/helpsec.txt
=== diff docstring vs help section (exit codes) ===
IDENTICAL
--- wc ---
  12 /tmp/opencode/doc.txt
  12 /tmp/opencode/helpsec.txt
  24 total
$ cd /data/repo; ./tools/regression-run --tests-dir /tmp/opencode/regr-fixtures/green --format json | python3 -c "import json,sys; d=json.load(sys.stdin); print(repr(d['shapes']))"; echo "--- jget style ---"; J=$(./tools/regression-run --tests-dir /tmp/opencode/regr-fixtures/green --format json); 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)
' "$J" shapes; echo "--- then len ---"; python3 -c 'import json,sys; print(len(json.load(sys.stdin)))' <<<"$(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)
' "$J" shapes)"
{'fence': 1, 'results': 1, 'bare': 1}
--- jget style ---
{'fence': 1, 'results': 1, 'bare': 1}
--- then len ---
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.12/json/__init__.py", line 293, in load
    return loads(fp.read(),
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
               ^^^^^^^^^^^^^^^^^^^^^^
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
> build · mimo-v2.6-flash-free
Three real bugs found:

1. **`help_section` takes the help *text* but `awk` treats it as a *filename`** — so every A5 byte-comparison was comparing against nothing.
2. **`jget` used `print(d)` → Python repr**, emitting `{'fence': 1}` and `True` — invalid JSON on any non-scalar.
3. **A7 asserted on `NEVER`**, which lives in a docstring section the epilog never renders.
← 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
@@ -75,15 +75,17 @@
     inb { if (substr($0,1,4) == "    ") print substr($0,5); else print }
   ' "$2"
 }
 # The section `--help` renders under one of the epilog's four labels.
-help_section() { # label, file
-  awk -v l="$1" '
+# Takes TEXT, not a path: awk must read it from stdin, because passing the
+# help output as "$2" makes awk treat a paragraph as a filename.
+help_section() { # label, text
+  printf '%s\n' "$2" | awk -v l="$1" '
     $0 == l { inb = 1; next }
     inb && ($0 == "exit codes:" || $0 == "summary parsing:" ||
             $0 == "environment:" || $0 == "examples:") { exit }
     inb { print }
-  ' "$2"
+  '
 }
 # First line of a helper that actually invokes the tool. Extracting BY FUNCTION
 # keeps these checks from matching their own needle text in this file.
 helper_line() { # function name

← 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
@@ -57,14 +57,17 @@
   RC=$?
   ERR=$(cat "$SB/.err")
 }
 jget() { # json, dotted key (list indices are integers)
+  # json.dumps, NOT 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)
+print(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.

> build · mimo-v2.6-flash-free
$ cd /data/repo; grep -n '"True"\|"False"\|A7 ' tests/test_regression_run.sh
157:assert_contains "A7 silence-is-not-green documented" "NEVER" "$HELP"
221:assert_eq "C9 conflict flagged (failures + exit 0)" "True" "$(jget "$OUT" suites.0.conflict)"
226:assert_eq "C11 skipped reported when the summary carries it" "True" "$(jget "$OUT" suites.0.skipped_reported)"
227:assert_eq "C12 skipped_reported false for a bare summary" "False" "$(jget "$OUT" suites.1.skipped_reported)"
241:assert_eq "D5 json ok false on failure" "False" "$(jget "$OUT" ok)"
247:assert_eq "D8 usage error under json ok false" "False" "$(jget "$OUT" ok)"
> build · mimo-v2.6-flash-free
$ cd /data/repo; python3 - <<'EOF'
import re
p='tests/test_regression_run.sh'
s=open(p).read()
before=s
s=s.replace('assert_contains "A7 silence-is-not-green documented" "NEVER" "$HELP"',
            'assert_contains "A7 silence-is-not-green documented in a RENDERED section" "not a green run with a small number" "$HELP"')
# json.dumps emits JSON booleans, not Python's True/False
s=s.replace('"True" "$(jget', '"true" "$(jget')
s=s.replace('"False" "$(jget', '"false" "$(jget')
open(p,'w').write(s)
print("changed:", s!=before)
EOF
grep -n 'A7 \|"true" "$(jget\|"false" "$(jget' tests/test_regression_run.sh
changed: True
157:assert_contains "A7 silence-is-not-green documented in a RENDERED section" "not a green run with a small number" "$HELP"
221:assert_eq "C9 conflict flagged (failures + exit 0)" "true" "$(jget "$OUT" suites.0.conflict)"
226:assert_eq "C11 skipped reported when the summary carries it" "true" "$(jget "$OUT" suites.0.skipped_reported)"
227:assert_eq "C12 skipped_reported false for a bare summary" "false" "$(jget "$OUT" suites.1.skipped_reported)"
241:assert_eq "D5 json ok false on failure" "false" "$(jget "$OUT" ok)"
247:assert_eq "D8 usage error under json ok false" "false" "$(jget "$OUT" ok)"
> build · mimo-v2.6-flash-free
`json.dumps` would now quote *string* fields (`"failed"`). Let me handle scalars properly:
← 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
@@ -57,17 +57,18 @@
   RC=$?
   ERR=$(cat "$SB/.err")
 }
 jget() { # json, dotted key (list indices are integers)
-  # json.dumps, NOT 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.
+  # 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(json.dumps(d))
+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.

> build · mimo-v2.6-flash-free
$ cd /data/repo; bash tests/test_regression_run.sh 2>&1 | tee /tmp/opencode/trr.log | grep -E '^(FAIL|===)' ; echo "SUITE_RC=${PIPESTATUS[0]}"
=== A. --help contract
=== B. exit codes
=== C. parsing
=== D. json
=== E. flags
=== F. epilog refusal
=== G. live
=== H. static
=== Results: 102 passed, 0 failed ===
SUITE_RC=0
> build · mimo-v2.6-flash-free

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)
[Sat Sep 26 03:42:25 2026] 127.0.0.1:44070 Accepted
[Sat Sep 26 03:42:25 2026] 127.0.0.1:44070 Closing
[Sat Sep 26 03:42:25 2026] 127.0.0.1:44072 Accepted
[Sat Sep 26 03:42:25 2026] 127.0.0.1:44072 Closing
[Sat Sep 26 03:42:25 2026] 127.0.0.1:44076 Accepted
[Sat Sep 26 03:42:25 2026] 127.0.0.1:44076 Closing
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45714 Accepted
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45714 Closing
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45726 Accepted
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45726 Closing
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45742 Accepted
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45742 Closing
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45758 Accepted
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45758 Closing
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45768 Accepted
[Sat Sep 26 03:42:42 2026] 127.0.0.1:45768 Closing
[Sat Sep 26 03:42:57 2026] 127.0.0.1:39900 Accepted
[Sat Sep 26 03:42:57 2026] 127.0.0.1:39900 Closing
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39908 Accepted
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39908 Closing
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39910 Accepted
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39910 Closing
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39914 Accepted
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39914 Closing
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39930 Accepted
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39930 Closing
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39936 Accepted
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39936 Closing
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39944 Accepted
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39944 Closing
[Sat Sep 26 03:42:58 2026] 127.0.0.1:39948 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39948 Closing
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39958 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39958 Closing
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39964 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39964 Closing
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39970 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39970 Closing
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39982 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39982 Closing
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39990 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:39990 Closing
[Sat Sep 26 03:42:59 2026] 127.0.0.1:40004 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:40004 Closing
[Sat Sep 26 03:42:59 2026] 127.0.0.1:40006 Accepted
[Sat Sep 26 03:42:59 2026] 127.0.0.1:40006 Closing
[Sat Sep 26 03:46:40 2026] 127.0.0.1:59670 Accepted
[Sat Sep 26 03:46:40 2026] 127.0.0.1:59670 Closing
[Sat Sep 26 03:46:45 2026] 127.0.0.1:53980 Accepted
[Sat Sep 26 03:46:45 2026] 127.0.0.1:53980 Closing
[Sat Sep 26 03:46:46 2026] 127.0.0.1:53986 Accepted
[Sat Sep 26 03:46:46 2026] 127.0.0.1:53986 Closing
[Sat Sep 26 03:50:28 2026] 127.0.0.1:45736 Accepted
[Sat Sep 26 03:50:28 2026] 127.0.0.1:45736 Closing
[Sat Sep 26 03:50:28 2026] 127.0.0.1:45748 Accepted
[Sat Sep 26 03:50:28 2026] 127.0.0.1:45748 Closing
[Sat Sep 26 03:56:06 2026] 127.0.0.1:58730 Accepted
[Sat Sep 26 03:56:06 2026] 127.0.0.1:58730 Closing
[Sat Sep 26 03:56:06 2026] 127.0.0.1:58736 Accepted

Generated 2026-09-26 01:56:06 UTC · Gladex.de