3d7f0505b0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
80 lines
4.9 KiB
Markdown
80 lines
4.9 KiB
Markdown
# felhom.eu — task reports
|
||
|
||
> **Overwrite** this file with a summary of the most recent task only (uniform with the other repos; not cumulative). The cumulative hub history lives in [hub/CHANGELOG.md](hub/CHANGELOG.md); the scripts history lives in [scripts/CHANGELOG.md](scripts/CHANGELOG.md).
|
||
|
||
---
|
||
|
||
# REPORT — `felhom-app-catalog` skill (4th) + SparkyFitness finalized as its worked example (2026-07-03)
|
||
|
||
Companion half in `app-catalog-felhom.eu/REPORT.md` (the template changes + live-deploy evidence).
|
||
|
||
## Baselines
|
||
|
||
| Repo | Base → head |
|
||
|---|---|
|
||
| felhom.eu | `7ad111c` → this push (`skills/felhom-app-catalog/SKILL.md` NEW + docs) |
|
||
| app-catalog-felhom.eu | `15cdf7b` → `c7490f7` (sparkyfitness finalized + REUSE.md probe-naming row) |
|
||
| felhom-controller | READ-ONLY (sync.go + healthprobe.go consulted to state consumer behavior accurately) |
|
||
|
||
## The skill
|
||
|
||
- **Workflow, not reference:** research → inspect-the-image healthcheck choice → compose →
|
||
`.felhom.yml` → live UI deploy on demo → verify healthy → reconcile count → finish. Every field
|
||
table is a POINTER to app-catalog `REUSE.md` §1–2 / `README.md` §format — the shipped SKILL.md
|
||
contains no field tables at all (checked); the one new fact it teaches (probe-container naming)
|
||
was placed in REUSE.md and is referenced from the skill.
|
||
- **Installer:** no change needed — `install_skills.py` auto-discovers `skills/*/SKILL.md` dirs
|
||
(line 69). Ran it: `felhom-app-catalog junction -> E:\git\felhom.eu\skills\felhom-app-catalog`.
|
||
- **Fresh-session discovery:** `claude -p "List your custom skills…"` → all 4 listed
|
||
(`felhom-app-catalog`, `felhom-build-deploy`, `felhom-testing`, `felhom-ui-design`).
|
||
|
||
## Two verified facts the exercise added to the knowledge base
|
||
|
||
1. **Probe-container naming (REUSE.md row, new):** the controller-side `healthcheck.checks[]`
|
||
probe dials the container named EXACTLY like the stack dir; fallback = first running
|
||
prefix-match — in a multi-container stack that can be the DB. Convention: exposed service's
|
||
`container_name` = stack name (vaultwarden/rallly already comply; sparkyfitness now does).
|
||
2. **BusyBox `ash` `command -v` takes ONE argument** — `command -v wget curl node python3`
|
||
reported "wget only" in both SparkyFitness images while per-tool runs showed curl (and node in
|
||
the server) present. The skill's inspect command is a per-tool loop for this reason.
|
||
|
||
## SparkyFitness — markers resolved by inspection (no more VERIFY-BEFORE-FINALIZE)
|
||
|
||
| Image (both tags RESOLVE) | wget | curl | node | python3 | Family chosen |
|
||
|---|---|---|---|---|---|
|
||
| `codewithcj/sparkyfitness:v0.17.2` (nginx SPA) | /usr/bin/wget | /usr/bin/curl | no | no | BusyBox-wget `--spider :80/` (kept — most common family) |
|
||
| `codewithcj/sparkyfitness_server:v0.17.2` (Node) | /usr/bin/wget | /usr/bin/curl | /usr/local/bin/node v24.17.0 | no | node-exec HTTP GET `:3010/api/health` status<400 (real status check, kept) |
|
||
|
||
`/api/health` existence proven live: `{"status":"UP"}`. `mem_limit` arithmetic verified:
|
||
512 (db) + 1024 (server) + 256 (frontend) = **1792M** = the `.felhom.yml` value (comment added).
|
||
|
||
## Live validation (method stated per claim)
|
||
|
||
SparkyFitness was ALREADY deployed on demo from the draft (4 h prior, three containers healthy) —
|
||
so the live action was applying the FINALIZED template: "Sablonok frissítése" then the card's
|
||
"Frissítés", both clicked in the real dashboard via the browser bridge (claude-in-chrome).
|
||
Compose recreated only the renamed frontend (`sparkyfitness`, healthy in 21 s); server + db
|
||
untouched (Up 4 h) → the two `data_key` secrets were NOT regenerated, as required. Verifications:
|
||
git-sync file content, `docker ps`, `/api/health`, traefik Host-header curl (200), and
|
||
`GET /api/stacks/sparkyfitness` (the endpoint the UI polls) — controller probe verdict
|
||
`healthy: true, http :80/ → 200 (6ms)` against the renamed container. Kept deployed (7.3 option A;
|
||
expendable demo box, real catalog app).
|
||
|
||
## App-count reconciliation (recorded, NOT fixed)
|
||
|
||
Real catalog: **53** templates. Website `gyik.html` claims "több mint 45" (true but lagging);
|
||
`alkalmazasok.html` per-category `app-count` spans sum **49** ≠ 53. Website fixes are
|
||
`felhom-ui-design` + `site_gates.py` territory — separate task.
|
||
|
||
## Observations (not acted on)
|
||
|
||
- The controller UI card and `docker ps` agreed throughout; the probe's DEBUG-level per-stack log
|
||
lines are invisible at INFO — the `GET /api/stacks/<name>` endpoint is the reliable verdict
|
||
source for validation.
|
||
- `paperless-ngx`'s containers (`paperless-webserver`…) match NEITHER the exact-name nor the
|
||
prefix fallback of its stack name `paperless-ngx` — its controller-side probe likely never runs
|
||
(silently "skipped no container"). Candidate follow-up: rename or add a probe-container hint;
|
||
NOT touched here.
|
||
- The pre-rename fallback DID probe the right container on demo (probe was green before the
|
||
update) — the rename converts order-dependent luck into the deterministic convention.
|