Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 811 files, 37.2 MB |
| Latest run log | run-20260930-161443-409.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20260930-161443-409.log | 125 KB | 2026-09-30 14:27:46 |
| run-20260930-160441-408.log | 153 B | 2026-09-30 14:04:43 |
| run-20260930-155440-407.log | 153 B | 2026-09-30 13:54:41 |
| run-20260930-154440-406.log | 153 B | 2026-09-30 13:44:40 |
| run-20260930-153439-405.log | 153 B | 2026-09-30 13:34:40 |
| run-20260930-152438-404.log | 190 B | 2026-09-30 13:24:39 |
| run-20260930-151438-403.log | 190 B | 2026-09-30 13:14:38 |
| run-20260930-150437-402.log | 153 B | 2026-09-30 13:04:37 |
| run-20260930-145436-401.log | 153 B | 2026-09-30 12:54:37 |
| run-20260930-144435-400.log | 153 B | 2026-09-30 12:44:36 |
| run-20260930-143435-399.log | 190 B | 2026-09-30 12:34:35 |
| run-20260930-142434-398.log | 153 B | 2026-09-30 12:24:35 |
| run-20260930-141433-397.log | 153 B | 2026-09-30 12:14:34 |
| run-20260930-140433-396.log | 153 B | 2026-09-30 12:04:33 |
| run-20260930-135432-395.log | 153 B | 2026-09-30 11:54:33 |
| run-20260930-134431-394.log | 153 B | 2026-09-30 11:44:32 |
| run-20260930-133431-393.log | 190 B | 2026-09-30 11:34:31 |
| run-20260930-132430-392.log | 153 B | 2026-09-30 11:24:31 |
| run-20260930-131429-391.log | 153 B | 2026-09-30 11:14:30 |
| run-20260930-130429-390.log | 153 B | 2026-09-30 11:04:29 |
| run-20260930-125428-389.log | 153 B | 2026-09-30 10:54:29 |
| run-20260930-124427-388.log | 153 B | 2026-09-30 10:44:28 |
| run-20260930-123427-387.log | 153 B | 2026-09-30 10:34:27 |
| run-20260930-122426-386.log | 153 B | 2026-09-30 10:24:27 |
| run-20260930-121425-385.log | 153 B | 2026-09-30 10:14:26 |
| run-20260930-120425-384.log | 153 B | 2026-09-30 10:04:25 |
| run-20260930-115424-383.log | 153 B | 2026-09-30 09:54:25 |
| run-20260930-114423-382.log | 153 B | 2026-09-30 09:44:24 |
| run-20260930-113423-381.log | 153 B | 2026-09-30 09:34:23 |
| run-20260930-112422-380.log | 153 B | 2026-09-30 09:24:23 |
| run-20260930-111421-379.log | 190 B | 2026-09-30 09:14:22 |
| run-20260930-110421-378.log | 153 B | 2026-09-30 09:04:21 |
| run-20260930-105420-377.log | 153 B | 2026-09-30 08:54:21 |
| run-20260930-100330-376.log | 339 KB | 2026-09-30 08:44:20 |
| run-20260930-092951-375.log | 271 KB | 2026-09-30 07:53:30 |
| run-20260930-074809-374.log | 229 KB | 2026-09-30 07:19:51 |
| run-20260930-051434-373.log | 466 KB | 2026-09-30 05:38:09 |
| run-20260930-040846-372.log | 234 KB | 2026-09-30 03:04:34 |
| run-20260930-035225-371.log | 111 KB | 2026-09-30 01:58:46 |
| run-20260930-020735-370.log | 429 KB | 2026-09-30 01:42:25 |
| run-20260930-015734-369.log | 153 B | 2026-09-29 23:57:35 |
| run-20260930-014733-368.log | 153 B | 2026-09-29 23:47:34 |
| run-20260930-013732-367.log | 153 B | 2026-09-29 23:37:33 |
| run-20260930-012732-366.log | 153 B | 2026-09-29 23:27:32 |
| run-20260930-011731-365.log | 153 B | 2026-09-29 23:17:32 |
| run-20260930-010730-364.log | 153 B | 2026-09-29 23:07:31 |
| run-20260930-005729-363.log | 153 B | 2026-09-29 22:57:30 |
| run-20260930-004729-362.log | 153 B | 2026-09-29 22:47:29 |
| run-20260930-003728-361.log | 153 B | 2026-09-29 22:37:29 |
| run-20260930-002727-360.log | 153 B | 2026-09-29 22:27:28 |
Tail — run-20260930-161443-409.log (last 200 lines)
bash tests/test_registry_coverage.sh [--help]
```
**How it stays honest**: **one** code path serves truth and every control —
`run_check()` is reached by the live assertion *and* by every negative control
through the same child re-exec (`REGISTRY_COVERAGE_CHILD=1` re-runs this script
to that branch), so a control going red proves the live assertion *can* go red
=== new assertions ===
189:# number a reader can watch. C29 plants both new classes at once.
544: # counting would redden G29 instead of quietly removing a pair from
1820:# --- C29 the (73) class: two metavars whose own TYPE says the value is wrong.
1863:expect "C29a plant: its --help still advertises an enum metavar (so it is in scope)" \
1866:assert_eq "C29b plant: and the value outside that list really is swallowed (exit 0, not 2)" 0 "$rc29e"
1868:assert_eq "C29c plant: and so is a quantity value that is not a number" 0 "$rc29n"
1870:assert_eq "C29d plant: while a MISSING value still exits 2 - (72) has nothing to find here" 2 "$rc29m"
1872:assert_eq "C29e plant: and E's probe still passes (this is NOT the (64) defect)" 2 "$rc29f"
1874:assert_eq "C29f plant: while the PORT class stays silent - one flag, one owning class" 2 "$rc29p"
1876:assert_eq "C29g a tool that swallows a type-invalid value -> exit 1" 1 "$RC"
1878: && ok "C29h VIOLATION badvalue_contract verify-landing:mode-enum" \
1879: || fail "C29h VIOLATION badvalue_contract verify-landing:mode-enum"
1881: && ok "C29i VIOLATION badvalue_contract verify-landing:wait-numval" \
1882: || fail "C29i VIOLATION badvalue_contract verify-landing:wait-numval"
1883:assert_eq "C29j exactly two violations - the two plants, and nothing else" \
1885:assert_contains "C29k both classes really ran in that sandbox (cl_enum/cl_num reported)" \
1890:assert_eq "C29l and every other enum metavar in the sandbox still answered 2" \
1892:assert_eq "C29m and every other quantity metavar in the sandbox still answered 2" \
1894:assert_eq "C29n and the partition still closes over the planted pairs" \
2055:assert_contains "G24 the live snapshot carries the (73) class keys" "cl_enum=" "$LIVE_OUT"
2056:assert_ge "G25 non-vacuity: at least one enum metavar is really advertised, so that class read a scope" \
2058:assert_eq "G26 every enum metavar refuses a value outside its own list with exit 2" \
2060:assert_ge "G27 non-vacuity: at least 10 quantity metavars are really advertised, so that class read a scope" \
2062:assert_eq "G28 every quantity metavar refuses a value that is not a number with exit 2" \
2064:assert_eq "G29 and the five buckets add up to the scope G14 recounted - one pair each, none skipped" \
2067:assert_ge "G30 and the declared-out remainder is counted rather than dropped (24 pairs today)" \
[0m$ [0mcd /data/repo && timeout 300 bash tests/test_gladex_monitor.sh 2>&1 | grep -i "fail\|FAIL" | head -20; echo "=== (73) header comment ==="; sed -n 130,175p tests/test_registry_coverage.sh
FAIL A3 tree clean AND in sync with origin/main (kind=is key=git want=## main...origin/main)
FAIL A9 repo-lint exits 0 (kind=rc key=lint want=0)
FAIL A10 every linted file parses (kind=contains key=lint want=parse clean (exit 0))
FAIL A11 no missing changelog citation (kind=contains key=lint want=checked, 0 missing)
failed: 4
summary: 27 assertions, 23 passed, 4 failed
=== (73) header comment ===
# `verify-landing` (`Usage: … [OPTIONS]`), `ip-drift-cron` and
# `go-compile-drift-verify` (both `Usage:` with the synopsis on the next
# row). The rule is deliberately ONE line: the row that carries the `usage:`
# label must name a flag (`\[--?[a-z]`), because a continuation row is not the
# synopsis a caller reads. All three tools were repaired to put their flags on
# that row — the same words `REGISTRY.md` already documents under **Usage** —
# and section C28 replants the defect: one tool with an `Options:` section and
# a flagless synopsis (reported), one with no `Options:` section at all (out
# of scope, so the subcommand shape cannot be swept in), each proved by its
# own plant assertion before the checker runs. The pair-level reader (77) also
# measured — 31 of 58 value-taking pairs named in their tool's synopsis — stays
# OUT of the tree: closing it would mean rewriting every tool's synopsis to
# enumerate every flag, which is a different, larger step than this one.
#
# Queue item (73), [0.4.140] — the VALUE half of a metavar, derived from the
# METAVAR the way (69) derived PORT from it, instead of from a flag name. (69)
# proved the shape — a port is an integer 1-65535 for every tool that has one,
# so `not-a-number` is invalid without asking any of them — and stopped there,
# because `--domain`/`--server`/`--ca-file` have no value that is wrong for
# every tool. This item widens that rule to the two classes where the TYPE
# still decides, and declares the rest out of scope rather than letting the
# probe look wider than it is. Measured 2026-09-30 over all 20 tools BEFORE a
# word was written, every value-taking pair classified by its own metavar:
# **18 enum** (`{json,human}`, `human|json`, `{dev,prod,both}` — the metavar IS
# the list of legal values, so anything outside it is provably not one), **14
# numeric** (`PCT`, `SECONDS`, `TIMEOUT`, `GO_TIMEOUT`, `WAIT`, `WARN_DAYS`,
# `EXPECT_USERS` — a quantity, so `not-a-number` is not one), **4 PORT** (kept
# by (69), same subject string), **18 `--format`** (kept by (65)) and **24
# other**. Of those 24, **21 have no type-invalid value at all** (`PATH`,
# `DIR`, `FILE`, `TEXT`, `SUBSTR`, `DOMAIN`, `SERVER`, `REPO`, `INBOX`,
# `BASE`, `LIBRARY`, `DEV_DB`, `DNS_SERVER`, `IDS`, `PEM`, `FMT`, `ENV` — any
# string is a possible value, so there is nothing to probe) and **3 do but the
# tool answers something other than 2**: `repo-lint --sha not-a-hex-digest` →
# **3**, `immich-roundtrip --email not-an-email-address` → **3**,
# `smtp-relay-probe --expect-open not-an-endpoint` → **1**, all three measured
# this run — and repo-lint's 3 is *pinned by its own suite*
# (`tests/test_repo_lint.sh` asserts `--sha deadbeef123` → 3, and `R16` asserts
# "refusal still exit 3"), so it is a documented contract rather than a hole,
# and repairing it here would be a second subject inside one entry. The three
# are therefore declared out of scope below and queued as (98), with their
# measured codes — the (75)/(76) lesson applied to *exclusion* instead of to
# visibility: an undeclared hole cannot show as a red anywhere, so the hole is
# declared, counted in `cl_other`, and printed in the SUMMARY.
#
# What the new probes add, counted rather than implied: **15 pairs that ran
# zero value probes before this entry** (1 enum — `source-sync-check --env`,
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n 1,80p tools/queue-source-check
#!/usr/bin/env python3
"""queue-source-check - prove that the next-candidate work queue has ONE home.
Why this exists (CHANGELOG [0.4.67], closing [0.4.66]'s queue item 1):
from [0.4.40] to [0.4.66] every CHANGELOG entry carried its own
`### Queue (next candidates, not actioned)` section AND every
`agent-logs/PROGRESS.md` run entry carried a copy of the same list as a
`Next-candidate queued` bullet - two lists, hand-maintained, in two files.
They diverged exactly as two hand-maintained copies do: PROGRESS's
`[0.4.65]` queue listed the regression-baseline item that `[0.4.66]` then
actioned, while CHANGELOG's `[0.4.65]` queue never listed it and instead
carried a `--jobs` note the run had already rejected by design. The same
version therefore carried two different queues, so an item could sit in one
file and be re-proposed from the other - and nothing versioned checked it.
The decision this tool enforces (not asks about):
`agent-logs/PROGRESS.md` is the SINGLE authoritative next-candidate queue.
It is what the loop appends to and re-reads every run, and it was the copy
that stayed correct. CHANGELOG's `### Queue` sections stop carrying items
after `[0.4.66]`: from `[0.4.67]` on they are a one-line POINTER at
agent-logs/PROGRESS.md, and the 111 item lines already written into the
historical sections are FROZEN - they are history, not a live list, so a
strike-through edits them in place and nothing is ever added or removed.
No prose copy states HOW MANY historical sections there are: that number
grows with every CHANGELOG entry, so a written-down copy is stale by
construction (three copies said 25 while rules.queue_sections read 62 on
the day [0.4.106] removed them - the live figure is that JSON key).
Availability (exit 3 "cannot verify", never a pass):
A1 CHANGELOG.md exists and is readable
A2 CHANGELOG.md owns at least one `### Queue` section
A3 agent-logs/PROGRESS.md exists and is readable
The first A-rule that fails decides the exit code; later rules are not
evaluated, because a verdict about a file that was not read is a guess.
Rules (any failure = exit 1, and every one is reported, not just the first):
R1 total `- ` item lines inside every `### Queue` section is exactly
FROZEN_ITEMS (111) - the historical snapshot neither grew nor shrank
R2 the NEWEST `## [x.y.z]` entry owns a `### Queue` section - the pointer
was not dropped by a run that forgot it
R3 that newest `### Queue` section contains NO list item of any kind
(`- `, `* `, `+ `, `1.`) - no second list may be written there
R4 that newest `### Queue` section names `agent-logs/PROGRESS.md`
R5 agent-logs/PROGRESS.md carries at least one `Next-candidate queued`
bullet - the authoritative list still exists
R6 NO `## [x.y.z]` entry owns more than ONE `### Queue` section - one
pointer per entry. A duplicate is invisible to R1-R5 by construction:
it is pointer-only, so the freeze stays 111, and `newest_section` is
the LAST one, so R2-R4 judge only the copy a run meant to leave. This
is the defect [0.4.102] carried at EOF for one run - found by counting
(61 raw headings against 60 read as sections), while this tool exited 0
and the suite stayed green.
R7 every `### Queue` heading is accounted for: count_queue_headings() is
an INDEPENDENT census with its own fence walk, and raw == sections +
fenced must hold. parse() deciding not to read a heading (a `### Queue`
written above the first `## [x.y.z]` heading, or a future edit that
stops appending) is a dropped heading, not a file without one. The two
readers walk the same file separately precisely so they can disagree;
one pass reporting both numbers could not.
What R5 COUNTS (it is reported as `progress_bullets`, and until [0.4.80] that
number was `pg_text.count("Next-candidate queued")` - raw occurrences
anywhere in the file: measured 56 against 49 real entry lines on the live
tree when the fix was written, a number that moves whenever an entry
merely QUOTES the phrase):
a queue bullet is a line whose first non-space text is the phrase, with or
without a list marker (`- **Next-candidate queued…**` and the six entries
written as a bare `**Next-candidate queued…**` paragraph both count, once
each), outside any fenced block. A line that mentions the phrase in the
middle of a sentence - the R5 prose itself, a dashboard detail line, a
health summary - is not an entry, and neither is a second occurrence on a
line already counted.
R1 is deliberately an EQUALITY against a constant rather than a "greater than":
a count that may only grow cannot see a history rewrite, and a count
compared against nothing is the shape of arithmetic this repo has been
removing since [0.4.65]. Changing FROZEN_ITEMS is a deliberate act - edit
the constant and say so in the changelog entry that does it.
Fenced code blocks are NOT structure: an entry that quotes the shape of a
[0m$ [0mcd /data/repo && ./tools/queue-source-check --help 2>&1 | head -60; echo "=== git state ==="; git status -sb; git log --oneline origin/main -1; git rev-list --count origin/main..main; git rev-list --count main..origin/main
usage: queue-source-check [-h] [--format {human,json}] [--repo DIR]
Verify that the next-candidate work queue has exactly one home: agent-logs/PROGRESS.md carries the live list and CHANGELOG.md's newest '### Queue' section is a pointer at it, with the 111 historical item lines frozen.
options:
-h, --help show this help message and exit
--format {human,json}
output format (default: human; json = one compact
object)
--repo DIR repo to check (default: GLADEX_REPO_DIR, else the repo
this script lives in)
exit codes:
0 - the queue has exactly one home: CHANGELOG's newest ### Queue section is a
pointer at agent-logs/PROGRESS.md, PROGRESS carries the live list, and the 111 historical
item lines are unchanged
1 - a violation: a second list exists, the pointer was dropped, the
authoritative list is empty, one entry owns two `### Queue` sections, or
a `### Queue` heading was not read as a section (see the violations[]
array - every cause is reported, not just the first)
2 - invalid arguments
3 - cannot verify: CHANGELOG.md, agent-logs/PROGRESS.md or a ### Queue section is absent -
NOT a pass, never reported as one
=== git state ===
## main...origin/main [ahead 1]
c097c11 dispatcher: shift 2026-09-30T13:30Z — documented repo-lint [0.4.140] citation blocker, Vera/Pip stale assignments
1
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 Sep 30 16:24:04 2026] 127.0.0.1:40662 Accepted [Wed Sep 30 16:24:04 2026] 127.0.0.1:40662 Closing [Wed Sep 30 16:24:04 2026] 127.0.0.1:40666 Accepted [Wed Sep 30 16:24:04 2026] 127.0.0.1:40666 Closing [Wed Sep 30 16:24:04 2026] 127.0.0.1:40672 Accepted [Wed Sep 30 16:24:04 2026] 127.0.0.1:40672 Closing [Wed Sep 30 16:24:04 2026] 127.0.0.1:40688 Accepted [Wed Sep 30 16:24:04 2026] 127.0.0.1:40688 Closing [Wed Sep 30 16:24:04 2026] 127.0.0.1:40690 Accepted [Wed Sep 30 16:24:04 2026] 127.0.0.1:40690 Closing [Wed Sep 30 16:24:04 2026] 127.0.0.1:40700 Accepted [Wed Sep 30 16:24:05 2026] 127.0.0.1:40700 Closing [Wed Sep 30 16:24:05 2026] 127.0.0.1:41284 Accepted [Wed Sep 30 16:24:05 2026] 127.0.0.1:41284 Closing [Wed Sep 30 16:24:05 2026] 127.0.0.1:41286 Accepted [Wed Sep 30 16:24:05 2026] 127.0.0.1:41286 Closing [Wed Sep 30 16:24:05 2026] 127.0.0.1:41290 Accepted [Wed Sep 30 16:24:05 2026] 127.0.0.1:41290 Closing [Wed Sep 30 16:26:03 2026] 127.0.0.1:41974 Accepted [Wed Sep 30 16:26:03 2026] 127.0.0.1:41974 Closing [Wed Sep 30 16:26:03 2026] 127.0.0.1:41978 Accepted [Wed Sep 30 16:26:03 2026] 127.0.0.1:41978 Closing [Wed Sep 30 16:26:03 2026] 127.0.0.1:41988 Accepted [Wed Sep 30 16:26:03 2026] 127.0.0.1:41988 Closing [Wed Sep 30 16:26:03 2026] 127.0.0.1:41994 Accepted [Wed Sep 30 16:26:03 2026] 127.0.0.1:41994 Closing [Wed Sep 30 16:26:03 2026] 127.0.0.1:41996 Accepted [Wed Sep 30 16:26:03 2026] 127.0.0.1:41996 Closing [Wed Sep 30 16:26:03 2026] 127.0.0.1:42004 Accepted [Wed Sep 30 16:26:03 2026] 127.0.0.1:42004 Closing [Wed Sep 30 16:26:03 2026] 127.0.0.1:42010 Accepted [Wed Sep 30 16:26:04 2026] 127.0.0.1:42010 Closing [Wed Sep 30 16:26:04 2026] 127.0.0.1:42024 Accepted [Wed Sep 30 16:26:04 2026] 127.0.0.1:42024 Closing [Wed Sep 30 16:26:04 2026] 127.0.0.1:42030 Accepted [Wed Sep 30 16:26:04 2026] 127.0.0.1:42030 Closing [Wed Sep 30 16:26:04 2026] 127.0.0.1:42042 Accepted [Wed Sep 30 16:26:04 2026] 127.0.0.1:42042 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42112 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42112 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42116 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42116 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42120 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42120 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42128 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42128 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42132 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42132 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42146 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42146 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42154 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42154 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42160 Accepted [Wed Sep 30 16:26:44 2026] 127.0.0.1:42160 Closing [Wed Sep 30 16:26:44 2026] 127.0.0.1:42172 Accepted [Wed Sep 30 16:26:45 2026] 127.0.0.1:42172 Closing [Wed Sep 30 16:26:45 2026] 127.0.0.1:60204 Accepted [Wed Sep 30 16:26:45 2026] 127.0.0.1:60204 Closing [Wed Sep 30 16:27:48 2026] 127.0.0.1:49308 Accepted
Generated 2026-09-30 14:27:48 UTC · Gladex.de