Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 1628 files, 119 MB |
| Latest run log | run-20261015-070843-1162.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
Tail — run-20261015-070843-1162.log (last 200 lines)
&& ok "11b: rc_class reads the residual condition as 'other', not as a code" \
|| bad "11b: rc_class reads the residual condition as 'other', not as a code"
echo "=== 12. live: the real module, through the tool ==="
if command -v go >/dev/null 2>&1 && [ -f "$REPO/app/src/go/go.mod" ]; then
GO_MODE=pass; STUBDIR="$STUB_REAL"; GO_TMO=180
OUT=$(run_status "$REPO")
GO_TMO=3; STUBDIR="$STUB"
printf '%s' "$(item_field "$OUT" detail)" | grep -q '^passing' \
&& ok "live: real go test ./... on the real repo -> passing" \
|| bad "live: real go test ./... on the real repo -> passing (got '$(item_field "$OUT" detail)')"
RC=$(run_exit "$REPO")
[ "$RC" = "0" ] && ok "live: tool exits 0 on the real repo" \
|| bad "live: tool exits 0 on the real repo (got $RC)"
else
skip "go or the real module absent"
fi
echo "=== 13. mutation checks: the assertions above must be load-bearing ==="
# Each mutant is planted on a COPY (the real tool is never edited), asserted to
# have landed EXACTLY once, `bash -n`-validated (so the red can only come from
# behaviour), then run through the one scenario it targets. The mutant must
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n -A30 '^run_status()' tests/test_system_status_go_tests.sh | head -50; grep -n 'run_exit()' tests/test_system_status_go_tests.sh
185:run_status() { _run "$1" json 2>/dev/null || true; }
186-run_exit() { _run "$1" json >/dev/null 2>&1; echo $?; }
187-
188-item_field() {
189- printf '%s' "$1" \
190- | grep -o '{"name":"go-tests","status":"[^"]*","detail":"[^"]*"}' \
191- | head -1 | grep -o "\"$2\":\"[^\"]*\"" | head -1 | cut -d'"' -f4
192-}
193-
194-A="$SANDBOX/repo-a"; mkrepo "$A" 1 # has a go module
195-B="$SANDBOX/repo-b"; mkrepo "$B" 0 # no app/src/go at all
196-
197-echo "=== 1. baseline: go exits 0 -> ok 'passing', tool exits 0 ==="
198-GO_MODE=pass; STUBDIR="$STUB"
199-OUT=$(run_status "$A")
200-[ -n "$OUT" ] && ok "tool emitted JSON" || bad "tool emitted JSON (empty output)"
201-[ "$(item_field "$OUT" status)" = "ok" ] \
202- && ok "status ok when go exits 0" \
203- || bad "status ok when go exits 0 (got '$(item_field "$OUT" status)')"
204-[ "$(item_field "$OUT" detail)" = "passing (worktree)" ] \
205- && ok "detail is 'passing (worktree)' on a clean committed tree" \
206- || bad "detail is 'passing (worktree)' on a clean committed tree (got '$(item_field "$OUT" detail)')"
207-RC=$(run_exit "$A")
208-[ "$RC" = "0" ] && ok "baseline exits 0" || bad "baseline exits 0 (got $RC)"
209-# JSON must stay parseable whatever the detail is.
210-printf '%s' "$OUT" | python3 -c "import json,sys; json.load(sys.stdin)" 2>/dev/null \
211- && ok "output is valid JSON" || bad "output is valid JSON"
212-
213-echo "=== 2. go exits 1 with a FAIL line -> error 'failing: <pkg>', exit 1 ==="
214-GO_MODE=fail
215-OUT=$(run_status "$A")
186:run_exit() { _run "$1" json >/dev/null 2>&1; echo $?; }
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n -B2 -A40 '^_run()' tests/test_system_status_go_tests.sh | head -60
176-STUBDIR="$STUB"
177-
178:_run() { # _run <repo-dir> <format>
179- env PATH="$STUBDIR:$PATH" \
180- GLADEX_DEV_DB="$SANDBOX/no.db" GLADEX_PROD_DB="$SANDBOX/no.db" \
181- GLADEX_REPO_DIR="$1" \
182- STUB_GO_MODE="$GO_MODE" GLADEX_GO_BIN="$GO_BIN" GLADEX_GO_TIMEOUT="$GO_TMO" \
183- "$TOOL" --format "$2"
184-}
185-run_status() { _run "$1" json 2>/dev/null || true; }
186-run_exit() { _run "$1" json >/dev/null 2>&1; echo $?; }
187-
188-item_field() {
189- printf '%s' "$1" \
190- | grep -o '{"name":"go-tests","status":"[^"]*","detail":"[^"]*"}' \
191- | head -1 | grep -o "\"$2\":\"[^\"]*\"" | head -1 | cut -d'"' -f4
192-}
193-
194-A="$SANDBOX/repo-a"; mkrepo "$A" 1 # has a go module
195-B="$SANDBOX/repo-b"; mkrepo "$B" 0 # no app/src/go at all
196-
197-echo "=== 1. baseline: go exits 0 -> ok 'passing', tool exits 0 ==="
198-GO_MODE=pass; STUBDIR="$STUB"
199-OUT=$(run_status "$A")
200-[ -n "$OUT" ] && ok "tool emitted JSON" || bad "tool emitted JSON (empty output)"
201-[ "$(item_field "$OUT" status)" = "ok" ] \
202- && ok "status ok when go exits 0" \
203- || bad "status ok when go exits 0 (got '$(item_field "$OUT" status)')"
204-[ "$(item_field "$OUT" detail)" = "passing (worktree)" ] \
205- && ok "detail is 'passing (worktree)' on a clean committed tree" \
206- || bad "detail is 'passing (worktree)' on a clean committed tree (got '$(item_field "$OUT" detail)')"
207-RC=$(run_exit "$A")
208-[ "$RC" = "0" ] && ok "baseline exits 0" || bad "baseline exits 0 (got $RC)"
209-# JSON must stay parseable whatever the detail is.
210-printf '%s' "$OUT" | python3 -c "import json,sys; json.load(sys.stdin)" 2>/dev/null \
211- && ok "output is valid JSON" || bad "output is valid JSON"
212-
213-echo "=== 2. go exits 1 with a FAIL line -> error 'failing: <pkg>', exit 1 ==="
214-GO_MODE=fail
215-OUT=$(run_status "$A")
216-[ "$(item_field "$OUT" status)" = "error" ] \
217- && ok "test failure is an error" \
218- || bad "test failure is an error (got '$(item_field "$OUT" status)')"
> build · mimo-v2.6-flash-free
Reproducing the suite's exact env against both copies:
[0m$ [0mcd /data/repo && STUB=$(ls -d tests/stubs* 2>/dev/null | head -1); grep -n 'STUB=' tests/test_system_status_go_tests.sh | head -3; grep -n 'STUB_REAL=' tests/test_system_status_go_tests.sh | head -2
82:STUB="$SANDBOX/bin"
149:STUB_REAL="$SANDBOX/bin-real"
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n 'SANDBOX=' tests/test_system_status_go_tests.sh | head -3; grep -n 'trap' tests/test_system_status_go_tests.sh | head -3; sed -n '76,160p' tests/test_system_status_go_tests.sh
78:SANDBOX="$(mktemp -d /tmp/ssg-test.XXXXXX)" || exit 1
79:trap 'rm -rf "$SANDBOX"' EXIT INT TERM
[ -f "$TOOL" ] || { echo "SKIP: tool not found: $TOOL"; exit 0; }
SANDBOX="$(mktemp -d /tmp/ssg-test.XXXXXX)" || exit 1
trap 'rm -rf "$SANDBOX"' EXIT INT TERM
# ---------------------------------------------------------------- stubs -----
STUB="$SANDBOX/bin"
mkdir -p "$STUB"
printf '#!/bin/sh\necho active\n' > "$STUB/systemctl"
printf '#!/bin/sh\nprintf 200\n' > "$STUB/curl"
printf '#!/bin/sh\necho "notAfter=Dec 22 12:00:00 2026 GMT"\n' > "$STUB/openssl"
# dig: every check green, so only go-tests can move the verdict. MX/SOA are the
# live-accurate fixtures from test_system_status_mx_soa.sh.
cat > "$STUB/dig" <<'STUBDIG'
#!/bin/sh
rtype=""
for a in "$@"; do case "$a" in @*|+*) ;; [A-Z]*) rtype="$a" ;; esac; done
case "$rtype" in
A) echo "77.90.15.49" ;;
MX) echo "10 gladex.de." ;;
SOA) echo "a.misconfigured.dns.server.invalid. hostmaster.gladex.de. 2026092305 10800 3600 604800 3600" ;;
*) : ;;
esac
STUBDIG
# Scenario go: STUB_GO_MODE selects the exit code and the stdout shape.
cat > "$STUB/go" <<'STUBGO'
#!/bin/sh
case "${STUB_GO_MODE:-pass}" in
pass)
printf '%s\n' 'ok probe/cmd/gladex/commands 0.1s'; exit 0 ;;
fail)
printf '%s\n' '--- FAIL: TestBoom (0.00s)' ' x_test.go:3: boom' \
'FAIL' 'FAIL probe/cmd/gladex/commands 0.1s'; exit 1 ;;
# THE D2 CASE: a package result line was already flushed when the run died.
timeout-ok)
printf '%s\n' 'ok probe/cmd/gladex/commands 0.1s'; exit 124 ;;
# Same shape, but killed by the REAL `timeout` (only reached post-fix,
# where the budget is a hook — see the guard in section 4).
slow)
printf '%s\n' 'ok probe/cmd/gladex/commands 0.1s'
sleep 30; exit 0 ;;
# D3: the binary exists but cannot run.
rc127) exit 127 ;;
# D3 variant: exits 1 (go's generic failure code) WITHOUT ever reporting a
# package — go never ran our tests, so this must not become "failing: ...".
rc1-silent) exit 1 ;;
rc3) printf '%s\n' 'ok probe/cmd/gladex/commands 0.1s'; exit 3 ;;
esac
STUBGO
# The go-compile row (CHANGELOG 0.4.39) shells out to repo-lint on every run.
# This suite pins the go-tests row, not that one, so the child is stubbed:
# without this, every run here would lint a real tree - and with a stub `go`
# on PATH it would also "compile" it with that stub, which is worse than not
# running it at all.
cat > "$STUB/repo-lint" <<'STUBRL'
#!/bin/sh
echo '{"tool":"repo-lint","requested_sha":"HEAD","sha_resolved":"1111111111111111111111111111111111111111","error":null,"go_compile":{"attempted":true,"go_mod":"app/src/go/go.mod","files":1,"ok":true,"reason":null,"summary":"1 module file(s) compile clean (0.0s)","duration_s":0.0},"ok":true,"exit_code":0}'
exit 0
STUBRL
export GLADEX_REPO_LINT_BIN="$STUB/repo-lint"
# The promote-gates row shells out to promote-dev-to-prod on every run. This
# suite pins the go-tests verdict, not that row, so the child points at an
# ABSENT path: without this, every run here would probe the live /opt/startup
# trees (read-only, but not hermetic and slow). Its own suite:
# tests/test_system_status_promote_gates.sh
export GLADEX_PROMOTE_BIN="$STUB/promote-dev-to-prod-not-under-test"
# The cloud row (Nextcloud/Immich/docker, [0.4.70]) is not under test here:
# pointing it at an absent path keeps this suite off the host's live
# containers, so a restarting container cannot flip the overall verdict.
export GLADEX_CLOUD_DOCKER_BIN="$STUB/docker-not-under-test"
chmod +x "$STUB"/*
# A stub dir with everything EXCEPT `go`, so sections 7/10 reach the real one.
STUB_REAL="$SANDBOX/bin-real"
mkdir -p "$STUB_REAL"
for f in systemctl curl dig openssl; do cp "$STUB/$f" "$STUB_REAL/$f"; done
# ------------------------------------------------------------- fixtures ----
# mkrepo <dir> <with-go-module:1|0> — a committed git work tree, so git-tree is
# clean and `app/src/go` holds no uncommitted files (detail stays exactly
# "passing"). With 0 the app/src/go tree is ABSENT entirely, which is the
# "this repo has no Go module" case, not merely "an empty go dir".
mkrepo() {
local dir="$1" withmod="$2"
rm -rf "$dir"; mkdir -p "$dir"
> build · mimo-v2.6-flash-free
Understood — the live `go_tests` failure is the `queue-source` row (same expected pre-PROGRESS red as `queue-source-check` rc 1: `[0.4.355]` not yet named in `agent-logs/PROGRESS.md`; `failed-units` is neutralized by the suite's `systemctl` stub). It should clear once the PROGRESS entry is written. The out-of-repo HEAD copy hid that row, hence its passing control.
Waiting for the batch to finish:
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)
[Thu Oct 15 08:01:31 2026] 127.0.0.1:47614 Accepted [Thu Oct 15 08:01:31 2026] 127.0.0.1:47614 Closing [Thu Oct 15 08:01:31 2026] 127.0.0.1:47620 Accepted [Thu Oct 15 08:01:31 2026] 127.0.0.1:47620 Closing [Thu Oct 15 08:01:31 2026] 127.0.0.1:47626 Accepted [Thu Oct 15 08:01:31 2026] 127.0.0.1:47626 Closing [Thu Oct 15 08:01:31 2026] 127.0.0.1:47632 Accepted [Thu Oct 15 08:01:31 2026] 127.0.0.1:47632 Closing [Thu Oct 15 08:01:31 2026] 127.0.0.1:47644 Accepted [Thu Oct 15 08:01:32 2026] 127.0.0.1:47644 Closing [Thu Oct 15 08:01:32 2026] 127.0.0.1:47656 Accepted [Thu Oct 15 08:01:32 2026] 127.0.0.1:47656 Closing [Thu Oct 15 08:01:32 2026] 127.0.0.1:47670 Accepted [Thu Oct 15 08:01:32 2026] 127.0.0.1:47670 Closing [Thu Oct 15 08:01:32 2026] 127.0.0.1:47678 Accepted [Thu Oct 15 08:01:32 2026] 127.0.0.1:47678 Closing [Thu Oct 15 08:07:29 2026] 127.0.0.1:39548 Accepted [Thu Oct 15 08:07:29 2026] 127.0.0.1:39548 Closing [Thu Oct 15 08:07:29 2026] 127.0.0.1:39554 Accepted [Thu Oct 15 08:07:29 2026] 127.0.0.1:39554 Closing [Thu Oct 15 08:07:29 2026] 127.0.0.1:39562 Accepted [Thu Oct 15 08:07:29 2026] 127.0.0.1:39562 Closing [Thu Oct 15 08:07:29 2026] 127.0.0.1:39572 Accepted [Thu Oct 15 08:07:29 2026] 127.0.0.1:39572 Closing [Thu Oct 15 08:07:29 2026] 127.0.0.1:39578 Accepted [Thu Oct 15 08:07:29 2026] 127.0.0.1:39578 Closing [Thu Oct 15 08:07:29 2026] 127.0.0.1:39586 Accepted [Thu Oct 15 08:07:29 2026] 127.0.0.1:39586 Closing [Thu Oct 15 08:07:29 2026] 127.0.0.1:39596 Accepted [Thu Oct 15 08:07:30 2026] 127.0.0.1:39596 Closing [Thu Oct 15 08:07:30 2026] 127.0.0.1:39606 Accepted [Thu Oct 15 08:07:30 2026] 127.0.0.1:39606 Closing [Thu Oct 15 08:07:30 2026] 127.0.0.1:39610 Accepted [Thu Oct 15 08:07:30 2026] 127.0.0.1:39610 Closing [Thu Oct 15 08:07:30 2026] 127.0.0.1:39618 Accepted [Thu Oct 15 08:07:30 2026] 127.0.0.1:39618 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39908 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39908 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39920 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39920 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39924 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39924 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39938 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39938 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39952 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39952 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39966 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39966 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39978 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39978 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39984 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39984 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:39996 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:39996 Closing [Thu Oct 15 08:08:47 2026] 127.0.0.1:40010 Accepted [Thu Oct 15 08:08:47 2026] 127.0.0.1:40010 Closing [Thu Oct 15 08:11:25 2026] 127.0.0.1:55068 Accepted [Thu Oct 15 08:11:25 2026] 127.0.0.1:55068 Closing [Thu Oct 15 08:15:16 2026] 127.0.0.1:44778 Accepted
Other app logs: downloads.log
Generated 2026-10-15 06:15:16 UTC · Gladex.de