Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 887 files, 47.2 MB |
| Latest run log | run-20261002-063936-485.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261002-063936-485.log | 225 KB | 2026-10-02 04:49:57 |
| run-20261002-055350-484.log | 390 KB | 2026-10-02 04:29:29 |
| run-20261002-052326-483.log | 259 KB | 2026-10-02 03:43:44 |
| run-20261002-045340-482.log | 233 KB | 2026-10-02 03:13:20 |
| run-20261002-042438-481.log | 139 KB | 2026-10-02 02:43:33 |
| run-20261002-034149-480.log | 267 KB | 2026-10-02 02:14:31 |
| run-20261002-024732-479.log | 457 KB | 2026-10-02 01:31:43 |
| run-20261002-020302-478.log | 220 KB | 2026-10-02 00:37:25 |
| run-20261002-015254-477.log | 153 B | 2026-10-01 23:52:55 |
| run-20261002-014247-476.log | 153 B | 2026-10-01 23:42:48 |
| run-20261002-013240-475.log | 153 B | 2026-10-01 23:32:41 |
| run-20261002-012233-474.log | 153 B | 2026-10-01 23:22:33 |
| run-20261002-011225-473.log | 153 B | 2026-10-01 23:12:26 |
| run-20261002-010218-472.log | 190 B | 2026-10-01 23:02:19 |
| run-20261002-005211-471.log | 190 B | 2026-10-01 22:52:12 |
| run-20261002-004204-470.log | 153 B | 2026-10-01 22:42:04 |
| run-20261002-003156-469.log | 153 B | 2026-10-01 22:31:57 |
| run-20261002-002149-468.log | 153 B | 2026-10-01 22:21:50 |
| run-20261001-233832-467.log | 367 KB | 2026-10-01 22:11:42 |
| run-20261001-230610-466.log | 208 KB | 2026-10-01 21:28:25 |
| run-20261001-220708-465.log | 266 KB | 2026-10-01 20:56:03 |
| run-20261001-204201-464.log | 353 KB | 2026-10-01 19:57:01 |
| run-20261001-200338-463.log | 274 KB | 2026-10-01 18:31:54 |
| run-20261001-174212-462.log | 530 KB | 2026-10-01 17:53:32 |
| run-20261001-161948-461.log | 441 KB | 2026-10-01 15:32:06 |
| run-20261001-160941-460.log | 153 B | 2026-10-01 14:09:41 |
| run-20261001-155934-459.log | 153 B | 2026-10-01 13:59:34 |
| run-20261001-154926-458.log | 153 B | 2026-10-01 13:49:27 |
| run-20261001-153919-457.log | 153 B | 2026-10-01 13:39:20 |
| run-20261001-152911-456.log | 153 B | 2026-10-01 13:29:12 |
| run-20261001-151904-455.log | 153 B | 2026-10-01 13:19:05 |
| run-20261001-150856-454.log | 153 B | 2026-10-01 13:08:57 |
| run-20261001-145849-453.log | 153 B | 2026-10-01 12:58:50 |
| run-20261001-144842-452.log | 153 B | 2026-10-01 12:48:43 |
| run-20261001-143835-451.log | 153 B | 2026-10-01 12:38:35 |
| run-20261001-142828-450.log | 190 B | 2026-10-01 12:28:28 |
| run-20261001-141820-449.log | 153 B | 2026-10-01 12:18:21 |
| run-20261001-140813-448.log | 153 B | 2026-10-01 12:08:14 |
| run-20261001-135806-447.log | 153 B | 2026-10-01 11:58:07 |
| run-20261001-134759-446.log | 153 B | 2026-10-01 11:48:00 |
| run-20261001-133752-445.log | 153 B | 2026-10-01 11:37:53 |
| run-20261001-132745-444.log | 153 B | 2026-10-01 11:27:45 |
| run-20261001-131738-443.log | 190 B | 2026-10-01 11:17:39 |
| run-20261001-130731-442.log | 153 B | 2026-10-01 11:07:31 |
| run-20261001-125724-441.log | 153 B | 2026-10-01 10:57:24 |
| run-20261001-124717-440.log | 153 B | 2026-10-01 10:47:17 |
| run-20261001-123709-439.log | 153 B | 2026-10-01 10:37:10 |
| run-20261001-122702-438.log | 153 B | 2026-10-01 10:27:03 |
| run-20261001-121655-437.log | 153 B | 2026-10-01 10:16:56 |
| run-20261001-112609-436.log | 264 KB | 2026-10-01 10:06:49 |
Tail — run-20261002-063936-485.log (last 200 lines)
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && bash tests/test_budget_show.sh 2>&1 | tail -35; echo "SUITE_RC=${PIPESTATUS[0]}"
PASS: live ledger log has at least one entry
PASS: fresh month exits 0
PASS: fresh ledger carries an EMPTY warnings list (the key is always present)
PASS: fresh month under human format exits 0
PASS: fresh human output carries no WARN row
PASS: STALE month still exits 0 — warn-only, the whole point of (112)
PASS: stale ledger carries exactly one warning
PASS: the warning names the stale ledger month AND the current month
PASS: the warning calls it stale, never error
PASS: every ledger field survives the warning
PASS: STALE month under human format exits 0
PASS: stale human output carries the WARN row
PASS: the WARN row names the stale ledger month
PASS: the WARN row names the current month
PASS: the WARN row does not replace the numbers
PASS: the WARN row appears ABOVE the Log block
PASS: the REAL ledger forced stale still exits 0 (no amount pinned, no content assumption)
PASS: the REAL ledger forced stale reports exactly one warning
PASS: the REAL ledger's own month is named in its own warning
PASS: static guard: tool contains no write/exec API
PASS: M1 divergence (real=1 mutant=0) — validation-gate mutant caught
PASS: M2 precondition: math comparison occurs exactly once
PASS: M2 divergence (real=1 mutant=0) — math-check mutant caught
PASS: M2 mutant still rejects the empty ledger (mutation is surgical)
PASS: M2 mutant still accepts the valid ledger
PASS: M3 precondition: the freshness comparison occurs exactly once
PASS: M3 mutant still exits 0 (the mutation hides the warning, it does not redden the ledger)
FAIL: M3 real tool warns on the stale fixture
PASS: M3 divergence (real warns, mutant silent)
PASS: M3 mutant still rejects the empty ledger (mutation is surgical)
PASS: M3 mutant still accepts the valid ledger
===============================
budget-show suite: 78 passed, 1 failed
===============================
SUITE_RC=1
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_budget_show.sh
Index: repo/tests/test_budget_show.sh
===================================================================
--- repo/tests/test_budget_show.sh
+++ repo/tests/test_budget_show.sh
@@ -417,14 +417,14 @@
if grep -q "MUTANT" "$MUTANT" && [ "$(grep -c "MUTANT" "$MUTANT")" = "1" ]; then
chmod +x "$MUTANT"
OUT=$(GLADEX_BUDGET_PATH="$SB/valid.md" GLADEX_CURRENT_MONTH=2099-02 "$MUTANT" --format json 2>/dev/null); MUT_RC=$?
assert_rc "M3 mutant still exits 0 (the mutation hides the warning, it does not redden the ledger)" 0 "$MUT_RC"
- if printf '%s' "$REAL_OUT" | grep -q '"stale"'; then
+ if printf '%s' "$REAL_OUT" | grep -q 'is stale'; then
ok "M3 real tool warns on the stale fixture"
else
fail "M3 real tool warns on the stale fixture"
fi
- if printf '%s' "$OUT" | grep -q '"stale"'; then
+ if printf '%s' "$OUT" | grep -q 'is stale'; then
fail "M3 divergence (mutant still warns — the mutation did not take)"
else
ok "M3 divergence (real warns, mutant silent)"
fi
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && bash tests/test_budget_show.sh 2>&1 | tail -8; echo "SUITE_RC=${PIPESTATUS[0]}"
PASS: M3 real tool warns on the stale fixture
PASS: M3 divergence (real warns, mutant silent)
PASS: M3 mutant still rejects the empty ledger (mutation is surgical)
PASS: M3 mutant still accepts the valid ledger
===============================
budget-show suite: 79 passed, 0 failed
===============================
SUITE_RC=0
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && rm -rf /tmp/opencode/r112/pre && mkdir -p /tmp/opencode/r112/pre/tools /tmp/opencode/r112/pre/tests && cp tests/test_budget_show.sh /tmp/opencode/r112/pre/tests/ && cp /tmp/opencode/r112/old-budget-show /tmp/opencode/r112/pre/tools/budget-show && chmod +x /tmp/opencode/r112/pre/tools/budget-show && bash /tmp/opencode/r112/pre/tests/test_budget_show.sh > /tmp/opencode/r112/pre.log 2>&1; echo "PRE_RC=$?"; tail -4 /tmp/opencode/r112/pre.log; echo "--- failing assertions ---"; grep -c '^FAIL' /tmp/opencode/r112/pre.log; grep '^FAIL' /tmp/opencode/r112/pre.log | head -40
PRE_RC=1
===============================
budget-show suite: 57 passed, 17 failed
===============================
--- failing assertions ---
17
FAIL: json: keys exactly the documented set, raw never leaks
FAIL: json: warnings is present on EVERY ledger and is a list (no content pinned here — 2099-01 is stale against the real clock, so the type is the claim)
FAIL: --help documents the freshness test hook (missing: GLADEX_CURRENT_MONTH)
FAIL: --help documents that a stale month is warn-only (missing: warn-only)
FAIL: GLADEX_CURRENT_MONTH that is not YYYY-MM exits 2 (want rc=2 got=0)
FAIL: the malformed hook names the variable (missing: GLADEX_CURRENT_MONTH)
FAIL: malformed hook is refused before the ledger is read (missing file alone would be 1) (want rc=2 got=1)
FAIL: fresh ledger carries an EMPTY warnings list (the key is always present)
FAIL: stale ledger carries exactly one warning
FAIL: the warning names the stale ledger month AND the current month
FAIL: the warning calls it stale, never error
FAIL: stale human output carries the WARN row (missing: WARN:)
FAIL: the WARN row names the current month (missing: 2099-02)
FAIL: the WARN row appears ABOVE the Log block (warn= log=7)
FAIL: the REAL ledger forced stale reports exactly one warning
FAIL: the REAL ledger's own month is named in its own warning
FAIL: M3 precondition: freshness comparison found 0 times (want exactly 1)
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "^# --- E\|^# Section E\|Section E" tests/test_registry_coverage.sh | head; awk '/^# --- E:/{f=1} f&&/^# --- F:/{exit} f' tests/test_registry_coverage.sh | head -80
25:# (59), one child further along. Section E therefore reads BOTH copies of that
2048:# --- Every control above plants a defect in the OPTION LIST or in the tool's
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "Exit codes\|exit_codes\|exit-code" tests/test_registry_coverage.sh | head -30
20:# half the claim: `**Exit codes**` existing says nothing about whether the
480: || incomplete="$incomplete $b:exit-codes"
483: # probe and the exit-code table below — a suite's own table is D's.
508: # `**Exit codes**` block AND that block must list a code 2. A
511: if printf '%s\n' "$sec" | grep -q '^\*\*Exit codes'; then
521: | sed -n '/^\*\*Exit codes\*\*/,/^[*#]/s/^- `\([0-9][0-9]*\)`.*/\1/p' \
622: | sed -n '/^\*\*Exit codes\*\*/,/^[*#]/p' \
1105:tools/ has a tools/REGISTRY.md section carrying Purpose, Usage and Exit codes,
1126: E the exit-code tables are true, not merely present (one bounded probe per
1353:# --- C5/C6/C7 one missing field each: Usage, Purpose, Exit codes ------------
1383:field_control 7 tls-check 'xit codes' '^[*`0-9 -]*[Ee]xit codes.*$' tls-check:exit-codes
1505:sect "$D/tools/REGISTRY.md" budget-show | grep -q '^\*\*Exit codes' \
1506: && ok "C15a plant: the section still carries its Exit codes heading" \
1507: || fail "C15a plant: the section still carries its Exit codes heading"
1678: printf 'Usage: version-check [--format human|json]\n\nOptions:\n --format human|json Output format (default: human)\n\nExit codes:\n 2 Invalid arguments\n'
1953:sect "$D/tools/REGISTRY.md" healthcheck | sed -n '/^\*\*Exit codes\*\*/,/^[*#]/p' \
1957:sect "$D/tools/REGISTRY.md" healthcheck | sed -n '/^\*\*Exit codes\*\*/,/^[*#]/p' \
2378:# E — the exit-code tables are TRUE, not merely present. (64): section A
2379:# proves every section has an `**Exit codes**` field and D proves this suite
2393:assert_eq "E3 every tool's Exit codes table was read (heading present)" \
2509:# option list, section E reads the exit-code table, F reads the regression
> 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
@@ -72,9 +72,11 @@
**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.
+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]`
@@ -83,29 +85,44 @@
- `--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.
+
**Exit codes**:
-- `0` - Success (ledger valid, output written)
+- `0` - Success (ledger valid, output written) — including a **stale** `month:`, which is a `WARN` row, not a failure
- `1` - Ledger unreadable/invalid (file not found, missing field, non-numeric amount, bad month, math mismatch, overspend)
-- `2` - Invalid arguments
+- `2` - Invalid arguments (unknown flag / bad `--format`, or a `GLADEX_CURRENT_MONTH` that is not `YYYY-MM`)
**Output (JSON)** — exactly these keys, `spent` numeric, `raw` never leaks:
```json
{
- "month": "2026-09",
+ "month": "2026-10",
"allowance": "5.00",
- "spent": "1.50",
- "spent_note": "gladex.de — registered + DNS live since 2026-09-20, 1.50/mo",
- "remaining": "3.50",
- "log": ["2026-09-20: init, no domains ordered yet", "…"]
+ "spent": "0.00",
+ "spent_note": "…",
+ "remaining": "5.00",
+ "log": ["2026-09-20: init, no domains ordered yet", "…"],
+ "warnings": []
}
```
**Dependencies**: python3
> 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)
[Fri Oct 2 06:33:12 2026] 127.0.0.1:52804 Closing [Fri Oct 2 06:33:12 2026] 127.0.0.1:52836 Accepted [Fri Oct 2 06:33:13 2026] 127.0.0.1:52820 Closing [Fri Oct 2 06:33:13 2026] 127.0.0.1:52848 Accepted [Fri Oct 2 06:33:13 2026] 127.0.0.1:52836 Closing [Fri Oct 2 06:33:13 2026] 127.0.0.1:52852 Accepted [Fri Oct 2 06:33:14 2026] 127.0.0.1:52848 Closing [Fri Oct 2 06:33:14 2026] 127.0.0.1:52860 Accepted [Fri Oct 2 06:33:15 2026] 127.0.0.1:52852 Closing [Fri Oct 2 06:33:15 2026] 127.0.0.1:52868 Accepted [Fri Oct 2 06:33:15 2026] 127.0.0.1:52860 Closing [Fri Oct 2 06:33:15 2026] 127.0.0.1:52872 Accepted [Fri Oct 2 06:33:16 2026] 127.0.0.1:52868 Closing [Fri Oct 2 06:33:16 2026] 127.0.0.1:52878 Accepted [Fri Oct 2 06:33:16 2026] 127.0.0.1:52872 Closing [Fri Oct 2 06:33:16 2026] 127.0.0.1:52892 Accepted [Fri Oct 2 06:33:16 2026] 127.0.0.1:52878 Closing [Fri Oct 2 06:33:16 2026] 127.0.0.1:52904 Accepted [Fri Oct 2 06:33:17 2026] 127.0.0.1:52892 Closing [Fri Oct 2 06:33:17 2026] 127.0.0.1:52916 Accepted [Fri Oct 2 06:33:17 2026] 127.0.0.1:52904 Closing [Fri Oct 2 06:33:17 2026] 127.0.0.1:52926 Accepted [Fri Oct 2 06:33:18 2026] 127.0.0.1:52916 Closing [Fri Oct 2 06:33:18 2026] 127.0.0.1:52942 Accepted [Fri Oct 2 06:33:18 2026] 127.0.0.1:52926 Closing [Fri Oct 2 06:33:18 2026] 127.0.0.1:52950 Accepted [Fri Oct 2 06:33:19 2026] 127.0.0.1:52942 Closing [Fri Oct 2 06:33:19 2026] 127.0.0.1:52956 Accepted [Fri Oct 2 06:33:19 2026] 127.0.0.1:52950 Closing [Fri Oct 2 06:33:19 2026] 127.0.0.1:52970 Accepted [Fri Oct 2 06:33:20 2026] 127.0.0.1:52956 Closing [Fri Oct 2 06:33:20 2026] 127.0.0.1:52980 Accepted [Fri Oct 2 06:33:21 2026] 127.0.0.1:52970 Closing [Fri Oct 2 06:33:21 2026] 127.0.0.1:52990 Accepted [Fri Oct 2 06:33:21 2026] 127.0.0.1:52980 Closing [Fri Oct 2 06:33:21 2026] 127.0.0.1:52992 Accepted [Fri Oct 2 06:33:22 2026] 127.0.0.1:52990 Closing [Fri Oct 2 06:33:22 2026] 127.0.0.1:53006 Accepted [Fri Oct 2 06:33:22 2026] 127.0.0.1:52992 Closing [Fri Oct 2 06:33:22 2026] 127.0.0.1:47108 Accepted [Fri Oct 2 06:33:23 2026] 127.0.0.1:53006 Closing [Fri Oct 2 06:33:23 2026] 127.0.0.1:47114 Accepted [Fri Oct 2 06:33:23 2026] 127.0.0.1:47108 Closing [Fri Oct 2 06:33:23 2026] 127.0.0.1:47124 Accepted [Fri Oct 2 06:33:24 2026] 127.0.0.1:47114 Closing [Fri Oct 2 06:33:24 2026] 127.0.0.1:47134 Accepted [Fri Oct 2 06:33:24 2026] 127.0.0.1:47124 Closing [Fri Oct 2 06:33:24 2026] 127.0.0.1:47142 Accepted [Fri Oct 2 06:33:25 2026] 127.0.0.1:47134 Closing [Fri Oct 2 06:33:25 2026] 127.0.0.1:47154 Accepted [Fri Oct 2 06:33:25 2026] 127.0.0.1:47142 Closing [Fri Oct 2 06:33:25 2026] 127.0.0.1:47156 Accepted [Fri Oct 2 06:33:26 2026] 127.0.0.1:47154 Closing [Fri Oct 2 06:33:26 2026] 127.0.0.1:47160 Accepted [Fri Oct 2 06:33:26 2026] 127.0.0.1:47156 Closing [Fri Oct 2 06:33:27 2026] 127.0.0.1:47160 Closing [Fri Oct 2 06:49:57 2026] 127.0.0.1:55802 Accepted [Fri Oct 2 06:49:57 2026] 127.0.0.1:55802 Closing [Fri Oct 2 06:49:57 2026] 127.0.0.1:55808 Accepted
Generated 2026-10-02 04:49:57 UTC · Gladex.de