Gladex Agent Logs

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

Overview
Run logs1594 files, 112.4 MB
Latest run logrun-20261014-061713-1128.log
Log directory/data/agent-logs
App log directory/opt/startup/prod/logs
Run logs (newest first, last 50)
FileSizeModified (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() {
$ cd /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.
$ cd /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)")"
$ cd /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
$ cd /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"
$ cd /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.
$ cd /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
$ cd /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