Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 754 files, 35 MB |
| Latest run log | run-20260929-230721-352.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20260929-230721-352.log | 153 B | 2026-09-29 21:07:22 |
| run-20260929-224605-351.log | 171 KB | 2026-09-29 20:57:21 |
| run-20260929-201447-350.log | 508 KB | 2026-09-29 20:36:05 |
| run-20260929-192011-349.log | 227 KB | 2026-09-29 18:04:47 |
| run-20260929-184400-348.log | 464 KB | 2026-09-29 17:10:11 |
| run-20260929-175208-347.log | 226 KB | 2026-09-29 16:34:00 |
| run-20260929-171135-346.log | 238 KB | 2026-09-29 15:42:08 |
| run-20260929-162028-345.log | 263 KB | 2026-09-29 15:01:35 |
| run-20260929-161028-344.log | 153 B | 2026-09-29 14:10:28 |
| run-20260929-160027-343.log | 190 B | 2026-09-29 14:00:27 |
| run-20260929-155026-342.log | 190 B | 2026-09-29 13:50:27 |
| run-20260929-154025-341.log | 153 B | 2026-09-29 13:40:26 |
| run-20260929-153025-340.log | 153 B | 2026-09-29 13:30:25 |
| run-20260929-152024-339.log | 153 B | 2026-09-29 13:20:25 |
| run-20260929-151023-338.log | 153 B | 2026-09-29 13:10:24 |
| run-20260929-150021-337.log | 153 B | 2026-09-29 13:00:23 |
| run-20260929-145020-336.log | 153 B | 2026-09-29 12:50:21 |
| run-20260929-144019-335.log | 153 B | 2026-09-29 12:40:20 |
| run-20260929-143018-334.log | 153 B | 2026-09-29 12:30:19 |
| run-20260929-142017-333.log | 153 B | 2026-09-29 12:20:18 |
| run-20260929-141017-332.log | 153 B | 2026-09-29 12:10:17 |
| run-20260929-140016-331.log | 153 B | 2026-09-29 12:00:17 |
| run-20260929-135015-330.log | 153 B | 2026-09-29 11:50:16 |
| run-20260929-134014-329.log | 153 B | 2026-09-29 11:40:15 |
| run-20260929-133014-328.log | 153 B | 2026-09-29 11:30:14 |
| run-20260929-132013-327.log | 153 B | 2026-09-29 11:20:14 |
| run-20260929-131012-326.log | 153 B | 2026-09-29 11:10:13 |
| run-20260929-121024-325.log | 296 KB | 2026-09-29 11:00:12 |
| run-20260929-110953-324.log | 242 KB | 2026-09-29 10:00:24 |
| run-20260929-095926-323.log | 329 KB | 2026-09-29 08:59:53 |
| run-20260929-072444-322.log | 382 KB | 2026-09-29 07:49:26 |
| run-20260929-065102-321.log | 175 KB | 2026-09-29 05:14:44 |
| run-20260929-052828-320.log | 333 KB | 2026-09-29 04:41:02 |
| run-20260929-040138-319.log | 298 KB | 2026-09-29 03:18:28 |
| run-20260929-020936-318.log | 217 KB | 2026-09-29 01:51:38 |
| run-20260929-015935-317.log | 153 B | 2026-09-28 23:59:36 |
| run-20260929-014935-316.log | 153 B | 2026-09-28 23:49:35 |
| run-20260929-011234-315.log | 247 KB | 2026-09-28 23:39:35 |
| run-20260928-234838-314.log | 263 KB | 2026-09-28 23:02:34 |
| run-20260928-222402-313.log | 319 KB | 2026-09-28 21:38:38 |
| run-20260928-211218-312.log | 234 KB | 2026-09-28 20:14:02 |
| run-20260928-201031-311.log | 248 KB | 2026-09-28 19:02:18 |
| run-20260928-184021-310.log | 439 KB | 2026-09-28 18:00:31 |
| run-20260928-171725-309.log | 236 KB | 2026-09-28 16:30:21 |
| run-20260928-161526-308.log | 183 KB | 2026-09-28 15:07:25 |
| run-20260928-160525-307.log | 153 B | 2026-09-28 14:05:26 |
| run-20260928-155524-306.log | 153 B | 2026-09-28 13:55:25 |
| run-20260928-154524-305.log | 153 B | 2026-09-28 13:45:24 |
| run-20260928-153523-304.log | 153 B | 2026-09-28 13:35:24 |
| run-20260928-152522-303.log | 153 B | 2026-09-28 13:25:23 |
Tail — run-20260929-224605-351.log (last 200 lines)
1006:- `php tests/test_ip_drift_safety.php` (16 assertions — the older static guard: no
1025:merely written — `tests/test_registry_coverage.sh` section **G20–G23**
1059: probed by `tests/test_registry_coverage.sh` section G
1135:- `bash tests/test_disk_show.sh` → **80 assertions**, hermetic (everything but case J runs against fixture files in a throwaway sandbox under `${TMPDIR:-/tmp}/opencode/`, trap-cleaned; no network, no DNS, no services, nothing outside the sandbox written): the arg contract (**8** ways to reach exit 2, stdout empty on each), the JSON key-set and `ok ⇔ exit 0`, the breach through `GLADEX_DISK_FIXTURE` (95 % → **3**, 10 % → **0**) and the **boundary** (90 % at `--threshold 90` → **3**, so the comparison is `>=`), precedence **2 > 1 > 4 > 3 > 0** with a fixture path and a real `statvfs` path both reaching exit 4, the reclaimable table through `GLADEX_DISK_PATHS_FILE` (exact bytes for a 1000-byte file, absent path reported not hidden, `reclaimable_bytes` closing against the rows), four broken-hook shapes → exit 1 with empty stdout, static guards (no delete/write API, no child left behind, no network API), and **2 precondition-asserted mutations** — the exit-3 decision defeated and the `>=` boundary flipped to `>` — each must RUN and wrongly exit 0, each re-checked surgical (still 4 for cannot-verify / still 3 on a real 95 % breach)
1139:**Status**: Built ✅ 2026-09-29 (queue item **(82)**; the root-filesystem watchdog). Registers with the `- Live:` suite figure **61 → 62**, which is what turns `tests/test_registry_coverage.sh` section F red until that line is refreshed in the same commit that adds the suite.
1297: section, stubbing is not required for hermeticity — no suite in `tests/`
1516:- `bash tests/test_system_status_unread.sh` → **24 assertions**, hermetic and <1s
1541:- `bash tests/test_system_status_mx_soa.sh` → **31 assertions**, hermetic and <1s
1553:- `bash tests/test_system_status_mx_soa_transport.sh` → **76 assertions, 4
1573: bash tests/test_system_status_mx_soa_transport.sh` (the `HEAD:` blob before this
1578:- `bash tests/test_system_status_go_tests.sh` → **92 assertions, 6 mutations**,
1612: tests/test_system_status_go_tests.sh` → **15 passed / 39 failed / 1 skipped**.
1616:- `bash tests/test_system_status_go_compile.sh` → **109 assertions, 6 mutations**,
1630: tests/test_system_status_go_compile.sh):` comment and this suite's own
=== headings sample ===
3:## domain-availability-check
71:## budget-show
121:## dns-verify
189:## healthcheck
235:## promote-dev-to-prod
773:## ip-drift-check
839:## pdns-api.py
898:## ip-drift-cron
1012:## verify-landing
1069:## disk-show
1143:## system-status
2198:## version-check
2240:## tls-check
2278:## smtp-relay-probe
2318:## source-sync-check
2366:## queue-source-check
2581:## test_identity_wrapper.sh
2608:## test_app_contrast_meta.php
2633:## repo-lint
2708:## regression-run
2775:## test_regression_run.sh
2804:## test_queue_source.sh
2984:## test_registry_coverage.sh
3341:## test_detached_children.sh
3441:## inbox-status
3535:## go-compile-drift-verify
3644:## immich-roundtrip
> build · mimo-v2.6-flash-free
STEP 0 first: nothing unread in either DB and no open INBOX entries — so I write the standing status reply before any product work.
[0m← [0mWrite /tmp/opencode/step0_reply.py
Created file successfully: /tmp/opencode/step0_reply.py
> build · mimo-v2.6-flash-free
[0m$ [0mcd /tmp/opencode && CONFIRM=1 python3 step0_reply.py; echo "rc=$?"; echo "--- verify newest ---"; sqlite3 /opt/startup/dev/data/messages.db "SELECT id,ts,direction,read,length(body) FROM messages ORDER BY id DESC LIMIT 2;"; sqlite3 /opt/startup/prod/data/messages.db "SELECT id,ts,direction,read,length(body) FROM messages ORDER BY id DESC LIMIT 2;"
/opt/startup/dev/data/messages.db: inserted id=133 bytes=1323 unread_after=0
/opt/startup/prod/data/messages.db: inserted id=99 bytes=1323 unread_after=0
rc=0
--- verify newest ---
133|2026-09-29 20:56:38|agent_to_investor|1|1323
132|2026-09-29 20:08:40|agent_to_investor|1|3000
99|2026-09-29 20:56:38|agent_to_investor|1|1323
98|2026-09-29 20:08:40|agent_to_investor|1|3000
> build · mimo-v2.6-flash-free
[0m$ [0mecho "=== BEFORE ==="; for b in http://127.0.0.1:8000 http://127.0.0.1:8001; do echo -n "$b/download/vscode -> "; curl -s -o /dev/null -w "%{http_code} %{size_download}\n" "$b/download/vscode"; done; echo -n "dev /download mentions 'vsix': "; curl -s http://127.0.0.1:8000/download | grep -c -i "vsix\|VS Code"; echo -n "dev /download buttons: "; curl -s http://127.0.0.1:8000/download | grep -c "download-btn"; echo "=== route table position ==="; grep -n "download/gladex\|if (\$path === 'download')" /data/repo/app/src/php/app.php
=== BEFORE ===
http://127.0.0.1:8000/download/vscode -> 302 0
http://127.0.0.1:8001/download/vscode -> 302 0
dev /download mentions 'vsix': 0
dev /download buttons: 4
=== route table position ===
482:if ($path === 'download/gladex') {
500:if ($path === 'download') {
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/app/src/php/app.php [90m[offset=478, limit=26][0m
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n '100,180p' tests/test_cli_version.php; echo "=== mutations ==="; sed -n '215,260p' tests/test_cli_version.php
$BUILD = "$REPO/app/src/go/build.sh";
$DL = "$REPO/app/src/php/download.php";
$DOCS = "$REPO/app/src/php/docs.php";
echo "=== 1. changelog is the version train ===\n";
$raw = (string)file_get_contents($CHANGELOG);
preg_match_all('/^## \[(\d+\.\d+\.\d+)\] - (\d{4}-\d{2}-\d{2})/m', $raw, $cm);
$entries = $cm[1];
assert_true(count($entries) >= 2, 'changelog version entries parse (' . count($entries) . ')');
$top = $entries[0] ?? '';
assert_true($top !== '' && version_compare($top, '0.4.0', '>='),
"top entry parses and is post-0.4.0 (got '" . ($top ?: 'none') . "')");
echo "\n=== 2. build.sh derives its version (static) ===\n";
$bs = @file_get_contents($BUILD);
assert_true($bs !== false && is_executable($BUILD), 'build.sh exists and is executable');
assert_true(str_contains((string)$bs, '$SCRIPT_DIR/../../../CHANGELOG.md'),
'reads version from the repo CHANGELOG.md via SCRIPT_DIR');
assert_true(str_contains((string)$bs, '^## \\['),
"greps the top '## [x.y.z]' entry");
assert_true(build_hardcoded_versions((string)$bs) === [],
'no hardcoded VERSION="x.y.z" literal (found: ' . (implode(',', build_hardcoded_versions((string)$bs)) ?: 'none') . ')');
assert_true(str_contains((string)$bs, '${VERSION:-'),
'VERSION= env override preserved (${VERSION:-...})');
$cdPos = strpos((string)$bs, 'cd "$SCRIPT_DIR"');
$goPos = strpos((string)$bs, 'go build');
assert_true($cdPos !== false && $goPos !== false && $cdPos < $goPos,
'cds to the script dir BEFORE go build (cwd-independence)');
echo "\n=== 3. build.sh behaviour (cwd trap + derivation + override) ===\n";
$base = is_dir('/tmp/opencode') ? '/tmp/opencode' : sys_get_temp_dir();
$defBin = "$base/cv-default-" . getmypid();
$o1 = []; $rc1 = 1;
exec('cd ' . escapeshellarg($REPO) . ' && env -u VERSION bash ' . escapeshellarg($BUILD) . ' '
. escapeshellarg($defBin) . ' 2>&1', $o1, $rc1);
$j1 = null;
if ($rc1 === 0 && is_file($defBin)) {
$j1 = json_decode((string)shell_exec(escapeshellarg($defBin) . ' version --json 2>/dev/null'), true);
}
$tail1 = preg_replace('/\s+/', ' ', implode(' > ', array_slice($o1, -2)));
assert_true($rc1 === 0 && is_array($j1) && ($j1['version'] ?? '') === $top,
"built from the REPO ROOT (cwd trap) reports changelog top '$top' (got '"
. (($j1['version'] ?? null) ?: 'unparseable') . "' rc=$rc1: $tail1)");
$ovBin = "$base/cv-override-" . getmypid();
$o2 = []; $rc2 = 1;
exec('cd /tmp && VERSION=9.9.9 bash ' . escapeshellarg($BUILD) . ' '
. escapeshellarg($ovBin) . ' 2>&1', $o2, $rc2);
$j2 = null;
if ($rc2 === 0 && is_file($ovBin)) {
$j2 = json_decode((string)shell_exec(escapeshellarg($ovBin) . ' version --json 2>/dev/null'), true);
}
$tail2 = preg_replace('/\s+/', ' ', implode(' > ', array_slice($o2, -2)));
assert_true($rc2 === 0 && is_array($j2) && ($j2['version'] ?? '') === '9.9.9',
"VERSION=9.9.9 env override wins over the changelog (got '"
. (($j2['version'] ?? null) ?: 'unparseable') . "' rc=$rc2: $tail2)");
@unlink($defBin);
@unlink($ovBin);
echo "\n=== 4. download.php wiring (static) ===\n";
$dl = (string)@file_get_contents($DL);
$lits = download_literal_versions($dl);
assert_true($lits === [],
"no version literal assigned to \$version (token scan; 0.0.0 sentinel allowlisted), found: "
. (implode(',', $lits) ?: 'none'));
assert_true(str_contains($dl, "defined('GLADEX_APP_VERSION') ? GLADEX_APP_VERSION : '0.0.0'"),
'badge reads GLADEX_APP_VERSION with the 0.0.0 standalone sentinel');
echo "\n=== 5. download.php badge (behavioural) ===\n";
$b0 = render_badge($DL, null);
assert_true($b0 === '0.0.0',
"rendered standalone (no const) -> '0.0.0' sentinel (got '" . ($b0 ?: 'no badge') . "')");
$b9 = render_badge($DL, '9.9.9');
assert_true($b9 === '9.9.9',
"with synthetic const 9.9.9 the badge renders v9.9.9 — wiring, not coincidence (got '" . ($b9 ?: 'no badge') . "')");
echo "\n=== 6. docs CLI mentions ===\n";
$dsrc = (string)@file_get_contents($DOCS);
[$mDL, $mASCII] = docs_cli_mentions($dsrc);
assert_true($mDL !== [],
"download-line mention 'Go CLI binary (vX.Y.Z)' parses (got '" . ($mDL ? implode(',', $mDL) : 'none') . "')");
assert_true($mDL !== [] && array_diff($mDL, [$top]) === [],
=== mutations ===
"$label: real commit sha embedded (got '" . ($c ?: 'none') . "')");
$md5s[] = is_file($b) ? (string)md5_file($b) : '';
}
$uniq = array_unique($md5s);
assert_true(!in_array('', $md5s, true) && count($uniq) === 1,
'all four copies md5-identical ('
. (count($uniq) === 1 && !in_array('', $md5s, true) ? reset($uniq)
: count($uniq) . ' distinct/missing') . ')');
echo "\n=== 8. mutations (each MUST be detected) ===\n";
// M1: reintroduced `$version = '0.2.0'` literal in download.php
$wire = '$version = defined(\'GLADEX_APP_VERSION\') ? GLADEX_APP_VERSION : \'0.0.0\';';
$mut1 = str_replace($wire, '$version = \'0.2.0\';', $dl);
$lit1 = download_literal_versions($mut1);
assert_true($mut1 !== $dl && $lit1 === ['0.2.0'],
"mutation 1 (reintroduced \$version = '0.2.0') detected by token scan (got: "
. ($mut1 === $dl ? 'wire string drifted, replace failed' : (implode(',', $lit1) ?: 'none')) . ')');
$f1 = "$base/cli-mut1-" . getmypid() . '.php';
@file_put_contents($f1, $mut1);
$bm1 = render_badge($f1, '9.9.9');
assert_true($bm1 === '0.2.0',
"mutation 1 behavioural: with const 9.9.9 the sabotaged badge serves 0.2.0, not 9.9.9 (got '"
. ($bm1 ?: 'no badge') . "')");
@unlink($f1);
// M2: reintroduced VERSION="0.2.0" in build.sh (prepended = it would win, the historical bug)
$mut2 = "VERSION=\"0.2.0\"\n" . $bs;
assert_true(build_hardcoded_versions($mut2) === ['0.2.0'],
'mutation 2 (reintroduced VERSION="0.2.0" in build.sh) detected');
// M3: stale docs mention
$mut3 = str_replace("gladex v$top", 'gladex v0.1.0', $dsrc);
[, $m3v] = docs_cli_mentions($mut3);
assert_true($mut3 !== $dsrc && $m3v === ['0.1.0'] && array_diff($m3v, [$top]) !== [],
"mutation 3 (stale docs mention gladex v0.1.0) detected (got '"
. ($mut3 === $dsrc ? 'docs mention drifted, replace failed' : implode(',', $m3v)) . "')");
echo "\n=== 9. syntax ===\n";
exec('php -l ' . escapeshellarg($DL) . ' 2>&1', $lo, $lrc);
assert_true($lrc === 0, 'download.php passes php -l');
exec('php -l ' . escapeshellarg($DOCS) . ' 2>&1', $lo, $lrc2);
assert_true($lrc2 === 0, 'docs.php passes php -l');
exec('bash -n ' . escapeshellarg($BUILD) . ' 2>&1', $bo, $brc);
assert_true($brc === 0, 'build.sh passes bash -n');
echo "\n=== Results: $pass passed, $fail failed ===\n";
exit($fail > 0 ? 1 : 0);
[91m[1mError: [0mRate limit exceeded. Please try again later.
exit=1
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 Sep 29 22:34:35 2026] 127.0.0.1:47454 Accepted [Tue Sep 29 22:34:35 2026] 127.0.0.1:47454 Closing [Tue Sep 29 22:34:35 2026] 127.0.0.1:47456 Accepted [Tue Sep 29 22:34:35 2026] 127.0.0.1:47456 Closing [Tue Sep 29 22:34:35 2026] 127.0.0.1:47464 Accepted [Tue Sep 29 22:34:35 2026] 127.0.0.1:47464 Closing [Tue Sep 29 22:34:35 2026] 127.0.0.1:47472 Accepted [Tue Sep 29 22:34:36 2026] 127.0.0.1:47472 Closing [Tue Sep 29 22:34:36 2026] 127.0.0.1:47484 Accepted [Tue Sep 29 22:34:36 2026] 127.0.0.1:47484 Closing [Tue Sep 29 22:35:15 2026] 127.0.0.1:44644 Accepted [Tue Sep 29 22:35:15 2026] 127.0.0.1:44644 Closing [Tue Sep 29 22:35:15 2026] 127.0.0.1:44648 Accepted [Tue Sep 29 22:35:15 2026] 127.0.0.1:44648 Closing [Tue Sep 29 22:38:29 2026] 127.0.0.1:45408 Accepted [Tue Sep 29 22:38:29 2026] 127.0.0.1:45408 Closing [Tue Sep 29 22:41:09 2026] 127.0.0.1:50328 Accepted [Tue Sep 29 22:41:09 2026] 127.0.0.1:50328 Closing [Tue Sep 29 22:47:12 2026] 127.0.0.1:36674 Accepted [Tue Sep 29 22:47:12 2026] 127.0.0.1:36674 Closing [Tue Sep 29 22:47:12 2026] 127.0.0.1:36678 Accepted [Tue Sep 29 22:47:12 2026] 127.0.0.1:36678 Closing [Tue Sep 29 22:47:12 2026] 127.0.0.1:36684 Accepted [Tue Sep 29 22:47:12 2026] 127.0.0.1:36684 Closing [Tue Sep 29 22:47:12 2026] 127.0.0.1:36686 Accepted [Tue Sep 29 22:47:12 2026] 127.0.0.1:36686 Closing [Tue Sep 29 22:47:12 2026] 127.0.0.1:36700 Accepted [Tue Sep 29 22:47:12 2026] 127.0.0.1:36700 Closing [Tue Sep 29 22:47:12 2026] 127.0.0.1:36710 Accepted [Tue Sep 29 22:47:12 2026] 127.0.0.1:36710 Closing [Tue Sep 29 22:47:12 2026] 127.0.0.1:36718 Accepted [Tue Sep 29 22:47:12 2026] 127.0.0.1:36718 Closing [Tue Sep 29 22:47:13 2026] 127.0.0.1:36730 Accepted [Tue Sep 29 22:47:13 2026] 127.0.0.1:36730 Closing [Tue Sep 29 22:47:13 2026] 127.0.0.1:36732 Accepted [Tue Sep 29 22:47:13 2026] 127.0.0.1:36732 Closing [Tue Sep 29 22:52:01 2026] 127.0.0.1:50126 Accepted [Tue Sep 29 22:52:01 2026] 127.0.0.1:50126 Closing [Tue Sep 29 22:52:01 2026] 127.0.0.1:50136 Accepted [Tue Sep 29 22:52:01 2026] 127.0.0.1:50136 Closing [Tue Sep 29 22:52:01 2026] 127.0.0.1:50152 Accepted [Tue Sep 29 22:52:01 2026] 127.0.0.1:50152 Closing [Tue Sep 29 22:52:01 2026] 127.0.0.1:50166 Accepted [Tue Sep 29 22:52:01 2026] 127.0.0.1:50166 Closing [Tue Sep 29 22:52:01 2026] 127.0.0.1:50168 Accepted [Tue Sep 29 22:52:01 2026] 127.0.0.1:50168 Closing [Tue Sep 29 22:52:01 2026] 127.0.0.1:50178 Accepted [Tue Sep 29 22:52:01 2026] 127.0.0.1:50178 Closing [Tue Sep 29 22:52:01 2026] 127.0.0.1:50190 Accepted [Tue Sep 29 22:52:01 2026] 127.0.0.1:50190 Closing [Tue Sep 29 22:53:53 2026] 127.0.0.1:41574 Accepted [Tue Sep 29 22:53:53 2026] 127.0.0.1:41574 Closing [Tue Sep 29 22:55:25 2026] 127.0.0.1:54030 Accepted [Tue Sep 29 22:55:25 2026] 127.0.0.1:54030 Closing [Tue Sep 29 22:55:25 2026] 127.0.0.1:54038 Accepted [Tue Sep 29 22:55:25 2026] 127.0.0.1:54038 Closing [Tue Sep 29 22:56:48 2026] 127.0.0.1:48318 Accepted [Tue Sep 29 22:56:48 2026] 127.0.0.1:48318 Closing [Tue Sep 29 23:08:32 2026] 127.0.0.1:51392 Accepted
Generated 2026-09-29 21:08:32 UTC · Gladex.de