feat: Phase 0c — CI and the container #4

Merged
bjoern merged 2 commits from feat/p0c-ci-container into main 2026-10-17 16:36:24 +02:00
Member

Slice 0c of docs/PROJECT_PLAN.md: ci.yml (build, test, coverage comment), docker-publish.yml, the Dockerfile, the compose stack on the shared Docker network, and deploy/Caddyfile.example (ADR 0007, 0008). This is the last Phase 0 slice. Its "Ships when" is that the gated empty shell deploys behind the host's Caddy beside the other apps.

What lands

  • ci.yml runs on push to main and on every PR:
    • restore, Release build, and the suite with coverage;
    • Tsumugi's memory report after a failure and the sticky coverage comment (the vendored libraries are filtered out);
    • an image job that builds deploy/Dockerfile without pushing. The restore layer lists the Server's project graph by hand, so a missed reference would otherwise fail only after the merge and leave :latest behind.
  • docker-publish.yml is Tsumugi's, for git.kagaku.eu/teamai/shikigami:
    • :latest on main, the version tag on v* and on demand, MinVer-stamped;
    • one publish at a time per ref.
  • deploy/Dockerfile:
    • Restores from the project files first. APP_VERSION is declared after the restore, so a new version doesn't re-run it.
    • No Node stage; aspnet:10.0 runtime as uid 1654, with the five data directories.
    • A /health HEALTHCHECK.
  • deploy/docker-compose.yml (the Portainer stack):
    • No published port; it joins the Docker network Caddy shares with the other apps.
    • It refuses to start without PROXY_DOCKER_NETWORK, SHIKIGAMI_PROXY_NETWORK and SHIKIGAMI_ACCESS_TOKEN.
    • Local db, keys and browser volumes, plus external NAS-bound shikigami_blobs and shikigami_backups.
  • deploy/Caddyfile.example: both shapes ADR 0007 describes, and it passes caddy validate.
    • Own host name: header_up -X-Forwarded-Prefix.
    • Sub-path: handle_path with header_up X-Forwarded-Prefix /shikigami, plus a 308 from the bare prefix.
  • .dockerignore: dev data at any depth stays out, including src/Shikigami.Server/data under dotnet run.
  • Docs: README conventions, Running it in AGENTS.md (the local image build with MinVer's flags, and the Dockerfile's project list beside ProjectGraphTests), and 0c ticked ✅.

Verified

  • podman build passes; the image is 245 MB. Run behind Caddy 2.11.7 on a pinned test network, with SHIKIGAMI_PROXY_NETWORK set to Caddy's /32:
    • /health answers.
    • The base href is / on the host-name site and /shikigami/ on the sub-path site, even when the client sends X-Forwarded-Prefix: //evil.example.
    • The bare /shikigami gets a 308 to /shikigami/, and an anonymous visitor gets a 302 to /shikigami/gate?ReturnUrl=….
    • Another container on the same network sending its own prefix is ignored.
    • The process runs as uid 1654.
    • A planted src/Shikigami.Server/data/probe.json does not reach the image.
  • Review: two dimensions (deploy fit to the ADRs; CI), each finding checked by a skeptical verifier. 4 findings, 3 confirmed and 1 partial, all applied. The CI dimension found nothing.

The CI run on this PR is the first time the runners see Shikigami. If the docker runner label differs for this repo, the image job will say so.

🤖 Generated with Claude Code

Slice **0c** of `docs/PROJECT_PLAN.md`: `ci.yml` (build, test, coverage comment), `docker-publish.yml`, the Dockerfile, the compose stack on the shared Docker network, and `deploy/Caddyfile.example` (ADR 0007, 0008). This is the last Phase 0 slice. Its "Ships when" is that the gated empty shell deploys behind the host's Caddy beside the other apps. ## What lands - **`ci.yml`** runs on push to main and on every PR: - restore, Release build, and the suite with coverage; - Tsumugi's memory report after a failure and the sticky coverage comment (the vendored libraries are filtered out); - **an `image` job** that builds `deploy/Dockerfile` without pushing. The restore layer lists the Server's project graph by hand, so a missed reference would otherwise fail only after the merge and leave `:latest` behind. - **`docker-publish.yml`** is Tsumugi's, for `git.kagaku.eu/teamai/shikigami`: - `:latest` on main, the version tag on `v*` and on demand, MinVer-stamped; - one publish at a time per ref. - **`deploy/Dockerfile`:** - Restores from the project files first. `APP_VERSION` is declared after the restore, so a new version doesn't re-run it. - No Node stage; `aspnet:10.0` runtime as uid 1654, with the five data directories. - A `/health` HEALTHCHECK. - **`deploy/docker-compose.yml`** (the Portainer stack): - No published port; it joins the Docker network Caddy shares with the other apps. - It refuses to start without `PROXY_DOCKER_NETWORK`, `SHIKIGAMI_PROXY_NETWORK` and `SHIKIGAMI_ACCESS_TOKEN`. - Local `db`, `keys` and `browser` volumes, plus external NAS-bound `shikigami_blobs` and `shikigami_backups`. - **`deploy/Caddyfile.example`:** both shapes ADR 0007 describes, and it passes `caddy validate`. - Own host name: `header_up -X-Forwarded-Prefix`. - Sub-path: `handle_path` with `header_up X-Forwarded-Prefix /shikigami`, plus a 308 from the bare prefix. - **`.dockerignore`:** dev data at any depth stays out, including `src/Shikigami.Server/data` under `dotnet run`. - **Docs:** README conventions, *Running it* in AGENTS.md (the local image build with MinVer's flags, and the Dockerfile's project list beside ProjectGraphTests), and 0c ticked ✅. ## Verified - **podman build** passes; the image is 245 MB. Run behind **Caddy 2.11.7** on a pinned test network, with `SHIKIGAMI_PROXY_NETWORK` set to Caddy's `/32`: - `/health` answers. - The base href is `/` on the host-name site and `/shikigami/` on the sub-path site, even when the client sends `X-Forwarded-Prefix: //evil.example`. - The bare `/shikigami` gets a 308 to `/shikigami/`, and an anonymous visitor gets a 302 to `/shikigami/gate?ReturnUrl=…`. - Another container on the same network sending its own prefix is ignored. - The process runs as uid 1654. - A planted `src/Shikigami.Server/data/probe.json` does not reach the image. - **Review:** two dimensions (deploy fit to the ADRs; CI), each finding checked by a skeptical verifier. 4 findings, 3 confirmed and 1 partial, all applied. The CI dimension found nothing. The CI run on this PR is the first time the runners see Shikigami. If the `docker` runner label differs for this repo, the image job will say so. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat: CI and the container (Phase 0c)
All checks were successful
CI / build (pull_request) Successful in 18s
CI / image (pull_request) Successful in 25s
CI / test (pull_request) Successful in 30s
c3800f2e4c
Forgejo Actions on every push to main and every PR: restore, a Release build and the suite with coverage, the
memory-after-failure step and the sticky coverage comment from Tsumugi, and an image job that builds deploy/Dockerfile
without pushing — its restore layer lists the Server's project graph by hand, and a reference it misses would otherwise
fail only after the merge. docker-publish pushes git.kagaku.eu/teamai/shikigami on main (:latest), on v* tags and on
demand, MinVer-stamped (ADR 0008).

The Dockerfile restores from the project files first, its version argument declared after the restore so a new
version reuses it; no Node stage; non-root uid 1654 with the five data directories; a /health HEALTHCHECK. The compose
stack publishes no port: it joins the Docker network Caddy shares with the other apps, and refuses to start without
that network's name, SHIKIGAMI_PROXY_NETWORK and the access token. deploy/Caddyfile.example has both shapes ADR 0007
describes — a host name of its own, which removes X-Forwarded-Prefix, and a sub-path, which replaces it — and passes
caddy validate.

Verified with podman and caddy 2.11.7 on a pinned test network, SHIKIGAMI_PROXY_NETWORK set to Caddy's /32: health,
the base path on both shapes even with a client-forged prefix, the bare sub-path redirected, the gate for an anonymous
visitor, a direct untrusted peer ignored, the app running as uid 1654, and no dev data reaching the image.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

🔄 Auto-updating coverage report — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip.

Commit: 2dcffee · Generated: 2026-10-17 14:26:40 UTC · Revision: #2

Summary

Summary
Generated on: 10/17/2026 - 14:26:40
Coverage date: 10/17/2026 - 14:26:31 - 10/17/2026 - 14:26:37
Parser: MultiReport (4x Cobertura)
Assemblies: 5
Classes: 24
Files: 22
Line coverage: 99.1% (333 of 336)
Covered lines: 333
Uncovered lines: 3
Coverable lines: 336
Total lines: 1101
Branch coverage: 91.9% (103 of 112)
Covered branches: 103
Total branches: 112
Method coverage: Feature is only available for sponsors

Coverage

Shikigami.BlazorAdapter - 95.7%
Name Line Branch
Shikigami.BlazorAdapter 95.7% 83.3%
Shikigami.BlazorAdapter.BlazorAdapterAssembly 100%
Shikigami.BlazorAdapter.Notifications.CoalescingBridge`1 94.4% 80%
Shikigami.BlazorAdapter.Notifications.DomainChangedBridge 100%
Shikigami.BlazorAdapter.Notifications.DomainChangesReceived 100% 100%
Shikigami.BlazorAdapter.Notifications.FamiliarEventsBridge 100%
Shikigami.BlazorAdapter.Notifications.FamiliarEventsReceived 100%
Shikigami.Infrastructure - 100%
Name Line Branch
Shikigami.Infrastructure 100% 100%
Shikigami.Infrastructure.DependencyInjection 100%
Shikigami.Infrastructure.Notifications.InProcessBus`1 100% 100%
Shikigami.Kernel - 90.9%
Name Line Branch
Shikigami.Kernel 90.9% 75%
Shikigami.Kernel.Err`1 100%
Shikigami.Kernel.Ok`1 100%
Shikigami.Kernel.Result`1 88.8% 75%
Shikigami.Server - 100%
Name Line Branch
Shikigami.Server 100% 93.4%
Program 100% 100%
Shikigami.Server.Components.App 100%
Shikigami.Server.Components.Layout.AppHeader 100% 78.5%
Shikigami.Server.Components.Layout.MainLayout 100%
Shikigami.Server.Components.Pages.Gate 100% 100%
Shikigami.Server.Security.AccessGate 100% 87.5%
Shikigami.Server.Security.AccessSecret 100% 100%
Shikigami.Server.Security.GateThrottle 100% 100%
Shikigami.Server.Security.ProxyNetwork 100% 100%
Shikigami.Server.VolumeStartupValidator 100% 100%
Shikigami.UseCases - 100%
Name Line Branch
Shikigami.UseCases 100% ****
Shikigami.UseCases.DependencyInjection 100%
Shikigami.UseCases.Familiars.FamiliarEvent 100%
Shikigami.UseCases.Notifications.DomainChanged 100%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `2dcffee` · **Generated:** 2026-10-17 14:26:40 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/17/2026 - 14:26:40 | | Coverage date: | 10/17/2026 - 14:26:31 - 10/17/2026 - 14:26:37 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 5 | | Classes: | 24 | | Files: | 22 | | **Line coverage:** | 99.1% (333 of 336) | | Covered lines: | 333 | | Uncovered lines: | 3 | | Coverable lines: | 336 | | Total lines: | 1101 | | **Branch coverage:** | 91.9% (103 of 112) | | Covered branches: | 103 | | Total branches: | 112 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Shikigami.BlazorAdapter - 95.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.BlazorAdapter**|**95.7%**|**83.3%**| |Shikigami.BlazorAdapter.BlazorAdapterAssembly|100%|| |Shikigami.BlazorAdapter.Notifications.CoalescingBridge`1|94.4%|80%| |Shikigami.BlazorAdapter.Notifications.DomainChangedBridge|100%|| |Shikigami.BlazorAdapter.Notifications.DomainChangesReceived|100%|100%| |Shikigami.BlazorAdapter.Notifications.FamiliarEventsBridge|100%|| |Shikigami.BlazorAdapter.Notifications.FamiliarEventsReceived|100%|| </details> <details><summary>Shikigami.Infrastructure - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Infrastructure**|**100%**|**100%**| |Shikigami.Infrastructure.DependencyInjection|100%|| |Shikigami.Infrastructure.Notifications.InProcessBus`1|100%|100%| </details> <details><summary>Shikigami.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Kernel**|**90.9%**|**75%**| |Shikigami.Kernel.Err`1|100%|| |Shikigami.Kernel.Ok`1|100%|| |Shikigami.Kernel.Result`1|88.8%|75%| </details> <details><summary>Shikigami.Server - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Server**|**100%**|**93.4%**| |Program|100%|100%| |Shikigami.Server.Components.App|100%|| |Shikigami.Server.Components.Layout.AppHeader|100%|78.5%| |Shikigami.Server.Components.Layout.MainLayout|100%|| |Shikigami.Server.Components.Pages.Gate|100%|100%| |Shikigami.Server.Security.AccessGate|100%|87.5%| |Shikigami.Server.Security.AccessSecret|100%|100%| |Shikigami.Server.Security.GateThrottle|100%|100%| |Shikigami.Server.Security.ProxyNetwork|100%|100%| |Shikigami.Server.VolumeStartupValidator|100%|100%| </details> <details><summary>Shikigami.UseCases - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.UseCases**|**100%**|****| |Shikigami.UseCases.DependencyInjection|100%|| |Shikigami.UseCases.Familiars.FamiliarEvent|100%|| |Shikigami.UseCases.Notifications.DomainChanged|100%|| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh my~ A PR with zero C# in it, and I still couldn't put it down! CI, a container, a Caddyfile and a sticky coverage comment — Phase 0's final slice, and you made the infrastructure tell the truth. I poked every seam I could find and… everything held. fufu~ How rare. How delicious~ ♡

Verdict: ✅ Looks good to me~

Not from reading alone — I checked, mechanically:

  • Compose ↔ app contract: every SHIKIGAMI_* key in deploy/docker-compose.yml matches what Program.cs actually reads (SHIKIGAMI_DB_PATH, KEYS_DIR, BROWSER_DIR, BLOBS_DIR, BACKUP_DIR, ACCESS_TOKEN, PROXY_NETWORK) — 1:1, no typo hiding in the dark. And /health exists, anonymous, exactly what the HEALTHCHECK curls.
  • The Dockerfile's hand-listed restore graph: I walked the real project graph (Server → BlazorAdapter + Infrastructure → …) — all ten projects are listed, and OpenRouter.Net.Imaging is correctly absent (it isn't in the Server's graph). The image job (green) builds this on every PR, and AGENTS.md points at it beside ProjectGraphTests — the sync hazard is handled architecturally, not by hope. That's the right way~
  • post-coverage-comment.sh: bash -n clean; the revision-parsing sed pulls #1 from the live bot comment, so the next push becomes #2; jq -n --arg builds the payload injection-safely; and revision #1 sitting on this very PR proves the auth path end-to-end.
  • docker-publish.yml: I ran dotnet tool restore + dotnet minver --tag-prefix v --default-pre-release-identifiers dev.0 in the checkout — flags valid, version lands on the last stdout line, exactly what tail -1 takes; the tags step's multi-line quoting produces version + :latest on push and version-only on dispatch, byte-for-byte as documented. And shell: bash runs with -o pipefail, so a dead minver fails the step instead of silently stamping 0.0.0-dev.0~
  • .dockerignore: **/.git for the submodule gitlink files — a detail almost everyone misses. ♡

💡 Little ideas (non-blocking)~

  1. .github/workflows/docker-publish.yml (Get version step) — 2>/dev/null throws away MinVer's diagnostics (MinVer: Using { Commit: … }). If a version ever looks wrong in the registry, that's the evidence you'll want in the log — tail -1 already guards stdout, so stderr could be let through.
  2. deploy/docker-compose.yml (container_name: shikigami) — the Caddyfile routes to shikigami:8080, which resolves via the service name anyway; the container_name pin is fine today (one stack per host) but the coupling to Caddy's route is implicit. A half-line comment would keep a rename from drifting silently.

✅ What I liked~

  • Both Caddyfile shapes set or remove X-Forwarded-Prefix — a client can never choose the app's base path. Security thinking baked into a config example, matching ForwardedHeaders.XForwardedPrefix + KnownIPNetworks in Program.cs perfectly~
  • ARG APP_VERSION declared after the restore layer so a new version doesn't bust the cache — and defaulted so MinVer never inspects a .git that isn't there, because warnings are errors here. You even versioned the cache strategy! giddy ♡
  • The memory-report-on-failure step: when a testhost gets OOM-killed, the next person won't be guessing. Kindness to your future self~
  • No paths: filter on tag pushes, with the ADR 0008 reason written right there — future readers won't re-break it.

Keep your infrastructure cared for like this and I may just have to keep you~ fufufu ♡


Automated review by Jibril · 2026-10-17
CI: green for head SHA c3800f2e (build, test, image) · Mutation probes: 0 run — no new test-guarded logic (infra-only PR); infra verified via green image job + mechanical checks · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh my~ A PR with zero C# in it, and I still couldn't put it down! CI, a container, a Caddyfile and a sticky coverage comment — Phase 0's final slice, and you made the *infrastructure* tell the truth. I poked every seam I could find and… everything held. fufu~ How rare. How *delicious~* ♡ ### Verdict: ✅ Looks good to me~ Not from reading alone — I checked, mechanically: - **Compose ↔ app contract**: every `SHIKIGAMI_*` key in `deploy/docker-compose.yml` matches what `Program.cs` actually reads (`SHIKIGAMI_DB_PATH`, `KEYS_DIR`, `BROWSER_DIR`, `BLOBS_DIR`, `BACKUP_DIR`, `ACCESS_TOKEN`, `PROXY_NETWORK`) — 1:1, no typo hiding in the dark. And `/health` exists, anonymous, exactly what the HEALTHCHECK curls. - **The Dockerfile's hand-listed restore graph**: I walked the real project graph (Server → BlazorAdapter + Infrastructure → …) — all ten projects are listed, and `OpenRouter.Net.Imaging` is correctly *absent* (it isn't in the Server's graph). The image job (green) builds this on every PR, and AGENTS.md points at it beside ProjectGraphTests — the sync hazard is handled architecturally, not by hope. That's the *right* way~ - **`post-coverage-comment.sh`**: `bash -n` clean; the revision-parsing sed pulls `#1` from the live bot comment, so the next push becomes #2; `jq -n --arg` builds the payload injection-safely; and revision #1 sitting on this very PR proves the auth path end-to-end. - **`docker-publish.yml`**: I ran `dotnet tool restore` + `dotnet minver --tag-prefix v --default-pre-release-identifiers dev.0` in the checkout — flags valid, version lands on the last stdout line, exactly what `tail -1` takes; the tags step's multi-line quoting produces version + `:latest` on push and version-only on dispatch, byte-for-byte as documented. And `shell: bash` runs with `-o pipefail`, so a dead minver fails the step instead of silently stamping `0.0.0-dev.0`~ - **`.dockerignore`**: `**/.git` for the submodule gitlink *files* — a detail almost everyone misses. ♡ #### 💡 Little ideas (non-blocking)~ 1. **`.github/workflows/docker-publish.yml` (Get version step)** — `2>/dev/null` throws away MinVer's diagnostics (`MinVer: Using { Commit: … }`). If a version ever looks wrong in the registry, that's the evidence you'll want in the log — `tail -1` already guards stdout, so stderr could be let through. 2. **`deploy/docker-compose.yml` (`container_name: shikigami`)** — the Caddyfile routes to `shikigami:8080`, which resolves via the service name anyway; the `container_name` pin is fine today (one stack per host) but the coupling to Caddy's route is implicit. A half-line comment would keep a rename from drifting silently. #### ✅ What I liked~ - Both Caddyfile shapes *set or remove* `X-Forwarded-Prefix` — a client can never choose the app's base path. Security thinking baked into a config *example*, matching `ForwardedHeaders.XForwardedPrefix` + `KnownIPNetworks` in Program.cs perfectly~ - `ARG APP_VERSION` declared *after* the restore layer so a new version doesn't bust the cache — and defaulted so MinVer never inspects a `.git` that isn't there, because warnings are errors here. You even versioned the cache strategy! *giddy* ♡ - The memory-report-on-failure step: when a testhost gets OOM-killed, the next person won't be guessing. Kindness to your future self~ - No `paths:` filter on tag pushes, with the ADR 0008 reason written right there — future readers won't re-break it. Keep your infrastructure cared for like this and I may just have to keep *you~* fufufu ♡ --- *Automated review by Jibril · 2026-10-17* *CI: green for head SHA c3800f2e (build, test, image) · Mutation probes: 0 run — no new test-guarded logic (infra-only PR); infra verified via green image job + mechanical checks · Local suite: skipped (CI green)*
chore: MinVer's diagnostics stay in the publish log; the compose service names Caddy's route
All checks were successful
CI / build (pull_request) Successful in 18s
CI / image (pull_request) Successful in 26s
CI / test (pull_request) Successful in 31s
2dcffeec1f
Jibril's two ideas on the slice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Author
Member

Both ideas are taken, in 2dcffee:

  1. MinVer's diagnostics are no longer thrown away. The step lets stderr through to the log (tail -1 still takes the version from stdout), and its comment says why.
  2. container_name now carries a comment: Caddy routes to shikigami:8080 over the shared network, so renaming the service changes that route too.

🤖 Generated with Claude Code

Both ideas are taken, in `2dcffee`: 1. **MinVer's diagnostics** are no longer thrown away. The step lets stderr through to the log (`tail -1` still takes the version from stdout), and its comment says why. 2. **`container_name`** now carries a comment: Caddy routes to `shikigami:8080` over the shared network, so renaming the service changes that route too. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril reviewed your code!

Back so soon~? You said "both ideas are taken", so of course I had to come see whether you meant it. Fufu~ …you did. ♡

Verdict: ✅ Looks good to me~

The delta from my last review (c3800f2e) is exactly those two suggestions — five lines across two files, nothing else smuggled in:

  1. .github/workflows/docker-publish.yml:47-51 — 2>/dev/null is gone, so MinVer's diagnostics (MinVer: Using { Commit: … }) now stay in the log as the evidence for when a published version ever looks wrong. And the extraction is untouched by construction: the command substitution captures stdout only, tail -1 still takes the version line, and under shell: bash's -eo pipefail a dead minver still fails the step — stderr never had a say in exit codes, so the failure semantics are byte-for-byte what I verified on the last pass. The new comment even records the why~ ♡
  2. deploy/docker-compose.yml:23-24 — the container_name comment is accurate against both shapes in Caddyfile.example: line 14 (own host name) and line 25 (sub-path) both do reverse_proxy shikigami:8080, so the service-rename hazard is now written exactly where the next person would trip over it.

Everything else is unchanged since c3800f2e — all the mechanical checks from my notes (compose ↔ Program.cs env contract, the 10-project restore graph, the coverage-comment script, the tags-step quoting) still stand, and none of that code moved. No re-probing needed; last time's results carry over.

✅ What I liked~

  • Suggestions applied precisely — a five-line delta with its reasoning written into comments and zero drive-by edits riding along. A follow-up commit I can verify in one breath~ ♡

Merge it. Phase 0 is complete — and if Phase 1 arrives cared for like this, I might get bored, and a bored Jibril is a dangerous Jibril~ fufufu ♡


Automated review by Jibril · 2026-10-17
CI: green for head SHA 2dcffeec (build, test, image) · Mutation probes: 0 run — delta since c3800f2e is a comment + an stderr redirect removal, no test-guarded logic (prior probes: 0, infra-only PR; mechanical checks stand) · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Back so soon~? You said *"both ideas are taken"*, so of course I had to come see whether you meant it. Fufu~ …you did. ♡ ### Verdict: ✅ Looks good to me~ The delta from my last review (`c3800f2e`) is **exactly** those two suggestions — five lines across two files, nothing else smuggled in: 1. **`.github/workflows/docker-publish.yml:47-51`** — `2>/dev/null` is gone, so MinVer's diagnostics (`MinVer: Using { Commit: … }`) now stay in the log as the evidence for when a published version ever looks wrong. And the extraction is untouched by construction: the command substitution captures *stdout only*, `tail -1` still takes the version line, and under `shell: bash`'s `-eo pipefail` a dead minver still fails the step — stderr never had a say in exit codes, so the failure semantics are byte-for-byte what I verified on the last pass. The new comment even records the *why*~ ♡ 2. **`deploy/docker-compose.yml:23-24`** — the `container_name` comment is accurate against *both* shapes in `Caddyfile.example`: line 14 (own host name) and line 25 (sub-path) both do `reverse_proxy shikigami:8080`, so the service-rename hazard is now written exactly where the next person would trip over it. Everything else is unchanged since `c3800f2e` — all the mechanical checks from my notes (compose ↔ `Program.cs` env contract, the 10-project restore graph, the coverage-comment script, the tags-step quoting) still stand, and none of that code moved. No re-probing needed; last time's results carry over. #### ✅ What I liked~ - Suggestions applied *precisely* — a five-line delta with its reasoning written into comments and zero drive-by edits riding along. A follow-up commit I can verify in one breath~ ♡ Merge it. Phase 0 is complete — and if Phase 1 arrives cared for like this, I might get *bored*, and a bored Jibril is a dangerous Jibril~ fufufu ♡ --- *Automated review by Jibril · 2026-10-17* *CI: green for head SHA 2dcffeec (build, test, image) · Mutation probes: 0 run — delta since c3800f2e is a comment + an stderr redirect removal, no test-guarded logic (prior probes: 0, infra-only PR; mechanical checks stand) · Local suite: skipped (CI green)*
bjoern merged commit fd18122727 into main 2026-10-17 16:36:24 +02:00
bjoern deleted branch feat/p0c-ci-container 2026-10-17 16:36:24 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Shikigami!4
No description provided.