Agent run logs & app logs · env: prod · LAN-only investor surface
| Run logs | 454 files, 11.6 MB |
| Latest run log | run-20260925-012106-52.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
| File | Size | Modified (UTC) |
|---|---|---|
| run-20260925-012106-52.log | 165 KB | 2026-09-24 23:44:44 |
| 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 |
| run-20260923-233751-7.log | 97 KB | 2026-09-23 21:43:34 |
| run-20260923-231451-6.log | 165 KB | 2026-09-23 21:27:51 |
| run-20260923-225120-5.log | 58 KB | 2026-09-23 21:04:51 |
| run-20260923-222610-4.log | 230 KB | 2026-09-23 20:41:20 |
| run-20260923-205439-3.log | 640 KB | 2026-09-23 20:16:10 |
tests/test_changelog_api.php
echo "=== staged ==="; git status --short
git commit -q -m "fix: CLI wrote all 158 Print* call sites to stderr — rootCmd.SetOut(os.Stdout) (0.4.16)
cobra's Print/Println/Printf route through OutOrStderr(), which resolves to
os.Stderr while outWriter is nil — rootCmd never called SetOut(). So
\`gladex version --json | jq\` got empty stdin and \`templates list > file\`
produced a 0-byte file, with the real output on stderr.
- one line in commands/root.go init(): rootCmd.SetOut(os.Stdout)
- errors, serve/mcp logging, workflow-validate human diagnostics and the
mcp --stdio JSON-RPC stream all stay on stderr (each verified post-fix;
mcp --stdio response byte-identical old vs new binary)
- new app/src/go/cmd/gladex/stdout_test.go (11 tests) builds and runs the real
binary rather than asserting in-process, because version_test/root_test call
rootCmd.SetOut(&buf) and never restore it. Mutation-verified: reverting the
fix fails 6 of 11.
- stats.php drops the 0.4.15 2>&1 shim (stdout-only now); its canary inverted,
test_changelog_api 65 -> 72 assertions
208 assertions green (PHP 182 + shell 26) plus both Go packages."
echo "=== HEAD now ==="; git log --oneline -3; echo "=== still dirty ==="; git status --short
=== staged ===
M CHANGELOG.md
M STRUCTURE.md
M agent-logs/PROGRESS.md
M app/bin/gladex
M app/src/go/cmd/gladex/commands/root.go
A app/src/go/cmd/gladex/stdout_test.go
M app/src/go/gladex
M app/src/php/stats.php
M tests/test_changelog_api.php
=== HEAD now ===
fd2e243 fix: CLI wrote all 158 Print* call sites to stderr — rootCmd.SetOut(os.Stdout) (0.4.16)
f41fd14 fix: /api/changelog folded Notes/Verified/Security/Tests into the previous section + /stats Go CLI row rendered empty (git_sha key + cobra Print* falls back to stderr) — 65-assertion regression test, repo==dev==prod, 0.4.15
3393c88 feat: public /templates workflow gallery — exact-match route before catch-all, 8/8 rendered, 27-assertion regression test (0.4.14)
=== still dirty ===
M app/bin/gladex
M app/src/go/gladex
> build · mimo-v2.6-flash-free
Source committed as `fd2e243`. Now rebuilding so binaries embed this release's sha, and redeploying:
[0m$ [0mcd /data/repo/app/src/go && ./build.sh 2>&1 | tail -8
NEW=/data/repo/app/bin/gladex
for d in /data/repo/app/src/go/gladex /opt/startup/dev/bin/gladex /opt/startup/prod/bin/gladex; do cp "$NEW" "$d"; chmod 755 "$d"; done
echo "=== md5 across 4 copies ==="; md5sum /data/repo/app/bin/gladex /data/repo/app/src/go/gladex /opt/startup/dev/bin/gladex /opt/startup/prod/bin/gladex
echo "=== binary now reports ==="; $NEW version --json 2>/dev/null
echo "=== stderr must be empty ==="; o=$($NEW version --json 2>&1 1>/dev/null); echo "[$o]"
Building gladex 0.2.0 (commit: fd2e243, time: 2026-09-24T02:08:27Z)
Built: /data/repo/app/src/go/../../bin/gladex
gladex version 0.2.0
commit: fd2e243
built: 2026-09-24T02:08:27Z
=== md5 across 4 copies ===
6b9c511cd1d86e25f7a936278b47c4cb /data/repo/app/bin/gladex
6b9c511cd1d86e25f7a936278b47c4cb /data/repo/app/src/go/gladex
6b9c511cd1d86e25f7a936278b47c4cb /opt/startup/dev/bin/gladex
6b9c511cd1d86e25f7a936278b47c4cb /opt/startup/prod/bin/gladex
=== binary now reports ===
{"version":"0.2.0","commit":"fd2e243","built":"2026-09-24T02:08:27Z"}
=== stderr must be empty ===
[]
> build · mimo-v2.6-flash-free
Binaries now embed `fd2e243` (this release's sha). Final live verification and test sweep:
[0m$ [0mecho "=== /stats Go CLI row ==="; printf 'dev : '; curl -s --noproxy '*' http://127.0.0.1:8000/stats | grep -o '<td>Go CLI</td><td>[^<]*</td>'; printf 'prod: '; curl -s --noproxy '*' http://127.0.0.1:8001/stats | grep -o '<td>Go CLI</td><td>[^<]*</td>'
echo "=== routes ==="; for p in /healthz /team /info /stats /templates; do printf '%-13s dev=%s prod=%s\n' "$p" "$(curl -s -o /dev/null -w '%{http_code}' --noproxy '*' http://127.0.0.1:8000$p)" "$(curl -s -o /dev/null -w '%{http_code}' --noproxy '*' http://127.0.0.1:8001$p)"; done
echo "=== public ==="; for p in / /team /stats /api/changelog; do printf '%-16s %s\n' "$p" "$(curl -s -o /dev/null -w '%{http_code}' --noproxy '*' https://gladex.de$p)"; done
echo "=== mcp stdio clean on final binary ==="; echo '{"jsonrpc":"2.0","id":1,"method":"initialize"}' | /opt/startup/prod/bin/gladex mcp --stdio 2>/dev/null | wc -l
=== /stats Go CLI row ===
dev : <td>Go CLI</td><td>0.2.0 (sha: fd2e243)</td>
prod: <td>Go CLI</td><td>0.2.0 (sha: fd2e243)</td>
=== routes ===
/healthz dev=200 prod=200
/team dev=200 prod=200
/info dev=200 prod=200
/stats dev=200 prod=200
/templates dev=200 prod=200
=== public ===
/ 200
/team 200
/stats 200
/api/changelog 200
=== mcp stdio clean on final binary ===
1
[0m$ [0mcd /data/repo && echo "=== FINAL full sweep ==="; fail=0
for t in tests/*.php; do r=$(php "$t" >/dev/null 2>&1; echo $?); [ $r -ne 0 ] && { echo "FAIL $t"; fail=1; } || echo "ok $(basename $t)"; done
r=$(bash tests/test_identity_wrapper.sh >/dev/null 2>&1; echo $?); [ $r -ne 0 ] && { echo "FAIL wrapper"; fail=1; } || echo "ok test_identity_wrapper.sh"
echo "--- assertion totals ---"
for t in tests/*.php; do printf '%-30s %s\n' "$(basename $t)" "$(php $t 2>&1 | grep -oE '[0-9]+ passed, [0-9]+ failed' | tail -1)"; done
printf '%-30s %s\n' "test_identity_wrapper.sh" "$(bash tests/test_identity_wrapper.sh 2>&1 | grep -oE '[0-9]+ passed, [0-9]+ failed' | tail -1)"
echo "fail=$fail"
=== FINAL full sweep ===
ok test_changelog_api.php
ok test_chat_frontend.php
ok test_ip_drift_safety.php
ok test_lan_middleware.php
ok test_templates_gallery.php
ok test_ts_ordering.php
ok test_identity_wrapper.sh
--- assertion totals ---
test_changelog_api.php 72 passed, 0 failed
test_chat_frontend.php 11 passed, 0 failed
test_ip_drift_safety.php 16 passed, 0 failed
test_lan_middleware.php 49 passed, 0 failed
test_templates_gallery.php 27 passed, 0 failed
test_ts_ordering.php 7 passed, 0 failed
test_identity_wrapper.sh 26 passed, 0 failed
fail=0
> build · mimo-v2.6-flash-free
All 208 assertions green, `/stats` shows `sha: fd2e243` on both envs. Committing the binaries and pushing:
[0m$ [0mcd /data/repo && export GOPATH=$PWD/app/src/go/gopath GOMODCACHE=$PWD/app/src/go/gocache GOCACHE=$PWD/app/src/go/gocache HOME=/root
echo "=== final Go suite ==="; (cd app/src/go && go test -count=1 ./cmd/... 2>&1 | tail -5)
echo "=== commit binaries ==="
git add -A && git status --short
git commit -q -m "chore: rebuild + redeploy gladex binaries for 0.4.16 (all 4 copies md5-identical 6b9c511c)
app/bin/gladex, app/src/go/gladex, /opt/startup/{dev,prod}/bin/gladex rebuilt from
fd2e243 so they embed the 0.4.16 source sha — /stats now renders
'Go CLI 0.2.0 (sha: fd2e243)' on dev :8000 and prod :8001."
echo "=== log ==="; git log --oneline -3
echo "=== push ==="; git push origin main 2>&1 | tail -5 || echo "(push skipped/failed)"
=== final Go suite ===
ok github.com/gladex/gladex/cmd/gladex 0.942s
ok github.com/gladex/gladex/cmd/gladex/commands 19.925s
=== commit binaries ===
M app/bin/gladex
M app/src/go/gladex
=== log ===
925f684 chore: rebuild + redeploy gladex binaries for 0.4.16 (all 4 copies md5-identical 6b9c511c)
fd2e243 fix: CLI wrote all 158 Print* call sites to stderr — rootCmd.SetOut(os.Stdout) (0.4.16)
f41fd14 fix: /api/changelog folded Notes/Verified/Security/Tests into the previous section + /stats Go CLI row rendered empty (git_sha key + cobra Print* falls back to stderr) — 65-assertion regression test, repo==dev==prod, 0.4.15
=== push ===
To git://git.gladex.de/gladex.git
f41fd14..925f684 main -> main
> build · mimo-v2.6-flash-free
Both commits pushed. Final STEP 0 re-check (messages may have arrived during the run) plus cleanup:
[0m$ [0mecho "=== STEP 0 RE-CHECK ==="
echo "dev unread investor_to_agent: $(sqlite3 /opt/startup/dev/data/messages.db "SELECT COUNT(*) FROM messages WHERE direction='investor_to_agent' AND read=0")"
echo "prod unread investor_to_agent: $(sqlite3 /opt/startup/prod/data/messages.db "SELECT COUNT(*) FROM messages WHERE direction='investor_to_agent' AND read=0")"
echo "INBOX unhandled entries: $(grep '^## ' /data/repo/INBOX.md | grep -vc 'HANDLED') of $(grep -c '^## ' /data/repo/INBOX.md)"
echo "open agent->investor escalation #57 read state: $(sqlite3 /opt/startup/dev/data/messages.db "SELECT read FROM messages WHERE id=57") (0 = investor has not opened it yet)"
echo "latest messages (any direction):"; sqlite3 -separator ' | ' /opt/startup/dev/data/messages.db "SELECT id, ts, direction, read FROM messages ORDER BY id DESC LIMIT 3;"
=== STEP 0 RE-CHECK ===
dev unread investor_to_agent: 0
prod unread investor_to_agent: 0
INBOX unhandled entries: 0 of 65
open agent->investor escalation #57 read state: 0 (0 = investor has not opened it yet)
latest messages (any direction):
57 | 1790194373 | agent_to_investor | 0
56 | 1790190849 | agent_to_investor | 0
55 | 1790187640 | agent_to_investor | 0
[0m$ [0mrm -f /tmp/timing-gladex /tmp/tl.txt /tmp/tl.err /tmp/cl.json /tmp/cl.err /tmp/h.txt /tmp/h.err /tmp/n.json /tmp/o.json /tmp/root.go.bak
echo "cleaned temp artifacts"
cd /data/repo && echo "=== git tree clean? ==="; git status --short; echo "(empty above = clean)"
echo "=== remote in sync? ==="; git log --oneline -1 origin/main 2>/dev/null || git ls-remote origin main 2>&1 | head -2
echo "=== budget unchanged ==="; head -4 BUDGET.md
cleaned temp artifacts
=== git tree clean? ===
(empty above = clean)
=== remote in sync? ===
925f684 chore: rebuild + redeploy gladex binaries for 0.4.16 (all 4 copies md5-identical 6b9c511c)
=== budget unchanged ===
month: 2026-09
allowance: 5.00
spent: 1.50 (gladex.de — investor-approved 2026-09-20, purchase pending at registrar)
remaining: 3.50
> build · mimo-v2.6-flash-free
Run complete. Summary:
## STEP 0 — investor inbox (checked first, re-checked last)
**No replies were owed:** `0` unread `investor_to_agent` rows on **both** dev and prod DBs, and **0 unhandled** of 65 INBOX entries (all struck through `~~HANDLED~~`). Nothing to insert, nothing to mark read — noted in PROGRESS.md as required.
One thread remains open *from my side*: escalation **#57** (`agent_to_investor`, `read=0` = investor hasn't opened it) — the **A/B/C public-gating decision**, restated under NEEDS-INVESTOR. I did not act on it unilaterally, since closing it would lock the operator out mid-session.
## Work done — the queued item: CLI stdout bug (0.4.16)
**Root cause** (confirmed against cobra source, not guessed): `rootCmd` never called `SetOut()`. cobra's `Print/Println/Printf` route through `OutOrStderr()` (`command.go:1400`), and with `outWriter == nil` that resolves to `os.Stderr`. Result: **158 `cmd.Print*` sites across 11 files** shipped real output on stderr.
Measured before the fix: `version --json 2>/dev/null` → **0 bytes**; `templates list > file` → **0-byte file**, 12-line table on stderr.
**Fix:** one line — `rootCmd.SetOut(os.Stdout)` in `root.go init()`. Subcommands inherit it via cobra's parent walk; the `SetOut(&buf)` overrides in existing tests still win, so no existing test changed meaning.
**Deliberately left on stderr, each verified post-fix:** errors (`main.go`, exit 1), `serve`/`mcp` logging, `workflow validate` human diagnostics (bypasses cobra), and **`mcp --stdio`** — whose JSON-RPC initialize response I diffed **old binary vs new: byte-identical**.
**Regression test `app/src/go/cmd/gladex/stdout_test.go` (11 tests)** builds and runs the *real binary* rather than asserting in-process — because `version_test.go`/`root_test.go` call `rootCmd.SetOut(&buf)` and never restore it, an in-process check would pass or fail on test ordering alone. **Mutation-verified: reverting the one line fails 6 of 11; restoring returns 11/11.**
**Gated follow-through:** `stats.php` dropped the 0.4.15 `2>&1` shim (JSON-decode guard kept), and its canary was *inverted* — 65 → 72 assertions.
## Verification
- All 4 binary copies md5-identical (`6b9c511c`), `stats.php` md5-identical repo == dev == prod
- `/stats` → `Go CLI 0.2.0 (sha: fd2e243)` on dev :8000 + prod :8001 (via stdout-only now)
- Routes `/healthz /team /info /stats /templates` → 200 on both envs **and** publicly; healthz 200/200
- **208 assertions green** (PHP 182 + shell 26) + both Go packages `ok`
## Bookkeeping
Two commits pushed to `git://git.gladex.de/gladex.git` (`fd2e243` source, `925f684` binaries — split so binaries embed *this* release's sha). Tree clean, remote in sync. Budget untouched: **5.00 / 1.50 / 3.50**, model spend **0.00** (`*-free` only), no API keys, no DNS write, no service restart.
**Queued next:** friendlier `gladex status` in a non-workspace cwd (suggest `gladex init` instead of `unable to open database file (14)`).
exit=0
Select another run log from the list above. Only files matching run-YYYYMMDD-HHMMSS-N.log are readable.
[Fri Sep 25 01:42:55 2026] 127.0.0.1:44106 Accepted [Fri Sep 25 01:42:55 2026] 127.0.0.1:44106 Closing [Fri Sep 25 01:43:00 2026] 127.0.0.1:44120 Accepted [Fri Sep 25 01:43:00 2026] 127.0.0.1:44120 Closing [Fri Sep 25 01:43:00 2026] 127.0.0.1:44134 Accepted [Fri Sep 25 01:43:00 2026] 127.0.0.1:44134 Closing [Fri Sep 25 01:43:00 2026] 127.0.0.1:44150 Accepted [Fri Sep 25 01:43:00 2026] 127.0.0.1:44150 Closing [Fri Sep 25 01:43:04 2026] 127.0.0.1:44164 Accepted [Fri Sep 25 01:43:04 2026] 127.0.0.1:44164 Closing [Fri Sep 25 01:43:04 2026] 127.0.0.1:38886 Accepted [Fri Sep 25 01:43:04 2026] 127.0.0.1:38886 Closing [Fri Sep 25 01:43:05 2026] 127.0.0.1:38896 Accepted [Fri Sep 25 01:43:05 2026] 127.0.0.1:38896 Closing [Fri Sep 25 01:43:09 2026] 127.0.0.1:38912 Accepted [Fri Sep 25 01:43:09 2026] 127.0.0.1:38912 Closing [Fri Sep 25 01:43:10 2026] 127.0.0.1:38918 Accepted [Fri Sep 25 01:43:10 2026] 127.0.0.1:38918 Closing [Fri Sep 25 01:43:10 2026] 127.0.0.1:38934 Accepted [Fri Sep 25 01:43:10 2026] 127.0.0.1:38934 Closing [Fri Sep 25 01:43:30 2026] 127.0.0.1:53584 Accepted [Fri Sep 25 01:43:30 2026] 127.0.0.1:53584 Closing [Fri Sep 25 01:43:30 2026] 127.0.0.1:53596 Accepted [Fri Sep 25 01:43:30 2026] 127.0.0.1:53596 Closing [Fri Sep 25 01:43:30 2026] 127.0.0.1:53610 Accepted [Fri Sep 25 01:43:30 2026] 127.0.0.1:53610 Closing [Fri Sep 25 01:43:39 2026] 127.0.0.1:34760 Accepted [Fri Sep 25 01:43:39 2026] 127.0.0.1:34760 Closing [Fri Sep 25 01:43:40 2026] 127.0.0.1:34764 Accepted [Fri Sep 25 01:43:40 2026] 127.0.0.1:34764 Closing [Fri Sep 25 01:43:40 2026] 127.0.0.1:34780 Accepted [Fri Sep 25 01:43:40 2026] 127.0.0.1:34780 Closing [Fri Sep 25 01:44:35 2026] 127.0.0.1:51444 Accepted [Fri Sep 25 01:44:35 2026] 127.0.0.1:51444 Closing [Fri Sep 25 01:44:35 2026] 127.0.0.1:51450 Accepted [Fri Sep 25 01:44:35 2026] 127.0.0.1:51450 Closing [Fri Sep 25 01:44:38 2026] 127.0.0.1:51462 Accepted [Fri Sep 25 01:44:38 2026] 127.0.0.1:51462 Closing [Fri Sep 25 01:44:38 2026] 127.0.0.1:51470 Accepted [Fri Sep 25 01:44:38 2026] 127.0.0.1:51470 Closing [Fri Sep 25 01:44:38 2026] 127.0.0.1:51474 Accepted [Fri Sep 25 01:44:38 2026] 127.0.0.1:51474 Closing [Fri Sep 25 01:44:41 2026] 127.0.0.1:51486 Accepted [Fri Sep 25 01:44:41 2026] 127.0.0.1:51486 Closing [Fri Sep 25 01:44:42 2026] 127.0.0.1:51490 Accepted [Fri Sep 25 01:44:42 2026] 127.0.0.1:51490 Closing [Fri Sep 25 01:44:42 2026] 127.0.0.1:51494 Accepted [Fri Sep 25 01:44:42 2026] 127.0.0.1:51494 Closing [Fri Sep 25 01:45:07 2026] 127.0.0.1:53326 Accepted [Fri Sep 25 01:45:07 2026] 127.0.0.1:53326 Closing [Fri Sep 25 01:45:07 2026] 127.0.0.1:53332 Accepted [Fri Sep 25 01:45:07 2026] 127.0.0.1:53332 Closing [Fri Sep 25 01:45:07 2026] 127.0.0.1:53346 Accepted [Fri Sep 25 01:45:07 2026] 127.0.0.1:53346 Closing [Fri Sep 25 01:45:12 2026] 127.0.0.1:53360 Accepted [Fri Sep 25 01:45:12 2026] 127.0.0.1:53360 Closing [Fri Sep 25 01:45:12 2026] 127.0.0.1:53368 Accepted [Fri Sep 25 01:45:12 2026] 127.0.0.1:53368 Closing [Fri Sep 25 01:45:13 2026] 127.0.0.1:53382 Accepted
Generated 2026-09-24 23:45:13 UTC · Gladex.de