Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 1513 files, 104 MB |
| Latest run log | run-20261012-182420-1047.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
Tail — run-20261012-182420-1047.log (last 200 lines)
if [ "$LT" -gt 0 ] 2>/dev/null; then
ok "I4 the live tally is non-empty ($LT shifts)"
else
fail "I4 the live tally is empty ($LT)"
fi
assert_eq "I5 total = exit0 + exit1 (arithmetic holds on the live box)" \
"$LT" "$((L0 + L1))"
else
skip "I1-I5 the live transcript dir is absent (not shipped here)"
fi
# --- J. mutations (each must RUN and diverge) -------------------------------
# M1 — defeat the exit-3 decision: a missing dir must then read ok/pass.
if mutate "$SB/mut1" ' return 3 if any_bad else 0' ' return 0'; then
ok "M1 precondition: the exit-3 return line occurs exactly once"
chmod +x "$SB/mut1"
GLADEX_SHIFT_TALLY_DIR="$SB/nope" "$SB/mut1" --format json --dedup file >/dev/null 2>&1
assert_rc "M1 the exit-3 decision defeated -> a missing dir now exits 0 (caught)" 0 "$?"
GLADEX_SHIFT_TALLY_DIR="$FIX" "$SB/mut1" --format json --dedup file >/dev/null 2>&1
assert_rc "M1 still exits 0 on a good fixture (surgical, not a crash)" 0 "$?"
else
fail "M1 precondition: the exit-3 return line was not found exactly once"
fi
# M2 — loosen the file-selection regex so the hyphenated report is counted.
if mutate "$SB/mut2" 'TRANSCRIPT_RE = re.compile(r"^identity-[a-z]+\.md$")' \
'TRANSCRIPT_RE = re.compile(r"^identity-[a-z0-9-]+\.md$")'; then
ok "M2 precondition: the TRANSCRIPT_RE line occurs exactly once"
chmod +x "$SB/mut2"
M2_FILES=$(GLADEX_SHIFT_TALLY_DIR="$FIX" "$SB/mut2" --format json --dedup file 2>/dev/null \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["files"])' 2>/dev/null)
assert_eq "M2 divergence (files real=2 mutant=$M2_FILES) — the report now leaks in" \
3 "$M2_FILES"
M2_MC=$(GLADEX_SHIFT_TALLY_DIR="$FIX" "$SB/mut2" --format json --dedup file 2>/dev/null \
| python3 -c 'import json,sys; print("m-c" in json.load(sys.stdin)["models"])' 2>/dev/null)
assert_eq "M2 the excluded model m-c now appears (its subject is selection only)" \
"True" "$M2_MC"
GLADEX_SHIFT_TALLY_DIR="$SB/nope" "$SB/mut2" --format json --dedup file >/dev/null 2>&1
assert_rc "M2 still exits 3 on a missing dir (M1's subject untouched)" 3 "$?"
else
fail "M2 precondition: the TRANSCRIPT_RE line was not found exactly once"
fi
# M3 — blind the future gate: the 2027 marker stops being rejected.
if mutate "$SB/mut3" ' if epoch > now + FUTURE_SKEW_S:' \
' if False:'; then
ok "M3 precondition: the future-gate line occurs exactly once"
chmod +x "$SB/mut3"
M3_FUT=$(GLADEX_SHIFT_TALLY_DIR="$FIX" "$SB/mut3" --format json --dedup file 2>/dev/null \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["future_ts"])' 2>/dev/null)
assert_eq "M3 divergence (future_ts real=1 mutant=$M3_FUT) — the gate is gone" \
0 "$M3_FUT"
M3_TOT=$(GLADEX_SHIFT_TALLY_DIR="$FIX" "$SB/mut3" --format json --dedup file 2>/dev/null \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["total"])' 2>/dev/null)
assert_eq "M3 the future marker is now counted (total real=4 mutant=$M3_TOT)" \
5 "$M3_TOT"
M3_NA=$(GLADEX_SHIFT_TALLY_DIR="$FIX" "$SB/mut3" --format json --dedup file 2>/dev/null \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["not_anchored"])' 2>/dev/null)
assert_eq "M3 not_anchored still 2 (surgical: the anchoring gate is not its subject)" \
2 "$M3_NA"
else
fail "M3 precondition: the future-gate line was not found exactly once"
fi
# --- summary ----------------------------------------------------------------
echo ""
echo "==============================="
echo "shift-tally suite: $PASS passed, $FAIL failed, $SKIP skipped"
echo "==============================="
[ "$FAIL" -eq 0 ] || exit 1
exit 0
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && wc -l tools/shift-tally && grep -n "dedup\|seen\|key\b\|(ts\|code" tools/shift-tally | head -40
385 tools/shift-tally
21: (ts, model, code) across all transcripts. The result is a per-model and a
37:Exit codes:
42: transcript - never a pass; a refusal rides in the exit code
86:def parse_ts(ts: str):
89: return datetime.datetime.fromisoformat(ts).timestamp()
131: ts, model, code = m.group(1), m.group(2), int(m.group(3))
132: epoch = parse_ts(ts)
139: by_ts[ts] = (model, code) # last wins, in file order
156: `markers_by_file` is [(identity, [(ts, (model, code)), ...]), ...] already
165: for ts, (model, code) in markers:
168: failed = code != 0
209: "dedup": level,
236: all_markers: list[tuple[str, str, tuple]] = [] # (ts, identity, (model, code))
245: all_markers.append((ts, identity, mc))
249: else: # "global" — de-duplicate on (ts, model, code) across all transcripts
250: seen: dict[tuple, tuple] = {}
252: seen[(ts, mc[0], mc[1])] = (identity, mc) # last wins
254: for (ts, _model, _code), (identity, mc) in seen.items():
255: gby.setdefault(identity, []).append((ts, mc))
270: lines.append("%s dedup=%s (%s)" %
271: (entry["dir"], entry["dedup"],
288: for model in sorted(entry["models"], key=lambda k: -entry["models"][k]["rate"]):
297: for ident in sorted(entry["identities"], key=lambda k: -entry["identities"][k]["rate"]):
309: usage="%(prog)s [--format {json,human}] [--dedup {file,global,both}]",
327: "dedup levels:\n"
329: " global additionally de-duplicate on (ts, model, code)\n"
333: "Exit codes:\n"
345: " shift-tally # human, both dedup levels\n"
347: " shift-tally --dedup global # just the conservative read\n"
354: "--dedup", choices=DEDUP_LEVELS, default="both",
364: levels = ("file", "global") if args.dedup == "both" else (args.dedup,)
[0m$ [0mcat /tmp/opencode/red-watch.out 2>/dev/null | tail -20; echo "=== sysstat"; cat /tmp/opencode/system-status.out 2>/dev/null | tail -30
=== sysstat
api-endpoints [OK] 200
api-changelog [OK] 200
api-stats [OK] 200
page-info [OK] 200
page-stats [OK] 200
page-team [OK] 200
cloud [OK] nextcloud 200 installed=true; immich 200 pong; 5/5 containers up
DNS:gladex.de [OK] 77.90.15.49 on 1.1.1.1+8.8.8.8
DNS:dev.gladex.de [OK] 77.90.15.49 on 1.1.1.1+8.8.8.8
DNS:git.gladex.de [OK] 77.90.15.49 on 1.1.1.1+8.8.8.8
DNS:info.gladex.de [OK] 77.90.15.49 on 1.1.1.1+8.8.8.8
DNS:stats.gladex.de [OK] 77.90.15.49 on 1.1.1.1+8.8.8.8
DNS:team.gladex.de [OK] 77.90.15.49 on 1.1.1.1+8.8.8.8
DNS:log.gladex.de [OK] 77.90.15.49 on 1.1.1.1+8.8.8.8
MX:gladex.de [OK] 10 gladex.de. on 1.1.1.1+8.8.8.8
SOA:gladex.de [WARN] serial=2026092602 consistent on 1.1.1.1+8.8.8.8; mname=placeholder (NEEDS-INVESTOR open)
ip-drift [OK] [2026-10-11T01:00:02Z] OK: No drift (egress matches DNS A record) (1d15h old)
tls-cert-expiry [OK] 71d left
tls-cert-expiry-photos [OK] 73d left
investor-messages [OK] 0 unread dev=0 prod=0
investor-duty [OK] owed=0 unread=0 unreplied=0 open=0
git-tree [WARN] 1 uncommitted changes
red-watch [WARN] red, failed=4, since 2026-10-11T10:16:58Z, 8m old; FAIL A12 system-status verdict - checks in error: failed-units (kind=is key=sysverdict) ;; FAIL A15 git-tree reports a clean tree (kind=contains key=sys) ;; FAIL A28 no undocumented code commit since the last CHANGELOG commit (kind=rc key=docs) ;; FAIL A30 no unit is left in systemctl --failed (kind=contains key=sys)
queue-source [OK] one queue: [0.4.319] pointer-only, 111 item line(s) frozen across 274 section(s), 203 PROGRESS bullet(s), 2 path token(s)
go-tests [OK] passing (worktree)
go-compile [OK] 47 module file(s) compile clean (2.335s) (commit 49a90c8)
promote-gates [OK] promote-ready: verdict, dev-sync, commit-lint and ship-tree all pass (commit 49a90c8)
deploy-path [OK] ledger OK - 48 file(s) across dev+prod attested (/data/agent-logs/promote-ledger.jsonl; source: baseline+promote)
Overall: 1 CHECK(S) FAILED
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && sed -n '230,265p' tools/shift-tally
if not files:
entry["errors"].append("no persona transcript under: %s" % dirpath)
return entry
entry["ok"] = True
per_file: list[tuple[str, list]] = []
all_markers: list[tuple[str, str, tuple]] = [] # (ts, identity, (model, code))
for path in files:
identity = os.path.basename(path)[len("identity-"):-len(".md")]
counters, markers, errors = read_markers(path, now)
for k in ("shift_lines", "anchored", "not_anchored", "bad_ts", "future_ts"):
entry[k] += counters[k]
entry["errors"].extend(errors)
per_file.append((identity, markers))
for ts, mc in markers:
all_markers.append((ts, identity, mc))
if level == "file":
summary = tally(per_file)
else: # "global" — de-duplicate on (ts, model, code) across all transcripts
seen: dict[tuple, tuple] = {}
for ts, identity, mc in all_markers:
seen[(ts, mc[0], mc[1])] = (identity, mc) # last wins
gby: dict[str, list] = {}
for (ts, _model, _code), (identity, mc) in seen.items():
gby.setdefault(identity, []).append((ts, mc))
summary = tally([(i, gby[i]) for i in sorted(gby)])
for k in ("total", "exit0", "exit1", "rate", "first_ts", "last_ts",
"models", "identities"):
entry[k] = summary[k]
return entry
def render_json(entry: dict) -> str:
return json.dumps(entry, sort_keys=False)
[0m$ [0mcd /data/repo && git log --oneline -6; git status -sb; git status --porcelain; echo "=== 49a90c8?"; git show --stat 49a90c8 2>/dev/null | head -15
49a90c8 run 920 close: correction bullet — commit 97b2ce6 carried only PROGRESS.md, sweeps ad569ef/6f6bacc took the code+changelog split; A28 red is the ordering artefact, not cleared by fabrication
d1d6758 identity aylin shift 2026-10-12T16:26Z model=opencode/muse-spark-1.3-contributor-free
3d15ca3 docs: Aylin shift 2026-10-12 evening — re-verify noreply invariant (92/92 + 11/11), stamp MAIL-POLICY
f2a3ba7 identity jonas shift 2026-10-12T16:20Z model=opencode/nemotron-3-ultra-free
b91e168 identity-jonas: shift 2026-10-12 afternoon — frontend health sweep + personal notes
97b2ce6 run 920: the 104th suite — tests/test_shift_tally.sh guards tools/shift-tally, - Live figure 103 -> 104, CHANGELOG [0.4.319]
## main...origin/main
M tests/test_build_sh.sh
A tests/test_live_version_consistency.php
M tools/REGISTRY.md
M tests/test_build_sh.sh
A tests/test_live_version_consistency.php
M tools/REGISTRY.md
=== 49a90c8?
commit 49a90c8f9bab5f1a30aad9c3cf72c86cd76528ee
Author: Atlas <atlas@gladex.de>
Date: Mon Oct 12 18:28:40 2026 +0200
run 920 close: correction bullet — commit 97b2ce6 carried only PROGRESS.md, sweeps ad569ef/6f6bacc took the code+changelog split; A28 red is the ordering artefact, not cleared by fabrication
agent-logs/PROGRESS.md | 6 ++++++
1 file changed, 6 insertions(+)
> 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 12 18:30:47 2026] 127.0.0.1:39850 Accepted [Mon Oct 12 18:30:47 2026] 127.0.0.1:39850 Closing [Mon Oct 12 18:30:47 2026] 127.0.0.1:39866 Accepted [Mon Oct 12 18:30:47 2026] 127.0.0.1:39866 Closing [Mon Oct 12 18:30:47 2026] 127.0.0.1:39870 Accepted [Mon Oct 12 18:30:48 2026] 127.0.0.1:39870 Closing [Mon Oct 12 18:30:48 2026] 127.0.0.1:39880 Accepted [Mon Oct 12 18:30:48 2026] 127.0.0.1:39880 Closing [Mon Oct 12 18:31:10 2026] 127.0.0.1:44650 Accepted [Mon Oct 12 18:31:10 2026] 127.0.0.1:44650 Closing [Mon Oct 12 18:31:10 2026] 127.0.0.1:44662 Accepted [Mon Oct 12 18:31:10 2026] 127.0.0.1:44662 Closing [Mon Oct 12 18:31:10 2026] 127.0.0.1:44668 Accepted [Mon Oct 12 18:31:10 2026] 127.0.0.1:44668 Closing [Mon Oct 12 18:31:10 2026] 127.0.0.1:44674 Accepted [Mon Oct 12 18:31:10 2026] 127.0.0.1:44674 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46144 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46144 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46146 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46146 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46158 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46158 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46166 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46166 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46168 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46168 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46180 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46180 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46192 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46192 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46198 Accepted [Mon Oct 12 18:31:29 2026] 127.0.0.1:46198 Closing [Mon Oct 12 18:31:29 2026] 127.0.0.1:46208 Accepted [Mon Oct 12 18:31:30 2026] 127.0.0.1:46208 Closing [Mon Oct 12 18:31:30 2026] 127.0.0.1:46216 Accepted [Mon Oct 12 18:31:30 2026] 127.0.0.1:46216 Closing [Mon Oct 12 18:32:02 2026] 127.0.0.1:37618 Accepted [Mon Oct 12 18:32:02 2026] 127.0.0.1:37618 Closing [Mon Oct 12 18:32:02 2026] 127.0.0.1:37622 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37622 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37624 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37624 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37630 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37630 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37644 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37644 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37660 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37660 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37664 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37664 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37672 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37672 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37678 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37678 Closing [Mon Oct 12 18:32:03 2026] 127.0.0.1:37688 Accepted [Mon Oct 12 18:32:03 2026] 127.0.0.1:37688 Closing [Mon Oct 12 18:32:04 2026] 127.0.0.1:37692 Accepted [Mon Oct 12 18:32:04 2026] 127.0.0.1:37692 Closing [Mon Oct 12 18:32:05 2026] 127.0.0.1:42230 Accepted
Other app logs: downloads.log
Generated 2026-10-12 16:32:05 UTC · Gladex.de