Gladex Agent Logs

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

Overview
Run logs1196 files, 73.9 MB
Latest run logrun-20261006-204734-730.log
Log directory/data/agent-logs
App log directory/opt/startup/prod/logs
Run logs (newest first, last 50)
FileSizeModified (UTC)
run-20261006-204734-730.log 101 KB 2026-10-06 18:55:48
run-20261006-193520-729.log 347 KB 2026-10-06 18:37:25
run-20261006-164643-728.log 351 KB 2026-10-06 17:25:12
run-20261006-124129-727.log 445 KB 2026-10-06 14:36:35
run-20261006-104452-726.log 468 KB 2026-10-06 10:31:20
run-20261006-090726-725.log 338 KB 2026-10-06 08:34:44
run-20261006-073331-724.log 245 KB 2026-10-06 06:57:18
run-20261006-061912-723.log 266 KB 2026-10-06 05:23:23
run-20261006-053304-722.log 192 KB 2026-10-06 04:09:04
run-20261006-041829-721.log 341 KB 2026-10-06 03:22:57
run-20261006-031229-720.log 292 KB 2026-10-06 02:08:21
run-20261006-022028-719.log 271 KB 2026-10-06 01:02:21
run-20261006-013213-718.log 276 KB 2026-10-06 00:10:20
run-20261006-004412-717.log 192 KB 2026-10-05 23:22:05
run-20261005-234618-716.log 235 KB 2026-10-05 22:34:04
run-20261005-225616-715.log 296 KB 2026-10-05 21:36:11
run-20261005-215648-714.log 220 KB 2026-10-05 20:46:08
run-20261005-205855-713.log 188 KB 2026-10-05 19:46:40
run-20261005-201246-712.log 321 KB 2026-10-05 18:48:47
run-20261005-190629-711.log 213 KB 2026-10-05 18:02:38
run-20261005-174000-710.log 397 KB 2026-10-05 16:56:22
run-20261005-164047-709.log 254 KB 2026-10-05 15:29:53
run-20261005-160934-708.log 139 KB 2026-10-05 14:30:37
run-20261005-155925-707.log 153 B 2026-10-05 13:59:26
run-20261005-154917-706.log 190 B 2026-10-05 13:49:18
run-20261005-153909-705.log 153 B 2026-10-05 13:39:09
run-20261005-152900-704.log 153 B 2026-10-05 13:29:01
run-20261005-142051-703.log 222 KB 2026-10-05 13:18:53
run-20261005-130731-702.log 227 KB 2026-10-05 12:10:44
run-20261005-120453-701.log 163 KB 2026-10-05 10:57:24
run-20261005-094142-700.log 440 KB 2026-10-05 09:54:46
run-20261005-090130-699.log 165 KB 2026-10-05 07:31:34
run-20261005-071341-698.log 435 KB 2026-10-05 06:51:22
run-20261005-061647-697.log 196 KB 2026-10-05 05:03:34
run-20261005-052959-696.log 226 KB 2026-10-05 04:06:39
run-20261005-044026-695.log 177 KB 2026-10-05 03:19:52
run-20261005-034927-694.log 254 KB 2026-10-05 02:30:18
run-20261005-030059-693.log 312 KB 2026-10-05 01:39:20
run-20261004-233305-692.log 1010 KB 2026-10-05 00:50:51
run-20261004-230052-691.log 130 KB 2026-10-04 21:22:57
run-20261004-221607-690.log 258 KB 2026-10-04 20:50:44
run-20261004-210204-689.log 310 KB 2026-10-04 20:05:59
run-20261004-184239-688.log 505 KB 2026-10-04 18:51:56
run-20261004-172538-687.log 486 KB 2026-10-04 16:32:32
run-20261004-165539-686.log 142 KB 2026-10-04 15:15:29
run-20261004-161338-685.log 176 KB 2026-10-04 14:45:31
run-20261004-160330-684.log 153 B 2026-10-04 14:03:31
run-20261004-155322-683.log 153 B 2026-10-04 13:53:23
run-20261004-154314-682.log 190 B 2026-10-04 13:43:15
run-20261004-153306-681.log 153 B 2026-10-04 13:33:07
Tail — run-20261006-204734-730.log (last 200 lines)
#                        that other suites grep for verdict strings.
#   the detail is PRINTABLE ASCII, byte for byte (section 21): JSON is UTF-8,
#                        so one byte >= 0x80 makes a STRICT reader refuse the
#                        whole document while the lenient reader the
#                        assertions run through (`sys.stdin`, which is
#                        `errors=surrogateescape` here) parses it happily —
#                        the lenient path was passing a document no strict one
#                        would take; and `cut -c1-400` counts BYTES under
#                        `LC_ALL=C`, so a surviving multi-byte sequence could
#                        be split in half there. The writer's own shapes are
#                        ASCII, so nothing real is dropped.
#   the shapes a truncated or twice-run write produces each have a defined
#                        reading (sections 16-20): a 0-byte log, a verdict
#                        line with no trailing newline, two verdict lines in
#                        one log, a log dated in the future, and an age that
#                        cannot be read. None of them may become a pass by
#                        accident, and the last one must warn even on a green.
#   the WRITER's own classified failures are REPLAYED, not typed (section 22):
#                        tools/ip-drift-cron itself runs once per exit branch
#                        through its sandbox hooks, and the row then reads the
#                        file that run wrote — so `no_a_records`,
#                        `dns_lookup_failed` and `public_ip_unavailable` each
#                        land as error from the code that produces them, not
#                        from a line this suite typed. The same harness must
> build · mimo-v2.6-flash-free
→ Read repo/tests/test_system_status_ip_drift.sh [offset=130, limit=175]
> build · mimo-v2.6-flash-free
$ cd /data/repo; echo "=== counts pinned elsewhere"; grep -rn "\b759\b\|\b779\b\|759/0\|779" tests/ tools/ REGISTRY* 2>/dev/null | grep -v test_system_status_ip_drift.sh | head; echo "=== run_mutation"; sed -n '3074,3130p' tests/test_system_status_ip_drift.sh; echo "=== NAD29 uses"; grep -n 'NAD29\|NOK29' tests/test_system_status_ip_drift.sh; echo "=== NAD28 uses"; grep -n 'NAD28\|NOK28' tests/test_system_status_ip_drift.sh
=== counts pinned elsewhere
tools/REGISTRY.md:2391:  decorations after it** (`/tmp/opencode/probe48/`): clean **759/0**, dec1
tools/REGISTRY.md:2398:  now reddens**. The suite moves **686 → 759/0** (`bash -n` clean), and
tools/REGISTRY.md:2418:  clean tree **759 / 0**, M14's tree **746 / 1 rc 1**, M15's **758 / 1
tools/REGISTRY.md:2434:  after the concatenation). Battery after it: **`=== Results: 779 passed,
tools/REGISTRY.md:2435:  0 failed ===`, rc 0** (759 + 10 for M12/M13 + 10 for M14/M15); the
tools/REGISTRY.md:2436:  default run stays **759 / 0** (the battery is opt-in), and `--help` now
=== run_mutation
# `--mutations`, and `GSIP_WRITER_PLANT=1` skips this block outright. Both
# plants also avoid the arm-adjacency that made rdrO/rdrR's 31 reds a
# control26/control27A cascade: neither touches the `no_a_records` arm, so
# every red the inner run prints is a red that READ the planted line.
#
# Opt-in, for the reason tests/test_ip_drift_cron.sh's battery is opt-in: two
# extra suite runs, about two minutes.
if [ "$DO_WRITER_MUT" = "1" ] && [ "${GSIP_WRITER_PLANT:-0}" != "1" ]; then
    echo ""
    echo "=== writer-plant mutations: an append-shaped WRONG KIND, caught by section 28 ==="
    run_writer_plant() {   # <id> <label> <find> <repl> <pin: the expected FAIL assertion>
        local id="$1" label="$2" find="$3" repl="$4" expect="$5"
        local tree="$SANDBOX/wtree-$id" out="$SANDBOX/wtree-$id.out" n rc
        rm -rf "$tree"; mkdir -p "$tree"
        if cp -R "$REPO/tests" "$tree/tests" 2>/dev/null \
           && cp -R "$REPO/tools" "$tree/tools" 2>/dev/null \
           && [ -f "$tree/tests/test_system_status_ip_drift.sh" ] \
           && [ -f "$tree/tools/ip-drift-cron" ]; then
            ok "$id: the sandbox tree is built (tests/ + tools/, REPO= resolves there)"
        else
            bad "$id: the sandbox tree could not be built"
            return 0
        fi
        n=$(python3 - "$tree/tools/ip-drift-cron" "$find" "$repl" <<'PY'
import sys
p, find, repl = sys.argv[1], sys.argv[2], sys.argv[3]
s = open(p).read()
n = s.count(find)
if n == 1:
    open(p, 'w').write(s.replace(find, repl, 1))
print(n)
PY
        )
        if [ "$n" != "1" ]; then
            bad "$id: plant pattern occurs '${n:-0}' times, need exactly 1 (plant NOT applied)"
            return 0
        fi
        ok "$id: plant applied exactly once"
        if bash -n "$tree/tools/ip-drift-cron" 2>/dev/null; then
            ok "$id: the planted writer parses (a red must come from behaviour, not a parse error)"
        else
            bad "$id: the planted writer does not parse"
            return 0
        fi
        chmod +x "$tree/tools/ip-drift-cron"
        GSIP_WRITER_PLANT=1 bash "$tree/tests/test_system_status_ip_drift.sh" > "$out" 2>&1
        rc=$?
        if [ "$rc" != "0" ]; then
            ok "$id → the suite goes red (rc=$rc), the mutant did not survive"
        else
            bad "$id → suite stayed GREEN, the mutant survived"
        fi
        if grep -F "FAIL - " "$out" | grep -qF "$expect"; then
            ok "$id → wrong verdict lands on the intended assertion: '$expect'"
        else
            bad "$id → wrong verdict is NOT the intended one (expected a failure of: '$expect')"
        fi
=== NAD29 uses
1613:    NOK29=$(printf '%s\n' "$ROWS29" | grep -c $'^ok\t')
1614:    NAD29=$(printf '%s\n' "$ROWS29" | grep -c $'^bad\t')
1615:    [ "$NOK29" = "3" ] && [ "$NAD29" = "6" ] \
1617:        || bad "control29 src: found $NOK29 presence + $NAD29 absence assertion(s), expected 3 + 6 — an edit changed what this block believes exists"
=== NAD28 uses
1376:    NOK28=$(printf '%s\n' "$TRIPLES28" | grep -c $'^ok\t')
1377:    NAD28=$(printf '%s\n' "$TRIPLES28" | grep -c $'^bad\t')
1378:    [ "$NOK28" = "3" ] && [ "$NAD28" = "6" ] \
1380:        || bad "control28 src: found $NOK28 presence + $NAD28 absence assertion(s), expected 3 + 6 — an edit changed what this block believes exists"
> build · mimo-v2.6-flash-free
$ cd /data/repo && python3 - <<'PY'
s=open('tests/test_system_status_ip_drift.sh').read()
t16="bad\t$LOG_CGN\trun 'ip-drift-check --format json' by hand and read its public_ip.\n"
t17a='[ "$NOK29" = "3" ] '
t17b='&& [ "$NAD29" = "6" ]'
print("M16 target count:", s.count(t16))
print("M17 find count:", s.count(t17a+t17b))
print("M17 A count:", s.count(t17a), "B count:", s.count(t17b))
# also alternative contract line for 29
t16b="'bad\\t$LOG_CGN\\tegress is NOT an IP address' \\\n"
print("alt29 line count:", s.count(t16b))
print("NOK29 =3 count:", s.count('[ "$NOK29" = "3" ]'), "NAD29=6:", s.count('[ "$NAD29" = "6" ]'))
PY
M16 target count: 1
M17 find count: 1
M17 A count: 1 B count: 1
alt29 line count: 1
NOK29 =3 count: 1 NAD29=6: 1
> build · mimo-v2.6-flash-free
← Write /tmp/opencode/probe50/build.sh
Created file successfully: /tmp/opencode/probe50/build.sh
> build · mimo-v2.6-flash-free
$ chmod +x /tmp/opencode/probe50/build.sh && bash /tmp/opencode/probe50/build.sh 2>&1 | tail -40
79ee4c52650eb115e8542fa55823dab7  /data/repo/tests/test_system_status_ip_drift.sh
tree clean built
tree p28 built
tree p29 built
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'p28/tests/test_system_status_ip_drift.sh'
PLANT FAIL M16
> build · mimo-v2.6-flash-free
← Edit /tmp/opencode/probe50/build.sh
Index: /tmp/opencode/probe50/build.sh
===================================================================
--- /tmp/opencode/probe50/build.sh
+++ /tmp/opencode/probe50/build.sh
@@ -55,8 +55,15 @@
 done
 
 plant p28 M16 "$M16_A$M16_B" ""            || { echo "PLANT FAIL M16"; exit 1; }
 plant p29 M17 "$M17_A$M17_B" '[ "$NOK29" = "3" ] && [ "$NAD29" = "5" ]' || { echo "PLANT FAIL M17"; exit 1; }
+echo "(needles re-counted below against the committed suite, outside the trees)"
+python3 - "$SRC_SUITE" "$M16_A$M16_B" "$M17_A$M17_B" <<'PY'
+import sys
+s = open(sys.argv[1]).read()
+print("committed suite: M16 find count=%d, M17 find count=%d"
+      % (s.count(sys.argv[2]), s.count(sys.argv[3])))
+PY
 for tr in p28 p29; do
     if bash -n "$OUT/$tr/tests/test_system_status_ip_drift.sh"; then
         echo "bash -n $tr: OK"
     else

> build · mimo-v2.6-flash-free
← Edit /tmp/opencode/probe50/build.sh
Index: /tmp/opencode/probe50/build.sh
===================================================================
--- /tmp/opencode/probe50/build.sh
+++ /tmp/opencode/probe50/build.sh
@@ -53,10 +53,10 @@
     make_tree "$tr" || { echo "TREE FAIL $tr"; exit 1; }
     echo "tree $tr built"
 done
 
-plant p28 M16 "$M16_A$M16_B" ""            || { echo "PLANT FAIL M16"; exit 1; }
-plant p29 M17 "$M17_A$M17_B" '[ "$NOK29" = "3" ] && [ "$NAD29" = "5" ]' || { echo "PLANT FAIL M17"; exit 1; }
+plant "$OUT/p28" M16 "$M16_A$M16_B" ""            || { echo "PLANT FAIL M16"; exit 1; }
+plant "$OUT/p29" M17 "$M17_A$M17_B" '[ "$NOK29" = "3" ] && [ "$NAD29" = "5" ]' || { echo "PLANT FAIL M17"; exit 1; }
 echo "(needles re-counted below against the committed suite, outside the trees)"
 python3 - "$SRC_SUITE" "$M16_A$M16_B" "$M17_A$M17_B" <<'PY'
 import sys
 s = open(sys.argv[1]).read()

> build · mimo-v2.6-flash-free
$ bash /tmp/opencode/probe50/build.sh 2>&1 | tail -40
79ee4c52650eb115e8542fa55823dab7  /data/repo/tests/test_system_status_ip_drift.sh
tree clean built
tree p28 built
tree p29 built
M16: s.count(find)=1
M17: s.count(find)=1
(needles re-counted below against the committed suite, outside the trees)
committed suite: M16 find count=1, M17 find count=1
bash -n p28: OK
bash -n p29: OK
--- run clean
clean: rc=0  === Results: 759 passed, 0 failed ===  FAIL-lines=0  seconds=63
--- run p28
p28: rc=1  === Results: 758 passed, 1 failed ===  FAIL-lines=1  seconds=63
      FAIL - control28 src: the extracted set is not the contract — 0a1;> bad	$LOG_CGN	run 'ip-drift-check --format json' by hand and read its public_ip.;
--- run p29
p29: rc=1  === Results: 758 passed, 1 failed ===  FAIL-lines=1  seconds=68
      FAIL - control29 src: found 3 presence + 6 absence assertion(s), expected 3 + 6 — an edit changed what this block believes exists
> 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)
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60500 Accepted
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60500 Closing
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60504 Accepted
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60504 Closing
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60518 Accepted
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60518 Closing
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60524 Accepted
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60524 Closing
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60528 Accepted
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60528 Closing
[Tue Oct  6 20:54:44 2026] 127.0.0.1:60540 Accepted
[Tue Oct  6 20:54:45 2026] 127.0.0.1:60540 Closing
[Tue Oct  6 20:54:45 2026] 127.0.0.1:51482 Accepted
[Tue Oct  6 20:54:45 2026] 127.0.0.1:51482 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55560 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55560 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55576 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55576 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55588 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55588 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55598 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55598 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55614 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55614 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55626 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55626 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55628 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55628 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55644 Accepted
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55644 Closing
[Tue Oct  6 20:55:33 2026] 127.0.0.1:55648 Accepted
[Tue Oct  6 20:55:34 2026] 127.0.0.1:55648 Closing
[Tue Oct  6 20:55:34 2026] 127.0.0.1:55658 Accepted
[Tue Oct  6 20:55:34 2026] 127.0.0.1:55658 Closing
[Tue Oct  6 20:56:10 2026] 127.0.0.1:46124 Accepted
[Tue Oct  6 20:56:10 2026] 127.0.0.1:46124 Closing
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49108 Accepted
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49108 Closing
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49122 Accepted
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49122 Closing
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49128 Accepted
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49128 Closing
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49136 Accepted
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49136 Closing
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49150 Accepted
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49150 Closing
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49154 Accepted
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49154 Closing
[Tue Oct  6 21:00:11 2026] 127.0.0.1:49164 Accepted
[Tue Oct  6 21:00:12 2026] 127.0.0.1:49164 Closing
[Tue Oct  6 21:00:12 2026] 127.0.0.1:49170 Accepted
[Tue Oct  6 21:00:12 2026] 127.0.0.1:49170 Closing
[Tue Oct  6 21:00:12 2026] 127.0.0.1:49172 Accepted
[Tue Oct  6 21:00:12 2026] 127.0.0.1:49172 Closing
[Tue Oct  6 21:00:12 2026] 127.0.0.1:49174 Accepted
[Tue Oct  6 21:00:12 2026] 127.0.0.1:49174 Closing
[Tue Oct  6 21:00:24 2026] 127.0.0.1:59432 Accepted
[Tue Oct  6 21:00:24 2026] 127.0.0.1:59432 Closing
[Tue Oct  6 21:00:24 2026] 127.0.0.1:43008 Accepted

Generated 2026-10-06 19:00:24 UTC · Gladex.de