Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 1167 files, 67.2 MB |
| Latest run log | run-20261005-120453-701.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261005-120453-701.log | 123 KB | 2026-10-05 10:29:43 |
| 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 |
| run-20261004-152258-680.log | 153 B | 2026-10-04 13:22:58 |
| run-20261004-151250-679.log | 190 B | 2026-10-04 13:12:50 |
| run-20261004-150241-678.log | 153 B | 2026-10-04 13:02:42 |
| run-20261004-145233-677.log | 153 B | 2026-10-04 12:52:34 |
| run-20261004-144225-676.log | 190 B | 2026-10-04 12:42:26 |
| run-20261004-143217-675.log | 153 B | 2026-10-04 12:32:17 |
| run-20261004-142209-674.log | 153 B | 2026-10-04 12:22:09 |
| run-20261004-141201-673.log | 153 B | 2026-10-04 12:12:01 |
| run-20261004-140152-672.log | 153 B | 2026-10-04 12:01:53 |
| run-20261004-135144-671.log | 153 B | 2026-10-04 11:51:44 |
| run-20261004-134136-670.log | 153 B | 2026-10-04 11:41:36 |
| run-20261004-133127-669.log | 153 B | 2026-10-04 11:31:27 |
| run-20261004-132119-668.log | 153 B | 2026-10-04 11:21:19 |
| run-20261004-131110-667.log | 153 B | 2026-10-04 11:11:10 |
| run-20261004-130101-666.log | 190 B | 2026-10-04 11:01:02 |
| run-20261004-125053-665.log | 153 B | 2026-10-04 10:50:54 |
| run-20261004-124045-664.log | 153 B | 2026-10-04 10:40:45 |
| run-20261004-123036-663.log | 153 B | 2026-10-04 10:30:37 |
| run-20261004-122028-662.log | 153 B | 2026-10-04 10:20:29 |
| run-20261004-121020-661.log | 153 B | 2026-10-04 10:10:20 |
| run-20261004-120011-660.log | 153 B | 2026-10-04 10:00:11 |
| run-20261004-115003-659.log | 153 B | 2026-10-04 09:50:03 |
| run-20261004-113954-658.log | 153 B | 2026-10-04 09:39:55 |
| run-20261004-112946-657.log | 153 B | 2026-10-04 09:29:47 |
| run-20261004-111938-656.log | 153 B | 2026-10-04 09:19:39 |
| run-20261004-110930-655.log | 153 B | 2026-10-04 09:09:31 |
| run-20261004-105922-654.log | 153 B | 2026-10-04 08:59:23 |
| run-20261004-104914-653.log | 153 B | 2026-10-04 08:49:14 |
| run-20261004-103906-652.log | 153 B | 2026-10-04 08:39:06 |
Tail — run-20261005-120453-701.log (last 200 lines)
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && echo "== ip_drift_safety"; php tests/test_ip_drift_safety.php 2>&1 | tail -2; echo "== go_tests"; bash tests/test_system_status_go_tests.sh 2>&1 | tail -2; echo "== leak_figure"; bash tests/test_leak_figure_readers.sh 2>&1 | tail -2; echo "== md5 tools"; md5sum tools/ip-drift-cron tools/system-status; git show HEAD:tools/ip-drift-cron | md5sum; git show HEAD:tools/system-status | md5sum; echo "== healthcheck"; ./tools/healthcheck 2>&1 | tail -5; echo "== budget"; ./tools/budget-show 2>&1 | tail -6; echo "== status"; git status --porcelain
== ip_drift_safety
=== Results: 16 passed, 0 failed ===
== go_tests
=== Results: 92 passed, 0 failed, 0 skipped ===
== leak_figure
leak-figure-readers suite: 41 passed, 0 failed
===============================
== md5 tools
2816126cb8bad48aabd03be621c2a60c tools/ip-drift-cron
50e704f809f7507cfd0b03a5b35f8e04 tools/system-status
2816126cb8bad48aabd03be621c2a60c -
50e704f809f7507cfd0b03a5b35f8e04 -
== healthcheck
HTTP: 200
Response: {"status":"ok","service":"gladex-investor-app","env":"dev","timestamp":1791195572,"version":"0.4.28"}
prod: HEALTHY
HTTP: 200
Response: {"status":"ok","service":"gladex-investor-app","env":"prod","timestamp":1791195572,"version":"0.4.28"}
== budget
- 2026-09-20: init, no domains ordered yet
- 2026-09-20: investor APPROVED gladex.de (1.50/mo). Awaiting registrar purchase + DNS creds.
- 2026-09-20: purchase completed same day — RDAP status active (changed 2026-09-20T11:10:57+02:00), DNS wired via pdns wrapper (A apex/dev/git/info/stats/log/team -> 77.90.15.49, MX 10 gladex.de), dig-verified; DOMAIN.md holds evidence.
- 2026-09-24: ledger narrative corrected — spent-line still said "purchase pending at registrar" 4 days after registration (queued candidate #1); numbers unchanged (1.50/3.50, no money moved), log history above kept verbatim.
- 2026-10-01: month rolled per brief §4 (balance resets to 5.00 on the 1st, unspent does NOT roll over). September history above is kept verbatim; September closed at spent 1.50 / remaining 3.50.
- 2026-10-02: October opened at spent 0.00 / remaining 5.00 because no October charge exists in any file on this box — while gladex.de is a known 1.50/mo recurring cost with NO renewal date recorded anywhere. Figure to be corrected the moment the investor answers REPORT.md §14.
== status
M tests/test_ip_drift_cron.sh
[0m$ [0mcd /data/repo && for t in --mutations; do echo "== mutations"; bash tests/test_ip_drift_cron.sh $t 2>&1 | tail -2; done; echo "== registry"; bash tests/test_registry_coverage.sh 2>&1 | tail -2; echo "== queue_source"; bash tests/test_queue_source.sh 2>&1 | tail -2; echo "== repo_lint"; bash tests/test_repo_lint.sh 2>&1 | tail -2; echo "== reader"; bash tests/test_system_status_ip_drift.sh 2>&1 | tail -2
== mutations
=== Results: 239 passed, 0 failed ===
== registry
=== Results: 464 passed, 0 failed ===
== queue_source
queue-source-check suite: 278 passed, 0 failed
===============================
== repo_lint
repo-lint suite: 473 passed, 0 failed
===============================
== reader
=== Results: 564 passed, 0 failed ===
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && ./tools/budget-show 2>&1 | head -8; echo "== repo-lint"; ./tools/repo-lint; echo "rc=$?"; echo "== headings"; grep -c '^## \[' CHANGELOG.md; echo "== failed units"; systemctl --failed --no-legend | wc -l; crontab -l | wc -l; ls tests | wc -l; ls tools | wc -l
=== Budget Status ===
Month: 2026-10
Allowance: 5.00 €
Spent: 0.00 € (no October charge recorded anywhere — gladex.de renews at 1.50/mo, renewal date NOT on file, raised as NEEDS-INVESTOR in REPORT.md §14, so this figure may understate a known recurring cost)
Remaining: 5.00 €
Log:
- 2026-09-20: init, no domains ordered yet
== repo-lint
repo-lint repo=/data/repo sha=ac549ec06f (HEAD) files=297 linted=184 skipped=113
linted: bash=54 go=43 json=11 php=57 python=19
skipped: binary=2 empty=6 no_shebang=4 unsupported_ext=101
go-compile: 45 module file(s) compile clean (1.731s)
changelog-version: 219 changelog version heading(s), 219 unique, 6595 citation(s) checked, 0 missing, 6039 bare token(s) counted
result: all 184 linted file(s) parse clean (exit 0)
rc=0
== headings
219
== failed units
0
2
90
26
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "M1–M8\|M1-M8\|battery" tools/REGISTRY.md | head -20; echo "=== around 1076-1100"; sed -n 1076,1105p tools/REGISTRY.md
1134:- `bash tests/test_ip_drift_cron.sh --mutations` — mutation battery, **M1–M8** (each
5797:bash tests/test_red_watch.sh --mutations # the 9-mutant battery
5802: mutation battery's own control, H0)
=== around 1076-1100
runs, the hooks, static no-DNS-write guards (write subcommands only — the error
path *names* `pdns-api.py records` as the human's next step) and the REGISTRY
contract, **the default↔named `ACTION` cross-guard read in both directions**
(queue item **(f9)**: a default run quotes none of the three named arms'
actions, a named run quotes not the default arm's — the writer-side twin of
`tests/test_system_status_ip_drift.sh` section 27), plus one guarded live case.
- **Section 7, the channel sweep** (`[0.4.206]`, the generalisation of
`tests/test_red_watch.sh` G28–G34 to this writer's two channels): an inline
`ipchan_scan <dir> <files|guard|names>` reader asserts that (C1) the only
`tests/` file naming a live `/data/agent-logs/ip-drift*` channel is this suite
itself, (C2) every such line there rides the `REAL_ALERT*` write-guard rather
than taking a verdict off a live channel, (C3) `tools/` is set-equality on the
writer `ip-drift-cron` alone (no reader exists to sanction), (C4) neither
writer source carries a `want=`, and (C5) a real drift run's channel text
exists and holds neither `want=` nor a whole-line healthy verdict. Comments are
skipped and single-quoted segments stripped first (a single-quoted path here is
a needle, not an open), `*.md` is excluded by extension, and **C6–C8 are a
five-twin plant** (open / needle / comment / guarded / unguarded) that keeps the
classifier itself honest: both real-tree set expectations are non-empty, so a
scanner that stopped reading reddens instead of passing on `""`. Measured with
plants: `tests/zz-plant.sh` → C1+C2 red (101/2), `tools/zz-plant` → C3 red
(102/1), both removed → **103/0**.
- **The default arm's own diagnosis** (`[0.4.210]`, queue item **(f5)** — the writer's
*fourth* exit branch, `case "$ERR_CODE" in … *)`): for the three honest inputs that
reach it — `err_int` (an `error_code` the writer classifies nowhere), `garbage`
(output the JSON reader cannot parse) and `rc99` (an undocumented checker exit) —
the block asserts the sentences a human reads, `DIAGNOSIS: checker failed without a
classified cause (exit N).` and its `ACTION`, present where they belong and **absent**
the three named branches' pairs (a diagnosis that matches everything diagnoses
nothing), `rc99` pinning the arm's own `${EXIT_CODE}` interpolation (**99**, so it is
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tools/REGISTRY.md [90m[offset=1053, limit=24][0m
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n 1130,1150p tools/REGISTRY.md
- **Pre-fix replay**: `IPDRIFT_CRON=<pre-fix blob> IPDRIFT_CRON_LEGACY=1 bash
tests/test_ip_drift_cron.sh` rewrites only the two hardcoded path literals into
the sandbox (the pre-fix cron has no hooks) → the suite **refuses to run
(exit 2)** without that flag instead of appending to the real alert log.
- `bash tests/test_ip_drift_cron.sh --mutations` — mutation battery, **M1–M8** (each
precondition-asserted to occur exactly once, must RUN and give the wrong
verdict, with a clean control); **194 assertions** measured 2026-10-05.
- `php tests/test_ip_drift_safety.php` (16 assertions — the older static guard: no
DNS-write call in executable code, CGNAT classified, alert written, `--help` green)
**Status**: Built ✅ (hardened 2026-09-24: CHECK-ERROR alerting + hooks + first behavioural suite)
---
## verify-landing
**Purpose**: Verify the minimalist gladex.de landing page is working correctly.
**Location**: `/data/repo/tools/verify-landing`
**Usage**:
```
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -1051,9 +1051,14 @@
- `IPDRIFT_LOG_DIR` — where logs/alerts go (the suite points it at a sandbox)
- `IPDRIFT_TOOLS_DIR` — tools directory (implies the default checker path)
**Tests**:
-- `bash tests/test_ip_drift_cron.sh` → **173 assertions** (measured 2026-10-05; was **161**
+- `bash tests/test_ip_drift_cron.sh` → **206 assertions** (measured 2026-10-05; was **173**
+ before `[0.4.215]` added the **drift-path ↔ check-error `ACTION` cross-guard, both
+ directions** — a check-error run quotes none of the three drift-path actions
+ (6 runs × 3 bodies) and a drift run quotes none of the four check-error actions
+ (3 runs × 4 bodies, each re-anchored on its own action so the absences cannot go
+ vacuous); was **161**
before `[0.4.214]` added the writer-side **ACTION** cross-guard in both directions —
a default run quotes none of the three named arms' actions (3 needles × 3 scenarios)
and a named run quotes not the default arm's action (1 per branch), each read as a
**body** rather than an `ACTION: `-prefixed needle; **134**
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -1082,9 +1082,15 @@
path *names* `pdns-api.py records` as the human's next step) and the REGISTRY
contract, **the default↔named `ACTION` cross-guard read in both directions**
(queue item **(f9)**: a default run quotes none of the three named arms'
actions, a named run quotes not the default arm's — the writer-side twin of
- `tests/test_system_status_ip_drift.sh` section 27), plus one guarded live case.
+ `tests/test_system_status_ip_drift.sh` section 27), **and the drift-path ↔
+ check-error `ACTION` cross-guard, both directions** (queue items **(g)** and
+ **(h)**: a check-error run quotes none of the three `class=` actions — it
+ never enters `if [ "$EXIT_CODE" -eq 1 ]` — and a drift run quotes none of the
+ four `case "$ERR_CODE"` arms — it never enters that `case`; both halves
+ measured green over the plants at **173/0** here and **564/0** in the reader
+ suite before the block existed), plus one guarded live case.
- **Section 7, the channel sweep** (`[0.4.206]`, the generalisation of
`tests/test_red_watch.sh` G28–G34 to this writer's two channels): an inline
`ipchan_scan <dir> <files|guard|names>` reader asserts that (C1) the only
`tests/` file naming a live `/data/agent-logs/ip-drift*` channel is this suite
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -1143,9 +1143,11 @@
the sandbox (the pre-fix cron has no hooks) → the suite **refuses to run
(exit 2)** without that flag instead of appending to the real alert log.
- `bash tests/test_ip_drift_cron.sh --mutations` — mutation battery, **M1–M8** (each
precondition-asserted to occur exactly once, must RUN and give the wrong
- verdict, with a clean control); **194 assertions** measured 2026-10-05.
+ verdict, with a clean control); **239 assertions** measured 2026-10-05 (the
+ battery counts the suite's own assertions plus its control, so it moves with
+ the suite: 194 → 206 with `[0.4.214]`, 206 → **239** with `[0.4.215]`).
- `php tests/test_ip_drift_safety.php` (16 assertions — the older static guard: no
DNS-write call in executable code, CGNAT classified, alert written, `--help` green)
**Status**: Built ✅ (hardened 2026-09-24: CHECK-ERROR alerting + hooks + first behavioural suite)
> 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)
[Mon Oct 5 12:32:54 2026] 127.0.0.1:53178 Accepted [Mon Oct 5 12:32:54 2026] 127.0.0.1:53178 Closing [Mon Oct 5 12:33:04 2026] 127.0.0.1:38604 Accepted [Mon Oct 5 12:33:04 2026] 127.0.0.1:38604 Closing [Mon Oct 5 12:33:12 2026] 127.0.0.1:44158 Accepted [Mon Oct 5 12:33:12 2026] 127.0.0.1:44158 Closing [Mon Oct 5 12:33:14 2026] 127.0.0.1:44168 Accepted [Mon Oct 5 12:33:14 2026] 127.0.0.1:44168 Closed without sending a request; it was probably just an unused speculative preconnection [Mon Oct 5 12:33:14 2026] 127.0.0.1:44168 Closing [Mon Oct 5 12:33:15 2026] 127.0.0.1:53078 Accepted [Mon Oct 5 12:33:15 2026] 127.0.0.1:53078 Closed without sending a request; it was probably just an unused speculative preconnection [Mon Oct 5 12:33:15 2026] 127.0.0.1:53078 Closing [Mon Oct 5 12:33:21 2026] 127.0.0.1:53090 Accepted [Mon Oct 5 12:33:21 2026] 127.0.0.1:53090 Closing [Mon Oct 5 12:33:31 2026] 127.0.0.1:52040 Accepted [Mon Oct 5 12:33:31 2026] 127.0.0.1:52040 Closing [Mon Oct 5 12:33:41 2026] 127.0.0.1:56948 Accepted [Mon Oct 5 12:33:41 2026] 127.0.0.1:56948 Closing [Mon Oct 5 12:33:51 2026] 127.0.0.1:34880 Accepted [Mon Oct 5 12:33:51 2026] 127.0.0.1:34880 Closing [Mon Oct 5 12:34:00 2026] 127.0.0.1:46112 Accepted [Mon Oct 5 12:34:00 2026] 127.0.0.1:46112 Closing [Mon Oct 5 12:34:11 2026] 127.0.0.1:50560 Accepted [Mon Oct 5 12:34:11 2026] 127.0.0.1:50560 Closing [Mon Oct 5 12:34:20 2026] 127.0.0.1:35824 Accepted [Mon Oct 5 12:34:20 2026] 127.0.0.1:35824 Closing [Mon Oct 5 12:34:32 2026] 127.0.0.1:52018 Accepted [Mon Oct 5 12:34:32 2026] 127.0.0.1:52018 Closing [Mon Oct 5 12:34:46 2026] 127.0.0.1:45662 Accepted [Mon Oct 5 12:34:46 2026] 127.0.0.1:45662 Closing [Mon Oct 5 12:34:58 2026] 127.0.0.1:37804 Accepted [Mon Oct 5 12:34:58 2026] 127.0.0.1:37804 Closing [Mon Oct 5 12:35:08 2026] 127.0.0.1:58290 Accepted [Mon Oct 5 12:35:08 2026] 127.0.0.1:58290 Closing [Mon Oct 5 12:35:22 2026] 127.0.0.1:45288 Accepted [Mon Oct 5 12:35:22 2026] 127.0.0.1:45288 Closing [Mon Oct 5 12:35:34 2026] 127.0.0.1:37078 Accepted [Mon Oct 5 12:35:34 2026] 127.0.0.1:37078 Closing [Mon Oct 5 12:35:46 2026] 127.0.0.1:53072 Accepted [Mon Oct 5 12:35:46 2026] 127.0.0.1:53072 Closing [Mon Oct 5 12:35:51 2026] 127.0.0.1:53082 Accepted [Mon Oct 5 12:35:51 2026] 127.0.0.1:53082 Closing [Mon Oct 5 12:35:56 2026] 127.0.0.1:39534 Accepted [Mon Oct 5 12:35:56 2026] 127.0.0.1:39534 Closing [Mon Oct 5 12:36:02 2026] 127.0.0.1:39538 Accepted [Mon Oct 5 12:36:02 2026] 127.0.0.1:39538 Closing [Mon Oct 5 12:36:07 2026] 127.0.0.1:54114 Accepted [Mon Oct 5 12:36:07 2026] 127.0.0.1:54114 Closing [Mon Oct 5 12:36:14 2026] 127.0.0.1:54122 Accepted [Mon Oct 5 12:36:14 2026] 127.0.0.1:54122 Closing [Mon Oct 5 12:36:27 2026] 127.0.0.1:35404 Accepted [Mon Oct 5 12:36:27 2026] 127.0.0.1:35404 Closing [Mon Oct 5 12:36:39 2026] 127.0.0.1:41360 Accepted [Mon Oct 5 12:36:39 2026] 127.0.0.1:41360 Closing [Mon Oct 5 12:36:55 2026] 127.0.0.1:34004 Accepted [Mon Oct 5 12:36:55 2026] 127.0.0.1:34004 Closing [Mon Oct 5 12:37:06 2026] 127.0.0.1:53070 Accepted [Mon Oct 5 12:37:06 2026] 127.0.0.1:53070 Closing [Mon Oct 5 12:37:08 2026] 127.0.0.1:53072 Accepted
Generated 2026-10-05 10:37:08 UTC · Gladex.de