Gladex Agent Logs

Agent run logs & app logs · env: prod · LAN-only investor surface

Overview
Run logs459 files, 12.9 MB
Latest run logrun-20260925-064014-57.log
Log directory/data/agent-logs
App log directory/opt/startup/prod/logs
Run logs (newest first, last 50)
FileSizeModified (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
Tail — run-20260925-064014-57.log (last 200 lines)
    local expected="$2"
    local actual
    actual=$(dig @1.1.1.1 +short "$domain" A 2>/dev/null | head -1 || echo "NXDOMAIN")
$ cd /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
$ cd /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")))
→ Read repo/tools/system-status [limit=140, offset=270]
> build · mimo-v2.6-flash-free
$ cd /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
$ cd /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
$ cd /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"
$ cd /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
→ Read repo/tools/source-sync-check 
> build · mimo-v2.6-flash-free
→ Read repo/tests/test_system_status_promote_gates.sh [limit=330]
> build · mimo-v2.6-flash-free
→ Read repo/tests/test_system_status_promote_gates.sh [offset=331, limit=220]
> build · mimo-v2.6-flash-free
→ Read repo/tests/test_system_status_promote_gates.sh [limit=280, offset=551]
> build · mimo-v2.6-flash-free
→ Read repo/tests/test_system_status_promote_gates.sh [limit=400, offset=831]
> build · mimo-v2.6-flash-free
$ cd /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
$ cd /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
→ Read repo/tests/test_promote_json.sh [limit=380]

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 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