Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 864 files, 43.2 MB |
| Latest run log | run-20261001-174212-462.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-174212-462.log | 123 KB | 2026-10-01 15:48:40 |
| run-20261001-161948-461.log | 441 KB | 2026-10-01 15:32:06 |
| run-20261001-160941-460.log | 153 B | 2026-10-01 14:09:41 |
| run-20261001-155934-459.log | 153 B | 2026-10-01 13:59:34 |
| run-20261001-154926-458.log | 153 B | 2026-10-01 13:49:27 |
| run-20261001-153919-457.log | 153 B | 2026-10-01 13:39:20 |
| run-20261001-152911-456.log | 153 B | 2026-10-01 13:29:12 |
| run-20261001-151904-455.log | 153 B | 2026-10-01 13:19:05 |
| run-20261001-150856-454.log | 153 B | 2026-10-01 13:08:57 |
| run-20261001-145849-453.log | 153 B | 2026-10-01 12:58:50 |
| run-20261001-144842-452.log | 153 B | 2026-10-01 12:48:43 |
| run-20261001-143835-451.log | 153 B | 2026-10-01 12:38:35 |
| run-20261001-142828-450.log | 190 B | 2026-10-01 12:28:28 |
| run-20261001-141820-449.log | 153 B | 2026-10-01 12:18:21 |
| run-20261001-140813-448.log | 153 B | 2026-10-01 12:08:14 |
| run-20261001-135806-447.log | 153 B | 2026-10-01 11:58:07 |
| run-20261001-134759-446.log | 153 B | 2026-10-01 11:48:00 |
| run-20261001-133752-445.log | 153 B | 2026-10-01 11:37:53 |
| run-20261001-132745-444.log | 153 B | 2026-10-01 11:27:45 |
| run-20261001-131738-443.log | 190 B | 2026-10-01 11:17:39 |
| run-20261001-130731-442.log | 153 B | 2026-10-01 11:07:31 |
| run-20261001-125724-441.log | 153 B | 2026-10-01 10:57:24 |
| run-20261001-124717-440.log | 153 B | 2026-10-01 10:47:17 |
| run-20261001-123709-439.log | 153 B | 2026-10-01 10:37:10 |
| run-20261001-122702-438.log | 153 B | 2026-10-01 10:27:03 |
| run-20261001-121655-437.log | 153 B | 2026-10-01 10:16:56 |
| run-20261001-112609-436.log | 264 KB | 2026-10-01 10:06:49 |
| run-20261001-104159-435.log | 361 KB | 2026-10-01 09:16:02 |
| 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 |
Tail — run-20261001-174212-462.log (last 200 lines)
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"
}
# The section `--help` renders under one of the epilog's labels.
# 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.
# 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 }
inb { print }
'
}
# First line of a helper that actually invokes the tool. Extracting BY FUNCTION
[0m$ [0mcd /data/repo && grep -n "Results:\|passed\b.*failed\|SKIP\b\|skip()" tests/test_regression_run.sh | tail -40; echo "=== harness fn ==="; grep -n "^assert_eq\|^assert_ge\|^assert_contains\|^ok()\|^fail()\|^skip\|^run_live\|^run_sandbox\|^run_default\|^jget\|^json_keys" tests/test_regression_run.sh | head -40
134:printf '#!/usr/bin/env bash\necho "=== Results: 10 passed, 0 failed, 0 skipped ==="\nexit 0\n' > "$SB/green/test_alpha.sh"
135:printf '#!/usr/bin/env bash\necho "7 passed, 0 failed"\nexit 0\n' > "$SB/green/test_gamma.sh"
136:printf '#!/usr/bin/env bash\necho "Results: 3 passed, 0 failed"\nexit 0\n' > "$SB/green/test_delta.sh"
138:printf '#!/usr/bin/env bash\necho "beta suite: 5 passed, 1 failed"\nexit 1\n' > "$SB/red/test_beta.sh"
142:printf '#!/usr/bin/env bash\necho "4 passed, 0 failed"\nexit 3\n' > "$SB/crash/test_zeta.sh"
146:printf '#!/usr/bin/env bash\necho "=== Results: 12 passed, 0 failed ==="\necho "PASS: replay says 999 passed, 999 failed"\nexit 0\n' > "$SB/tie/test_theta.sh"
148:printf '#!/usr/bin/env bash\necho " ok - 8 passed, 2 failed"\nexit 0\n' > "$SB/fallback/test_iota.sh"
485: echo "SKIP G: shipped-location checks (suite runs from $REPO, not /data/repo)"
514: echo "SKIP G6: shipped-location checks (under test: $TOOL)"
535: | sed -n 's/^=== Results: [0-9][0-9]* passed, \([0-9][0-9]*\) failed.*$/\1/p' | tail -1)
538: "SKIP G: shipped-location checks" "$ISO_OUT"
611: "passed": 5, "failed": 0, "skipped": 0})
631: "totals": {"passed": 0, "failed": 0, "skipped": 0,
634: "passed": 1, "failed": 0, "skipped": 0},
636: "passed": 2, "failed": 0, "skipped": 0}]})
908:echo "=== Results: 1 passed, 0 failed, 0 skipped ==="
1142:echo "=== Results: 1 passed, 0 failed, 0 skipped ==="
1293:echo "=== Results: $PASS passed, $FAIL failed ==="
=== harness fn ===
21:ok() { PASS=$((PASS + 1)); echo "PASS: $1"; }
22:fail() { FAIL=$((FAIL + 1)); echo "FAIL: $1"; }
24:assert_eq() { # desc want got
27:assert_contains() { # desc needle haystack
33:assert_ge() { # desc want got (got >= want)
47:run_sandbox() {
63:run_live() {
70:run_default() {
75:jget() { # json, dotted key (list indices are integers)
88:json_keys() { python3 -c 'import json,sys; print(",".join(sorted(json.load(sys.stdin))))' <<<"$1"; }
157:assert_eq "A1 --help exits 0" 0 "$HRC"
158:assert_contains "A2 usage line is argparse's own" "usage: regression-run" "$HELP"
214:assert_contains "A6 exit 5 documented" "no test suites were discovered" "$HELP"
215:assert_contains "A7 silence-is-not-green documented in a RENDERED section" "not a green run with a small number" "$HELP"
216:assert_contains "A8 --note is on the usage line" "[--note TEXT]" "$HELP"
217:assert_contains "A9 --note documents its writer" "requires --save-baseline" "$HELP"
226:assert_eq "A10 exactly one NOTE_MAX definition" "1" "$(grep -c '^NOTE_MAX = ' "$TOOL")"
230:assert_contains "A11 --note help states the bound from the constant" \
232:assert_contains "A12 the baseline prose states the same bound" \
240:assert_contains "A13 the termination contract reaches --help (start_new_session)" \
242:assert_contains "A14 the signal outcome reaches --help (143 / 130)" \
244:assert_contains "A15 the declared escape limit reaches --help" \
256:assert_contains "A18 the preflight's watched paths reach --help" \
258:assert_contains "A19 an unmeasurable path refusing reaches --help" \
260:assert_contains "A20 the fixture-hook warning reaches --help" \
272:assert_contains "A21 the sequencing rationale reaches --help (--jobs)" \
274:assert_contains "A22 the behavioural sentence reaches --help" \
289:assert_eq "A23 every column-0 docstring block is rendered or the one declared inward-facing block" \
299:assert_ge "A16 EPILOG_PAIRS parsed from the tool (list is not empty)" 1 "${#EPILOG[@]}"
318:assert_eq "A16b EPILOG row count equals the tuple's own pair count (92)" \
336:assert_eq "B1 green -> 0" 0 "$RC"
338:assert_eq "B2 green totals 20 passed" "20" "$(jget "$J" totals.passed)"
339:assert_eq "B3 green totals 0 failed" "0" "$(jget "$J" totals.failed)"
340:assert_eq "B4 green suites_run 3" "3" "$(jget "$J" totals.suites_run)"
341:assert_eq "B5 green covers 3 distinct shapes" "3" \
345:assert_eq "B6 red -> 1" 1 "$RC"
346:assert_eq "B7 red failed 1" "1" "$(jget "$OUT" totals.failed)"
347:assert_eq "B8 red suite status failed" "failed" "$(jget "$OUT" suites.0.status)"
350:assert_eq "B9 silent -> 4" 4 "$RC"
351:assert_eq "B10 silent contributes 0 passed (never counted green)" "0" "$(jget "$OUT" totals.passed)"
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tools/regression-run [90m[offset=175, limit=200][0m
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tools/regression-run [90m[limit=240, offset=420][0m
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "def emit_json" -A 40 tools/regression-run; echo "=== record keys emitted ==="; grep -n '_text\|for k in\|json.dumps' tools/regression-run | head -30
970:def emit_json(payload: dict) -> None:
971- """Print the one JSON object, ordered by JSON_KEYS and key-set-checked.
972-
973- A refusal or a usage error must be indistinguishable IN SHAPE from a
974- verdict — that is what lets a `| jq` consumer handle both without a
975- special case — so the key set is enforced here rather than trusted.
976- """
977- if set(payload) != set(JSON_KEYS):
978- raise SystemExit(
979- f"{TOOL}: internal error — JSON key set drifted: "
980- f"missing={sorted(set(JSON_KEYS) - set(payload))} "
981- f"extra={sorted(set(payload) - set(JSON_KEYS))}"
982- )
983- print(json.dumps({k: payload[k] for k in JSON_KEYS}, indent=2, sort_keys=False))
984-
985-
986-def die(message: str, fmt: str, code: int, *, repo=None, tests_dir=None,
987- discovered=None) -> int:
988- """One refusal object, same 14 keys as a verdict.
989-
990- `repo`/`tests_dir`/`discovered` are optional on purpose: a refusal raised
991- BEFORE discovery (every usage error) has nothing to report there and keeps
992- the nulls it has always had, while the preflight — which is reached after
993- discovery, and whose whole claim is "nothing ran" — names what it decided
994- about, so `suites_discovered: 1` is visible in the same object as
995- `suites: []`.
996- """
997- payload = blank_payload("run", repo, tests_dir, discovered)
998- payload["error"] = message
999- payload["exit_code"] = code
1000- if fmt == "json":
1001- emit_json(payload)
1002- else:
1003- sys.stderr.write(f"{TOOL}: ERROR {message}\n")
1004- return code
1005-
1006-
1007-class _Parser(argparse.ArgumentParser):
1008- """argparse that raises instead of exiting, so `--format json` can answer."""
1009-
1010- def error(self, message): # noqa: D102 - argparse override
=== record keys emitted ===
437: "summary_text": None,
503: rec["summary_text"] = chosen["line"]
523: rec["_text"] = text
589: for k in ("passed", "failed", "skipped"):
738: attributed = {k: 0 for k in METRICS}
745: for k in METRICS:
774: base_totals = {k: doc["totals"].get(k, 0) for k in METRICS}
775: delta = {k: totals.get(k, 0) - base_totals[k] for k in METRICS}
776: closure_ok = all(attributed[k] == delta[k] for k in METRICS)
983: print(json.dumps({k: payload[k] for k in JSON_KEYS}, indent=2, sort_keys=False))
1218: text = rec.pop("_text", "")
[0m$ [0mcd /data/repo && grep -rn "skipped" tests/test_regression_run.sh | head -40; echo "=== how many assertions total now ==="; grep -c '^PASS:\|^FAIL:' /dev/null; grep -n "RESULTS\|=== Results" tests/test_regression_run.sh
134:printf '#!/usr/bin/env bash\necho "=== Results: 10 passed, 0 failed, 0 skipped ==="\nexit 0\n' > "$SB/green/test_alpha.sh"
401:assert_eq "C11 skipped reported when the summary carries it" "true" "$(jget "$OUT" suites.0.skipped_reported)"
402:assert_eq "C12 skipped_reported false for a bare summary" "false" "$(jget "$OUT" suites.1.skipped_reported)"
403:assert_eq "C13 skipped total still 0" "0" "$(jget "$OUT" totals.skipped)"
522:# Its own section G is skipped by the guard above, so this cannot recurse
611: "passed": 5, "failed": 0, "skipped": 0})
631: "totals": {"passed": 0, "failed": 0, "skipped": 0,
634: "passed": 1, "failed": 0, "skipped": 0},
636: "passed": 2, "failed": 0, "skipped": 0}]})
651:assert_eq "I6c an unreported skip is stored as null, not 0" "null" "$(jget "$BASE" suites.2.skipped)"
908:echo "=== Results: 1 passed, 0 failed, 0 skipped ==="
1142:echo "=== Results: 1 passed, 0 failed, 0 skipped ==="
1258:assert_contains "K25b and that ancestor is measured, not skipped" "has 1 MB free" "$ERR"
=== how many assertions total now ===
0
134:printf '#!/usr/bin/env bash\necho "=== Results: 10 passed, 0 failed, 0 skipped ==="\nexit 0\n' > "$SB/green/test_alpha.sh"
146:printf '#!/usr/bin/env bash\necho "=== Results: 12 passed, 0 failed ==="\necho "PASS: replay says 999 passed, 999 failed"\nexit 0\n' > "$SB/tie/test_theta.sh"
535: | sed -n 's/^=== Results: [0-9][0-9]* passed, \([0-9][0-9]*\) failed.*$/\1/p' | tail -1)
908:echo "=== Results: 1 passed, 0 failed, 0 skipped ==="
1142:echo "=== Results: 1 passed, 0 failed, 0 skipped ==="
1293:echo "=== Results: $PASS passed, $FAIL failed ==="
> 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)
[Thu Oct 1 17:26:52 2026] 127.0.0.1:34674 Accepted [Thu Oct 1 17:26:52 2026] 127.0.0.1:34674 Closing [Thu Oct 1 17:26:52 2026] 127.0.0.1:34688 Accepted [Thu Oct 1 17:26:52 2026] 127.0.0.1:34688 Closing [Thu Oct 1 17:27:34 2026] 127.0.0.1:56334 Accepted [Thu Oct 1 17:27:34 2026] 127.0.0.1:56334 Closing [Thu Oct 1 17:27:34 2026] 127.0.0.1:56342 Accepted [Thu Oct 1 17:27:34 2026] 127.0.0.1:56342 Closing [Thu Oct 1 17:27:34 2026] 127.0.0.1:56344 Accepted [Thu Oct 1 17:27:34 2026] 127.0.0.1:56344 Closing [Thu Oct 1 17:27:34 2026] 127.0.0.1:56358 Accepted [Thu Oct 1 17:27:34 2026] 127.0.0.1:56358 Closing [Thu Oct 1 17:27:34 2026] 127.0.0.1:56368 Accepted [Thu Oct 1 17:27:34 2026] 127.0.0.1:56368 Closing [Thu Oct 1 17:27:34 2026] 127.0.0.1:56372 Accepted [Thu Oct 1 17:27:34 2026] 127.0.0.1:56372 Closing [Thu Oct 1 17:27:34 2026] 127.0.0.1:56388 Accepted [Thu Oct 1 17:27:35 2026] 127.0.0.1:56388 Closing [Thu Oct 1 17:27:35 2026] 127.0.0.1:43100 Accepted [Thu Oct 1 17:27:35 2026] 127.0.0.1:43100 Closing [Thu Oct 1 17:27:35 2026] 127.0.0.1:43102 Accepted [Thu Oct 1 17:27:35 2026] 127.0.0.1:43102 Closing [Thu Oct 1 17:27:35 2026] 127.0.0.1:43112 Accepted [Thu Oct 1 17:27:35 2026] 127.0.0.1:43112 Closing [Thu Oct 1 17:29:18 2026] 127.0.0.1:47778 Accepted [Thu Oct 1 17:29:18 2026] 127.0.0.1:47778 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 17:29:18 2026] 127.0.0.1:47778 Closing [Thu Oct 1 17:29:19 2026] 127.0.0.1:47788 Accepted [Thu Oct 1 17:29:19 2026] 127.0.0.1:47788 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 17:29:19 2026] 127.0.0.1:47788 Closing [Thu Oct 1 17:29:52 2026] 127.0.0.1:44144 Accepted [Thu Oct 1 17:29:52 2026] 127.0.0.1:44144 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 17:29:52 2026] 127.0.0.1:44144 Closing [Thu Oct 1 17:29:53 2026] 127.0.0.1:44148 Accepted [Thu Oct 1 17:29:53 2026] 127.0.0.1:44148 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 17:29:53 2026] 127.0.0.1:44148 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50620 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50620 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50636 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50636 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50646 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50646 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50652 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50652 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50660 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50660 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50674 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50674 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50686 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50686 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50694 Accepted [Thu Oct 1 17:31:08 2026] 127.0.0.1:50694 Closing [Thu Oct 1 17:31:08 2026] 127.0.0.1:50696 Accepted [Thu Oct 1 17:31:09 2026] 127.0.0.1:50696 Closing [Thu Oct 1 17:31:09 2026] 127.0.0.1:50704 Accepted [Thu Oct 1 17:31:09 2026] 127.0.0.1:50704 Closing [Thu Oct 1 17:50:11 2026] 127.0.0.1:55832 Accepted [Thu Oct 1 17:50:11 2026] 127.0.0.1:55832 Closing [Thu Oct 1 17:50:12 2026] 127.0.0.1:55838 Accepted
Generated 2026-10-01 15:50:12 UTC · Gladex.de