Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 460 files, 13.3 MB |
| Latest run log | run-20260925-084303-58.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20260925-084303-58.log | 207 KB | 2026-09-25 07:05:09 |
| run-20260925-064014-57.log | 294 KB | 2026-09-25 06:33:03 |
| run-20260925-052608-56.log | 381 KB | 2026-09-25 04:30:14 |
| run-20260925-042134-55.log | 200 KB | 2026-09-25 03:16:08 |
| run-20260925-031342-54.log | 303 KB | 2026-09-25 02:11:34 |
| run-20260925-022932-53.log | 212 KB | 2026-09-25 01:03:42 |
| run-20260925-012106-52.log | 297 KB | 2026-09-25 00:19:32 |
| run-20260925-003542-51.log | 153 KB | 2026-09-24 23:11:06 |
| run-20260924-234828-50.log | 204 KB | 2026-09-24 22:25:42 |
| run-20260924-230237-49.log | 303 KB | 2026-09-24 21:38:28 |
| run-20260924-222340-48.log | 206 KB | 2026-09-24 20:52:37 |
| run-20260924-215353-47.log | 146 KB | 2026-09-24 20:13:40 |
| run-20260924-210315-46.log | 182 KB | 2026-09-24 19:43:53 |
| run-20260924-200755-45.log | 181 KB | 2026-09-24 18:53:15 |
| run-20260924-192844-44.log | 133 KB | 2026-09-24 17:57:55 |
| run-20260924-182059-43.log | 227 KB | 2026-09-24 17:18:44 |
| run-20260924-164658-42.log | 181 KB | 2026-09-24 16:10:59 |
| run-20260924-160206-41.log | 101 KB | 2026-09-24 14:36:58 |
| run-20260924-153643-40.log | 127 KB | 2026-09-24 13:52:05 |
| run-20260924-151001-39.log | 130 KB | 2026-09-24 13:26:43 |
| run-20260924-144921-38.log | 90 KB | 2026-09-24 13:00:01 |
| run-20260924-143001-37.log | 63 KB | 2026-09-24 12:39:21 |
| run-20260924-141012-36.log | 106 KB | 2026-09-24 12:20:01 |
| run-20260924-135151-35.log | 75 KB | 2026-09-24 12:00:12 |
| run-20260924-133211-34.log | 116 KB | 2026-09-24 11:41:51 |
| run-20260924-130932-33.log | 67 KB | 2026-09-24 11:22:11 |
| run-20260924-115831-32.log | 260 KB | 2026-09-24 10:59:32 |
| run-20260924-111405-31.log | 117 KB | 2026-09-24 09:48:31 |
| run-20260924-102752-30.log | 106 KB | 2026-09-24 09:04:05 |
| run-20260924-100538-29.log | 81 KB | 2026-09-24 08:17:52 |
| run-20260924-092904-28.log | 101 KB | 2026-09-24 07:55:38 |
| run-20260924-083526-27.log | 116 KB | 2026-09-24 07:19:04 |
| run-20260924-080136-26.log | 75 KB | 2026-09-24 06:25:26 |
| run-20260924-074910-25.log | 23 KB | 2026-09-24 05:51:36 |
| run-20260924-072601-24.log | 52 KB | 2026-09-24 05:39:10 |
| run-20260924-065657-23.log | 156 KB | 2026-09-24 05:16:01 |
| run-20260924-063310-22.log | 76 KB | 2026-09-24 04:46:57 |
| run-20260924-055309-21.log | 107 KB | 2026-09-24 04:23:10 |
| run-20260924-052831-20.log | 133 KB | 2026-09-24 03:43:09 |
| run-20260924-050107-19.log | 69 KB | 2026-09-24 03:18:31 |
| run-20260924-044831-18.log | 34 KB | 2026-09-24 02:51:07 |
| run-20260924-041948-17.log | 156 KB | 2026-09-24 02:38:31 |
| run-20260924-035438-16.log | 185 KB | 2026-09-24 02:09:48 |
| run-20260924-033002-15.log | 245 KB | 2026-09-24 01:44:38 |
| run-20260924-025910-14.log | 120 KB | 2026-09-24 01:20:02 |
| run-20260924-023430-13.log | 97 KB | 2026-09-24 00:49:10 |
| run-20260924-015458-12.log | 255 KB | 2026-09-24 00:24:30 |
| run-20260924-012751-11.log | 179 KB | 2026-09-23 23:44:58 |
| run-20260924-005036-10.log | 162 KB | 2026-09-23 23:17:51 |
| run-20260924-000545-9.log | 217 KB | 2026-09-23 22:40:36 |
Tail — run-20260925-084303-58.log (last 200 lines)
assert_order "mutation X: without line buffering the refusal overtakes stdout (fix is pinned)" \
"DEV-SYNC REFUSED" "Starting promotion" "$OUT"
else
fail "mutation X setup: sed did not plant the ordering mutant"
fi
# --- summary -------------------------------------------------------------------
echo ""
echo "==============================="
echo "promote-dev-to-prod gate suite: $PASS passed, $FAIL failed"
echo "==============================="
[ "$FAIL" -eq 0 ] || exit 1
exit 0
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_promote_gate.sh
Index: repo/tests/test_promote_gate.sh
===================================================================
--- repo/tests/test_promote_gate.sh
+++ repo/tests/test_promote_gate.sh
@@ -439,8 +439,52 @@
else
fail "mutation X setup: sed did not plant the ordering mutant"
fi
+# --- Y: ship-tree gate — the tree that ships is the tree that was committed ----
+# Step 3 rsyncs the WORKTREE while the commit lint gate measures HEAD's blobs,
+# so this is the only gate that asks whether those two are still one tree.
+# Future-dated verdict: every fixture below is written NOW and a 2026 verdict
+# would read as stale the moment a file is touched (section G).
+new_sandbox
+write_verdict "$SB" "VERDICT-20270101-000000-ship.md" \
+ "VERDICT: APPROVE
+" '2027-01-01 00:00:00'
+run_tool "$SB"
+assert_rc "committed promoted trees open the gate (exit 0)" 0 "$RC"
+assert_contains "the gate reports SHIP-TREE OK" "SHIP-TREE OK" "$OUT"
+assert_contains "and says what it compared" "match HEAD" "$OUT"
+
+# the same tree, edited after the commit and mirrored into dev so the dev-sync
+# gate stays green - only the NEW gate can speak here
+printf '<?php // edited after commit\n' > "$SB/repo/app/src/php/a.php"
+cp "$SB/repo/app/src/php/a.php" "$SB/dev/src/php/a.php"
+run_tool "$SB"
+assert_rc "an uncommitted promoted file refuses (exit 8)" 8 "$RC"
+assert_contains "the refusal names the file that would ship" "app/src/php/a.php" "$OUT"
+assert_contains "the refusal is labelled with its own gate and code" \
+ "SHIP-TREE REFUSED (exit 8)" "$OUT"
+assert_contains "the abort line names the gate" "Promotion aborted at the ship-tree gate" "$OUT"
+assert_not_contains "the mutating phase was never reached" "Copying source from" "$OUT"
+
+# --force bypasses it loudly, like every other gate
+run_tool "$SB" --force
+assert_rc "--force bypasses the ship-tree gate (exit 0)" 0 "$RC"
+assert_contains "--force warns about THIS gate by name" "bypassing ship-tree gate" "$OUT"
+assert_contains "--force still reaches the planned rsync" "[DRY-RUN] Would run: rsync" "$OUT"
+
+# gate order: a stale human verdict (5) outranks it (8) - the same precedence
+# the lint gate documents in section K of test_promote_lint_gate.sh
+new_sandbox
+write_verdict "$SB" "VERDICT-20260924-120000-shipstale.md" \
+ "VERDICT: APPROVE
+" '2026-09-24 12:00:00'
+printf '<?php // dirty\n' > "$SB/repo/app/src/php/a.php"
+cp "$SB/repo/app/src/php/a.php" "$SB/dev/src/php/a.php"
+run_tool "$SB"
+assert_rc "a stale verdict wins the refusal (exit 5, not 8)" 5 "$RC"
+assert_contains "the verdict refusal is the one reported" "STALE" "$OUT"
+
# --- summary -------------------------------------------------------------------
echo ""
echo "==============================="
echo "promote-dev-to-prod gate suite: $PASS passed, $FAIL failed"
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_promote_lint_gate.sh
Index: repo/tests/test_promote_lint_gate.sh
===================================================================
--- repo/tests/test_promote_lint_gate.sh
+++ repo/tests/test_promote_lint_gate.sh
@@ -136,8 +136,16 @@
LINT_STUB_MODE=ok
# deterministic baseline: sources are OLD, verdicts are dated relative to them
touch -d '2026-09-24 09:00:00' "$SB/repo/app/src/php/a.php" \
"$SB/repo/examples/workflows/hello-workflow.json"
+ # A real git repo: after a CLEAN lint the ship-tree gate asks git whether the
+ # trees this tool would copy still equal HEAD, and a sandbox with no .git
+ # makes that unanswerable (fail closed) in every section below.
+ git -C "$SB/repo" init -q 2>/dev/null
+ git -C "$SB/repo" -c user.email=lint@sandbox.invalid -c user.name=lint \
+ add -A >/dev/null 2>&1
+ git -C "$SB/repo" -c user.email=lint@sandbox.invalid -c user.name=lint \
+ commit -qm "sandbox baseline" >/dev/null 2>&1
}
# write_verdict <sandbox> <filename> <body> <date>
write_verdict() {
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "OK3\|emit(\|G_LINT_OK\|G_DEVSYNC_OK\|G_VERDICT_OK" tests/test_system_status_promote_gates.sh
213:def emit(gates, ready, blocked, dry_run=True, sha="STUB-SHA",
279:G_VERDICT_OK = gate("verdict", "ok", 0,
281:G_DEVSYNC_OK = gate("dev-sync", "ok", 0,
283:G_LINT_OK = gate("commit-lint", "ok", 0,
285:OK3 = [G_VERDICT_OK, G_DEVSYNC_OK, G_LINT_OK]
288: emit(OK3, True, [])
290: emit([gate("verdict", "refused", 5,
292: G_DEVSYNC_OK, G_LINT_OK], False, ["verdict"], rc=0)
294: emit([G_VERDICT_OK,
297: G_LINT_OK], False, ["dev-sync"])
299: emit([G_VERDICT_OK, G_DEVSYNC_OK,
304: emit([gate("verdict", "refused", 5, "no verdict in /srv/repo/mailboxes/reviewer-to-main")],
307: emit(OK3, True, [], dry_run=False)
309: emit([gate("verdict", "refused", 5, "no verdict"), G_DEVSYNC_OK, G_LINT_OK],
312: emit(OK3, False, [])
314: emit(OK3, False, [], rc=1)
1078:if plant M1 'emit("warning", "%s: %s%s" % (refusal_header(doc), summary, tag))' \
1079: 's@emit("warning", "%s: %s%s" % (refusal_header(doc), summary, tag))@emit("ok", "promote-ready: MUTANT: M1 all gates pass" + tag)@'; then
1280:if plant M13 'emit("warning", "%s: %s%s" % (refusal_header(doc), summary, tag))' \
1281: 's@emit("warning", "%s: %s%s" % (refusal_header(doc), summary, tag))@emit("warning", "not promotable: %s%s" % (summary, tag)) # MUTANT: M13 refusal not dated@'; then
[0m$ [0mcd /data/repo && grep -n "verdict, dev-sync\|three gates\|all three" tests/test_system_status_promote_gates.sh
7:# The three gates live behind a human-printing tool whose exit codes cannot
8:# carry all three verdicts (a plain --dry-run stops at the first refusal,
14:# * all three gates pass -> ok "promote-ready: ..."
39:# three gates' children - `dev-sync`'s source-sync-check path was recorded
453:assert_contains "detail names all three gates" "verdict, dev-sync and commit-lint" \
689:# the path it ran, and all three outcomes must be readable from the detail.
862:case "$ARGV" in *"--force"*) ok "child is called with --force (all three gates evaluated)" ;;
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tests/test_system_status_promote_gates.sh [90m[offset=277, limit=42][0m
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tests/test_system_status_promote_gates.sh
Index: repo/tests/test_system_status_promote_gates.sh
===================================================================
--- repo/tests/test_system_status_promote_gates.sh
+++ repo/tests/test_system_status_promote_gates.sh
@@ -281,38 +281,50 @@
G_DEVSYNC_OK = gate("dev-sync", "ok", 0,
"dev tree (/opt/startup/dev) matches the repo - nothing would be dropped")
G_LINT_OK = gate("commit-lint", "ok", 0,
"repo-lint verdict on HEAD clean (165 file(s) linted, exit 0)")
-OK3 = [G_VERDICT_OK, G_DEVSYNC_OK, G_LINT_OK]
+G_SHIPTREE_OK = gate("ship-tree", "ok", 0,
+ "promoted trees match HEAD (app/src/php, examples/workflows)")
+OK4 = [G_VERDICT_OK, G_DEVSYNC_OK, G_LINT_OK, G_SHIPTREE_OK]
if mode == "ready":
- emit(OK3, True, [])
+ emit(OK4, True, [])
elif mode == "verdict-refused":
emit([gate("verdict", "refused", 5,
"no verdict in /srv/repo/mailboxes/reviewer-to-main (expected VERDICT-...md containing 'VERDICT: APPROVE')"),
- G_DEVSYNC_OK, G_LINT_OK], False, ["verdict"], rc=0)
+ G_DEVSYNC_OK, G_LINT_OK, G_SHIPTREE_OK], False, ["verdict"], rc=0)
elif mode == "dev-refused":
emit([G_VERDICT_OK,
gate("dev-sync", "refused", 6,
"dev tree differs from the repo in 1 file(s): src/php/x.php (only_in_dev) - this promotion copies REPO -> prod, so that work would be silently dropped"),
- G_LINT_OK], False, ["dev-sync"])
+ G_LINT_OK, G_SHIPTREE_OK], False, ["dev-sync"])
elif mode == "lint-refused":
emit([G_VERDICT_OK, G_DEVSYNC_OK,
gate("commit-lint", "refused", 7,
- "committed file(s) fail to parse or compile: app/src/php/bad.php")],
+ "committed file(s) fail to parse or compile: app/src/php/bad.php"),
+ G_SHIPTREE_OK],
False, ["commit-lint"])
+elif mode == "ship-refused":
+ # The fourth gate on its own: HEAD lints clean, yet the tree rsync would
+ # ship is not the tree repo-lint checked.
+ emit([G_VERDICT_OK, G_DEVSYNC_OK, G_LINT_OK,
+ gate("ship-tree", "refused", 8,
+ "worktree differs from HEAD in 1 path(s): src/php/a.php - repo-lint "
+ "verified the committed HEAD, rsync ships the worktree")],
+ False, ["ship-tree"])
elif mode == "not-evaluated":
emit([gate("verdict", "refused", 5, "no verdict in /srv/repo/mailboxes/reviewer-to-main")],
False, ["verdict"], sha=None)
elif mode == "no-dry-run":
- emit(OK3, True, [], dry_run=False)
+ emit(OK4, True, [], dry_run=False)
elif mode == "ready-lie":
- emit([gate("verdict", "refused", 5, "no verdict"), G_DEVSYNC_OK, G_LINT_OK],
+ emit([gate("verdict", "refused", 5, "no verdict"), G_DEVSYNC_OK, G_LINT_OK,
+ G_SHIPTREE_OK],
True, ["verdict"])
elif mode == "all-ok-not-ready":
- emit(OK3, False, [])
+ emit(OK4, False, [])
elif mode == "run-failed":
- emit(OK3, False, [], rc=1)
+ emit(OK4, False, [], rc=1)
elif mode == "garbage":
print("<html><body><h1>502 Bad Gateway</h1></body></html>")
sys.exit(0)
elif mode == "empty":
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tests/test_system_status_promote_gates.sh [90m[limit=95, offset=445][0m
> 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 Sep 25 08:51:12 2026] 127.0.0.1:48796 Accepted [Fri Sep 25 08:51:12 2026] 127.0.0.1:48796 Closing [Fri Sep 25 08:51:12 2026] 127.0.0.1:48804 Accepted [Fri Sep 25 08:51:12 2026] 127.0.0.1:48804 Closing [Fri Sep 25 08:51:12 2026] 127.0.0.1:48814 Accepted [Fri Sep 25 08:51:12 2026] 127.0.0.1:48814 Closing [Fri Sep 25 08:51:12 2026] 127.0.0.1:48818 Accepted [Fri Sep 25 08:51:12 2026] 127.0.0.1:48818 Closing [Fri Sep 25 08:51:12 2026] 127.0.0.1:48828 Accepted [Fri Sep 25 08:51:12 2026] 127.0.0.1:48828 Closing [Fri Sep 25 08:51:44 2026] 127.0.0.1:48126 Accepted [Fri Sep 25 08:51:44 2026] 127.0.0.1:48126 Closing [Fri Sep 25 08:52:36 2026] 127.0.0.1:56500 Accepted [Fri Sep 25 08:52:36 2026] 127.0.0.1:56500 Closing [Fri Sep 25 08:52:36 2026] 127.0.0.1:56516 Accepted [Fri Sep 25 08:52:36 2026] 127.0.0.1:56516 Closing [Fri Sep 25 08:52:36 2026] 127.0.0.1:56518 Accepted [Fri Sep 25 08:52:36 2026] 127.0.0.1:56518 Closing [Fri Sep 25 08:52:36 2026] 127.0.0.1:56520 Accepted [Fri Sep 25 08:52:36 2026] 127.0.0.1:56520 Closing [Fri Sep 25 08:52:36 2026] 127.0.0.1:56532 Accepted [Fri Sep 25 08:52:36 2026] 127.0.0.1:56532 Closing [Fri Sep 25 08:52:36 2026] 127.0.0.1:56536 Accepted [Fri Sep 25 08:52:36 2026] 127.0.0.1:56536 Closing [Fri Sep 25 08:52:36 2026] 127.0.0.1:56548 Accepted [Fri Sep 25 08:52:36 2026] 127.0.0.1:56548 Closing [Fri Sep 25 08:52:38 2026] 127.0.0.1:56558 Accepted [Fri Sep 25 08:52:38 2026] 127.0.0.1:56558 Closing [Fri Sep 25 08:55:42 2026] 127.0.0.1:56412 Accepted [Fri Sep 25 08:55:42 2026] 127.0.0.1:56412 Closing [Fri Sep 25 08:55:42 2026] 127.0.0.1:56424 Accepted [Fri Sep 25 08:55:42 2026] 127.0.0.1:56424 Closing [Fri Sep 25 08:55:42 2026] 127.0.0.1:56428 Accepted [Fri Sep 25 08:55:42 2026] 127.0.0.1:56428 Closing [Fri Sep 25 08:55:42 2026] 127.0.0.1:56440 Accepted [Fri Sep 25 08:55:42 2026] 127.0.0.1:56440 Closing [Fri Sep 25 08:55:42 2026] 127.0.0.1:56448 Accepted [Fri Sep 25 08:55:42 2026] 127.0.0.1:56448 Closing [Fri Sep 25 08:55:42 2026] 127.0.0.1:56464 Accepted [Fri Sep 25 08:55:42 2026] 127.0.0.1:56464 Closing [Fri Sep 25 08:55:42 2026] 127.0.0.1:56470 Accepted [Fri Sep 25 08:55:42 2026] 127.0.0.1:56470 Closing [Fri Sep 25 08:57:06 2026] 127.0.0.1:53596 Accepted [Fri Sep 25 08:57:06 2026] 127.0.0.1:53596 Closing [Fri Sep 25 08:57:06 2026] 127.0.0.1:53604 Accepted [Fri Sep 25 08:57:06 2026] 127.0.0.1:53604 Closing [Fri Sep 25 08:57:06 2026] 127.0.0.1:53610 Accepted [Fri Sep 25 08:57:06 2026] 127.0.0.1:53610 Closing [Fri Sep 25 08:57:06 2026] 127.0.0.1:53616 Accepted [Fri Sep 25 08:57:06 2026] 127.0.0.1:53616 Closing [Fri Sep 25 08:57:06 2026] 127.0.0.1:53632 Accepted [Fri Sep 25 08:57:06 2026] 127.0.0.1:53632 Closing [Fri Sep 25 08:57:06 2026] 127.0.0.1:53644 Accepted [Fri Sep 25 08:57:06 2026] 127.0.0.1:53644 Closing [Fri Sep 25 08:57:06 2026] 127.0.0.1:53648 Accepted [Fri Sep 25 08:57:06 2026] 127.0.0.1:53648 Closing [Fri Sep 25 09:05:25 2026] 127.0.0.1:56666 Accepted [Fri Sep 25 09:05:25 2026] 127.0.0.1:56666 Closing [Fri Sep 25 09:05:25 2026] 127.0.0.1:56674 Accepted
Generated 2026-09-25 07:05:25 UTC · Gladex.de