Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/holger

.nornir/feature-complete-gaps.md

Holger — the feature-complete checklist (the long gap list)

Purpose. The single driver that answers "what does feature-complete Holger mean, and what is still missing?" — mined from the git history, PLAN.md, artifactory-parity-design.md, holger-tiers.md, static-dynamic-profile-design.md, the shared-infra charter (workspace_nordisk/.nornir/shared-infra-index.md), and the modgunn/master-plan arc. artifactory-parity-design.md is the external parity view (vs Artifactory/Nexus); this doc is the internal completeness view across the three shipped executables and the shared-infra seams they must consume. Kept at altitude; each item links to where the detail lives.

Legend: ✅ shipped & tested · 🟡 partial (exists, not in the packaged/enforced shape) · 🧭 designed, not in code · ❌ absent. Every ❌/🟡 is a candidate for a future round — do NOT invent churn against a ✅.

Last synced against the tree: 2026-07-14.


0. The three executables (build-space, task #36) — the completeness frame

One source tree (server/cli/src/main.rs), three distinctly-named binaries selected by a mutually-exclusive fatness feature, materialized by nornir-build-thing from .nornir/build-variants.toml and consumed by dwarves' pipeline. Each column below is a tier; a feature is only "complete" when it lands in the tier(s) that should carry it.

Tier Binary Mode feature Federation Intended role State
embedded holger-embedded embedded none in-process engine as a standalone binary; leanest, zero-federation ✅ Built
mini holger-mikro mini none stripped read-only standalone server (airgap/red-zone) ✅ Built (single binary; crate-split floor 🧭)
full holger-full full Skidbladnir ship writable everything-on server (proxy/import/RON graph) ✅ Built

Detail: .nornir/holger-tiers.md, .nornir/build-variants.toml, .nornir/static-dynamic-profile-design.md.

Tier-completeness gaps


1. Formats / protocols (parity §A)

server/repository/: znippy-{maven,python,rust,npm,nuget,go,gem,deb,rpm,helm,docker, conda,composer,package} + writable file-rust (Cargo sparse) + file-oci.

2. Remote / proxy / virtual (parity §B)

3. Promotion / staging / lifecycle (parity §C — the Artifactory headline)

4. Retention / cleanup (parity §D) — planner + executor shipped

5. Integrity / CAS (parity §E)

6. Security / policy gate (parity §F — the modgunn seam)

7. RBAC / auth / tokens (parity §G — modgunn + skidbladnir)

8. Search / metadata / REST (parity §H)

9. Replication / HA (parity §I)

10. Audit / events / webhooks (parity §J)

11. Ops / observability / misc (parity §K)

12. Service, jobs, UI, warehouse, build — the shared-infra seams


Priority shortlist for the next rounds (crucial-first, self-contained-first)

  1. Retention/cleanup planner (§4) — ✅ planner shipped (pure plan_retention + CLI + HEAVY bench). NEXT: the jera executor (drop superseded archive generations) → skade decision log, + per-artifact ingest time so max-age bites over the live listing.
  2. Cross-repo search verb (§8) — ✅ shipped, and custom artifact properties (the one deferred axis) — ✅ shipped (PropertyStore + property search axis on gRPC/HTTP/CLI + PropertyService.{Set,Get}Property gRPC RPCs + PUT/DELETE /-/properties HTTP write door + holger-server properties CLI — write/read symmetric on all surfaces; .nornir/properties-design.md). NEXT here: property-based retention/promotion policy; repo CRUD over the API.
  3. Prometheus /metrics (§11) — ✅ shipped (read-only GET /metrics door + process-global AtomicU64 registry + per-repo artifact gauge), and gRPC-verb counters — ✅ shipped (the gRPC plane now feeds the same holger_requests_total{verb} family via the single record_audit choke point + one shared Verb::from_audit_action classifier — the HTTP twin collapsed — plus a distinct promote verb). NEXT here: proxy hit/miss counters + request-duration histograms (both additive over the same global registry).
  4. Generic/Raw writable repo (§1) — ✅ shipped (RawBackend, ron_repo_type: "raw", path-addressed loose-file bucket + HTTP door + traversal guard + SHA-256-verified delete, reusing search/retention/replication/ metrics unchanged). custom per-blob properties (the deferred §8 axis) — ✅ shipped (see #2 — PropertyStore + property search axis).
  5. The crate-split floor + egress gate (§0) — makes mini provably stripped.
  6. Offline OIDC (§7) — completes the airgap auth path for mini/embedded.
  7. Per-upstream credentials + negative caching (§2) — proxy hardening, BOTH ✅ shipped: negative caching (ron_negative_cache_secs opt-in miss cache in ProxyBackend) + per-upstream credentials (each remote its own ron_upstream_auth — was already wired; ledger corrected). NEXT here: metadata/index-doc caching.
  8. Collapse the modgunn Decision twin (§6) — Law #1 hygiene.