Agent run logs & app logs · env: prod · LAN-only investor surface
| Run logs | 459 files, 12.9 MB |
| Latest run log | run-20260925-064014-57.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
| File | Size | Modified (UTC) |
|---|---|---|
| run-20260925-064014-57.log | 92 KB | 2026-09-25 05:06:49 |
| 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 |
| run-20260923-235334-8.log | 29 KB | 2026-09-23 21:55:45 |
local expected="$2"
local actual
actual=$(dig @1.1.1.1 +short "$domain" A 2>/dev/null | head -1 || echo "NXDOMAIN")
[0m$ [0mcd /data/repo && grep -rn "sync\|dev ==" tools/healthcheck | head -20; echo "=== healthcheck --help ==="; tools/healthcheck --help 2>&1 | head -40
=== healthcheck --help ===
usage: healthcheck [-h] [--format {json,human}] [--timeout TIMEOUT] [envs ...]
Check /healthz endpoint on dev/prod environments
positional arguments:
envs Environment(s) to check: dev, prod, or both (default:
both)
options:
-h, --help show this help message and exit
--format {json,human}
Output format (default: human)
--timeout TIMEOUT Timeout per request in seconds (default: 5)
Examples:
healthcheck # Check both dev and prod (default)
healthcheck dev # Check only dev
healthcheck prod # Check only prod
healthcheck --format json both # JSON output for both
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "dev_root\|DEV_ROOT\|GLADEX_DEV_ROOT" tools/promote-dev-to-prod tools/source-sync-check | head -30
tools/promote-dev-to-prod:43: GLADEX_DEV_ROOT (default /opt/startup/dev)
tools/promote-dev-to-prod:56: GLADEX_DEV_ROOT (default /opt/startup/dev)
tools/promote-dev-to-prod:313:def check_dev_sync_gate(repo_root: str, dev_root: str, force: bool = False) -> int:
tools/promote-dev-to-prod:340: env["GLADEX_DEV_ROOT"] = dev_root
tools/promote-dev-to-prod:354: ok_detail = (f"dev tree ({dev_root}) matches the repo — "
tools/promote-dev-to-prod:657: dev_root = os.environ.get("GLADEX_DEV_ROOT", "/opt/startup/dev")
tools/promote-dev-to-prod:675: rc = _promote(dry_run, force, repo_root, dev_root, prod_root)
tools/promote-dev-to-prod:684:def _promote(dry_run: bool, force: bool, repo_root: str, dev_root: str,
tools/promote-dev-to-prod:698: devsync_rc = check_dev_sync_gate(repo_root, dev_root, force=force)
tools/promote-dev-to-prod:858: GLADEX_DEV_ROOT (default /opt/startup/dev),
tools/source-sync-check:12:Env overrides (test hooks): GLADEX_REPO_DIR, GLADEX_DEV_ROOT, GLADEX_PROD_ROOT.
tools/source-sync-check:39:env overrides (test hooks): GLADEX_REPO_DIR, GLADEX_DEV_ROOT, GLADEX_PROD_ROOT
tools/source-sync-check:149: env_roots.append(("dev", os.environ.get("GLADEX_DEV_ROOT", "/opt/startup/dev")))
[0m→ [0mRead repo/tools/system-status [90m[limit=140, offset=270][0m
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && wc -l tests/test_system_status_promote_gates.sh tests/test_system_status_go_compile.sh; grep -rn "system-status" app/ 2>/dev/null | head -10; echo "=== cron/systemd ==="; crontab -l 2>/dev/null | head -20; systemctl list-timers --no-pager 2>/dev/null | head -20
1221 tests/test_system_status_promote_gates.sh
509 tests/test_system_status_go_compile.sh
1730 total
=== cron/systemd ===
0 3 * * 0 /data/repo/tools/ip-drift-cron gladex.de
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2026-09-25 06:57:19 CEST 2s Fri 2026-09-25 06:42:19 CEST 14min ago agent-loop-watchdog.timer agent-loop-watchdog.service
Fri 2026-09-25 07:00:00 CEST 2min 42s Fri 2026-09-25 06:50:19 CEST 6min ago sysstat-collect.timer sysstat-collect.service
Fri 2026-09-25 07:09:00 CEST 11min Fri 2026-09-25 06:39:29 CEST 17min ago phpsessionclean.timer phpsessionclean.service
Fri 2026-09-25 07:30:40 CEST 33min Thu 2026-09-24 14:45:19 CEST 16h ago certbot.timer certbot.service
Fri 2026-09-25 08:05:39 CEST 1h 8min Thu 2026-09-24 18:06:15 CEST 12h ago identity-run@lena.timer identity-run@lena.service
Fri 2026-09-25 08:10:00 CEST 1h 12min Thu 2026-09-24 18:11:24 CEST 12h ago identity-run@jonas.timer identity-run@jonas.service
Fri 2026-09-25 08:15:16 CEST 1h 17min Thu 2026-09-24 18:15:57 CEST 12h ago identity-run@mia.timer identity-run@mia.service
Fri 2026-09-25 08:20:42 CEST 1h 23min Thu 2026-09-24 18:20:45 CEST 12h ago identity-run@leon.timer identity-run@leon.service
Fri 2026-09-25 08:26:04 CEST 1h 28min Thu 2026-09-24 18:25:42 CEST 12h ago identity-run@aylin.timer identity-run@aylin.service
Fri 2026-09-25 08:49:19 CEST 1h 52min Thu 2026-09-24 08:49:19 CEST 22h ago update-notifier-download.timer update-notifier-download.service
Fri 2026-09-25 08:51:21 CEST 1h 54min Thu 2026-09-24 18:51:28 CEST 12h ago identity-run@dispatcher.timer identity-run@dispatcher.service
Fri 2026-09-25 08:58:30 CEST 2h 1min Thu 2026-09-24 08:58:30 CEST 21h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Fri 2026-09-25 13:00:37 CEST 6h Thu 2026-09-24 22:25:19 CEST 8h ago apt-daily.timer apt-daily.service
Fri 2026-09-25 17:29:37 CEST 10h Fri 2026-09-25 05:10:37 CEST 1h 46min ago motd-news.timer motd-news.service
Sat 2026-09-26 00:00:00 CEST 17h Fri 2026-09-25 00:00:19 CEST 6h ago dpkg-db-backup.timer dpkg-db-backup.service
Sat 2026-09-26 00:00:00 CEST 17h Fri 2026-09-25 00:00:19 CEST 6h ago logrotate.timer logrotate.service
Sat 2026-09-26 00:07:00 CEST 17h Fri 2026-09-25 00:07:03 CEST 6h ago sysstat-summary.timer sysstat-summary.service
Sat 2026-09-26 00:33:38 CEST 17h Fri 2026-09-25 02:32:27 CEST 4h 24min ago man-db.timer man-db.service
Sat 2026-09-26 06:24:29 CEST 23h Fri 2026-09-25 06:18:29 CEST 38min ago apt-daily-upgrade.timer apt-daily-upgrade.service
[0m$ [0mcd /data/repo && grep -rln "system-status" --include='*' . | grep -v "^./agent-logs" | head -30; echo "=== count assertions in tests ==="; grep -rn "checks\"\]\|29\|all 29\|number of checks" tests/*.sh tests/*.php 2>/dev/null | grep -i "status\|checks" | head -20
./CHANGELOG.md
./.git/logs/HEAD
./.git/logs/refs/heads/main
./.git/index
./tools/REGISTRY.md
./tools/repo-lint
./tools/__pycache__/repo-lintcpython-312.pyc
./tools/__pycache__/promote-dev-to-prodcpython-312.pyc
./tools/system-status
./tools/promote-dev-to-prod
./STRUCTURE.md
./tests/test_system_status_promote_gates.sh
./tests/test_system_status_mx_soa.sh
./tests/test_system_status_go_tests.sh
./tests/test_tls_check.sh
./tests/test_promote_json.sh
./tests/test_system_status_unread.sh
./tests/test_domain_availability.sh
./tests/test_system_status_go_compile.sh
./tests/test_dns_verify.sh
=== count assertions in tests ===
tests/test_domain_availability.sh:226:assert_eq "dns says no records" "False" "$(jget 1 'd["checks"]["dns"]["dns"]["has_a"]')"
tests/test_domain_availability.sh:227:assert_eq "rdap voted available" "True" "$(jget 1 'd["checks"]["rdap"]["rdap"]["available"]')"
tests/test_domain_availability.sh:228:assert_eq "whois voted available" "True" "$(jget 1 'd["checks"]["whois"]["whois"]["available"]')"
tests/test_domain_availability.sh:234:assert_eq "dns sees an A record" "True" "$(jget 1 'd["checks"]["dns"]["dns"]["has_a"]')"
tests/test_domain_availability.sh:324: "$(jget 1 'd["checks"]["dns"]["dns"].get("error") in ("timeout","network")')"
tests/test_domain_availability.sh:327: "$(jget 1 'd["checks"]["rdap"]["rdap"].get("error")')"
tests/test_domain_availability.sh:330: "$(jget 1 'd["checks"]["whois"]["whois"].get("error")')"
tests/test_domain_availability.sh:333: "$(jget 1 'd["checks"]["rdap"]["rdap"].get("error")')"
tests/test_domain_availability.sh:336: "$(jget 1 'd["checks"]["rdap"]["rdap"].get("error")')"
tests/test_domain_availability.sh:339: "$(jget 1 'd["checks"]["dns"]["dns"].get("error")')"
tests/test_domain_availability.sh:345: "$(jget 1 'd["checks"]["rdap"]["rdap"].get("error") is not None')"
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -rn "source-sync\|dev tree\|dev-sync" tools/system-status tests/test_system_status_promote_gates.sh | head -30
tools/system-status:82: echo " ok 'promote-ready' verdict, dev-sync AND commit-lint all pass"
tools/system-status:592:# The three gates (verdict 5, dev-sync 6, commit-lint 7) each print a human
tools/system-status:693:EXPECTED = ["verdict", "dev-sync", "commit-lint"]
tools/system-status:897: emit("ok", "promote-ready: verdict, dev-sync and commit-lint all pass%s" % tag)
tests/test_system_status_promote_gates.sh:256:G_DEVSYNC_OK = gate("dev-sync", "ok", 0,
tests/test_system_status_promote_gates.sh:257: "dev tree (/opt/startup/dev) matches the repo - nothing would be dropped")
tests/test_system_status_promote_gates.sh:270: gate("dev-sync", "refused", 6,
tests/test_system_status_promote_gates.sh:271: "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"),
tests/test_system_status_promote_gates.sh:272: G_LINT_OK], False, ["dev-sync"])
tests/test_system_status_promote_gates.sh:375:assert_contains "detail names all three gates" "verdict, dev-sync and commit-lint" \
tests/test_system_status_promote_gates.sh:395:assert_contains "detail names dev-sync too" "dev-sync OK" "$DETAIL"
tests/test_system_status_promote_gates.sh:401:echo "=== 3. dev-sync refuses -> named with its own reason ==="
tests/test_system_status_promote_gates.sh:406: && ok "dev-sync refusal -> warning" || bad "dev-sync refusal -> warning"
tests/test_system_status_promote_gates.sh:407:assert_contains "dev-sync is the refusing gate" "dev-sync REFUSED" "$DETAIL"
tests/test_system_status_promote_gates.sh:427:assert_contains "the missing gate is named" "dev-sync NOT-EVALUATED" "$DETAIL"
[0m$ [0mcd /data/repo && grep -rn "second pair\|nothing reads it\|source-sync.*child" tools/REGISTRY.md CHANGELOG.md agent-logs/PROGRESS.md | head -20
CHANGELOG.md:1007:- **The divergence guard blamed "the two children" while neither row named one.** `[0.4.42]` had already made the guard *measure* the commit, but its same-commit branch still ended `both measured commit <sha> - the two children differ (binary or env)`: a guess between two hypotheses, offered because **neither row recorded the path of the `repo-lint` it ran**. The unmeasured claim was the sentence's entire content, and the mirror was worse — a branch where `same child` had never been compared. The promote report now records **`gates[].child`** — the binary the gate *executed*, written by `_record_gate(..., child=…)` **only after `subprocess.run` returns** (`commit-lint` → `repo-lint`, `dev-sync` → `source-sync-check`; a timeout or a missing helper records nothing, because a child that never came back did not identify itself; the verdict gate runs no child and records none) — and the `go-compile` row exports its own as `bin`, handed over as `SS_GCC_BIN`. The guard then states only what it can show: **same path** → `both ran <path> - the same child, so the difference is in the environment`; **different paths** → `they ran DIFFERENT children (go-compile …, commit-lint …)`; **one or both unrecorded** → `the child each check ran is not BOTH recorded (go-compile …, commit-lint ?)` with a literal `?` where the path is unknown. `binary or env` is gone on purpose: with both paths in hand, "or env" is no longer a guess, and when only one is in hand the honest answer is the question mark, not a claim of sameness.
CHANGELOG.md:1014:- **Live**: `promote-dev-to-prod --dry-run --force --format json` → `ready:false`, `sha:01f35e5`, `gates[dev-sync].child=/data/repo/tools/source-sync-check`, `gates[commit-lint].child=/data/repo/tools/repo-lint`, verdict with no `child`, `mailbox.newest=2026-09-21T18:29:21Z`, `mailbox.age_seconds` in the 10⁵ range; `system-status` → `promote-gates [WARN] not promotable (newest reviewer-mailbox entry 2026-09-21T18:29:21Z, 4771m old): verdict REFUSED: no verdict in /data/repo/mailboxes/reviewer-to-main … | dev-sync OK | commit-lint OK (commit 01f35e5)` under **ALL SYSTEMS HEALTHY**, exit 0. Promotions remain refused in practice (exit 5, `reviewer-to-main/` holds no `VERDICT-*`) and nothing was promoted: every invocation is `--dry-run`.
CHANGELOG.md:1020:- **Only one of the three gates' children is ever compared.** `dev-sync`'s `source-sync-check` path is now recorded too but nothing reads it — a divergence guard between the promote gate's dev-sync verdict and `source-sync-check`'s own output would extend the same "one check seen twice" principle to the second pair.
CHANGELOG.md:1064:- **Only one of the three gates' children is ever compared** (carried forward from `[0.4.43]`/`[0.4.44]`, the last of the three): `dev-sync`'s `source-sync-check` path is now recorded in `gates[].child` but nothing reads it — extending the divergence guard to compare the promote gate's dev-sync verdict against `source-sync-check`'s own output would apply the same "one check seen twice" principle to the second pair.
agent-logs/PROGRESS.md:4837:- **Safety**: model spend **0.00** (`*-free` only), no secrets/personal data in prompts or commits, **no DNS write**, no service restart, `/opt/startup/dev` and `/opt/startup/prod` untouched (repo-side tool only; `source-sync-check` 30/30), **no money moved** (BUDGET unchanged: 1.50 spent / 3.50 remaining). The child rebuilds the module in `mkdtemp()` **outside** the repo and removes it in a `finally`, so a dashboard run leaves the work tree byte-identical.
agent-logs/PROGRESS.md:4890:- **Contract now**: (a) **`promote-dev-to-prod` records two evidence fields.** `_mailbox_state(repo_root)` (`timespec="seconds"`, computed in `promote()` **beside `sha`, before any gate runs** so an early refusal still carries it) → `mailbox: {dir, newest (UTC ISO), age_seconds (int|null)}`; **every** file counts, not only `VERDICT-*` (an emptied mailbox is a state worth dating) and `null` is never a guessed age. `_record_gate(..., child=…)` → `gates[].child`, written **only after `subprocess.run` returns** — `commit-lint` → `repo-lint`, `dev-sync` → `source-sync-check`; a timeout, a missing helper or an `isfile()`-only path records **nothing** (a child that never came back did not identify itself), and the verdict gate — which executes nothing — records none. Both are documented in `--help`'s epilog. (b) **`system-status` dates the refusal, as a PREFIX.** `refusal_header(doc)` renders four honest states: `not promotable (newest reviewer-mailbox entry <ts>, <N>m old)`, `(reviewer-mailbox holds no entries)`, `(reviewer-mailbox age not recorded by this child)`, `(reviewer-mailbox entry <ts>, age not recorded)`. Prefix rather than suffix because the detail is re-extracted through `clean()`'s **400-char truncation** — anything appended after a long verdict message is exactly what gets cut. Minutes (`int(round(age / 60.0))`) because the row is read at a glance; the header appears **only on a refusal** (a `promote-ready` row gains no decoration). (c) **The guard names which child ran.** `BIN_FIELD`/`SS_RL_BIN` → the `go-compile` row's `bin`, `GC_BIN` → `SS_GCC_BIN` hand-off, `child_path()`/`child_phrase()` on the promote side; the same-commit branch now states one of three measured outcomes: `both ran <path> - the same child, so the difference is in the environment` · `they ran DIFFERENT children (go-compile …, commit-lint …)` · `the child each check ran is not BOTH recorded (go-compile …, commit-lint ?)` with a literal `?`. `binary or env` is gone: with both paths it is no longer a guess, with one missing the honest answer is the question mark — never a claim of sameness. Still `warning`, still 0 incremented errors, still fires only on a genuine contradiction.
agent-logs/PROGRESS.md:4893:- **Live**: `promote-dev-to-prod --dry-run --force --format json` → `ready:false`, `sha:01f35e5`, `gates[dev-sync].child=/data/repo/tools/source-sync-check`, `gates[commit-lint].child=/data/repo/tools/repo-lint`, `gates[verdict]` with **no** `child`, `mailbox.newest=2026-09-21T18:29:21Z` + `age_seconds`; `system-status --format human` → `promote-gates [WARN] not promotable (newest reviewer-mailbox entry 2026-09-21T18:29:21Z, 4771m old): verdict REFUSED: no verdict in /data/repo/mailboxes/reviewer-to-main … | dev-sync OK | commit-lint OK (commit 01f35e5)` beside `go-compile [OK] … (commit 01f35e5)` — the two rows naming the same commit *and* the refusal naming its own age — under **ALL SYSTEMS HEALTHY**, exit 0, 30.5 s. Promotion stays refused in practice (exit 5, `reviewer-to-main/` holds no `VERDICT-*`); every invocation was `--dry-run`.
agent-logs/PROGRESS.md:4898:- **Next-candidate queued, not actioned**: (1) the age is **recomputed at read time** — `mailbox.age_seconds` is measured when the report is generated, so `4771m old` re-ages on every dashboard run even though nothing changed; dating the refusal from the report's own `timestamp` would make "old" mean "old when this report was made". (2) `4771m old` is arithmetic a reader must do (above a day `2d 23h` would be glanceable) — pinned as a contract by M18 today, so it needs a deliberate change, not a slip. (3) only one of the three gates' children is ever compared: `dev-sync`'s `source-sync-check` path is now recorded but nothing reads it — the same "one check seen twice" guard applied to that second pair.
agent-logs/PROGRESS.md:4911:- **Next-candidate queued, not actioned** (all three carried from `[0.4.43]` unchanged — this run's step was the defect found *while reading* their contract): (1) the age is **recomputed at read time** — dating the refusal from the report's own `timestamp` would make "old" mean "old when this report was made"; (2) `4803m old` is arithmetic a reader must do (above a day `2d 23h` would be glanceable) — pinned as a contract by mutation M18, so it needs a deliberate change; (3) only one of the three gates' children is ever compared: `dev-sync`'s `source-sync-check` path is recorded but nothing reads it.
agent-logs/PROGRESS.md:4924:- **Next-candidate queued, not actioned**: (1) the last of `[0.4.43]`'s three items — only one of the three gates' children is ever compared: `dev-sync`'s `source-sync-check` path is recorded in `gates[].child` but nothing reads it, so extending the divergence guard to that second pair applies the same "one check seen twice" principle where it is still missing. (2) Noted in `[0.4.45]`'s queue as intended behaviour, not a defect: the age is now *dated* correctly but re-ages on every dashboard run because each run makes a fresh report — freezing it at refusal time would need the refusal moment itself recorded, which no field currently carries.
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tools/source-sync-check
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tests/test_system_status_promote_gates.sh [90m[limit=330][0m
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tests/test_system_status_promote_gates.sh [90m[offset=331, limit=220][0m
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tests/test_system_status_promote_gates.sh [90m[limit=280, offset=551][0m
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tests/test_system_status_promote_gates.sh [90m[limit=400, offset=831][0m
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "source-sync\|SYNC\|dev-sync\|G_DEVSYNC\|checker" tests/test_promote_json.sh | head -40; echo "=== size ==="; wc -l tests/test_promote_json.sh
23:# Hermetic: the repo-lint child is a scenario stub and source-sync-check runs
35:SRC_SYNC="$TESTS_DIR/../tools/source-sync-check"
166: cp "$SRC_SYNC" "$SB/repo/tools/source-sync-check"
167: chmod +x "$SB/repo/tools/source-sync-check"
240:assert_eq "gate 2 is dev-sync" "dev-sync" "$(json_get "$OUT" "gates.1.name")"
244:assert_eq "dev-sync gate reports ok" "ok" "$(json_get "$OUT" "gates.1.status")"
308:# === G. dev-sync refusal is reported with its own code =======================
315:assert_eq "dev-sync refuses with code 6" "6" "$(json_get "$OUT" "gates.1.code")"
316:assert_eq "blocked_by names dev-sync" '["dev-sync"]' "$(json_get "$OUT" "blocked_by")"
445:assert_eq "the dev-sync gate names its own child" \
446: "$SB/repo/tools/source-sync-check" "$(json_get "$OUT" "gates.1.child")"
679:# that never evaluated dev-sync (an unevaluated gate must never read as a pass).
683:if plant M5 ' _record_gate("dev-sync", 0, ok_detail, child=checker)' \
684: 's/ _record_gate("dev-sync", 0, ok_detail, child=checker)/ pass # MUTANT: M5 dev-sync ok not recorded/'; then
=== size ===
868 tests/test_promote_json.sh
[0m$ [0mcd /data/repo && grep -n "keys\|sorted\|set(d)\|assert.*key\|mailbox\|child" tests/test_promote_json.sh | head -40
18:# * section I proves GLADEX_GATE_PROBE=1 pins --dry-run from the child's
23:# Hermetic: the repo-lint child is a scenario stub and source-sync-check runs
110:# mailbox age is dated when the REPORT is built - after every gate ran - while
111:# the mailbox itself is scanned before them, so a suite that makes the gates
155: mkdir -p "$SB/repo/app/src/php" "$SB/repo/mailboxes/reviewer-to-main" \
181: printf '%s' "$3" > "$1/repo/mailboxes/reviewer-to-main/$2"
182: touch -d "$4" "$1/repo/mailboxes/reviewer-to-main/$2"
379:# === L. the report DATES its evidence and NAMES the child it ran =============
383:# the same whether the reviewer mailbox last changed 4 seconds or 4 days
386:# "the two children differ (binary or env)" precisely because neither side
391:# L1: mailbox age, dated from a file set relative to NOW (age is a wall-clock
399:# has to be a file the mailbox counts.)
400:printf 'VERDICT: APPROVE\n' > "$SB/repo/mailboxes/reviewer-to-main/VERDICT-20260923-090000-older.md"
401:touch -d "@$(( $(date +%s) - 86400 ))" "$SB/repo/mailboxes/reviewer-to-main/VERDICT-20260923-090000-older.md"
402:touch -d "@$(( $(date +%s) - 600 ))" "$SB/repo/mailboxes/reviewer-to-main/VERDICT-20260924-150900-age.md"
404:assert_contains "the mailbox field is present in the report" '"mailbox":{' "$OUT"
405:assert_eq "mailbox.dir names the reviewer mailbox" "mailboxes/reviewer-to-main" \
406: "$(json_get "$OUT" "mailbox.dir")"
407:NEWEST=$(json_get "$OUT" "mailbox.newest")
408:assert_contains "mailbox.newest is an ISO timestamp" "T" "$NEWEST"
409:assert_contains "mailbox.newest is UTC (Z suffix)" "Z" "$NEWEST"
410:AGE=$(json_get "$OUT" "mailbox.age_seconds")
412: ''|*[!0-9]*) fail "mailbox.age_seconds is a non-negative integer (got '$AGE')" ;;
414: ok "mailbox.age_seconds is a non-negative integer ($AGE)"
421:assert_contains "the report is still ONE object with the mailbox inside" '"tool":"promote-dev-to-prod"' "$OUT"
423:# L2: an empty (or vanished) mailbox is a state worth dating, not a crash.
426:assert_contains "an empty mailbox still records the field" '"mailbox":{' "$OUT"
427:assert_eq "an empty mailbox reports no newest entry" "" "$(json_get "$OUT" "mailbox.newest")"
428:assert_eq "and no age" "" "$(json_get "$OUT" "mailbox.age_seconds")"
429:assert_eq "the dir is still named" "mailboxes/reviewer-to-main" "$(json_get "$OUT" "mailbox.dir")"
430:rm -rf "$SB/repo/mailboxes"
432:assert_contains "a mailbox dir that does not exist is recorded the same way" '"mailbox":{' "$OUT"
433:assert_eq "and still carries no age" "" "$(json_get "$OUT" "mailbox.age_seconds")"
435:# L3: `child` = the binary a gate ACTUALLY executed (a gate that never ran one
436:# records nothing: claiming a path for a child that never started would be the
439:write_verdict "$SB" "VERDICT-20260924-151000-child.md" "VERDICT: APPROVE
444: "$SB/repo/tools/repo-lint" "$(json_get "$OUT" "gates.2.child")"
445:assert_eq "the dev-sync gate names its own child" \
446: "$SB/repo/tools/source-sync-check" "$(json_get "$OUT" "gates.1.child")"
447:assert_eq "the verdict gate runs no child, so it records none" \
> build · mimo-v2.6-flash-free
[0m→ [0mRead repo/tests/test_promote_json.sh [90m[limit=380][0m
Select another run log from the list above. Only files matching run-YYYYMMDD-HHMMSS-N.log are readable.
[Fri Sep 25 05:12:49 2026] 127.0.0.1:34716 Accepted [Fri Sep 25 05:12:49 2026] 127.0.0.1:34716 Closing [Fri Sep 25 05:12:49 2026] 127.0.0.1:34730 Accepted [Fri Sep 25 05:12:49 2026] 127.0.0.1:34730 Closing [Fri Sep 25 05:12:49 2026] 127.0.0.1:34744 Accepted [Fri Sep 25 05:12:49 2026] 127.0.0.1:34744 Closing [Fri Sep 25 05:12:49 2026] 127.0.0.1:34746 Accepted [Fri Sep 25 05:12:49 2026] 127.0.0.1:34746 Closing [Fri Sep 25 05:17:25 2026] 127.0.0.1:33232 Accepted [Fri Sep 25 05:17:25 2026] 127.0.0.1:33232 Closing [Fri Sep 25 05:24:27 2026] 127.0.0.1:53460 Accepted [Fri Sep 25 05:24:27 2026] 127.0.0.1:53460 Closing [Fri Sep 25 05:24:50 2026] 127.0.0.1:42274 Accepted [Fri Sep 25 05:24:50 2026] 127.0.0.1:42274 Closing [Fri Sep 25 05:37:55 2026] 127.0.0.1:32768 Accepted [Fri Sep 25 05:37:55 2026] 127.0.0.1:32768 Closing [Fri Sep 25 05:56:02 2026] 127.0.0.1:39338 Accepted [Fri Sep 25 05:56:02 2026] 127.0.0.1:39338 Closing [Fri Sep 25 05:56:02 2026] 127.0.0.1:39342 Accepted [Fri Sep 25 05:56:02 2026] 127.0.0.1:39342 Closing [Fri Sep 25 06:01:14 2026] 127.0.0.1:43256 Accepted [Fri Sep 25 06:01:14 2026] 127.0.0.1:43256 Closing [Fri Sep 25 06:01:14 2026] 127.0.0.1:43264 Accepted [Fri Sep 25 06:01:14 2026] 127.0.0.1:43264 Closing [Fri Sep 25 06:01:14 2026] 127.0.0.1:43276 Accepted [Fri Sep 25 06:01:14 2026] 127.0.0.1:43276 Closing [Fri Sep 25 06:01:14 2026] 127.0.0.1:43282 Accepted [Fri Sep 25 06:01:14 2026] 127.0.0.1:43282 Closing [Fri Sep 25 06:01:14 2026] 127.0.0.1:43290 Accepted [Fri Sep 25 06:01:14 2026] 127.0.0.1:43290 Closing [Fri Sep 25 06:01:14 2026] 127.0.0.1:43292 Accepted [Fri Sep 25 06:01:14 2026] 127.0.0.1:43292 Closing [Fri Sep 25 06:01:14 2026] 127.0.0.1:43300 Accepted [Fri Sep 25 06:01:14 2026] 127.0.0.1:43300 Closing [Fri Sep 25 06:01:49 2026] 127.0.0.1:45750 Accepted [Fri Sep 25 06:01:49 2026] 127.0.0.1:45750 Closing [Fri Sep 25 06:01:49 2026] 127.0.0.1:45754 Accepted [Fri Sep 25 06:01:49 2026] 127.0.0.1:45754 Closing [Fri Sep 25 06:01:49 2026] 127.0.0.1:45756 Accepted [Fri Sep 25 06:01:49 2026] 127.0.0.1:45756 Closing [Fri Sep 25 06:01:49 2026] 127.0.0.1:45768 Accepted [Fri Sep 25 06:01:49 2026] 127.0.0.1:45768 Closing [Fri Sep 25 06:01:49 2026] 127.0.0.1:45784 Accepted [Fri Sep 25 06:01:49 2026] 127.0.0.1:45784 Closing [Fri Sep 25 06:01:49 2026] 127.0.0.1:45796 Accepted [Fri Sep 25 06:01:49 2026] 127.0.0.1:45796 Closing [Fri Sep 25 06:01:49 2026] 127.0.0.1:45808 Accepted [Fri Sep 25 06:01:49 2026] 127.0.0.1:45808 Closing [Fri Sep 25 06:08:53 2026] 127.0.0.1:39668 Accepted [Fri Sep 25 06:08:53 2026] 127.0.0.1:39668 Closing [Fri Sep 25 06:27:00 2026] 127.0.0.1:37758 Accepted [Fri Sep 25 06:27:00 2026] 127.0.0.1:37758 Closing [Fri Sep 25 06:53:53 2026] 127.0.0.1:54316 Accepted [Fri Sep 25 06:53:53 2026] 127.0.0.1:54316 Closing [Fri Sep 25 06:53:54 2026] 127.0.0.1:54322 Accepted [Fri Sep 25 06:53:54 2026] 127.0.0.1:54322 Closing [Fri Sep 25 07:06:30 2026] 127.0.0.1:45120 Accepted [Fri Sep 25 07:06:30 2026] 127.0.0.1:45120 Closing [Fri Sep 25 07:07:03 2026] 127.0.0.1:55238 Accepted
Generated 2026-09-25 05:07:03 UTC · Gladex.de