Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 1594 files, 112.4 MB |
| Latest run log | run-20261014-061713-1128.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261014-061713-1128.log | 285 KB | 2026-10-14 04:42:19 |
| run-20261014-052042-1127.log | 96 KB | 2026-10-14 04:07:02 |
| run-20261014-044319-1126.log | 200 KB | 2026-10-14 03:10:30 |
| run-20261014-032502-1125.log | 531 KB | 2026-10-14 02:33:08 |
| run-20261014-024815-1124.log | 214 KB | 2026-10-14 01:14:52 |
| run-20261014-020537-1123.log | 283 KB | 2026-10-14 00:38:05 |
| run-20261014-015526-1122.log | 154 B | 2026-10-13 23:55:27 |
| run-20261014-014514-1121.log | 191 B | 2026-10-13 23:45:15 |
| run-20261014-013503-1120.log | 191 B | 2026-10-13 23:35:04 |
| run-20261014-012452-1119.log | 154 B | 2026-10-13 23:24:53 |
| run-20261014-011441-1118.log | 154 B | 2026-10-13 23:14:42 |
| run-20261014-010430-1117.log | 154 B | 2026-10-13 23:04:31 |
| run-20261014-005419-1116.log | 154 B | 2026-10-13 22:54:20 |
| run-20261014-004409-1115.log | 154 B | 2026-10-13 22:44:09 |
| run-20261014-003358-1114.log | 154 B | 2026-10-13 22:33:58 |
| run-20261014-002347-1113.log | 154 B | 2026-10-13 22:23:48 |
| run-20261014-001336-1112.log | 154 B | 2026-10-13 22:13:37 |
| run-20261014-000325-1111.log | 154 B | 2026-10-13 22:03:25 |
| run-20261013-235314-1110.log | 154 B | 2026-10-13 21:53:15 |
| run-20261013-234303-1109.log | 154 B | 2026-10-13 21:43:04 |
| run-20261013-233139-1108.log | 159 KB | 2026-10-13 21:32:53 |
| run-20261013-225919-1107.log | 255 KB | 2026-10-13 21:21:29 |
| run-20261013-222935-1106.log | 191 KB | 2026-10-13 20:49:08 |
| run-20261013-214526-1105.log | 128 KB | 2026-10-13 20:19:24 |
| run-20261013-203244-1104.log | 264 KB | 2026-10-13 19:35:16 |
| run-20261013-195951-1103.log | 283 KB | 2026-10-13 18:22:34 |
| run-20261013-192444-1102.log | 95 KB | 2026-10-13 17:49:40 |
| run-20261013-171515-1101.log | 585 KB | 2026-10-13 17:14:33 |
| run-20261013-161458-1100.log | 250 KB | 2026-10-13 15:05:05 |
| run-20261013-153047-1099.log | 183 KB | 2026-10-13 14:04:48 |
| run-20261013-144509-1098.log | 171 KB | 2026-10-13 13:20:37 |
| run-20261013-141129-1097.log | 228 KB | 2026-10-13 12:34:59 |
| run-20261013-123439-1096.log | 494 KB | 2026-10-13 12:01:17 |
| run-20261013-111017-1095.log | 471 KB | 2026-10-13 10:24:29 |
| run-20261013-102815-1094.log | 208 KB | 2026-10-13 09:00:06 |
| run-20261013-095340-1093.log | 162 KB | 2026-10-13 08:18:04 |
| run-20261013-075349-1092.log | 458 KB | 2026-10-13 07:43:30 |
| run-20261013-064410-1091.log | 387 KB | 2026-10-13 05:43:38 |
| run-20261013-052913-1090.log | 255 KB | 2026-10-13 04:34:00 |
| run-20261013-045151-1089.log | 191 KB | 2026-10-13 03:19:02 |
| run-20261013-040348-1088.log | 266 KB | 2026-10-13 02:41:41 |
| run-20261013-031817-1087.log | 249 KB | 2026-10-13 01:53:37 |
| run-20261013-025143-1086.log | 178 KB | 2026-10-13 01:08:05 |
| run-20261013-021003-1085.log | 209 KB | 2026-10-13 00:41:33 |
| run-20261013-015952-1084.log | 154 B | 2026-10-12 23:59:52 |
| run-20261013-014941-1083.log | 154 B | 2026-10-12 23:49:42 |
| run-20261013-013931-1082.log | 154 B | 2026-10-12 23:39:31 |
| run-20261013-012920-1081.log | 154 B | 2026-10-12 23:29:21 |
| run-20261013-011909-1080.log | 154 B | 2026-10-12 23:19:10 |
| run-20261013-010859-1079.log | 154 B | 2026-10-12 23:08:59 |
Tail — run-20261014-052042-1127.log (last 200 lines)
}
}
}
END { for (s in readers) print s }
' $(ls "$tests_dir"/* 2>/dev/null) | sort -u
}
# figure_sections <registry-file> -> `## <name>` sections carrying a figure
figure_sections() {
[0m$ [0mcd /data/repo && bash tests/test_registry_figure_readers.sh 2>&1 | tail -20; echo "rc=$?"
PASS: R1a the i_reg_pair shape counts as a reader for alpha
PASS: R1b and beta, which nothing extracts, is NOT read
PASS: R2a naming a section in an exit-code grep is NOT reading its figure
PASS: R3a with no extractor, the reader set is empty (unread, not all-read)
PASS: R4a zeta carries a figure and is listed
PASS: R4b theta carries a figure and is listed
PASS: R4c eta has no figure and is NOT listed
PASS: R4d exactly the two figure-carrying sections are listed
CENSUS: 18 section(s) carry a **N assertions** figure; 1 read, 17 unread
CENSUS-read:alpha test_registry_coverage.sh
CENSUS-unread: budget-show disk-show dns-verify domain-availability-check immich-roundtrip ip-drift-check ip-drift-cron pdns-api.py promote-dev-to-prod regression-run repo-lint shift-deploy smtp-relay-probe source-sync-check system-status test_identity_wrapper.sh test_registry_figure_readers.sh
PASS: L1 non-vacuity: at least 2 live sections carry an assertion figure
PASS: L2 test_registry_coverage.sh's own figure IS read (i_reg_pair)
=== Results: 10 passed, 0 failed ===
rc=0
> build · mimo-v2.6-flash-free
Queue read: **(a⁶) is not mine** (fire at 08:05:17 CEST, now 05:21). The handover directs me to run 949's census-reading line — add cross-suite readers for the unread figure sections. Let me understand the exact shape first.
[0m$ [0mcd /data/repo && echo "=== i_reg_pair in test_registry_coverage.sh ===" && grep -n 'i_reg_pair' tests/test_registry_coverage.sh | head -20
=== i_reg_pair in test_registry_coverage.sh ===
636:# i_reg_pair <registry-file> -> "<assertion figure>|<control figure>": the two
650:i_reg_pair() {
1782: tree for a whole release). i_reg_pair() reads them from the bounded
4001:c46_r1=$(i_reg_pair "$cov_registry")
4009:# Both figures are matched the way i_reg_pair() READS them: bounded to this
4041: "$(( ${c46_fig0:-0} + 1 ))" "$(i_reg_pair "$c46_p1" | cut -d'|' -f1)"
4043: "$c46_ctl0" "$(i_reg_pair "$c46_p1" | cut -d'|' -f2)"
4045: "$(( ${c46_ctl0:-0} + 1 ))" "$(i_reg_pair "$c46_p2" | cut -d'|' -f2)"
4047: "$c46_fig0" "$(i_reg_pair "$c46_p2" | cut -d'|' -f1)"
4559:# So both figures are now read HERE, live, by i_reg_pair(): the assertion
4581:IFS='|' read -r i_fig i_ctl <<< "$(i_reg_pair "$cov_registry")"
4589: "differs" "$(c43_state "${i_fig:-}" "$(i_reg_pair "$c46_p1" | cut -d'|' -f1)")"
4591: "differs" "$(c43_state "${i_ctl:-}" "$(i_reg_pair "$c46_p2" | cut -d'|' -f2)")"
[0m$ [0mcd /data/repo && echo "=== a sample section: budget-show ===" && awk '/^## budget-show/,/^## [a-z]/{print NR": "$0}' tools/REGISTRY.md | head -40
=== a sample section: budget-show ===
137: ## budget-show
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n '630,700p' tests/test_registry_coverage.sh
if (a ~ /^[0-9]+(\.[0-9]+)?$/ && b ~ /^[0-9]+(\.[0-9]+)?$/)
exit (a + 0 == b + 0) ? 0 : 1
exit 1
}'
}
# i_reg_pair <registry-file> -> "<assertion figure>|<control figure>": the two
# numbers this suite's OWN registry section CLAIMS — how many assertions a run
# produces (`**497 assertions**`) and how many negative controls the file
# defines (`**C** 46 negative controls`). Both are read from ONE bounded
# section (sect, the same reader (125) pinned) and from the registry's own
# spelling; the section is FOLDED to a single squeezed line first, because the
# registry's prose is wrapped and the claim genuinely spans a line break
# (`**C** 45 negative` / ` controls …`) — a reader that grepped raw bytes
# would miss the very line it is supposed to pin. A figure written any other
# way reads EMPTY, which section I's non-vacuity assertion rejects rather than
# passes over. Until (331) neither figure had a reader — the assertion count
# had already moved twice while the tree disagreed ([0.4.328] shipped 464
# with the file holding 473, and 464 sat nine behind for a whole release),
# which is (126)'s defect one level up.
i_reg_pair() {
local f="${1:-$cov_registry}" sec a c
sec=$(sect "$f" test_registry_coverage.sh | tr '\n' ' ' | tr -s ' ')
a=$(printf '%s\n' "$sec" | grep -oE '\*\*[0-9]+ assertions\*\*' | head -1 | tr -dc '0-9')
c=$(printf '%s\n' "$sec" | grep -oE '\*\*C\*\* [0-9]+ negative controls' | head -1 | sed 's/.*\*\* //; s/ negative.*//')
printf '%s|%s\n' "${a:-}" "${c:-}"
}
# --------------------------------------------------------------------------
# The checker under test. Reached in child mode ONLY through this branch, so
# a control cannot accidentally run a differently-written code path.
# --------------------------------------------------------------------------
# Prints `VIOLATION <kind> <subject>` per finding and one `SUMMARY ...` line,
# then returns 0 (clean), 1 (findings) or 3 (cannot verify: an input that was
# not read is never a pass).
run_check() {
local tools_dir="$cov_tools" registry="$cov_registry" tests_dir="$cov_tests"
local tools="" reg_names="" sec="" f b
local tools_n=0 reg_n=0 test_n=0 help_run=0 help_ok=0 v=0
local arg_run=0 arg_ok=0 ec_run=0 ec_ok=0
local fmt_n=0 fmtv_ok=0 fmtm_ok=0 to_n=0 to_ok=0
# (328) the format-DEFAULT claim agreement: pairs where the registry row and
# the tool's own --help BOTH state a `(default: …)` for `--format`, how many
# of them disagree, and the offending `tool:reg/help` subjects.
local fmtcp=0 fmtcm=0 fmtclaim_bad="" reg_fmt help_fmt
# (330) the ALL-flag generalisation of the same two claim sites: every option
# row's `(default: …)` against that tool's own `--help`, scope = the same
# INTERSECTION, comparison = af_same() (numeric-equal counts as agreement).
# `afnq` counts the pairs that agreed only numerically, so a reader can watch
# the rule that made `5`/`5.0` pass instead of having to re-derive it.
local afcp=0 afcm=0 afnq=0 afclaim_bad="" af_hmap="" rflag="" rraw="" hraw=""
local port_n=0 portv_ok=0 portm_ok=0 miss_n=0 missm_ok=0
local conv_pairs=0 conv_extra=0
local syn_n=0 syn_ok=0 synp_n=0 synp_ok=0
local cl_scope=0 cl_fmt=0 cl_port=0 cl_enum=0 cl_enum_ok=0
local cl_num=0 cl_num_ok=0 cl_other=0 cl_declared=0 cl_declared_ok=0
local cl_declared_seen="" dline="" dexpect="" dargs="" drc=0 dt="" df=""
local fig_disc="" fig_live_n=0 fig_claim="" figbad="" fig_list="" fig_lrc=0
local fig_undated_n=0 fig_stale_n=0
# (83) the second count, and which side the claim agrees with.
local fig_head="na" fig_src="na"
local unreg="" stale="" incomplete="" helpbad="" argbad="" ecbad="" badval=""
local convbad="" synbad=""
local synrow="" synrow_bad=0 synp_miss=0 pr=""
local helpout codes portflags missflags mline mflag mmeta
local strictpairs metavpairs devpairs exit2bullet
# The one deliberately-unrecognised flag both probes use. Every tool must
# reject it; no tool defines it (a name no getopt table could carry).
local bad_flag="--regcov-not-a-real-flag"
[0m$ [0mcd /data/repo && sed -n '137,175p' tools/REGISTRY.md
## budget-show
**Purpose**: Display the BUDGET.md spend ledger in machine/human format — and
**validate it first**: a broken or unbalanced ledger is an error (exit 1), never
a quiet row of nulls. The investor reads this file; a stale or arithmetically
wrong ledger is a defect, which is exactly what this tool now refuses. A ledger
that merely has **not been rolled over** to the current month is the one case it
reports instead of refusing: **warn-only, exit 0** (see *Month freshness*).
**Location**: `/data/tools/budget-show`
**Usage**: `budget-show [--format json|human]`
**Options**:
- `--format json|human` - Output format (default: human)
**Environment**:
- `GLADEX_BUDGET_PATH` - Override the ledger path (test hook; default `/data/repo/BUDGET.md`). Documented in `--help`.
- `GLADEX_CURRENT_MONTH` - Override the month freshness is compared against (test hook, `YYYY-MM`; default: the clock, UTC). A value that is not `YYYY-MM` exits `2` **before** the ledger is read. Documented in `--help`.
**Ledger contract (validated)**:
- `month:` must be `YYYY-MM`; `allowance:` / `remaining:` must be bare numbers
- `spent:` numeric prefix + optional prose note (`spent: 1.50 (gladex.de — …)`)
- `allowance - spent == remaining` (2dp), `remaining >= 0` (overspend forbidden, brief §4)
- Violations → each named field on **stderr**, exit `1`, stdout empty (machines key off the exit code)
**Month freshness (warn-only — queue item (112))**:
- A `month:` that is not the **current UTC month** adds one WARN row and still
exits **0**: the ledger is hand-written, so an un-rolled month is a lapse to
report to the reader, never a broken number to refuse — and suite case L stays
content-agnostic (it pins no amount), so a future approved purchase or a
hand-rolled month cannot redden a green for a reason unrelated to validity.
- Human: a `WARN:` row between the summary and the `Log:` block; **absent when
fresh**, so a fresh ledger's human output is byte-identical to the pre-(112)
tool. JSON: a `warnings` array, **always present** (empty when fresh), so
`d["warnings"]` needs no key check and a missing key cannot be read as "none".
- Computed **after** validation passes, so a warning can never appear on the
stderr path and never moves an exit code.
> build · mimo-v2.6-flash-free
Let me measure the shape of the unread sections — which are tools vs suites, and what each figure claims.
[0m$ [0mcd /data/repo && echo "=== which have test suites? ===" && ls tests/ | grep -iE 'budget|disk|dns-verify|domain|immich|ip-drift|pdns|promote|regression|repo-lint|shift|smtp|source-sync|system-status|identity_wrapper' | head -40
=== which have test suites? ===
test_budget_show.sh
test_disk_show.sh
test_domain_availability.sh
test_identity_wrapper.sh
test_immich_roundtrip.sh
test_pdns_api.sh
test_promote_gate.sh
test_promote_json.sh
test_promote_lint_gate.sh
test_regression_run.sh
test_shift_census.sh
test_shift_deploy.sh
test_shift_tally.sh
test_smtp_relay_probe.sh
test_system_status_promote_gates.sh
[0m$ [0mcd /data/repo && for n in budget-show disk-show dns-verify domain-availability-check immich-roundtrip ip-drift-check ip-drift-cron pdns-api.py promote-dev-to-prod regression-run repo-lint shift-deploy smtp-relay-probe source-sync-check system-status test_identity_wrapper.sh test_registry_figure_readers.sh; do
fig=$(awk -v sec="$n" '$0=="## "sec{f=1;next} /^## /{f=0} f' tools/REGISTRY.md | tr '\n' ' ' | tr -s ' ' | grep -oE '\*\*[0-9]+ assertions\*\*' | head -1 | tr -dc '0-9')
echo "$n -> $fig"
done
budget-show -> 89
disk-show -> 90
dns-verify -> 40
domain-availability-check -> 140
immich-roundtrip -> 160
ip-drift-check -> 133
ip-drift-cron -> 340
pdns-api.py -> 175
promote-dev-to-prod -> 44
regression-run -> 347
repo-lint -> 473
shift-deploy -> 132
smtp-relay-probe -> 38
source-sync-check -> 40
system-status -> 24
test_identity_wrapper.sh -> 45
test_registry_figure_readers.sh -> 10
> build · mimo-v2.6-flash-free
exit=0
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)
[Wed Oct 14 06:33:40 2026] 127.0.0.1:35618 Accepted [Wed Oct 14 06:33:40 2026] 127.0.0.1:35618 Closing [Wed Oct 14 06:37:57 2026] 127.0.0.1:35226 Accepted [Wed Oct 14 06:37:57 2026] 127.0.0.1:35226 Closing [Wed Oct 14 06:37:57 2026] 127.0.0.1:35234 Accepted [Wed Oct 14 06:37:57 2026] 127.0.0.1:35234 Closing [Wed Oct 14 06:44:03 2026] 127.0.0.1:34400 Accepted [Wed Oct 14 06:44:03 2026] 127.0.0.1:34400 Closed without sending a request; it was probably just an unused speculative preconnection [Wed Oct 14 06:44:03 2026] 127.0.0.1:34400 Closing [Wed Oct 14 06:44:05 2026] 127.0.0.1:40780 Accepted [Wed Oct 14 06:44:05 2026] 127.0.0.1:40780 Closed without sending a request; it was probably just an unused speculative preconnection [Wed Oct 14 06:44:05 2026] 127.0.0.1:40780 Closing [Wed Oct 14 06:44:52 2026] 127.0.0.1:36070 Accepted [Wed Oct 14 06:44:52 2026] 127.0.0.1:36070 Closed without sending a request; it was probably just an unused speculative preconnection [Wed Oct 14 06:44:52 2026] 127.0.0.1:36070 Closing [Wed Oct 14 06:44:54 2026] 127.0.0.1:36080 Accepted [Wed Oct 14 06:44:54 2026] 127.0.0.1:36080 Closed without sending a request; it was probably just an unused speculative preconnection [Wed Oct 14 06:44:54 2026] 127.0.0.1:36080 Closing [Wed Oct 14 06:45:21 2026] 127.0.0.1:34380 Accepted [Wed Oct 14 06:45:21 2026] 127.0.0.1:34380 Closing [Wed Oct 14 06:45:21 2026] 127.0.0.1:34396 Accepted [Wed Oct 14 06:45:21 2026] 127.0.0.1:34396 Closing [Wed Oct 14 06:45:21 2026] 127.0.0.1:34408 Accepted [Wed Oct 14 06:45:21 2026] 127.0.0.1:34408 Closing [Wed Oct 14 06:45:21 2026] 127.0.0.1:34420 Accepted [Wed Oct 14 06:45:21 2026] 127.0.0.1:34420 Closing [Wed Oct 14 06:45:21 2026] 127.0.0.1:34436 Accepted [Wed Oct 14 06:45:21 2026] 127.0.0.1:34436 Closing [Wed Oct 14 06:45:21 2026] 127.0.0.1:34448 Accepted [Wed Oct 14 06:45:21 2026] 127.0.0.1:34448 Closing [Wed Oct 14 06:45:22 2026] 127.0.0.1:34458 Accepted [Wed Oct 14 06:45:22 2026] 127.0.0.1:34458 Closing [Wed Oct 14 06:45:22 2026] 127.0.0.1:34468 Accepted [Wed Oct 14 06:45:22 2026] 127.0.0.1:34468 Closing [Wed Oct 14 06:45:22 2026] 127.0.0.1:34472 Accepted [Wed Oct 14 06:45:22 2026] 127.0.0.1:34472 Closing [Wed Oct 14 06:45:22 2026] 127.0.0.1:34478 Accepted [Wed Oct 14 06:45:22 2026] 127.0.0.1:34478 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34294 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34294 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34296 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34296 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34298 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34298 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34312 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34312 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34314 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34314 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34318 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34318 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34328 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34328 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34338 Accepted [Wed Oct 14 06:46:26 2026] 127.0.0.1:34338 Closing [Wed Oct 14 06:46:26 2026] 127.0.0.1:34340 Accepted [Wed Oct 14 06:46:27 2026] 127.0.0.1:34340 Closing [Wed Oct 14 06:46:27 2026] 127.0.0.1:34342 Accepted [Wed Oct 14 06:46:27 2026] 127.0.0.1:34342 Closing [Wed Oct 14 06:49:01 2026] 127.0.0.1:58998 Accepted
Other app logs: downloads.log
Generated 2026-10-14 04:49:01 UTC · Gladex.de