Feature graph — human overview
Generated file — do not edit by hand. Rendered from
feature-graph.yaml(the machine-checkable source of truth) byscripts/gen-feature-graph-md.go. Edit the YAML, then runmake docs/generate.
Graph generated 2026-07-02, last refreshed 2026-07-31. 45 features.
Refresh notes
Section titled “Refresh notes”targeted re-verification at main ~541af2ee6 + working tree. CLI surface rulings folded in: there is NO shc dns subtree (owner ruling — DNS records are lifecycle-managed via —host / the provider ladder; /api/dns is machine-facing only: the daemon lifecycle, terraform shc_dns_record over the UDS) and NO shc rollback verb (safety-snapshot restore is shc backup restore --before; the shc.stack.rollback routes remain as its backend). Other post-07-02 landings reflected in per-feature notes: http app repos (index.yaml + .app archives via Pages), canonical shc connection noun (provider = deprecated alias), forward partial-spec inference (shc.stack.services), vault restart unlock-pull, init pure-bootstrap (—nic/—nebula; provider flags deleted), hetzner DNS cloud-API migration, 8-platform provider gap-fill, acm-pca dropped from the aws capability row, retention cleanup task handlers bound. Line anchors from 2026-07-02 drift as main moves — verify before use. 2026-07-17 spot-refresh for the g1/F8/F9/rqlite merge wave (targeted corrections only, NOT a full re-extraction — entries not touched may still carry pre-merge anchors): storage engine is rqlite (external rqlited, raft :4002 + HTTP :4001 under gated mutual TLS — genesis default-on via NodeBootstrap.RaftTLS); cluster.single_node config key retired (single-node mode is marker-derived, daemon/daemon.go singleNodeMode); env SHC_SYSTEM_APPS renamed SHC_MODULES (system_plan.go); init flag set refreshed — —system-apps/—traefik-le* retired in favor of —modules-config + —acme-provider/—acme-directory/—acme-email; docs/reference/configuration/sse-config.md was deleted (its claim rows are historical). 2026-07-30 citation repoint for the B1 de-internal-ize + ce split (paths only, NOT a re-extraction — line anchors still date from extraction time): every internal/… and ent/schema/… citation re-resolved to where the code lives at HEAD, per the path convention in the header comment (bare = ce module, shc/… = this repo); the module X-code aggregate rows re-synced to docs/reference/errors.md (counts + per-module source dirs). Claims about deleted machinery removed or rewritten honestly: the core/template, cli and tests X-code modules are gone from the registry; the backup_cache_meta / locks / mesh_bootstrap_token dead tables no longer exist even as ent schemas; the storage.providers.shc task list is shc task ls; the postgres app is a ce builtin; greenbone/mail smtp plug/socket files renamed. 2026-07-30 re-extraction (same day, second pass): coverage ADDED for modules that post-date the 07-02 extraction and had no graph presence — new feature nodes licensing, system-image-extensions, origin-adapters, network-fabric, x9s-provider; extensions folding modules/internal_stacks, modules/portforward, modules/forms, modules/cron, modules/acme, core/daemonclient, core/nic, core/openstack, shc/core/rqlited, shc/core/enginemarker, shc/core/otelboot and shc/subsystems/leader_elector into their owning features. Every errors.md module with X-codes now carries an aggregate row in exactly one feature. New-node line anchors are extraction-time at shc 4f92d8947 / ce pin ef1aa08bb95d and drift as main moves. docs rows on the NEW nodes carry no claim counts (the per-doc claims pass was 07-02-only and its snapshots are retired) — they are marked “claims unextracted”. 2026-07-31 path repoint for the ee/ flatten (paths only, NOT a re-extraction): the former ee/ subtree moved to the repo root and the _ee/_ee_test file suffixes died, so every ee/… citation in this file became shc/… per the header convention (this repo is always shc/-prefixed now that both repos share the modules/core/cli/daemon/subsystems layout). Line anchors still date from their extraction/refresh time and drift as main moves.
Feature × surface matrix
Section titled “Feature × surface matrix”Cell values are entry/group counts on that surface in the YAML
(count-carrying aggregates count as 1 — e.g. an errors cell of 2 means
codes from 2 modules). · = no presence. Feature names link to the
detail sections below.
| feature | cli | api | int-api | hud | daemon | db | events | config | app-schema | errors | docs | notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
app-catalog | 7 | 11 | · | 2 | 4 | 2 | 1 | 5 | 1 | 2 | 11 | 3 |
app-install-lifecycle | 3 | 3 | · | 2 | · | · | 1 | 3 | 21 | 1 | 7 | 2 |
app-packaging | · | · | · | · | · | · | · | · | 81 | 2 | · | 1 |
presets | 5 | 1 | · | · | · | · | · | · | 8 | · | · | · |
vapps | · | · | · | · | · | · | · | · | 12 | · | · | · |
integrations | 4 | 3 | · | · | · | 1 | · | · | 27 | · | · | · |
stack-operations | 5 | 10 | 5 | · | 5 | 3 | 1 | · | · | 2 | 7 | 2 |
logs-shell-exec | 3 | 5 | 7 | · | · | · | · | · | · | 2 | 5 | · |
inspect-validate | 2 | 2 | · | · | · | · | · | · | · | 1 | 3 | · |
backup-restore | 27 | 21 | 41 | 2 | 10 | 3 | 1 | 24 | 16 | 2 | 11 | 5 |
schedules | 8 | 8 | · | 1 | 3 | 1 | 1 | · | · | 1 | 5 | 1 |
import-export | 3 | 3 | · | · | · | · | · | · | 7 | 1 | 6 | 1 |
clone-move | 2 | 3 | · | · | · | · | 1 | · | · | 1 | 7 | · |
origin-adapters | 4 | · | · | · | · | · | · | · | · | 1 | 3 | 4 |
jobs-tasks | 14 | 11 | · | · | 16 | 4 | 1 | 1 | 20 | 2 | 10 | 1 |
vault-secrets | 12 | 15 | 3 | 2 | 1 | 2 | 1 | 19 | 6 | 1 | 6 | 2 |
tls-certificates-ca | 11 | 6 | · | 1 | 6 | 2 | · | 4 | · | 1 | · | 3 |
ingress-routing | · | 5 | · | · | 4 | 2 | · | 5 | · | 2 | 1 | 3 |
dns-management | · | 5 | · | · | · | · | · | 36 | · | 1 | 6 | 2 |
port-forward | 1 | 1 | 1 | 2 | · | · | · | · | · | 2 | 3 | 3 |
mesh-networking | 12 | 5 | 8 | · | 5 | 1 | 1 | 1 | · | 3 | 6 | · |
network-fabric | · | · | · | · | · | 1 | · | 2 | · | 1 | 2 | 5 |
cluster-membership | 25 | 30 | 8 | · | 9 | 1 | 2 | 5 | · | 6 | 16 | 5 |
init-system-apps | 2 | 2 | · | · | · | · | · | 1 | · | · | 3 | 2 |
tenants | 6 | 4 | · | · | · | · | · | · | · | 1 | 4 | · |
auth-access | 12 | 11 | · | 4 | · | · | 1 | 12 | · | 2 | 6 | · |
quotas-usage | 5 | 6 | · | 1 | 2 | 1 | 1 | 10 | · | 1 | 5 | · |
licensing | 8 | 8 | · | · | 7 | 1 | · | 6 | · | 3 | 5 | 9 |
system-image-extensions | · | 2 | · | · | 6 | · | · | 4 | · | · | 2 | 8 |
health-status | 4 | 6 | 1 | · | 15 | · | 6 | 17 | · | 2 | 8 | 1 |
metrics-observability | · | 1 | 2 | · | 4 | · | 1 | 5 | · | 1 | 5 | 1 |
events-audit | 1 | 4 | 1 | 1 | 7 | 3 | 3 | · | · | 2 | 14 | · |
notifications | 2 | 1 | · | · | 1 | · | 1 | 9 | · | 1 | 4 | · |
config-management | 6 | 4 | · | 1 | 2 | 2 | 1 | 2 | · | 2 | 9 | · |
connections-providers | 7 | 6 | · | 1 | · | 1 | · | · | · | 2 | · | 4 |
storage-volumes | 23 | 23 | 8 | 1 | 6 | 4 | · | 7 | · | 2 | 7 | 2 |
docker-runtime | · | · | 13 | · | 3 | · | 1 | · | · | 1 | 4 | 1 |
hud-dashboard | 2 | 1 | · | 31 | 1 | · | · | 5 | · | 2 | 5 | 2 |
x9s-provider | 1 | · | · | · | · | · | · | · | · | · | · | 3 |
cli-experience | 7 | · | · | · | · | · | · | 36 | · | 3 | 8 | 3 |
daemon-runtime | 2 | 5 | 2 | · | 10 | 2 | · | 58 | · | 6 | 16 | 1 |
kv-store | · | · | · | · | · | 1 | · | · | · | 1 | · | 1 |
testing-harness | · | · | · | · | · | · | · | 5 | 1 | 1 | 2 | · |
docs-governance | · | · | · | · | · | · | · | · | · | · | 21 | · |
uncategorized | · | · | · | · | · | · | · | · | · | · | · | · |
Features
Section titled “Features”Each section lists the feature’s entries per surface (collapsed)
and its notes. @ file:line anchors are extraction-time
positions and drift as main moves — verify before use.
app-catalog
Section titled “app-catalog”App catalog: git app repos, bundled apps, search, marketplace metadata
- repo sync cron + repo crawler feed the catalog rows; HUD marketplace/repos views browse it
- FIXED since 07-02: the sync_all task handler is bound (daemon/services_seams_repo_crawler.go TaskOn V200006REPALL) — the repo-router-sync-all-unbound dead seam is gone
- 2026-07-09: http(s) app repositories — a repo URL serving index.yaml + .app archives catalogs without git (modules/repo/httpindex.go; published for the official catalog via GitLab Pages by scripts/gen-apps-index.go; docs/app-development/http-repos.md). Also git+file:// repo adds.
cli (7)
- shc repo @ modules/repo/commands/main.go:24
- shc repo add @ modules/repo/commands/add.go:32
- shc repo ls @ modules/repo/commands/ls.go:24
- shc repo rm @ modules/repo/commands/rm.go:22
- shc repo sync @ modules/repo/commands/sync.go:21
- shc repo update @ modules/repo/commands/update.go:24
- shc search @ modules/search/commands/commands.go:120
api (11)
- GET /api/method/shc.app.detail @ modules/app/router.go:100
- POST /api/method/shc.repo.sync @ modules/repo/router.go:122
- POST /api/method/shc.repo.sync_all @ modules/repo/router.go:121
- GET /api/method/shc.search @ modules/search/router.go:62
- GET /api/resource/App @ modules/app/router.go:99
- GET /api/resource/App/{name} @ modules/app/router.go:101
- GET /api/resource/Repo @ modules/repo/router.go:116
- POST /api/resource/Repo @ modules/repo/router.go:118
- DELETE /api/resource/Repo/{name} @ modules/repo/router.go:120
- GET /api/resource/Repo/{name} @ modules/repo/router.go:117
- PATCH /api/resource/Repo/{name} @ modules/repo/router.go:119
hud (2)
- view repos (key R (also row-aware r fall-through off stack/service/pod/backup rows, app.go:1580)) @ shc/modules/hud/state/state.go:27
- view marketplace (key A) @ shc/modules/hud/state/state.go:30
daemon (4)
- cron sync_all_repos_cron (0 */6 * * *, leader-gated) @ modules/repo/crons.go:79
- task-handler update_repository @ daemon/services_seams_repo_crawler.go:304
- task-handler log_repo_deleted @ daemon/services_seams_repo_crawler.go:311
- dead-path repo-router-sync-all-unbound @ modules/repo/router.go:307
db (2)
- table app @ ent/schema/app.go:15
- table repo @ ent/schema/repo.go:17
events (1)
- module repo event types (7): A200000REPCRT, A200001REPRMV, A200002REPSYN, V200003REPCRT, V200004REPDEL, V200005REPSYN, V200006REPALL
config (5)
- key repos [DEAD] @ core/config/default.yaml:361
- prefix repos.
@ core/config/default.yaml:361 - cron-override crons.sync_all_repos_cron @ modules/repo/crons.go:21
- env SHC_BUNDLED_APPS_DIRS @ modules/app/bundled.go:39
- env SHC_APP_DIR @ modules/test/service.go:132
app-schema (1)
- matrix:summary @ apps/
errors (2)
- module repo — 14 X-codes @ modules/repo/ (full list: docs/reference/errors.md)
- module search — 3 X-codes @ modules/search/ (full list: docs/reference/errors.md)
docs (11)
- docs/architecture/modules/repo.md (1 claim entries)
- docs/architecture/modules/search.md (1 claim entries)
- docs/guide/apps/README.md (1 claim entries)
- docs/guide/apps/postgres.md (1 claim entries)
- docs/reference/api/app.md (20 claim entries)
- docs/reference/api/repo.md (8 claim entries)
- docs/reference/api/search.md (2 claim entries)
- docs/reference/cli/repo.md (7 claim entries)
- docs/reference/errors.md [doc section (global)] (1 claim entries)
- docs/reference/errors.md [doc section repo] (4 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
app-install-lifecycle
Section titled “app-install-lifecycle”Install, uninstall and update apps as stacks (incl. install-watch UX and lifecycle hooks)
- the
appGo module spans catalog + install; its error codes and module doc are grouped here, catalog routes under app-catalog - installs emit no stack-scoped events (known gap); HUD install view is entered programmatically, no hotkey by design
cli (3)
- shc install @ modules/app/commands/install.go:29
- shc uninstall @ modules/app/commands/uninstall.go:18
- shc update @ modules/app/commands/update.go:35
api (3)
- POST /api/method/shc.stack.install @ modules/app/router.go:106
- POST /api/method/shc.stack.uninstall @ modules/app/router.go:108
- POST /api/method/shc.stack.update @ modules/app/router.go:107
hud (2)
- view install (key NONE (entered programmatically by fireInstall, install_flow.go:212; esc returns to PrevView, app.go:1442)) @ shc/modules/hud/state/state.go:51
- overlay install form + watch @ shc/modules/hud/install_flow.go:189 (startInstallForm) / :282 (renderInstallWatch)
events (1)
- module app event types (11): A200100STKINS, A200101STKUNI, A200102STKUPD, A200400STKSCL, A200401STKUNO, A200402STKUOC, A400401STKUOF, V200320STKRUN, V200321STKSTP, V200322STKDGR, V500320STKERR
config (3)
- env SHC_COMPOSE_NO_WAIT @ modules/app/compose_driver.go:74
- env SHC_STACK_NO_WAIT @ modules/app/swarm_driver.go:48
- env SHC_INSTALL_POLL_MS @ modules/app/compose_progress.go:59
app-schema (21)
- hook:pre_install @ modules/app/types.go:93
- hook:post_install @ modules/app/types.go:94
- hook:pre_update @ modules/app/types.go:95
- hook:post_update @ modules/app/types.go:96
- hook:pre_uninstall @ modules/app/types.go:97
- hook:post_uninstall @ modules/app/types.go:98
- hook:pre_recover @ modules/app/types.go:108
- hook:post_recover @ modules/app/types.go:109
- hook:pre_move @ modules/app/types.go:110
- hook:post_move @ modules/app/types.go:111
- hook:pre_clone @ modules/app/types.go:112
- hook:post_clone @ modules/app/types.go:113
- hook:pre_scale @ modules/app/types.go:114
- hook:post_scale @ modules/app/types.go:115
- hook:pre_rollback @ modules/app/types.go:116
- hook:post_rollback @ modules/app/types.go:117
- hook-action:bare-string @ modules/app/action.go:56-63
- hook-action:job @ modules/app/action.go:33
- hook-action:scale @ modules/app/action.go:34
- hook-action:halt @ modules/app/action.go:35
- hook:allowed-contexts-table @ modules/app/hooks.go:24-48
errors (1)
- module app — 161 X-codes @ modules/app/ (full list: docs/reference/errors.md)
docs (7)
- docs/architecture/flows/install.md (1 claim entries)
- docs/architecture/flows/uninstall.md (1 claim entries)
- docs/architecture/flows/upgrade.md (1 claim entries)
- docs/architecture/modules/app.md (1 claim entries)
- docs/reference/cli/app.md (22 claim entries)
- docs/reference/errors.md [doc section app] (64 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
app-packaging
Section titled “app-packaging”App packaging schema: app.yaml/vars.yaml/compose.yaml declarations, var markers, jinja rendering, render-context
- declaration surface only — consumed at render/install time; backup.yaml/exporter/socket/plug/vapp/preset keys are grouped under their owning features
app-schema (81)
- app.yaml:name @ modules/app/detail.go:61
- app.yaml:version @ modules/app/detail.go:62
- app.yaml:description @ modules/app/detail.go:63
- app.yaml:category @ modules/app/detail.go:64
- app.yaml:homepage @ modules/app/detail.go:65
- app.yaml:icon @ daemon/services_seams_repo_crawler.go:45
- app.yaml:tags @ daemon/services_seams_repo_crawler.go:46
- app.yaml:source @ apps/greenbone/app.yaml:7
- app.yaml:parent_app @ daemon/services_seams_repo_crawler.go:47
- app.yaml:vapp @ daemon/services_seams_repo_crawler.go:48
- app.yaml:vars @ modules/app/detail.go:66
- app.yaml:hooks @ modules/app/post_install_hooks.go:47
- app.yaml:crons @ modules/app/validate.go:303
- app.yaml:access @ modules/app/inject_traefik.go:178
- app.yaml:exposure @ modules/app/inject_traefik.go:192
- app.yaml:self_auth @ modules/app/inject_traefik.go:229
- app.yaml:timeouts @ apps/greenbone/app.yaml:15
- app.yaml:public @ apps/gitea/app.yaml:17
- app.yaml:requires @ apps/ivatar/app.yaml:15
- app.yaml:runtimes @ apps/mailcow/app.yaml:8
- vars:decl-marker ”@
” @ modules/app/detail.go:106-113 - vars:required-marker ”!” @ modules/app/detail.go:111
- vars:secret-marker “@secret” @ modules/app/integration_render.go:711 (secretSocketFields)
- vars:nested-groups @ modules/app/detail.go:94-104
- runtime-ref:scheme-hook @ modules/app/runtime_refs.go:47
- runtime-ref:hook://previous @ modules/app/runtime_refs.go:53-60
- runtime-ref:scheme-node @ modules/app/runtime_refs.go:48
- runtime-ref:node://ip @ modules/app/runtime_refs.go:75-82
- runtime-ref:node://id @ modules/app/runtime_refs.go:75-82
- runtime-ref:node://mesh-ip @ modules/app/runtime_refs.go:75-82
- runtime-ref:node://internal-ip @ modules/app/runtime_refs.go:75-82
- runtime-ref:node://hostname @ modules/app/runtime_refs.go:75-82
- runtime-ref:scheme-cluster @ modules/app/runtime_refs.go:49
- runtime-ref:cluster://leader-ip @ modules/app/runtime_refs.go:89-96
- runtime-ref:cluster://node-count @ modules/app/runtime_refs.go:89-96
- file:app.yaml @ modules/app/validate.go:124-148
- file:compose.yaml @ modules/app/validate.go:153-191
- file:vars.yaml @ modules/app/install_runner.go:1623 (loadVars)
- file:*.vvars.yaml @ modules/app/vapp_runner.go:136
- file:manifest.json (deployment sidecar) @ modules/app/manifest.go:20
- compose:x-shc-scale @ modules/app/scale_extension.go:33 (XShcScale)
- compose:x-shc-scale.max @ modules/app/scale_extension.go:35
- compose:x-shc-scale.backup @ modules/app/scale_extension.go:38
- compose:x-shc-scale.restore @ modules/app/scale_extension.go:41
- compose:x-shc-volumes @ core/volume/binding.go:34
- compose:x-shc-volumes.size @ core/volume/binding.go:128 (parseSizeBytes)
- compose:x-shc-volumes.access @ core/volume/binding.go:116-127
- compose:volume-spec SHC extras (perm/owner/noinit) @ core/volume/parse.go:6-23
- compose:mount-type classification @ core/volume/resolve.go:64 (DetectMountType)
- compose:jinja templating @ core/jinja/jinja.go:1-25
- jinja-filter:default @ core/jinja/jinja.go:408
- jinja-filter:basename @ core/jinja/jinja.go:424
- jinja-filter:dirname @ core/jinja/jinja.go:431
- jinja-filter:lower @ core/jinja/jinja.go:437
- jinja-filter:upper @ core/jinja/jinja.go:439
- jinja-filter:trim @ core/jinja/jinja.go:441
- jinja-filter:string @ core/jinja/jinja.go:443
- jinja-filter:int @ core/jinja/jinja.go:445
- jinja-filter:length @ core/jinja/jinja.go:451
- jinja-filter:quote @ core/jinja/jinja.go:461
- jinja-filter:b64encode @ core/jinja/jinja.go:463
- renderctx:compose:vars @ modules/app/install_runner.go:285
- renderctx:compose:integrations.
@ modules/app/integration_render.go:375-400 (buildIntegrationsContext) - renderctx:compose:stack / environment / tenant @ modules/app/install_runner.go:287-289
- renderctx:compose:hosts.
@ modules/app/install_runner.go:298 (buildHostsContext:2363) - renderctx:compose:url() @ modules/app/install_runner.go:2492 (buildURLFunc)
- renderctx:compose:host() @ modules/app/install_runner.go:2468 (buildHostFunc)
- renderctx:compose:port() @ modules/app/install_runner.go:2503 (buildPortFunc)
- renderctx:compose:paths() @ modules/app/install_runner.go:2528 (buildPathsFunc)
- renderctx:compose:shc.state_dir @ modules/app/install_runner.go:319
- renderctx:compose:shc.ca_root_b64 @ modules/app/install_runner.go:320 (system_ca_root.go)
- renderctx:seeded-var:basePath @ modules/app/system_apps.go:142-149
- renderctx:seeded-var:sso.publicUrl @ modules/app/system_apps.go:156-165
- renderctx:socket-data @ modules/app/integration_render.go:282-287
- renderctx:plug-data @ modules/app/integration_render.go:323-328
- renderctx:socket-job @ modules/app/socket_jobs.go:126-136
- renderctx:hook-job @ modules/app/install_runner.go:1128-1139 (deployedStackHookContext)
- renderctx:backup-hook @ modules/backup/cli_runner.go:1713-1739 (backupHookTemplateContext)
- renderctx:vapp @ modules/app/vapp_runner.go:272-286
- renderctx:pipeline-steps @ modules/job/context_pipeline.go:41-58
- renderctx:exporter @ modules/export/cli_runner.go:430
errors (2)
- module core/jinja — 7 X-codes @ core/jinja/ (full list: docs/reference/errors.md)
- module core/validation — 2 X-codes @ core/validation/ (full list: docs/reference/errors.md)
presets
Section titled “presets”Named var-bundles (presets) shipped by apps, with versions and aliases
cli (5)
- shc preset @ modules/app/commands/preset.go:139
- shc preset ls @ modules/app/commands/preset.go:158
- shc preset search @ modules/app/commands/preset.go:427
- shc preset show @ modules/app/commands/preset.go:278
- shc preset versions @ modules/app/commands/preset.go:372
api (1)
- GET /api/method/shc.preset.search @ modules/app/router.go:116
app-schema (8)
- file:*.vpreset.yaml @ modules/app/preset.go:151 (LoadVPresetEntries)
- file:preset.yaml @ modules/app/preset.go:177 (LoadPresetEntries)
- preset:meta @ modules/app/preset.go:59-65
- preset:default @ modules/app/preset.go:71
- preset:versions @ modules/app/preset.go:72
- preset:aliases @ modules/app/preset.go:73
- preset:vars @ modules/app/preset.go:74
- preset:spec “name@version” @ modules/app/preset.go:50 (ParsePresetSpec)
Virtual apps (vapp.yaml) — provider-backed app instances discovered through vsockets
app-schema (12)
- file:*.vapp.yaml @ modules/app/detail.go:177-191
- file:*.vsocket.yaml @ modules/app/vapp_runner.go:498-508 (loadVsocket)
- vapp:vapp.yaml:name @ modules/app/detail.go:180
- vapp:vapp.yaml:description @ modules/app/detail.go:181
- vapp:vsocket:data @ modules/app/vapp_runner.go:471
- vapp:vsocket:jobs.discovery @ modules/app/vapp_runner.go:478
- vapp:vsocket:jobs.integration @ modules/app/vapp_runner.go:479
- vapp:vsocket:jobs.cleanup @ modules/app/vapp_runner.go:480
- vapp:vsocket:jobs.unintegration @ modules/app/vapp_runner.go:481
- vapp:vsocket:job-fields @ modules/app/vapp_runner.go:486-495
- vapp:vplug:data @ modules/app/vapp_runner.go:510-530 (renderVplugData)
- vapp:vvars (flat map) @ modules/app/vapp_runner.go:136
integrations
Section titled “integrations”Cross-app integrations: sockets, plugs, integration jobs, magic tokens, cross-tenant redaction
cli (4)
- shc integration @ modules/app/commands/integration.go:24
- shc integration ls @ modules/app/commands/integration.go:67
- shc integration plugs @ modules/app/commands/integration.go:151
- shc integration sockets @ modules/app/commands/integration.go:106
api (3)
- GET /api/method/shc.integration.list @ modules/app/router.go:113
- GET /api/method/shc.plug.list @ modules/app/router.go:115
- GET /api/method/shc.socket.list @ modules/app/router.go:114
db (1)
- table integration @ ent/schema/integration.go:17
app-schema (27)
- file:*.socket.yaml @ modules/app/integration_render.go:612 (findSocketForPlug)
- file:*.plug.yaml @ modules/app/integration_render.go:308
- file:*.vplug.yaml @ modules/app/vapp_runner.go:129-133
- socket:schema.socket @ modules/app/integration_render.go:712
- socket:schema.plug @ builtin/postgres/postgres.socket.yaml:2
- socket:data @ modules/app/integration_render.go:288
- socket:data.hostname (special) @ modules/app/integration_render.go:498-605 (addProviderNetworkAlias)
- socket:data.endpoint (special) @ modules/app/vapp_runner.go:678 (pickJobContainerNetwork)
- socket:jobs.integration @ modules/app/socket_jobs.go:42-60
- socket:jobs.discovery @ modules/job/service.go:1055-1092 (scanYamlPhaseJobs)
- socket:jobs.cleanup @ modules/job/service.go:1055-1092
- socket:jobs.unintegration @ modules/job/service.go:1055-1092
- socket:jobs.post_deployment @ modules/job/service.go:1056 (phaseList)
- socket:name/description @ apps/mail/smtp.socket.yaml:1
- socket:job-fields @ modules/app/socket_jobs.go:50-60
- plug:data @ modules/app/integration_render.go:308-330
- plug:required @ apps/affine/postgres.plug.yaml:1
- plug:jobs.* @ modules/job/service.go:1012 (scanYamlPhaseJobs “plug”)
- plug:socket @ apps/matrix/postgresMas.plug.yaml:1
- plug:schema @ builtin/postgres/postgres.socket.yaml:2 (same grammar)
- plug:compose @ apps/greenbone/smtp.plug.yaml
- integration:spec “plug=provider” @ modules/app/integration_render.go:69-90 (ParseIntegrateFlags)
- integration:spec bare “provider” @ modules/app/integration_render.go:125-173 (inferPlugFromProvider)
- integration:spec “provider@env” @ modules/app/integration_render.go:107-118 (parseProviderRef)
- integration:magic-token KEYCLOAK (sole token; telemetry is fabric-only, no OPENOBSERVE) @ modules/app/integration_magic.go:59
- integration:cross-tenant secret redaction @ modules/app/integration_render.go:349-364
- integration:flag recapture (backup/recover) @ modules/app/integration_magic.go:161 (IntegrationFlagFor)
stack-operations
Section titled “stack-operations”Operate deployed stacks: start/stop/restart/scale, list, per-stack status/config, cross-node stack ops
shc scaleis a dead command (daemon: dead) — scaling goes through shc.stack.scale via install/update paths- /internal/stacks/* peer routes also carry cross-node exec/logs for the logs-shell-exec feature
cli (5)
- shc ls @ modules/app/commands/stack_lifecycle.go:125
- shc restart @ modules/app/commands/stack_lifecycle.go:246
- shc scale [DEAD] @ modules/app/commands/scale.go:18
- shc start @ modules/app/commands/stack_lifecycle.go:298
- shc stop @ modules/app/commands/stack_lifecycle.go:341
api (10)
- POST /api/method/shc.container.restart @ modules/stack/router.go:93
- GET /api/method/shc.stack.config @ modules/stack/router.go:94
- POST /api/method/shc.stack.restart @ modules/stack/router.go:90
- POST /api/method/shc.stack.scale @ modules/app/router.go:111
- POST /api/method/shc.stack.start @ modules/stack/router.go:88
- GET /api/method/shc.stack.status @ modules/app/router.go:112
- POST /api/method/shc.stack.stop @ modules/stack/router.go:89
- GET /api/resource/Stack @ modules/app/router.go:102
- DELETE /api/resource/Stack/{name} @ modules/app/router.go:104
- GET /api/resource/Stack/{name} @ modules/app/router.go:103
int-api (5)
- POST /internal/stacks/{deployment_id}/deploy @ modules/internal_stacks/router.go:144
- POST /internal/stacks/{deployment_id}/exec @ modules/internal_stacks/router.go:147
- POST /internal/stacks/{deployment_id}/logs @ modules/internal_stacks/router.go:146
- POST /internal/stacks/{deployment_id}/ps @ modules/internal_stacks/router.go:148
- POST /internal/stacks/{deployment_id}/stop @ modules/internal_stacks/router.go:145
daemon (5)
- subsystem stack_reconcile (prio 4) @ subsystems/impl/stack_reconcile.go:89
- subsystem container_reconciler (prio 51, leader-only) @ subsystems/impl/container_reconciler.go:92
- loop container_reconciler.poll @ subsystems/impl/container_reconciler.go:67
- loop daemon.disk_stack_reconcile @ daemon/services_extra.go:56
- dead-path stack-reconcile-dead-dep @ subsystems/impl/stack_reconcile.go:92
db (3)
- table container @ ent/schema/container.go:15
- table deployment @ ent/schema/deployment.go:19
- table service @ ent/schema/service.go:15
events (1)
- module stack event types (10): A200100STKSTR, A200101STKSTP, A200102STKRST, A200103STKEXC, A200104PODRST, V500100STRFAL, V500101STPFAL, V500102RSTFAL, V500103EXCFAL, V500104PODFAL
errors (2)
- module internal_stacks — 6 X-codes @ modules/internal_stacks/ (full list: docs/reference/errors.md; the /internal/stacks/* peer-route module — added 2026-07-30 re-extraction)
- module stack — 6 X-codes @ modules/stack/ (full list: docs/reference/errors.md)
docs (7)
- docs/architecture/core/deployment-identity.md (1 claim entries)
- docs/architecture/modules/stack.md (1 claim entries)
- docs/reference/api/stack.md (5 claim entries)
- docs/reference/cli/stack.md (14 claim entries)
- docs/reference/cli/stop.md (2 claim entries)
- docs/reference/errors.md [doc section stack] (5 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
logs-shell-exec
Section titled “logs-shell-exec”Tail logs, open interactive shells, exec commands in service containers (incl. cross-node dial)
cli (3)
- shc exec @ modules/shell/commands/exec.go:60
- shc logs @ modules/logs/commands/main.go:66
- shc shell @ modules/shell/commands/shell.go:58
api (5)
- GET /api/method/shc.container.exec @ modules/shell/router.go:50
- GET /api/method/shc.logs.get @ modules/logs/router.go:54
- POST /api/method/shc.stack.exec @ modules/stack/router.go:92
- GET /api/method/shc.stack.logs @ modules/stack/router.go:96
- GET /api/method/shc.stack.logs.stream @ modules/logs/router.go:56
int-api (7)
- GET /internal/containers/{container_id}/exec @ modules/shell/router.go:56
- POST /internal/containers/{container_id}/exec-one-shot @ modules/shell/router.go:59
- GET /internal/containers/{container_id}/logs @ modules/logs/router.go:57
- GET /internal/containers/{container_id}/logs/ws @ modules/logs/router.go:58
- GET /internal/stacks/{deployment_id}/logs/ws @ modules/logs/router.go:59
- GET /internal/ws/exec @ modules/shell/router.go:53
- GET /internal/ws/logs @ modules/logs/router.go:60
errors (2)
- module logs — 8 X-codes @ modules/logs/ (full list: docs/reference/errors.md)
- module shell — 7 X-codes @ modules/shell/ (full list: docs/reference/errors.md)
docs (5)
- docs/architecture/modules/logs.md (1 claim entries)
- docs/architecture/modules/shell.md (1 claim entries)
- docs/reference/api/logs.md (2 claim entries)
- docs/reference/cli/logs.md (2 claim entries)
- docs/reference/cli/shell.md (2 claim entries)
inspect-validate
Section titled “inspect-validate”Inspect rendered stack state and validate app definitions before install
cli (2)
- shc inspect @ modules/inspect/commands/main.go:61
- shc validate @ modules/app/commands/validate.go:18
api (2)
- GET /api/method/shc.stack.dry_run @ modules/stack/router.go:91
- GET /api/method/shc.stack.inspect @ modules/stack/router.go:95
errors (1)
- module inspect — 2 X-codes @ modules/inspect/ (full list: docs/reference/errors.md)
docs (3)
- docs/architecture/modules/inspect.md (1 claim entries)
- docs/reference/cli/inspect.md (2 claim entries)
- docs/reference/cli/validate.md (2 claim entries)
backup-restore
Section titled “backup-restore”Backup and restore: restic-backed backups, groups, retention policy, FUSE backup mounts, disaster recovery
- FIXED since 07-02: the retention CLI subtree is daemon-backed (retention/register.go daemonBackedClient) — the [DEAD] markers above are stale; the nightly retention_cleanup_all_tenants task handler is bound (daemon/services_seams_retention.go)
- backup-mount (FUSE browse of snapshots) is API+CLI mount/umount; several mount session routes have no in-repo consumer
shc recover(dead-cluster recovery from archives) lives here, not under cluster- 2026-07-10 ruling: there is NO
shc rollbackverb — safety-snapshot rollback isshc backup restore --before(same m/h/d/w suffixes + absolute dates); the shc.stack.rollback(.list) routes remain as its backend - 2026-07-08: cross-node
shc backup export(ExportBackupAnywhere via /internal/backup/export/{id}); force node removal sweeps phantom node-local backup rows
cli (27)
- shc backup @ modules/backup/commands/main.go:261
- shc backup create @ modules/backup/commands/create.go:37
- shc backup export @ modules/backup/commands/simple.go:184
- shc backup group @ modules/backup/commands/simple.go:424
- shc backup import @ modules/backup/commands/simple.go:356
- shc backup inspect @ modules/backup/commands/simple.go:471
- shc backup list @ modules/backup/commands/list.go:29
- shc backup ls @ modules/backup/commands/list.go:29
- shc backup mount @ modules/backup/commands/simple.go:496
- shc backup prune @ modules/backup/commands/simple.go:398
- shc backup restore @ modules/backup/commands/simple.go:81
- shc backup rm @ modules/backup/commands/simple.go:26
- shc backup schedule @ modules/backup/commands/schedule.go:19
- shc backup schedule ls @ modules/backup/commands/schedule.go:159
- shc backup schedule set @ modules/backup/commands/schedule.go:85
- shc backup schedule unset @ modules/backup/commands/schedule.go:129
- shc backup sync @ modules/backup/commands/simple.go:374
- shc backup umount @ modules/backup/commands/simple.go:527
- shc backup ungroup @ modules/backup/commands/simple.go:457
- shc backup verify @ modules/backup/commands/simple.go:44
- shc recover @ modules/app/commands/stack_lifecycle.go:397
- shc retention @ modules/retention/commands/main.go:26
- shc retention apply @ modules/retention/commands/apply.go:39
- shc retention ls @ modules/retention/commands/list.go:20 (alias
list) - shc retention preview @ modules/retention/commands/preview.go:24
- shc retention reset @ modules/retention/commands/reset.go:23
- shc retention set @ modules/retention/commands/set.go:29
api (21)
- POST /api/method/shc.backup.create @ modules/backup/router.go:103
- POST /api/method/shc.backup.create_async @ modules/backup/router.go:104
- POST /api/method/shc.backup.detect_snapshot @ modules/backup/router.go:108
- GET /api/method/shc.backup.export/{backup_id} @ modules/backup/router.go:117
- POST /api/method/shc.backup.group @ modules/backup/router.go:111
- GET /api/method/shc.backup.group_manifest/{consistency_id} @ modules/backup/router.go:113
- POST /api/method/shc.backup.import @ modules/backup/router.go:118
- POST /api/method/shc.backup.mount @ modules/backup/router.go:129
- GET /api/method/shc.backup.mounts @ modules/backup/router.go:131
- POST /api/method/shc.backup.recover @ modules/backup/router.go:106
- POST /api/method/shc.backup.recover_async @ modules/backup/router.go:107
- POST /api/method/shc.backup.restore @ modules/backup/router.go:115
- POST /api/method/shc.backup.restore_async @ modules/backup/router.go:105
- POST /api/method/shc.backup.restore_from_file @ modules/backup/router.go:110
- POST /api/method/shc.backup.restore_from_file_async @ modules/backup/router.go:109
- POST /api/method/shc.backup.restore_group/{consistency_id} @ modules/backup/router.go:114
- POST /api/method/shc.backup.retention.apply @ modules/retention/router.go:120
- GET /api/method/shc.backup.retention.get @ modules/retention/router.go:119
- POST /api/method/shc.backup.retention.preview @ modules/retention/router.go:140
- POST /api/method/shc.backup.retention.reset @ modules/retention/router.go:122
- POST /api/method/shc.backup.retention.set @ modules/retention/router.go:121
int-api (41)
- GET /internal/backup/export/{backup_id} @ modules/backup/router.go:123 (cross-node backup export)
- POST /api/method/shc.backup.schedule.get @ modules/backup/router.go:153
- GET /api/method/shc.backup.schedule.list @ modules/backup/router.go:156
- POST /api/method/shc.backup.schedule.list @ modules/backup/router.go:157
- POST /api/method/shc.backup.schedule.set @ modules/backup/router.go:154
- POST /api/method/shc.backup.schedule.unset @ modules/backup/router.go:155
- POST /api/method/shc.backup.sync @ modules/backup/router.go:160
- POST /api/method/shc.backup.umount @ modules/backup/router.go:130
- POST /api/method/shc.backup.ungroup/{group_id} @ modules/backup/router.go:112
- POST /api/method/shc.backup.verify/{backup_id} @ modules/backup/router.go:116
- POST /api/method/shc.mount.create @ modules/backup/mount/router.go:78
- GET /api/method/shc.mount.list @ modules/backup/mount/router.go:77
- POST /api/method/shc.mount.ping/{session_id} @ modules/backup/mount/router.go:80
- GET /api/method/shc.mount.subscribe/{session_id} @ modules/backup/mount/router.go:79
- DELETE /api/method/shc.mount.{session_id} @ modules/backup/mount/router.go:81
- GET /api/method/shc.mount.{session_id}/changes @ modules/backup/mount/router.go:82
- POST /api/method/shc.mount.{session_id}/chmod @ modules/backup/mount/router.go:87
- POST /api/method/shc.mount.{session_id}/commit @ modules/backup/mount/router.go:88
- POST /api/method/shc.mount.{session_id}/create @ modules/backup/mount/router.go:89
- POST /api/method/shc.mount.{session_id}/discard @ modules/backup/mount/router.go:90
- POST /api/method/shc.mount.{session_id}/mkdir @ modules/backup/mount/router.go:91
- GET /api/method/shc.mount.{session_id}/read @ modules/backup/mount/router.go:83
- GET /api/method/shc.mount.{session_id}/readdir @ modules/backup/mount/router.go:84
- POST /api/method/shc.mount.{session_id}/rename @ modules/backup/mount/router.go:92
- DELETE /api/method/shc.mount.{session_id}/rmdir @ modules/backup/mount/router.go:94
- GET /api/method/shc.mount.{session_id}/stat @ modules/backup/mount/router.go:85
- POST /api/method/shc.mount.{session_id}/symlink @ modules/backup/mount/router.go:93
- DELETE /api/method/shc.mount.{session_id}/unlink @ modules/backup/mount/router.go:95
- PUT /api/method/shc.mount.{session_id}/write @ modules/backup/mount/router.go:86
- GET /api/method/shc.operation.state/{operation_id} @ modules/backup/router.go:169
- GET /api/method/shc.operation.stream/{operation_id} @ modules/backup/router.go:168
- POST /api/method/shc.pod.mount @ modules/backup/router.go:142
- POST /api/method/shc.stack.rollback @ modules/backup/router.go:161
- POST /api/method/shc.stack.rollback.list @ modules/backup/router.go:162
- POST /api/method/shc.volume.mount @ modules/backup/router.go:139
- GET /api/method/shc.volume.mounts @ modules/backup/router.go:141
- POST /api/method/shc.volume.umount @ modules/backup/router.go:140
- GET /api/resource/Backup @ modules/backup/router.go:172
- DELETE /api/resource/Backup/{backup_id} @ modules/backup/router.go:175
- GET /api/resource/Backup/{backup_id} @ modules/backup/router.go:173
- GET /api/resource/Backup/{backup_id}/manifest @ modules/backup/router.go:174
hud (2)
- view backups (key B) @ shc/modules/hud/state/state.go:58
- fzf backup import (CLI-side fzf) @ shc/modules/hud/actions.go:432 (onImportBackup)
daemon (10)
- subsystem backup_mount (prio 6) @ subsystems/impl/backup_mount.go:109
- subsystem backup_scheduler (prio 70, leader-only) @ subsystems/impl/backup_scheduler.go:63
- cron retention_cleanup_cron (0 2 * * *, leader-gated) @ modules/retention/crons.go:121
- cron retention_config_watch_cron (*/5 * * * *, leader-gated) @ modules/retention/crons.go:129
- task-handler retention_config_handler @ modules/retention/config_reload.go:75
- task-handler backup_config_handler @ modules/backup/config_reload.go:97
- loop backup_mount.reaper @ subsystems/impl/backup_mount.go:51
- sse-keepalive backup.sse_keepalive @ modules/backup/router.go:522
- sse-keepalive backup_mount.sse_keepalive @ modules/backup/mount/router.go:293
- dead-path retention-cleanup-handler-missing @ modules/retention/crons.go:51
db (3)
- table backup @ ent/schema/backup.go:16
- table backup_cache @ ent/schema/backup_cache.go:14
- table backup_mount @ ent/schema/backup_mount.go:14
events (1)
- module backup event types (29): A200400BKPCRT, A200401BKPDEL, A200402BKPRST, A200403BKPVFY, V200401BKPCMP, V200402BKPDEL, V400400BKPFAL, V200403RSTSTR, V200404RSTCMP, V400401RSTFAL, V300405INTMIS, V300406INTFPM, V200405RETAPP, V200406RETSET, V200407RETRES, V200408RETCLN, V200409RETCFG, V200200BKSCST, V200201BKSCCP, V500200BKSCFL, V200202BKSCSY, V200300BKRPIN, V200301BKCASY, V200302BKRPCH, A200800RLBKST, A200801RLBKCP, A500800RLBKFL, V200800RLBKDR, V200801RLBKPR
config (24)
- key backup.repo @ core/config/default.yaml:139
- key backup.password @ core/config/default.yaml:143
- key backup.aws_access_key_id @ core/config/default.yaml:147
- key backup.aws_secret_access_key @ core/config/default.yaml:148
- key backup.azure_account_name @ core/config/default.yaml:149
- key backup.azure_account_key @ core/config/default.yaml:150
- key backup.b2_account_id @ core/config/default.yaml:151
- key backup.b2_account_key @ core/config/default.yaml:152
- key backup.google_application_credentials @ core/config/default.yaml:153
- key backup.retention.daily [DEAD] @ core/config/default.yaml:159
- key backup.retention.weekly [DEAD] @ core/config/default.yaml:160
- key backup.retention.monthly [DEAD] @ core/config/default.yaml:161
- key backup.retention.yearly [DEAD] @ core/config/default.yaml:162
- key backup.mount.idle_ttl_seconds [DEAD] @ core/config/default.yaml:171
- key backup.mount.max_sessions_per_tenant [DEAD] @ core/config/default.yaml:173
- key backup.mount.writable_allowed [DEAD] @ core/config/default.yaml:176
- key backup.mount.overlay_max_fraction [DEAD] @ core/config/default.yaml:179
- key backup.schedule [undocumented] @ modules/backup/config_reload.go:20
- key backup.all_connected [undocumented] @ modules/backup/config_reload.go:21
- key backup.with_dependants [undocumented] @ modules/backup/config_reload.go:22
- cron-override crons.retention_cleanup_cron @ modules/retention/crons.go:23
- cron-override crons.retention_config_watch_cron @ modules/retention/crons.go:26
- env SHC_BACKUP_REPO @ subsystems/impl/backup_mount.go:415
- env SHC_BACKUP_PASSWORD @ subsystems/impl/backup_mount.go:430
app-schema (16)
- hook:pre_backup @ modules/app/types.go:99
- hook:post_backup @ modules/app/types.go:100
- hook:pre_restore @ modules/app/types.go:101
- hook:post_restore @ modules/app/types.go:102
- file:backup.yaml @ modules/backup/orchestrator.go:134-146 (loadBackupConfig)
- backup:include.files / include.mounts @ modules/backup/orchestrator.go:150-153
- backup:exclude.files / exclude.mounts @ modules/backup/orchestrator.go:150-153
- backup:jobs.restore @ modules/backup/cli_runner.go:1308 (runBackupRestoreJobs)
- backup:jobs.pre_pause @ modules/backup/phases.go:643 (runPauseBracketJobs)
- backup:jobs.post_pause @ modules/backup/phases.go:643
- backup:jobs.pre_backup/post_backup/pre_restore/post_restore (legacy) @ modules/job/service.go:1103-1110 (scanBackupJobs)
- backup:jobs.
job fields @ modules/backup/cli_runner.go:1323-1335 (backupHookJob) - backup:jobs volumes ”@
” prefix @ modules/backup/cli_runner.go:1495-1540 - backup:converters.
@ modules/backup/types.go:665 + modules/backup/converter.go:274 - backup:recreate_on_restore @ modules/backup/cli_runner.go:996
- backup:migrate @ modules/backup/types.go:620-625
errors (2)
- module backup — 117 X-codes @ modules/backup/ (full list: docs/reference/errors.md)
- module retention — 2 X-codes @ modules/retention/ (full list: docs/reference/errors.md)
docs (11)
- docs/architecture/deploy-restore-recover.md (1 claim entries)
- docs/architecture/flows/backup-restore.md (1 claim entries)
- docs/architecture/modules/backup.md (1 claim entries)
- docs/architecture/modules/retention.md (1 claim entries)
- docs/guide/operations/disaster-recovery.md (1 claim entries)
- docs/reference/api/backup.md (31 claim entries)
- docs/reference/cli/backup.md (26 claim entries)
- docs/reference/cli/recover.md (2 claim entries)
- docs/reference/cli/retention.md (7 claim entries)
- docs/reference/errors.md [doc section backup] (56 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
schedules
Section titled “schedules”Cron-style backup/job schedules per scope, dispatched by the schedule_dispatcher
- schedule.dispatch task lands in an empty registry on non-leader paths (daemon-ops dead-path lead)
cli (8)
- shc schedule @ modules/schedule/commands/main.go:121
- shc schedule add @ modules/schedule/commands/add.go:35
- shc schedule disable @ modules/schedule/commands/disable.go:24
- shc schedule enable @ modules/schedule/commands/enable.go:24
- shc schedule info @ modules/schedule/commands/info.go:30
- shc schedule list @ modules/schedule/commands/list.go:30
- shc schedule ls @ modules/schedule/commands/list.go:30
- shc schedule rm @ modules/schedule/commands/rm.go:26
api (8)
- POST /api/method/shc.schedule.create @ modules/schedule/router.go:38
- POST /api/method/shc.schedule.disable @ modules/schedule/router.go:42
- POST /api/method/shc.schedule.enable @ modules/schedule/router.go:41
- GET /api/method/shc.schedule.info @ modules/schedule/router.go:44
- GET /api/method/shc.schedule.list @ modules/schedule/router.go:39
- POST /api/method/shc.schedule.list @ modules/schedule/router.go:40
- POST /api/method/shc.schedule.remove @ modules/schedule/router.go:43
- POST /api/method/shc.schedule.sync @ modules/schedule/router.go:42
hud (1)
- view schedules (key K) @ shc/modules/hud/state/state.go:26
daemon (3)
- subsystem schedule_dispatcher (prio 71, leader-only) @ subsystems/impl/schedule_dispatcher.go:93
- loop schedule_dispatcher.sweep @ subsystems/impl/schedule_dispatcher.go:102
- FIXED since 07-02: dispatch fires execute_job_task through the queue (schedule_dispatcher.go dispatchToTaskQueue) — the dispatch-into-empty-registry dead path is retired with the cron-registry route
db (1)
- table schedules @ ent/schema/schedules.go:13
events (1)
- module schedule event types (5): A200600SCHCRT, A200601SCHENB, A200602SCHDIS, A200603SCHRMV, V200610SCHTRG
errors (1)
- module schedule — 12 X-codes @ modules/schedule/ (full list: docs/reference/errors.md)
docs (5)
- docs/architecture/modules/schedule.md (1 claim entries)
- docs/reference/api/schedule.md (8 claim entries)
- docs/reference/cli/schedule.md (8 claim entries)
- docs/reference/errors.md [doc section schedule] (3 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
import-export
Section titled “import-export”Export/import deployment data archives driven by app exporter.yaml schemas
- FIXED since 07-02:
shc export lsis daemon-backed;shc export showwas retired (test pins it stays gone)
cli (3)
- shc export @ modules/export/commands/commands.go:130
- shc export ls @ modules/export/commands/commands.go:266
- shc import @ modules/export/commands/commands.go:306
api (3)
- POST /api/method/shc.export.export @ modules/export/router.go:53
- POST /api/method/shc.export.import @ modules/export/router.go:54
- POST /api/method/shc.export.list @ modules/export/router.go:57
app-schema (7)
- file:*.exporter.yaml @ modules/export/cli_runner.go:58-74 (NewFSLoader)
- exporter:schema.export / schema.import @ modules/export/types.go:55-62
- exporter:schema field attrs @ modules/export/types.go:46-51
- exporter:jobs.export / jobs.import @ modules/export/types.go:95-98
- exporter:job fields @ modules/export/types.go:69-92
- exporter:volumes “@output”/“@input” slots @ modules/export/job_executor.go:53-57 (resolveSpecialVolumes)
- exporter:render-context @ modules/export/cli_runner.go:430-470 (buildTemplateContext)
errors (1)
- module export — 18 X-codes @ modules/export/ (full list: docs/reference/errors.md)
docs (6)
- docs/architecture/modules/export.md (1 claim entries)
- docs/reference/api/export.md (3 claim entries)
- docs/reference/cli/export-import.md (10 claim entries)
- docs/reference/cli/import.md (2 claim entries)
- docs/reference/errors.md [doc section export] (9 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
clone-move
Section titled “clone-move”Clone a deployment or move it to another node/tenant (incl. presumed-dead source moves)
cli (2)
- shc clone @ modules/clone/commands/main.go:124
- shc move @ modules/clone/commands/main.go:190
api (3)
- POST /api/method/shc.stack.clone @ modules/clone/router.go:68
- POST /api/method/shc.stack.move @ modules/clone/router.go:69
- POST /api/method/shc.stack.move_single @ modules/clone/router.go:70
events (1)
- module clone event types (11): A200600STKCLN, A200601STKMOV, A200602STKRNM, A400600CLNFAL, A400601MOVFAL, A400602RNMFAL, V200600CLNPRE, V200601CLNBKP, V200602CLNUNI, V200603CLNRCV, V500600CLNRLB
errors (1)
- module clone — 27 X-codes @ modules/clone/ (full list: docs/reference/errors.md)
docs (7)
- docs/architecture/flows/clone-move.md (1 claim entries)
- docs/architecture/modules/clone.md (1 claim entries)
- docs/reference/api/clone.md (3 claim entries)
- docs/reference/cli/clone.md (5 claim entries)
- docs/reference/cli/move.md (10 claim entries)
- docs/reference/errors.md [doc section clone] (11 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
origin-adapters
Section titled “origin-adapters”Origin adapters: load a live install off a foreign self-hosting platform (caprover/casaos/cloudron/compose/coolify/dockge/dokploy/easypanel/portainer/runtipi/synology/truenas/umbrel/unraid/yunohost) — catalog ingest + per-app manifest transpile into native SHC packages, box-layout SSH data-volume pull into restore-consumable backups, adapter plugs
- ADDED in the 2026-07-30 re-extraction — the module post-dates the 07-02 extraction and had no graph presence
- library-core module by design: registers only error metadata (modules/adapter/register.go:24) — no router, events, crons; each adapter self-registers from its own init() and the daemon links them via modules/adapter/adapters/all; the repo module owns the user-facing surface of adapter REPOS
- adapter plugs map a foreign app’s expected external-service addon onto an SHC capability socket+plug (modules/adapter/adapterplug.go); gated/rejected catalog apps aggregate into a rejected.json sidecar (modules/adapter/ingest.go)
- box-layout SSH pull (modules/adapter/boxlayout*.go, per-platform layouts) pulls live data volumes over SSH (X501000ADPSSH / X501001ADPPUL) into backups the backup-restore feature can consume
cli (4)
- shc adapter @ modules/adapter/commands/main.go:44
- shc adapter load
ssh://[user@]host[:port] [app] @ modules/adapter/commands/load.go:48 - shc adapter ls @ modules/adapter/commands/ls.go:86
- shc adapter migrate
—adapter —version —from @ modules/adapter/commands/migrate.go:377
errors (1)
- module adapter — 13 X-codes @ modules/adapter/ (full list: docs/reference/errors.md)
docs (3)
- docs/reference/cli/shc_adapter.md + shc_adapter_load.md / shc_adapter_ls.md / shc_adapter_migrate.md (claims unextracted)
- docs/handoff/2026-07-21-origins-adapters-verification.md (claims unextracted)
- docs/reference/errors.md [doc section adapter] (claims unextracted)
jobs-tasks
Section titled “jobs-tasks”App job runner (service/container/http/graphql/pipeline/playwright contexts) + the distributed task queue and workers
- generic async-operation registry (shc.operation.* SSE) is grouped here; its URLs are registered by the backup router (deliberate)
cli (14)
- shc job @ modules/job/commands/main.go:117
- shc job cancel @ modules/job/commands/cancel.go:26
- shc job history @ modules/job/commands/history.go:20
- shc job ls @ modules/job/commands/ls.go:21
- shc job ps @ modules/job/commands/ps.go:22
- shc job run @ modules/job/commands/run.go:23
- shc job show @ modules/job/commands/show.go:18
- shc job status @ modules/job/commands/status.go:26
- shc task @ modules/task/commands/main.go:121
- shc task cancel @ modules/task/commands/cancel.go:20
- shc task ls @ modules/task/commands/ls.go:37
- shc task ls @ modules/task/register.go (canonical
ls, aliaslist; Python-erapsretired) - shc task show @ modules/task/commands/show.go:20
- shc task workers @ modules/task/commands/workers.go:26
api (11)
- GET /api/method/shc.job.get @ modules/job/router.go:44
- GET /api/method/shc.job.list @ modules/job/router.go:43
- POST /api/method/shc.job.run @ modules/job/router.go:45
- GET /api/resource/Job/{job_name} @ modules/job/router.go:42
- GET /api/resource/JobRun @ modules/job/router.go:37
- GET /api/resource/JobRun/{name} @ modules/job/router.go:41
- GET /api/resource/Task @ modules/task/router.go:27
- GET /api/resource/Task/{id} @ modules/task/router.go:46
- GET /api/resource/Worker @ modules/task/router.go:28
- POST /api/method/shc.job.cancel @ modules/job/router.go:55
- POST /api/method/shc.task.cancel @ modules/task/router.go:48
daemon (16)
- subsystem queue (prio 8) @ subsystems/impl/queue.go:90
- subsystem operation_registry (prio 70, leader-only) @ subsystems/impl/operation_registry.go:107
- task-handler execute_job_task @ subsystems/impl/event_bus.go:323
- job-context service @ modules/job/context_service.go:1
- job-context container @ modules/job/context_container.go:1
- job-context http @ modules/job/context_http.go:1
- job-context graphql @ modules/job/context_graphql.go:1
- job-context pipeline @ modules/job/context_pipeline.go:1
- job-context playwright @ modules/job/context_playwright.go:1
- job-runner lifecycle hook set (10: pre_install, post_install, pre_update, post_update, pre_uninstall, post_uninstall, pre_backup, post_backup, pre_restore, post_restore)
- job dispatch event V200900JOBRUN @ modules/job/events.go:16
- loop queue.worker_poll @ modules/task/worker.go:71
- loop queue.worker_recovery @ modules/task/worker.go:74
- loop queue.worker_heartbeat @ modules/task/worker.go:80
- loop operation_registry.pump @ subsystems/impl/operation_registry.go:120
- sse-keepalive operation.sse_heartbeat @ modules/operation/router.go:22
db (4)
- table job @ ent/schema/job.go:17
- table job_run @ ent/schema/job_run.go:19
- table task @ ent/schema/task.go:19
- table worker @ ent/schema/worker.go:14
events (1)
- module job event types (1): V200900JOBRUN
config (1)
- key concurrency.queue_max_depth @ core/config/default.yaml:187
app-schema (20)
- file:*.job.yaml @ modules/job/service.go:1019 (scanStandaloneJobs)
- job:contexts @ modules/job/types.go:50-57
- job:on_failure @ modules/job/types.go:67-71
- job:name @ modules/job/types.go:102
- job:context @ modules/job/types.go:103
- job:command @ modules/job/types.go:104
- job:timeout @ modules/job/types.go:105
- job:service @ modules/job/types.go:109
- job:image @ modules/job/types.go:113
- job:entrypoint @ modules/job/types.go:114
- job:networks @ modules/job/types.go:115
- job:volumes @ modules/job/types.go:116
- job:labels @ modules/job/types.go:117
- job:container_name @ modules/job/types.go:118
- job:group @ modules/job/types.go:119
- job:url / method / headers / body / insecure / max_retries / retry_interval @ modules/job/types.go:122-128
- job:query / variables / operation_name @ modules/job/types.go:131-133
- job:steps @ modules/job/types.go:136
- job:script / browser / headless / base_url @ modules/job/types.go:139-142
- job:user / working_dir / environment @ modules/job/types.go:145-147
errors (2)
- module job — 14 X-codes @ modules/job/ (full list: docs/reference/errors.md)
- module task — 11 X-codes @ modules/task/ (full list: docs/reference/errors.md)
docs (10)
- docs/architecture/events/job-registration.md (1 claim entries)
- docs/architecture/modules/job.md (1 claim entries)
- docs/architecture/modules/task.md (1 claim entries)
- docs/reference/api/job.md (7 claim entries)
- docs/reference/api/task.md (3 claim entries)
- docs/reference/cli/job.md (8 claim entries)
- docs/reference/cli/task.md (4 claim entries)
- docs/reference/errors.md [doc section (global)] (7 claim entries)
- docs/reference/errors.md [doc section job] (5 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
vault-secrets
Section titled “vault-secrets”Vault secret storage: providers, autogen secrets, unlock flow, secret refs (ref+vault://)
- 2026-07-09: restart auto-unlock — a locked node pulls the unlock from already-unlocked peers (modules/vault/unlock_pull.go RunUnlockPull), closing the full-rolling-restart lockout
- 2026-07-10: autogen refs honor ?scope= (modules/vault/autogen.go) — forward-auth secrets mint at GLOBAL, fixing the fresh-cluster gated-502
cli (12)
- shc vault @ modules/vault/commands/main.go:177
- shc vault exists @ modules/vault/commands/main.go:451
- shc vault export @ modules/vault/commands/main.go:526
- shc vault get @ modules/vault/commands/main.go:274
- shc vault import @ modules/vault/commands/main.go:590
- shc vault ls @ modules/vault/commands/main.go:466
- shc vault migrate @ modules/vault/commands/main.go:208
- shc vault rm @ modules/vault/commands/main.go:412
- shc vault rotate @ modules/vault/commands/main.go:198
- shc vault set @ modules/vault/commands/main.go:374
- shc vault status @ modules/vault/commands/main.go:505
- shc vault unlock @ modules/vault/commands/main.go:300
api (15)
- GET /api/method/shc.vault.exists @ modules/vault/router.go:49
- POST /api/method/shc.vault.export @ modules/vault/router.go:53
- POST /api/method/shc.vault.import @ modules/vault/router.go:54
- POST /api/method/shc.vault.rotate @ modules/vault/router.go:52
- POST /api/method/shc.vault.migrate @ modules/vault/router.go:42
- GET /api/method/shc.vault.status @ modules/vault/router.go:50
- POST /api/method/shc.vault.unlock @ modules/vault/router.go:51
- GET /api/resource/Secret @ modules/vault/router.go:37
- POST /api/resource/Secret @ modules/vault/router.go:39
- DELETE /api/resource/Secret/* @ modules/vault/router.go:41
- GET /api/resource/Secret/* @ modules/vault/router.go:38
- PUT /api/resource/Secret/* @ modules/vault/router.go:40
- DELETE /api/resource/Secret/{key:path} @ modules/vault/router.go:48
- GET /api/resource/Secret/{key:path} @ modules/vault/router.go:46
- PUT /api/resource/Secret/{key:path} @ modules/vault/router.go:47
int-api (3)
- POST /internal/vault/rekey @ modules/vault/internal_router.go:49
- POST /internal/vault/request-unlock @ modules/vault/internal_router.go:52 (restart unlock-pull)
- POST /internal/vault/unlock @ modules/vault/internal_router.go:48
hud (2)
- view vault (key V) @ shc/modules/hud/state/state.go:28
- overlay vault unlock strip @ shc/modules/hud/app.go:1732 (panels.InlineInput), typing app.go:1148
daemon (1)
- subsystem vault (prio -30) @ subsystems/impl/vault.go:66
db (2)
- table vault @ ent/schema/vault.go:14
- table vault_config @ ent/schema/vault_config.go:13
events (1)
- module vault event types (21): A200300VLTCRT, A200301VLTUPD, A200302VLTDEL, V200300VLTSET, V200301VLTUPD, V200302VLTDEL, V200303VLTGET, V200304VLTLST, V200305VLTEXP, V200306VLTIMP, V400300VLTSET, V400301VLTUPD, V400302VLTDEL, V404303VLTGET, V400305VLTEXP, V400306VLTIMP, V200100VLTCON, V200101VLTSCR, V200102VLTSCU, V200103VLTSCD, V500100VLTERR
config (19)
- key vault.provider @ core/config/default.yaml:239
- key vault.providers @ core/config/default.yaml:242
- key vault.
. [undocumented] @ modules/vault/factory.go:357 - prefix vault.providers.
.* @ modules/vault/factory.go:355 - vault-provider local @ modules/vault/providers/local/provider.go:422
- vault-provider hashicorp @ modules/vault/providers/hashicorp/provider.go:249
- vault-provider aws @ modules/vault/providers/aws/provider.go:177
- vault-provider azure @ modules/vault/providers/azure/provider.go:252
- vault-provider gcp @ modules/vault/providers/gcp/provider.go:362
- vault-provider doppler @ modules/vault/providers/doppler/provider.go:193
- vault-provider infisical @ modules/vault/providers/infisical/provider.go:273
- vault-provider 1password @ modules/vault/providers/onepassword/provider.go:232
- vault-provider bitwarden @ modules/vault/providers/bitwarden/provider.go:207
- vault-provider pass @ modules/vault/providers/passwordstore/provider.go:186
- vault-provider sops @ modules/vault/providers/sops/provider.go:338
- secret-ref scheme vault @ modules/vault/resolver.go:66
- env SHC_VAULT_PASSWORD @ subsystems/impl/vault.go:132
- env SHC_SECRETS_PASSWORDS @ core/secretspw/secretspw.go:31
- env SHC_SECRETS_PASSWORD_FILES @ core/secretspw/secretspw.go:34
app-schema (6)
- secret-ref:ref+vault://
?autogen @ core/config/secrets.go:42 (ParseSecretRef) - secret-ref:?length=N @ core/config/secrets.go:83
- secret-ref:?charset= @ core/config/secrets.go:87
- secret-ref:?scope= @ core/config/secrets.go:79
- secret-ref:non-autogen ref+vault:// @ modules/vault/autogen.go:113-117 (walkAutogenRefs)
- secret-ref:other-providers (env/aws/doppler/…) @ modules/vault/resolver.go:66
errors (1)
- module vault — 33 X-codes @ modules/vault/ (full list: docs/reference/errors.md)
docs (6)
- docs/architecture/modules/vault.md (1 claim entries)
- docs/guide/operations/vault.md (1 claim entries)
- docs/reference/api/vault.md (9 claim entries)
- docs/reference/cli/vault.md (11 claim entries)
- docs/reference/errors.md [doc section vault] (21 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
tls-certificates-ca
Section titled “tls-certificates-ca”Certificate authorities and TLS certs: per-tenant CAs, cluster CA + rotation, internal mTLS leaf rotation, cert inventory, ACME
- cluster CA rotation (shc cluster cert rotate) was uncommitted WIP at extraction time — anchors may drift
- nebula mesh host-cert rotation is a separate machine under mesh-networking
- 2026-07-30 re-extraction: modules/acme folded in — a PURE config projection (open-map registry like vault.providers, NOT a shc_connection capability slot) the daemon reads to seed TRAEFIK_ACME_PROVIDERS; no service, no runtime, no X-codes
cli (11)
- shc ca @ modules/ca/commands/main.go:136
- shc ca import @ modules/ca/commands/import.go:13
- shc ca provision @ modules/ca/commands/provision.go:9
- shc ca reprovision @ modules/ca/commands/reprovision.go:24
- shc ca show @ modules/ca/commands/show.go:9
- shc cert @ modules/ca/commands/main.go:152
- shc cert ls @ modules/ca/commands/list.go:60
- shc cluster cert @ modules/cluster/commands/cert.go:70
- shc cluster cert ls @ modules/cluster/commands/cert.go:86
- shc cluster cert rotate @ modules/cluster/commands/cert.go:143
- shc cluster cert rotate-now @ modules/cluster/commands/cert.go:197
api (6)
- POST /api/method/shc.ca.import @ modules/ca/router.go:54
- POST /api/method/shc.ca.provision @ modules/ca/router.go:53
- POST /api/method/shc.ca.reprovision @ modules/ca/router.go:55
- GET /api/method/shc.ca.root_cert @ modules/ca/router.go:43
- GET /api/method/shc.ca.show @ modules/ca/router.go:48
- GET /api/method/shc.cert.list @ modules/ca/router.go:52
hud (1)
- view certificates (key Z) @ shc/modules/hud/state/state.go:87
daemon (6)
- subsystem cluster_ca_genesis (prio 7) @ subsystems/impl/cluster_ca_genesis.go:191
- subsystem global_ca_genesis (prio 7) @ subsystems/impl/global_ca_genesis.go:153
- subsystem internal_cert_rotation (prio 45) @ subsystems/impl/internal_cert_rotation.go:172
- loop internal_cert_rotation.check @ subsystems/impl/internal_cert_rotation.go:17
- loop cluster_ca_genesis.reconcile @ subsystems/impl/cluster_ca_genesis.go:52
- loop global_ca_genesis.reconcile @ subsystems/impl/global_ca_genesis.go:54
db (2)
- table certificates @ ent/schema/certificate.go:25
- table leaf_cert @ ent/schema/leaf_cert.go:22
config (4)
- key acme.email @ core/config/default.yaml:195
- key acme.default @ modules/acme/reader.go:48
- prefix acme.providers.
.* (named ACME providers — directory URL, email, optional ZeroSSL/EAB HMAC dereferenced via config.GetResolved) @ modules/acme/reader.go:63 (ProviderTable) - env SHC_CA_BUNDLE @ forward-auth/cmd/forward-auth/main.go:55
errors (1)
- module ca — 21 X-codes @ modules/ca/ (full list: docs/reference/errors.md)
ingress-routing
Section titled “ingress-routing”HTTP(S) ingress: Traefik materialization, host mappings, exposure/access posture, forward-auth SSO, L4 proxy plane
- port_mapping table rows are recorded but PortMappings are never hydrated (host-port managed path is dead)
- GET/HEAD /forward-auth is the standalone forward-auth sidecar surface; GET /api/auth/forward-auth is the in-daemon probe
- 2026-07-30 (shc 4f92d8947): the forward-auth browser-SSO protocol ALSO rides the SHC Traefik image as the plugin’s opt-in fail-closed authGate — see system-image-extensions; the sidecar path above is untouched and stays functional this release (either path accepts a session the other minted)
api (5)
- GET /api/auth/forward-auth @ modules/auth/router.go:117
- GET /api/resource/HostMapping/{deployment_id} @ modules/network/router.go:40
- GET /api/resource/PortMapping/{deployment_id} @ modules/network/router.go:39
- GET /forward-auth @ modules/forward/router.go:30
- HEAD /forward-auth @ modules/forward/router.go:31
daemon (4)
- subsystem ingress_materialize (prio 65) @ subsystems/impl/ingress_materialize.go:104
- subsystem proxy_reconcile (prio 66, leader-only) @ subsystems/impl/proxy_reconcile.go:89
- loop ingress_materialize.sweep @ subsystems/impl/ingress_materialize.go:64
- loop proxy_reconcile.tick @ subsystems/impl/proxy_reconcile.go:73
db (2)
- table host_mapping @ ent/schema/host_mapping.go:15
- table port_mapping @ ent/schema/port_mapping.go:16
config (5)
- key proxy.proxy_protocol_trusted_ips [undocumented] @ daemon/services.go:1505
- env SHC_HOST @ daemon/services.go:1258
- env SHC_FORWARD_AUTH_STATE_SECRET @ forward-auth/cmd/forward-auth/main.go:46
- env SHC_FORWARD_AUTH_LISTEN @ forward-auth/cmd/forward-auth/main.go:48
- env SHC_TRAEFIK_NETWORK @ modules/test/daemon.go:517
errors (2)
- module core/hostactivate — 2 X-codes @ core/hostactivate/ (full list: docs/reference/errors.md)
- module proxy — 6 X-codes @ modules/proxy/ (full list: docs/reference/errors.md)
docs (1)
- docs/guide/apps/traefik.md (1 claim entries)
dns-management
Section titled “dns-management”DNS record management (machine-facing): provider registry (cloudflare/route53/…), zone matching, record CRUD API, dns.target ladder. Deliberately NO CLI — records are lifecycle-managed (—host / —dns-provider + the target ladder, released on uninstall); /api/dns serves the daemon itself and machine callers (terraform shc_dns_record over the UDS).
- 2026-07-10 ruling: the
shc dns record/shc dns validateCLI subtree (added 2026-07-06) was REMOVED — records must flow from the deployment lifecycle, never operator CRUD. Raw-port apps get DNS via a provider-side record or terraform shc_dns_record. - 2026-07-07: hetzner provider migrated to the Cloud DNS API (legacy dnsapi.hetzner.com is dead), live-proven on a reference estate
api (5)
- DELETE /api/dns/record @ modules/dns/router.go:64
- GET /api/dns/record @ modules/dns/router.go:62
- POST /api/dns/record @ modules/dns/router.go:63
- GET /api/dns/records @ modules/dns/router.go:68 (full managed set for a host)
- GET /api/dns/validate @ modules/dns/router.go:55
config (36)
- key dns.provider @ core/config/default.yaml:205
- key dns.providers.cloudflare.token @ core/config/default.yaml:208
- key dns.providers.route53.region @ core/config/default.yaml:210
- key dns.providers.hetzner.token @ core/config/default.yaml:212
- key dns.providers.powerdns.api_key @ core/config/default.yaml:214
- key dns.providers.powerdns.endpoint @ core/config/default.yaml:215
- key dns.providers.powerdns.server_id @ core/config/default.yaml:216
- key dns.providers.digitalocean.token @ core/config/default.yaml:218
- key dns.providers.gcp.project_id @ core/config/default.yaml:220
- key dns.providers.azure.subscription_id @ core/config/default.yaml:222
- key dns.providers.azure.resource_group @ core/config/default.yaml:223
- key dns.providers.linode.token @ core/config/default.yaml:225
- key dns.providers.vultr.api_key @ core/config/default.yaml:227
- key dns.providers.namecheap.api_user @ core/config/default.yaml:229
- key dns.providers.namecheap.api_key @ core/config/default.yaml:230
- key dns.providers.namecheap.client_ip @ core/config/default.yaml:231
- key dns.public_address [undocumented] @ modules/app/dns_target.go:404
- key dns.ttl [undocumented] @ modules/app/dns_target.go:457
- key dns.proxied [undocumented] @ modules/app/dns_target.go:471
- key dns.
. [undocumented] @ modules/dns/factory.go:227 - prefix dns.providers.
.* @ modules/dns/factory.go:225 - dns-provider cloudflare @ modules/dns/factory.go:264
- dns-provider route53 @ modules/dns/factory.go:281
- dns-provider hetzner @ modules/dns/factory.go:296
- dns-provider powerdns @ modules/dns/factory.go:307
- dns-provider powerdns-local @ modules/dns/factory.go:335
- dns-provider rfc2136 @ modules/dns/factory.go:446
- dns-provider digitalocean @ modules/dns/factory.go:358
- dns-provider gcp @ modules/dns/factory.go:366
- dns-provider azure @ modules/dns/factory.go:377
- dns-provider linode @ modules/dns/factory.go:396
- dns-provider vultr @ modules/dns/factory.go:404
- dns-provider unbound @ modules/dns/factory.go:419
- dns-provider namecheap @ modules/dns/factory.go:487
- dns-provider ovh @ modules/dns/factory.go (2026-07-08 gap-fill)
- dns-provider designate @ modules/dns/factory.go (openstack, 2026-07-08 gap-fill)
errors (1)
- module dns — 26 X-codes @ modules/dns/dnsapi/ (full list: docs/reference/errors.md)
docs (6)
- docs/architecture/cluster/dns-https.md (1 claim entries)
- docs/architecture/cluster/dns-provider-sync.md (1 claim entries)
- docs/architecture/modules/dns.md (1 claim entries)
- docs/reference/errors.md [doc section (global)] (4 claim entries)
- docs/reference/errors.md [doc section dns] (7 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
port-forward
Section titled “port-forward”Client-side port forwarding from local ports to deployment services (shc forward, HUD forwards view)
- forwarders run client-side (PID-tracked); daemon side is a single /internal/ws/forward websocket
- 2026-07-08: partial specs (
shc forward postgres/shc forward 5432) infer via shc.stack.services + forward.SetComposeLoader (cli/forward_wiring.go); tenant hardcode removed; HUD f-key argv fixed - 2026-07-30 re-extraction: the daemon half modules/portforward folded in (it had only the route citation) — NodeRouter local-vs-remote dispatch mirroring logs/shell (modules/portforward/node_router.go), swarm task resolution incl. the socat overlay hop (swarm_resolver.go, X503922FWDSCT), mesh-dialed cross-node WS proxy (proxy.go:80 proxyWSForward)
cli (1)
- shc forward @ modules/forward/commands/main.go:34
api (1)
- GET /api/method/shc.stack.services @ modules/app/router.go:120 (per-service container-port candidates for partial-spec inference)
int-api (1)
- GET /internal/ws/forward @ modules/portforward/register.go:21
hud (2)
- view forwards (key F) @ shc/modules/hud/state/state.go:78
- fzf remote-port picker @ shc/modules/hud/actions.go:830 (inside onPortForward)
errors (2)
- module forward — 8 X-codes @ modules/forward/ (full list: docs/reference/errors.md)
- module portforward — 2 X-codes @ modules/portforward/ (full list: docs/reference/errors.md; added 2026-07-30 re-extraction)
docs (3)
- docs/architecture/modules/forward.md (1 claim entries)
- docs/reference/cli/forward.md (2 claim entries)
- docs/reference/errors.md [doc section (global)] (6 claim entries)
mesh-networking
Section titled “mesh-networking”Node networking: nebula overlay mesh + PKI rotation, docker overlay/tenant networks, swarm network state
cli (12)
- shc cluster mesh @ shc/modules/cluster/commands/mesh.go:91
- shc cluster mesh diagnose @ shc/modules/cluster/commands/mesh.go:169
- shc cluster mesh disable @ shc/modules/cluster/commands/mesh.go:136
- shc cluster mesh enable @ shc/modules/cluster/commands/mesh.go:114
- shc cluster mesh lighthouse @ shc/modules/cluster/commands/mesh.go:314
- shc cluster mesh lighthouse add @ shc/modules/cluster/commands/mesh.go:374
- shc cluster mesh lighthouse ls @ shc/modules/cluster/commands/mesh.go:331
- shc cluster mesh lighthouse rm @ shc/modules/cluster/commands/mesh.go:411
- shc cluster mesh status @ shc/modules/cluster/commands/mesh.go:157
- shc nebula @ shc/modules/nebula/commands/main.go:59
- shc nebula rotate-now @ shc/modules/nebula/commands/main.go:73
- shc nebula status @ shc/modules/nebula/commands/main.go:93
api (5)
- POST /api/method/shc.network.ensure_tenant @ modules/network/router.go:38 (GET→POST in the UX-audit authz wave)
- GET /api/method/shc.nebula.status @ shc/modules/nebula/router.go:85
- POST /api/method/shc.nebula.rotate_now @ shc/modules/nebula/router.go:86
- GET /api/method/shc.network.nic @ modules/network/router.go:37
- GET /api/method/shc.network.swarm_status @ modules/network/router.go:36
int-api (8)
- POST /internal/mesh/diagnose @ shc/modules/nebula/internal_router.go:139
- POST /internal/mesh/install @ shc/modules/nebula/internal_router.go:136
- GET /internal/mesh/status @ shc/modules/nebula/internal_router.go:138
- POST /internal/mesh/uninstall @ shc/modules/nebula/internal_router.go:137
- POST /internal/nebula/reload @ shc/modules/nebula/internal_router.go:146
- POST /internal/nebula/rotate @ shc/modules/nebula/router.go:96
- GET /internal/nebula/status @ shc/modules/nebula/internal_router.go:145
- POST /internal/nebula/update-lighthouses @ shc/modules/nebula/internal_router.go:147
daemon (5)
- subsystem infrastructure_reconcile (prio -10) @ subsystems/impl/infrastructure_reconcile.go:73
- subsystem cluster_cert_rotation (prio 65, leader-only) @ shc/subsystems/cluster_cert_rotation.go:40
- loop infrastructure_reconcile.sweep @ subsystems/impl/infrastructure_reconcile.go:49
- loop cluster_cert_rotation.nebula_check @ shc/modules/nebula/types.go:193
- dead-path network-task-handlers-never-wired @ modules/network/tasks.go:68
db (1)
- table mesh_token @ ent/schema/mesh_token.go:14
events (1)
- module network event types (7): V200700NETCRT, V200701NETTNT, V200702NETENV, V200703NETSTK, V200704NETDPL, V200705NETALL, V200706NETTRK
config (1)
- env SHC_NIC @ modules/network/state.go:39
errors (3)
- module core/nic — 2 X-codes @ core/nic/ (full list: docs/reference/errors.md; the shared NIC detector behind —nic / SHC_NIC — added 2026-07-30 re-extraction)
- module nebula — 9 X-codes @ shc/modules/nebula/ (full list: docs/reference/errors.md)
- module network — 3 X-codes @ modules/network/ (full list: docs/reference/errors.md)
docs (6)
- docs/architecture/core/networking.md (1 claim entries)
- docs/architecture/modules/nebula.md (1 claim entries)
- docs/architecture/modules/network.md (1 claim entries)
- docs/reference/errors.md [doc section (global)] (2 claim entries)
- docs/reference/errors.md [doc section nebula] (11 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
network-fabric
Section titled “network-fabric”SHC network fabric (slice 1 scaffold): routed kernel-WireGuard cross-node data plane (shc0 device), cluster-scoped fabric choice swarm|shc|none at init, per-node /24 IPAM over the fabric supernet
- ADDED in the 2026-07-30 re-extraction — the module post-dates the 07-02 extraction and had no graph presence
- DORMANT scaffold unless a cluster was initialized with —fabric shc: no renderer target, no nftables policy, no podman adapter yet (modules/fabric/types.go package doc)
- per-node /24 allocator over fabric_allocation runs leader-side (modules/fabric/repo.go:93 Allocate); the WireGuard private key is generated on the node and NEVER leaves it — only the derived public key travels enroll→allocation row (modules/fabric/keys.go:23 EnsurePrivateKey)
- shc0 device + peers applied via rtnetlink/wgctrl — no config files, no shelling out (modules/fabric/applier_linux.go:24); fabric none allows a single node only (X409358FABNON); tombstoned /24s are never reused, exhaustion means re-init wider (X500353FABFUL)
- edges: cluster-membership (enroll carries the fabric public key; the fabric/runtime topology matrix excludes swarm runtime under —fabric shc) and mesh-networking (nebula is the control-plane overlay; the fabric is the runtime-neutral DATA-plane alternative to docker swarm overlay)
db (1)
- table fabric_allocation @ ent/schema/fabric_allocation.go:27
config (2)
- flag —fabric (shc init; swarm|shc|none, unset preserves today’s swarm-overlay model) @ modules/cluster/commands/init.go:484
- flag —fabric-cidr (shc init; only with —fabric shc, default 10.84.0.0/16) @ modules/cluster/commands/init.go:485
errors (1)
- module fabric — 9 X-codes @ modules/fabric/ (full list: docs/reference/errors.md)
docs (2)
- docs/architecture/cluster/network-fabric.md (claims unextracted)
- docs/reference/errors.md [doc section fabric] (claims unextracted)
cluster-membership
Section titled “cluster-membership”Cluster formation and membership: raft voters, join/enroll/leave/repair, node registry, leader election, peer RPC
- /internal/* peer routes are mTLS/shared-token only by design (no public CLI verb)
- shc leader health/status degrade to local-only service when the daemon is unreachable
- 2026-07-06 surface trim:
node add/node rm/node set-storage/node config *REMOVED — membership is enrollment-owned (join / cluster rm / forget);node swarm-tokensadded - 2026-07-07: identity-first membership matcher + membership watchdog closed the voter-collapse class in the old embedded-raft engine;
cluster repair --force= quorum-loss recovery - 2026-07-30 re-extraction: shc/core/rqlited (the external-rqlited supervisor + sqlite⇄rqlite engine-flip surface, a Go port of the Python-era shc/rqlite/manager.py) and shc/core/enginemarker folded in — they had no graph presence; joiners join as full raft voters by default (NonVoter opts out)
cli (25)
- shc cluster @ modules/cluster/commands/main.go:223
- shc cluster init [hidden] @ modules/cluster/commands/init.go:92
- shc cluster join [hidden] @ shc/modules/cluster/commands/join.go:28
- shc cluster leave @ shc/modules/cluster/commands/leave.go:25
- shc cluster logs @ modules/cluster/commands/admin.go:90
- shc cluster nodes @ modules/cluster/commands/nodes.go:42
- shc cluster ping @ modules/cluster/commands/admin.go:150
- shc cluster reconcile @ modules/cluster/commands/reconcile.go:33
- shc cluster repair @ modules/cluster/commands/admin.go:219
- shc cluster rm @ modules/cluster/commands/admin.go:343
- shc cluster status @ modules/cluster/commands/status.go:26
- shc leader @ shc/modules/leader/commands/main.go:75
- shc leader health @ shc/modules/leader/commands/health.go:25
- shc leader status @ shc/modules/leader/commands/status.go:26
- shc node @ modules/node/commands/main.go:107
- shc node drain @ shc/modules/node/commands/drain.go:28
- shc node forget @ shc/modules/node/commands/forget.go:33
- shc node health @ modules/node/commands/stubs.go:82
- shc node info @ modules/node/commands/stubs.go:68
- shc node join @ shc/modules/node/commands/join.go:36
- shc node leave [—purge] @ shc/modules/node/commands/leave.go:34
- shc node ls @ modules/node/commands/stubs.go:53
- shc node status @ shc/modules/node/commands/status.go:18
- shc node swarm-tokens @ shc/modules/node/commands/swarm_tokens.go:27
- shc node token @ shc/modules/node/commands/token.go:23
api (30)
- GET /api/method/shc.cluster.certs.list @ modules/cluster/certs_router.go:148
- POST /api/method/shc.cluster.certs.rotate @ modules/cluster/certs_router.go:149
- POST /api/method/shc.cluster.drain @ shc/modules/cluster/lifecycle_router.go:129
- POST /api/method/shc.cluster.force_leader @ shc/modules/cluster/lifecycle_router.go:131
- POST /api/method/shc.cluster.forget @ shc/modules/cluster/lifecycle_router.go:130
- POST /api/method/shc.cluster.leave @ shc/modules/cluster/lifecycle_router.go:128
- POST /api/method/shc.cluster.lighthouse.add @ shc/modules/cluster/lighthouse_router.go:106
- GET /api/method/shc.cluster.lighthouse.ls @ shc/modules/cluster/lighthouse_router.go:105
- DELETE /api/method/shc.cluster.lighthouse.rm @ shc/modules/cluster/lighthouse_router.go:107
- GET /api/method/shc.cluster.logs @ modules/cluster/admin_router.go:98
- GET /api/method/shc.cluster.mesh.diagnose @ shc/modules/cluster/mesh_router.go:152
- POST /api/method/shc.cluster.mesh.disable @ shc/modules/cluster/mesh_router.go:150
- POST /api/method/shc.cluster.mesh.enable @ shc/modules/cluster/mesh_router.go:149
- GET /api/method/shc.cluster.mesh.status @ shc/modules/cluster/mesh_router.go:151
- GET /api/method/shc.cluster.nodes @ modules/cluster/nodes_router.go:66
- GET /api/method/shc.cluster.ping @ modules/cluster/admin_router.go:95
- POST /api/method/shc.cluster.repair @ modules/cluster/admin_router.go:96
- DELETE /api/method/shc.cluster.rm @ modules/cluster/admin_router.go:97
- GET /api/method/shc.cluster.status @ modules/cluster/nodes_router.go:69
- POST /api/method/shc.cluster.token @ shc/modules/cluster/token_router.go:170
- GET /api/method/shc.leader.health @ shc/modules/leader/router.go:36
- GET /api/method/shc.leader.status @ shc/modules/leader/router.go:35
- GET /api/method/shc.node.deployments @ modules/node/deployments_router.go:76
- POST /api/method/shc.node.health @ modules/node/router.go:160
- GET /api/method/shc.node.ls @ modules/cluster/nodes_router.go:67
- GET /api/method/shc.node.status @ modules/cluster/nodes_router.go:68
- GET /api/method/shc.node.swarm_tokens @ modules/node/router.go:161
- GET /api/resource/Node @ modules/node/router.go:167 (read-only — Node POST/PUT/DELETE removed with the node add/rm surface trim; membership is enrollment-owned)
- GET /api/resource/Node/{name} @ modules/node/router.go:168
- POST /api/method/shc.cluster.certs.rotate_now @ modules/cluster/certs_router.go:155 (canonical; the hyphen spelling rotate-now stays registered as a compat alias at :156)
int-api (8)
- GET /internal/certs/info @ modules/cluster/certs_internal_router.go:117
- POST /internal/certs/install @ modules/cluster/certs_internal_router.go:118
- POST /internal/certs/renew @ modules/cluster/certs_internal_router.go:120
- POST /internal/certs/rotate @ modules/cluster/certs_internal_router.go:119
- POST /internal/enroll @ modules/cluster/router.go:77
- POST /internal/node/leave @ modules/node/internal_router.go:134
- POST /internal/rpc/{function_name} @ modules/internal_rpc/router.go:50
- POST /internal/unenroll @ modules/node/internal_router.go:135
daemon (9)
- subsystem rqlite_engine (prio 1) @ shc/subsystems/rqlite_engine.go:76
- subsystem node_self_register (prio 6) @ subsystems/impl/node_self_register.go:83
- subsystem leader_hub (prio 50) @ subsystems/impl/leader_hub.go:145
- loop leader_hub.leader_poll @ subsystems/impl/leader_hub.go:501
- loop node_self_register.swarm_refresh @ subsystems/impl/node_self_register.go:318
- rqlited supervisor (spawn, /readyz + consecutive-SELECT-1 readiness gate, crash relaunch, SIGTERM→SIGKILL shutdown of the EXTERNAL rqlited process) @ shc/core/rqlited/manager.go:145 (New)
- engine flip promote/demote (marker + restart, never a live swap; POST /boot sqlite ingest, wal_checkpoint(TRUNCATE) demote export) @ shc/core/rqlited/engine.go:67 (BootFromFile) / :99 (Demote), wired shc/daemon/wiring/engine_flip.go:44
- engine marker {state}/engine.json (absence IS plain-sqlite single-node mode) @ shc/core/enginemarker/enginemarker.go:49 (ReadMarker)
- leader-elector seam registration (raft-backed probe; single-node keeps permanent leadership on a nil probe) @ shc/subsystems/leader_elector.go:1
db (1)
- table node @ ent/schema/node.go:14
events (2)
- module cluster event types (8): V200402NODEHL, V500402NODEUR, V500405NODFAL, A200201CLSPRO, A200202CLSDEM, A200400CLSDRN, V500400CLSDRF, A200400CLSFRC
- module node event types (3): A200200NODCRT, A200201NODUPD, A200202NODRMV
config (5)
- single-node mode is marker-derived, not a config key (the former cluster.single_node key is retired) — singleNodeMode(paths.StateHome(), hasJoin) @ daemon/daemon.go:948
- env SHC_ADVERTISE_ADDR @ modules/app/dns_lifecycle.go:189
- env SHC_NODE_LOCATION @ subsystems/impl/node_self_register.go:374
- env SHC_RQLITE_RAFT_ADDR @ shc/subsystems/rqlite_engine.go:128
- env SHC_RQLITE_BIND_ADDR @ shc/subsystems/rqlite_engine.go:301
errors (6)
- module cluster — 50 X-codes @ shc/modules/cluster/ + modules/cluster/ (full list: docs/reference/errors.md)
- module core/enginemarker — 1 X-codes @ shc/core/enginemarker/ (full list: docs/reference/errors.md; added 2026-07-30 re-extraction)
- module core/rqlited — 19 X-codes @ shc/core/rqlited/ (full list: docs/reference/errors.md; added 2026-07-30 re-extraction)
- module internal_rpc — 6 X-codes @ modules/internal_rpc/ (full list: docs/reference/errors.md)
- module leader — 1 X-codes @ modules/leader/ (full list: docs/reference/errors.md)
- module node — 19 X-codes @ modules/node/ (full list: docs/reference/errors.md)
docs (16)
- docs/architecture/cluster/diagrams.md (1 claim entries)
- docs/architecture/cluster/overview.md (1 claim entries)
- docs/architecture/flows/cluster-join.md (1 claim entries)
- docs/architecture/modules/cluster.md (1 claim entries)
- docs/architecture/modules/leader.md (1 claim entries)
- docs/architecture/modules/node.md (1 claim entries)
- docs/guide/operations/cluster-setup.md (1 claim entries)
- docs/reference/api/cluster.md (2 claim entries)
- docs/reference/api/node.md (9 claim entries)
- docs/reference/cli/cluster.md (13 claim entries)
- docs/reference/cli/node.md (21 claim entries)
- docs/reference/errors.md [doc section cluster] (51 claim entries)
- docs/reference/errors.md [doc section core/rqlited] (3 claim entries)
- docs/reference/errors.md [doc section leader] (1 claim entries)
- docs/reference/errors.md [doc section node] (11 claim entries)
- docs/reference/errors.md [module-count claims] (4 claim entries)
init-system-apps
Section titled “init-system-apps”First-boot cluster init wizard and system apps (traefik/keycloak/openobserve) plan/reconcile
shc initandshc cluster initare hidden commands; the system plan is daemon-authoritative (shc.system.plan)- 2026-07-07 frozen contract: init = PURE BOOTSTRAP; provider/lb/connection flags DELETED (init_providers.go retired); connections are set up post-init. 2026-07-17 flag-set refresh (F8/F9): —name/—runtime/—nic/—nebula/—host/—vault-password[-file]/—modules-config/—acme-provider/—acme-directory/—acme-email/—public-address/—yes/—force — —system-apps/—traefik-le* retired (init_test.go pins the traefik-le family absent)
cli (2)
- shc init [hidden] @ modules/cluster/commands/init.go:92
- shc reconcile @ modules/cluster/commands/reconcile.go:33
api (2)
- POST /api/method/shc.system.complete @ modules/app/router.go:110
- POST /api/method/shc.system.plan @ modules/app/router.go:109
config (1)
- env SHC_MODULES @ modules/app/system_plan.go:63
docs (3)
- docs/guide/getting-started/installation.md (1 claim entries)
- docs/guide/getting-started/quick-start.md (1 claim entries)
- docs/reference/cli/init.md (2 claim entries)
tenants
Section titled “tenants”Tenant lifecycle and tenant-scoped context (add/rm/info/use)
cli (6)
- shc tenant @ modules/tenant/commands/main.go:107
- shc tenant add @ modules/tenant/commands/add.go:35
- shc tenant info @ modules/tenant/commands/info.go:24
- shc tenant ls @ modules/tenant/commands/ls.go:24
- shc tenant rm @ modules/tenant/commands/rm.go:33
- shc tenant use @ modules/tenant/commands/use.go:26
api (4)
- GET /api/resource/Tenant @ modules/tenant/router.go:29
- POST /api/resource/Tenant @ modules/tenant/router.go:31
- DELETE /api/resource/Tenant/{name} @ modules/tenant/router.go:32
- GET /api/resource/Tenant/{name} @ modules/tenant/router.go:30
errors (1)
- module tenant — 15 X-codes @ modules/tenant/ (full list: docs/reference/errors.md)
docs (4)
- docs/architecture/modules/tenant.md (1 claim entries)
- docs/reference/api/tenant.md (5 claim entries)
- docs/reference/cli/tenant.md (7 claim entries)
- docs/reference/errors.md [doc section (global)] (3 claim entries)
auth-access
Section titled “auth-access”AuthN/AuthZ: keycloak OIDC login, tokens, users, role grants, RBAC, access-control model
cli (12)
- shc auth @ modules/auth/commands/main.go:48
- shc auth login @ modules/auth/commands/main.go:77
- shc auth logout @ modules/auth/commands/main.go:208
- shc user @ modules/user/commands/main.go:163
- shc user apps @ modules/user/commands/apps.go:14
- shc user create @ modules/user/commands/create.go:19
- shc user grant @ modules/user/commands/grant.go:16
- shc user ls @ modules/user/commands/list.go:18
- shc user managed-apps @ modules/user/commands/apps.go:40
- shc user reset-password @ modules/user/commands/reset_password.go:19
- shc user revoke @ modules/user/commands/revoke.go:16
- shc user rm @ modules/user/commands/rm.go:19
api (11)
- GET /api/auth/ca @ modules/auth/router.go:118
- GET /api/auth/oidc/realm @ modules/auth/router.go:116
- GET /api/auth/oidc/realm-for-host @ modules/auth/router.go:115
- GET /api/user/apps @ modules/user/router.go:86
- POST /api/user/create @ modules/user/router.go:88
- POST /api/user/delete @ modules/user/router.go:107
- POST /api/user/grant @ modules/user/router.go:89
- GET /api/user/list @ modules/user/router.go:91
- GET /api/user/managed-apps @ modules/user/router.go:87
- POST /api/user/reset-password @ modules/user/router.go:92
- POST /api/user/revoke @ modules/user/router.go:90
hud (4)
- view users (key U) @ shc/modules/hud/state/state.go:31
- overlay re-login form @ shc/modules/hud/relogin.go:38
- fzf role grant picker @ shc/modules/hud/user_actions.go:75
- fzf role revoke picker @ shc/modules/hud/user_actions.go:87
events (1)
- module auth event types (5): A401000AUTHFL, A401001TOKEXP, A401002TOKINV, A403000AUTHZF, A403001PERMDNY
config (12)
- key keycloak.client_id @ core/config/default.yaml:39
- key keycloak.client_secret [DEAD] @ core/config/default.yaml:42
- key keycloak.tls_verify @ core/config/default.yaml:46
- key keycloak.swagger_client_id @ core/config/default.yaml:48
- key keycloak.realm [undocumented] @ daemon/services.go:1126
- key keycloak.base_path [undocumented] @ daemon/services.go:1135
- env SHC_KEYCLOAK_CLIENT_ID @ core/config/config.go:296
- env SHC_KEYCLOAK_CLIENT_SECRET @ core/config/config.go:297
- env SHC_KEYCLOAK_REALM @ core/config/config.go:298
- env SHC_HTTP_TOKEN @ core/config/config.go:260
- env SHC_USER @ core/config/config.go:260
- env SHC_PASSWORD @ core/config/config.go:260
errors (2)
- module auth — 54 X-codes @ modules/auth/ (full list: docs/reference/errors.md)
- module user — 9 X-codes @ modules/user/ (full list: docs/reference/errors.md)
docs (6)
- docs/architecture/access-control.md (1 claim entries)
- docs/architecture/security.md (1 claim entries)
- docs/guide/apps/keycloak.md (1 claim entries)
- docs/reference/errors.md [doc section (global)] (15 claim entries)
- docs/reference/errors.md [doc section auth] (4 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
quotas-usage
Section titled “quotas-usage”Per-scope CPU/mem/disk/object quotas and usage accounting
cli (5)
- shc quota @ shc/modules/quota/commands/main.go:26
- shc quota scan @ shc/modules/quota/commands/scan.go:24
- shc quota set @ shc/modules/quota/commands/set.go:41
- shc quota status @ shc/modules/quota/commands/status.go:24
- shc quota unset @ shc/modules/quota/commands/unset.go:41
api (6)
- GET /api/method/shc.quota.limits @ shc/modules/quota/router.go:136
- POST /api/method/shc.quota.scan_disk @ shc/modules/quota/router.go:138
- GET /api/method/shc.quota.status @ shc/modules/quota/router.go:135
- GET /api/method/shc.quota.usage @ shc/modules/quota/router.go:137
- GET /api/resource/Usage @ shc/modules/quota/router.go:139
- GET /api/resource/Usage/{usage_id} @ shc/modules/quota/router.go:140
hud (1)
- view quotas (key Q) @ shc/modules/hud/state/state.go:29
daemon (2)
- cron scan_all_disk_usage (every 1 hour, leader-gated) @ shc/modules/quota/crons.go:129
- cron reconcile_all_usage (every 6 hours, leader-gated) @ shc/modules/quota/crons.go:137
db (1)
- table usage @ ent/schema/usage.go:15
events (1)
- module quota event types (3): A200503QTASCA, V200504DSKSCA, V200505USGREC
config (10)
- key quota.cpu [undocumented] @ shc/daemon/wiring/quota_limits.go:18
- key quota.memory [undocumented] @ shc/daemon/wiring/quota_limits.go:19
- key quota.disk [undocumented] @ shc/daemon/wiring/quota_limits.go:20
- key quota.max_stacks [undocumented] @ shc/daemon/wiring/quota_limits.go:21
- key quota.max_environments [undocumented] @ shc/daemon/wiring/quota_limits.go:22
- key quota.max_apps [undocumented] @ shc/daemon/wiring/quota_limits.go:23
- key quota.max_vapp_instances [undocumented] @ shc/daemon/wiring/quota_limits.go:24
- prefix quota.
@ shc/daemon/wiring/quota_limits.go:17 - cron-override crons.scan_all_disk_usage @ shc/modules/quota/crons.go:35
- cron-override crons.reconcile_all_usage @ shc/modules/quota/crons.go:36
errors (1)
- module quota — 16 X-codes @ shc/modules/quota/ (full list: docs/reference/errors.md)
docs (5)
- docs/architecture/modules/quota.md (1 claim entries)
- docs/reference/api/quota.md (7 claim entries)
- docs/reference/cli/quota.md (6 claim entries)
- docs/reference/errors.md [doc section quota] (15 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
licensing
Section titled “licensing”Licensing and entitlements: data-driven license resolution (offline, file-interface), opt-in trial, activation (signed file / broker domain-callback dual-verify), broker refresh, two-file annual+overage union, peak capacity billing, strong lock, cluster-wide row distribution + watch, entitlement gates, the vendor license-broker service
- ADDED in the 2026-07-30 re-extraction — the licensing core landed through 2026-07 (broker refresh, two-file union, peak billing, strong lock, distribution + row watch all post-date the 07-02 extraction; no prior graph presence)
- resolution is DATA-driven and OFFLINE: entitlements resolve from local signed files —
/license/license.lic (annual baseline) + license-overage.lic (~35-day overage) @ shc/modules/license/store.go:32,42,47; union merge rules (shc/modules/license/union.go): limits SUM with absent/-1 absorbing as UNLIMITED, features OR, domain must match BOTH, each expiry independent, an expired overage contributes nothing - distribution doctrine (shc/modules/license/distribution.go): replicated kv row → each node independently materialises its own local file → consumers read files; licensing must NEVER depend on quorum — the DB is needed once, then never again
- peak capacity tracking (shc/modules/license/usage.go): the peak over the term sizes the NEXT term, overage is never back-billed; the peak is MONOTONE within a term (structurally — one merge function) and every sampled axis FAILS OPEN (a failed read is skipped, never recorded as zero)
- the strong lock (shc/modules/license/lock.go) fires only on (a) lapse + closed 14-day grace or (b) usage over caps; NEVER a data hostage — reads, backup export, start/stop/restart always pass; never applied to unlicensed/dev/trial/uninitialized/replicating postures
- unlicensed EE = CE-equivalent by choice; the trial is explicit opt-in (X403036LICOPT points at
shc license trial start; license.accept_trial is the IaC consent path @ shc/modules/license/opt_in_prompt.go:25); a lapsed trial LOCKS after grace (owner ruling 4) - product-boundary halves: core/eestub = CE-side visible-but-honest “requires SHC EE” command stubs (X403028CLIEEO @ core/eestub/eestub.go:54); shc/core/eegate = the commercial clients’ daemon-product handshake (X403026DMNEEO @ shc/core/eegate/eegate.go:65) — consulted by the HUD and shc-x9s
- entitlement gates registered across modules (doctrine: deleting proprietary code removes CAPABILITY, never a RESTRICTION): sso @ shc/modules/app/sso_gate.go:27, swarm/clustering runtime @ shc/modules/app/runtime_gate.go:20, named environments @ shc/modules/app/environment_gate.go:52, tenancy create + max_tenants @ shc/modules/tenant/create_gate.go:30 + create_count_gate.go:34, audit compliance @ shc/modules/audit/license_gate.go:30, volume rebind @ shc/modules/storage/volume_rebind_edition.go:25, seat-cap lift + licensed max_seats @ shc/modules/user/seat_limit.go:29 + shc/daemon/wiring/user_seat_gate.go:62, /api/health license watermark @ shc/modules/app/health_license.go:17, system-image gate (see system-image-extensions)
- the broker dogfoods as an SHC app on the vendor estate next to apps/keygen (license-broker/app/, keygen.plug.yaml); an ERPNext invoice-paid hook drives the vendor /record route (license-broker/brokerd/record.go)
cli (8)
- shc license @ shc/modules/license/commands.go:27
- shc license status @ shc/modules/license/commands.go:103
- shc license trial @ shc/modules/license/commands.go:135
- shc license trial start @ shc/modules/license/commands.go:141
- shc license activate [
] (offline signed file; —broker = keyless online activation) @ shc/modules/license/commands.go:621 - shc license refresh @ shc/modules/license/commands.go:691
- shc license delink @ shc/modules/license/commands.go:724
- shc license mint [hidden, VENDOR-ONLY offline signer — local, calls LoadSigner/Mint directly] @ shc/modules/license/mint_cmd.go:35
api (8)
- GET /api/method/shc.license.status @ shc/modules/license/router.go:50
- POST /api/method/shc.license.activate @ shc/modules/license/router.go:51
- POST /api/method/shc.license.activate_online @ shc/modules/license/router.go:52
- POST /api/method/shc.license.delink @ shc/modules/license/router.go:53
- POST /api/method/shc.license.refresh @ shc/modules/license/router.go:54
- POST /api/method/shc.license.trial @ shc/modules/license/router.go:55
- GET /.well-known/shc-license-challenge (self-authenticating; the broker’s activation-callback nonce leg over the estate’s system ingress) @ shc/modules/license/router.go:57 (ChallengePath shc/modules/license/challenge.go:25; prefix reaches shc-api via shc/modules/app/license_challenge_route.go + modules/app/system_api_prefixes.go:19)
- broker (the VENDOR’s service, deployed on the vendor’s own estate — never part of a customer daemon): POST /activate + POST /refresh @ license-broker/brokerd/server.go:81-82; vendor-only POST /mint + POST /record (armed by LB_VENDOR_TOKEN, else 404) @ license-broker/brokerd/server.go:84,86
daemon (7)
- cron license.reverify (every 6 hours, every node; the poll policy decides per fire whether to ask the broker at all) @ shc/modules/license/crons.go:42
- cron license.usage_sample (every 1 hour, every node; the peak fold inside SampleUsage is leader-only) @ shc/modules/license/usage_crons.go:61
- cron license.usage_sample_boot (every 1 minute, self-retiring once any reading is held) @ shc/modules/license/usage_crons.go:81
- wiring eeWireLicense (composition root — resolver, stores, config listeners) @ shc/daemon/wiring/license_wire.go:50
- strong-lock probe on every mutating request (CE installs no probe and the middleware reads nil as unlocked — CE is structurally incapable of locking) @ shc/daemon/wiring/license_lock.go:27 (CE half = core/api LicenseLockMiddleware)
- licence ROW watch (15s content watch — followers re-materialise their file when the row itself changes, closing the stale-follower window seen live on the v0.0.6 roll) @ shc/modules/license/distribution.go:536 (WatchRows)
- join-time capacity gate + its audit trail @ shc/daemon/wiring/cluster_enroll_license.go:54 (AcceptEnrollGrant) / shc/modules/license/capgate.go:107,131 (X503964LICGSK when the registry read fails — a skipped gate says so)
db (1)
- kv rows license.file/<annual|overage> + license.estate + license.trial (CLUSTER scope over the replicated kv table — no new table, no migration) @ shc/daemon/wiring/license_row.go:32,106,180
config (6)
- prefix license.* (accept_trial = the IaC consent door; offline = airgapped never-ask policy) @ shc/modules/license/register.go:28
- env SHC_LICENSE_ENFORCE @ shc/modules/license/devenv.go:27
- env SHC_LICENSE_BROKER_URL (dev override only — the production broker URL is BAKED into the binary) @ shc/modules/license/devenv.go:30
- env SHC_LICENSE_PUBKEY_FILE @ shc/modules/license/devenv.go:35
- env SHC_LICENSE_SIGNING_KEY (vendor mint/broker signing seed only) @ shc/modules/license/signer.go:12
- broker env surface (LB_LISTEN, LB_GRANTS[_FILE], LB_KEYGEN_URL/_ACCOUNT_ID/_TOKEN/_HOST/_PRODUCT_ID, LB_CALLBACK_TIMEOUT, LB_VENDOR_TOKEN, LB_PRO_CORE_FLOOR, …) @ license-broker/main.go:1
errors (3)
- module core/eegate — 1 X-codes @ shc/core/eegate/ (full list: docs/reference/errors.md)
- module core/eestub — 1 X-codes @ core/eestub/ (full list: docs/reference/errors.md)
- module license — 26 X-codes @ shc/modules/license/ (full list: docs/reference/errors.md)
docs (5)
- docs/reference/cli/shc_license.md + shc_license_status/trial/trial_start/activate/refresh/delink.md (claims unextracted)
- docs/reference/errors.md [doc section license] (claims unextracted)
- TIERS.md (claims unextracted)
- docs/internal/ee-licensing-design.md (claims unextracted)
- docs/handoff/2026-07-30-licensing-program.md + docs/handoff/2026-07-30-open-core-enforcement-architecture.md (claims unextracted)
system-image-extensions
Section titled “system-image-extensions”Proprietary system-image extensions: the SHC Traefik image’s baked Yaegi response-injection plugin (launcher/apps menu, license banner, informational status endpoint, opt-in forward-auth gate) + the SHC Keycloak image’s SPI (realm role/group seeding, federation guard, license verification) + the ce-side feeders and the system-app image gate that make the images load-bearing
- ADDED in the 2026-07-30 re-extraction — traefik/plugin, keycloak/ and the image gate post-date the 07-02 extraction; the forward-auth fold (authGate) landed at shc 4f92d8947 and the baked estate-routes module traefik/render/ at 75336e78d, the very HEAD this pass extracted against
- traefik/render is a zero-dependency in-image module like traefik/plugin (enforced by
test ! -e ./go.sumin traefik/docker/Dockerfile); its YAML emit is golden-tested byte-identical to ce’s WriteTraefikShcAPIRoute output; failure posture is ALWAYS EXEC (a render failure must never keep Traefik down) with baked/ emptied first so a docker restart cannot serve a stale route; ce’s identity-env/mount half lands separately - doctrine (the plugin’s own header): “the DB is the replication mechanism, the FILE is the interface, the TRUST is the signature” — neither extension calls the daemon; the one exception is the opt-in authGate, where a per-request live lookup is the point
- every injector fails OPEN (any error, unreadable license, non-HTML or encoded response passes through unmodified); UNIQUELY the authGate fails CLOSED — an unusable config refuses (403) instead of vanishing, and only an explicit enabled:true turns it on, so silence changes no router (traefik/plugin/auth.go)
- the forward-auth/ SIDECAR path is untouched and stays functional this release — gate and sidecar honour the same session cookie, and ce’s cutover chains the gate IN FRONT of shc-oidc (its runtime surface stays cited under ingress-routing)
- source is not secret: the plugin ships as plain interpreted .go in the image (yaegi has no compiled option) and the SPI jar decompiles — the protection is effort plus the private signing seed, never algorithm secrecy
- no rows under errors: both extensions run OUT of the daemon process — the plugin registers nothing in core/coded, and the SPI’s SHC-style codes are minted Java-side; the image gate’s X403974IMGEEO is counted in module app’s row (app-install-lifecycle/app-packaging)
- edges: licensing (banner/status render the same resolver posture the daemon enforces), ingress-routing (the plugin rides the system Traefik the ingress feature materializes), auth-access (the SPI seeds the role vocabulary modules/user grants against; RealmSetup closes the hand-created-realm window until the leader reconcile pass)
api (2)
- GET /.well-known/shc-license-status (plugin-INTERCEPTED at the edge on gated hosts; informational only, enforces nothing; configurable/disableable) @ traefik/plugin/shcinject.go:90 (defaultStatusEndpoint) / traefik/plugin/status.go:1
- forward-auth gate legs (opt-in authGate; OIDC redirect + signed state, /api/auth/oidc/callback code-exchange intercept, per-request daemon authz round-trip to GET /api/auth/forward-auth) @ traefik/plugin/auth.go:117,341
daemon (6)
- apps-menu data file
/license/apps.json — daemon-rendered, plugin-read (the file is the interface, never HTTP) @ modules/app/apps_menu.go:158 (WriteAppsMenuFile) / traefik/plugin/menu.go:146 (menuSource) - license dir mount /shc/license read + Ed25519-VERIFIED in-plugin (yaegi ships crypto/ed25519; same signature→domain→expiry order as the daemon) @ traefik/plugin/license.go:60,214
- launcher middleware shc-launcher-
chained onto every gated router via the traefik file provider @ modules/app/inject_traefik.go:592 (WriteIngressRouteFile) - system-app image gate — ce default REFUSES a non-shipped image build (X403974IMGEEO), the licensed half installs the permissive custom_images gate; mirror-vs-substitution is settled BEFORE the hook @ modules/app/system_image_gate.go:190 / shc/modules/app/system_image_gate.go:58 / core/imageref/imageref.go:132 (Mirrors)
- baked estate-global routes — shc-traefik-boot renders the SHC API route (+ licence banner/status middleware + activation callback path) and the system keycloak/openobserve routes into /etc/traefik/dynamic/baked from the SHC_INGRESS_* identity env, then EXECs the stock entrypoint (Traefik stays PID 1) @ traefik/render/render.go:207 (FromEnv) / :243 (Files) / traefik/render/cmd/shc-traefik-boot/main.go:44
- keycloak SPI — realm-creation role/group vocabulary seeding, federation guard, mounted-file license gate @ keycloak/spi/src/main/java/org/selfhostedcloud/keycloak/events/RealmSetup.java + events/FederationGuard.java + license/LicenseGate.java
config (4)
- plugin middleware config (lastModified / rewrites / licenseDir / licenseHost / licenseBanner / appsMenu / authGate / statusEndpoint / handleGzip) @ traefik/plugin/shcinject.go:135 (Config), manifest traefik/plugin/.traefik.yml
- authGate config carries TOPOLOGY ONLY (enabled / shcUrl / caBundle) — secrets ride the sidecar-compatible env vars; the CA bundle self-heals off the dynamic mount @ traefik/plugin/auth.go:172 (AuthGateConfig)
- keycloak SPI env (SHC_LICENSE_FILE / SHC_LICENSE_HOST / SHC_LICENSE_TTL_SECONDS / SHC_LICENSE_GRACE_DAYS / SHC_LICENSE_PUBKEY_FILE / SHC_KC_REALM_SETUP[_SKIP] / SHC_KC_REALM_ROLES / SHC_KC_REALM_GROUPS / SHC_KC_ADMIN_THEME) @ keycloak/spi/src/main/java/org/selfhostedcloud/keycloak/ShcConfig.java:30-64
- env SHC_INGRESS_* (estate identity stamped on the traefik container by the daemon — HOST/ACME + KEYCLOAK_/OPENOBSERVE_ HOST/PATH/ACME/RUNTIME; consumed in-image, never by the daemon) @ traefik/render/render.go:210-221
docs (2)
- TIERS.md (mirroring free on every tier — same-digest refs classify as mirrors, no license consulted) (claims unextracted)
- docs/handoff/2026-07-30-open-core-enforcement-architecture.md (claims unextracted)
health-status
Section titled “health-status”Deployment/service/node health and status: unified status model, doctor diagnoses, health crons, reconcile-on-degraded, maintenance sweeps
- db_analyze/db_vacuum/image_prune/disk_auto_prune maintenance crons are registered by the health module (grouped here)
cli (4)
- shc doctor @ modules/doctor/commands/main.go:12
- shc doctor ls @ modules/doctor/commands/list.go:18 (alias
list) - shc doctor run @ modules/doctor/commands/run.go:33
- shc status @ modules/health/commands/main.go:90 (the old
status showsubcommand folded into the root verb)
api (6)
- GET /api/doctor/diagnoses @ modules/doctor/router.go:28
- POST /api/doctor/run @ modules/doctor/router.go:29
- GET /api/health @ modules/app/router.go:123
- GET /api/method/shc.status.get @ modules/health/router.go:29
- POST /api/method/shc.status.get @ modules/health/router.go:28
- GET /api/status @ modules/app/router.go:124
int-api (1)
- GET /internal/health @ modules/health/router.go:30
daemon (15)
- subsystem container_recorder_node (prio 11) @ subsystems/impl/container_recorder_node.go:149
- subsystem swarm_recorder (prio 52, leader-only) @ subsystems/impl/swarm_recorder.go:74
- cron tick_cron (every 2 seconds, leader-gated) @ modules/health/crons.go:102
- cron poll_cron (every 1 minute, leader-gated) @ modules/health/crons.go:103
- cron reconcile_cron (every 1 minute, leader-gated) @ modules/health/crons.go:104
- cron cleanup_cron (every 1 hour, leader-gated) @ modules/health/crons.go:105
- cron disk_auto_prune_cron (every 1 hour, leader-gated) @ modules/health/crons.go:106
- cron image_prune_cron (every 6 hours) @ modules/health/crons.go:108
- cron db_analyze_cron (every 6 hours, leader-gated) @ modules/health/crons.go:109
- cron db_vacuum_cron (every 6 hours, leader-gated) @ modules/health/crons.go:110
- task-handler health_config_handler @ modules/health/config_reload.go:75
- loop container_recorder_node.floor @ subsystems/impl/container_recorder_node.go:342
- loop swarm_recorder.sweep @ subsystems/impl/swarm_recorder.go:39
- loop lifecycle.health_checks @ subsystems/lifecycle/lifecycle.go:214
- dead-path health-db-cron-spec-drift @ modules/health/crons.go:22
events (6)
- module health event types (11): V200400DPLYHL, V200401DPLYDG, V500400DPLYUH, V200500STSDRF, V200403NODEDG, V500401NODEUH, V200410ORPHCL, V200411STLJOB, V200412DSKPRN, V200413SSHREF, V200414VLTCHK
- unregistered publish V200330SVCSTC @ subsystems/impl/container_recorder_node.go:659
- unregistered publish V200500RCNATT @ modules/health/reconcile/reconcile.go:263
- unregistered publish V200501RCNHEAL @ modules/health/reconcile/reconcile.go:278
- unregistered publish V200502RCNFAIL @ modules/health/reconcile/reconcile.go:296
- unregistered publish X409903PRTCNF @ modules/health/reconcile/actions.go:281
config (17)
- key timing.slow_poll @ core/config/default.yaml:65
- key timing.tick_interval @ core/config/default.yaml:66
- key maintenance.events_log_retention_days @ core/config/default.yaml:119
- key maintenance.events_log_max_rows @ core/config/default.yaml:120
- key maintenance.disk_auto_prune_threshold @ core/config/default.yaml:122
- key maintenance.stale_jobs_retention_hours @ core/config/default.yaml:124
- key health.reconcile_enabled @ core/config/default.yaml:331
- key health.check_infrastructure @ core/config/default.yaml:334
- key health.check_docker_networks @ core/config/default.yaml:335
- cron-override crons.tick_cron @ modules/health/crons.go:41
- cron-override crons.poll_cron @ modules/health/crons.go:42
- cron-override crons.reconcile_cron @ modules/health/crons.go:43
- cron-override crons.cleanup_cron @ modules/health/crons.go:44
- cron-override crons.disk_auto_prune_cron @ modules/health/crons.go:45
- cron-override crons.image_prune_cron @ modules/health/crons.go:48
- cron-override crons.db_analyze_cron @ modules/health/crons.go:49
- cron-override crons.db_vacuum_cron @ modules/health/crons.go:50
errors (2)
- module doctor — 4 X-codes @ modules/doctor/ (full list: docs/reference/errors.md)
- module health — 11 X-codes @ modules/health/ (full list: docs/reference/errors.md)
docs (8)
- docs/architecture/events/live-service-tracking.md (1 claim entries)
- docs/architecture/modules/doctor.md (1 claim entries)
- docs/architecture/modules/health.md (1 claim entries)
- docs/architecture/status-states.md (1 claim entries)
- docs/reference/api/health.md (3 claim entries)
- docs/reference/cli/doctor.md (3 claim entries)
- docs/reference/cli/status.md (3 claim entries)
- docs/reference/errors.md [doc section (global)] (1 claim entries)
metrics-observability
Section titled “metrics-observability”Metrics and observability: collectors, node stats, otel providers, telemetry ingest, monitoring assets
- 2026-07-30 re-extraction: the OTel SDK boot is shc/core/otelboot (Init → real OTLP-HTTP-backed Tracer/Meter/Logger providers + the CollectorBuilder injected into core/otel’s Registry) — the ONLY home for OTel SDK imports; ce’s core/otel stays SDK-free contracts. No X-codes; the otel.provider[s] keys cited above configure it
api (1)
- POST /api/telemetry @ modules/app/router.go:125
int-api (2)
- GET /internal/_metrics_introspect @ modules/metrics/router.go:27
- GET /internal/_node_stats @ modules/metrics/router.go:33
daemon (4)
- subsystem collectors (prio -10) @ subsystems/impl/collectors.go:154
- task-handler collector_config_handler @ modules/metrics/config_reload.go:73
- loop collectors.metrics_tick @ subsystems/impl/collectors.go:404
- loop collectors.leader_resync_floor @ subsystems/impl/collectors.go:188
events (1)
- module metrics event types (3): V200600QTACOL, V200601CNRCOL, V200602NODCOL
config (5)
- key otel.provider @ core/config/default.yaml:277
- key otel.providers @ core/config/default.yaml:278
- key collector.max_cardinality_per_instrument [undocumented] @ subsystems/impl/collectors.go:264
- key collector.diagnostic_cardinality [undocumented] @ subsystems/impl/collectors.go:265
- prefix otel.providers.
.* @ daemon/daemon.go:745
errors (1)
- module metrics — 4 X-codes @ modules/metrics/ (full list: docs/reference/errors.md)
docs (5)
- docs/architecture/modules/metrics.md (1 claim entries)
- docs/guide/apps/openobserve.md (1 claim entries)
- docs/guide/operations/monitoring/sse-alerts.yml (6 claim entries)
- docs/guide/operations/monitoring/sse-dashboard.json (1 claim entries)
- docs/guide/operations/observability.md (1 claim entries)
events-audit
Section titled “events-audit”Event bus, SSE/event streams, events log and audit trail
cli (1)
- shc events @ modules/events/commands/main.go:78
api (4)
- GET /api/method/shc.events.errors.stream @ modules/events/router.go:54
- GET /api/method/shc.events.stream @ modules/events/router.go:52
- GET /api/resource/Audit @ modules/audit/router.go:43
- GET /api/resource/Audit/{audit_id} @ modules/audit/router.go:45
int-api (1)
- POST /internal/events @ modules/events/router.go:55
hud (1)
- view events (key E) @ shc/modules/hud/state/state.go:25
daemon (7)
- subsystem sse_broker (prio 1) @ subsystems/impl/sse_broker.go:56
- subsystem event_bus (prio 2) @ subsystems/impl/event_bus.go:104
- loop event_bus.consumer @ modules/events/service.go:523
- loop event_bus.node_broadcaster @ modules/events/broadcaster.go:1
- sse-keepalive events.sse_heartbeat @ modules/events/router.go:33
- dead-path events-ontask-onrpc-registries-empty @ modules/events/handlers.go:73
- dead-path registered-events-with-no-emitter @ modules/health/events.go:88
db (3)
- table audit @ ent/schema/audit.go:14
- table events_log @ ent/schema/events_log.go:15
- raw-ddl EventsLogSchemaSQL (mirrors events_log) @ modules/events/models.go:58
events (3)
- module events event types (3): V503014NODNAV, V503010QUEFUL, V500933HDLEXC
- unregistered publish
@ core/log/typed.go:111 - unregistered publish
@ daemon/event_publisher_adapter.go:71
errors (2)
- module audit — 4 X-codes @ modules/audit/ (full list: docs/reference/errors.md)
- module events — 6 X-codes @ modules/events/ (full list: docs/reference/errors.md)
docs (14)
- docs/architecture/events/event-bus.md (1 claim entries)
- docs/architecture/flows/event-lifecycle.md (1 claim entries)
- docs/architecture/modules/audit.md (1 claim entries)
- docs/architecture/modules/events.md (1 claim entries)
- docs/guide/operations/sse-migration.md (1 claim entries)
- docs/guide/troubleshooting/sse.md (1 claim entries)
- docs/reference/api/audit.md (3 claim entries)
- docs/reference/api/events.md (4 claim entries)
- docs/reference/api/sse-streaming.md (4 claim entries)
- docs/reference/cli/events.md (3 claim entries)
- docs/reference/configuration/sse-config.md (24 claim entries)
- docs/reference/errors.md [doc section (global)] (4 claim entries)
- docs/reference/errors.md [doc section audit] (2 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
notifications
Section titled “notifications”Notification providers (email/ntfy/slack/discord/webhook) and test-fire
cli (2)
- shc notification @ modules/notification/commands/main.go:48
- shc notification test @ modules/notification/commands/test.go:31
api (1)
- POST /api/method/shc.notification.test @ modules/notification/router.go:69
daemon (1)
- task-handler notification_config_handler @ modules/notification/config_reload.go:95
events (1)
- module notification event types (4): V200700NTFSNT, V200701NTFSND, V400700NTFTMP, V500700NTFFAL
config (9)
- key notification.providers @ core/config/default.yaml:298
- key notifications @ core/config/default.yaml:301
- prefix notification.providers.
@ modules/notification/providers.go:67 - prefix notifications[] @ daemon/services.go:1877
- notification-provider email @ modules/notification/providers.go:45
- notification-provider ntfy @ modules/notification/providers.go:46
- notification-provider slack @ modules/notification/providers.go:47
- notification-provider discord @ modules/notification/providers.go:48
- notification-provider webhook @ modules/notification/providers.go:49
errors (1)
- module notification — 13 X-codes @ modules/notification/ (full list: docs/reference/errors.md)
docs (4)
- docs/architecture/modules/notification.md (1 claim entries)
- docs/reference/errors.md [doc section (global)] (1 claim entries)
- docs/reference/errors.md [doc section notification] (1 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
config-management
Section titled “config-management”Scoped configuration: 5-level config cascade in the DB, shc config CLI, config keyspace, hot reload
cli (6)
- shc config @ modules/config/commands/main.go:136
- shc config edit @ modules/config/commands/edit.go:20
- shc config get @ modules/config/commands/get.go:30
- shc config ls @ modules/config/commands/list.go:22
- shc config set @ modules/config/commands/set.go:23
- shc config unset @ modules/config/commands/unset.go:21
api (4)
- POST /api/method/shc.config.get @ modules/config/router.go:35
- POST /api/method/shc.config.list @ modules/config/router.go:38
- POST /api/method/shc.config.set @ modules/config/router.go:36
- POST /api/method/shc.config.unset @ modules/config/router.go:37
hud (1)
- view config (key C (admin-only)) @ shc/modules/hud/state/state.go:46
daemon (2)
- subsystem config_loader (prio 1) @ subsystems/impl/config_loader.go:155
- loop config_loader.db_watch @ subsystems/impl/config_loader.go:67
db (2)
- table config @ ent/schema/config.go:24
- raw-ddl TableSchemaSQL (mirrors config) @ modules/config/models.go:58
events (1)
- module config event types (1): V200100CFGCHG
config (2)
- flag —scope (shc config get/set/unset/edit) (shadows row scope selection global|tenant|environment|stack|deployment) @ modules/config/commands/get.go:59
- flag —db (shc config get/unset) (shadows nothing — ‘always on in Go’ (inert Python-parity flag)) @ modules/config/commands/get.go:60
errors (2)
- module config — 7 X-codes @ modules/config/ (full list: docs/reference/errors.md)
- module core/config — 1 X-codes @ core/config/ (full list: docs/reference/errors.md)
docs (9)
- docs/architecture/modules/config.md (1 claim entries)
- docs/reference/api/config.md (5 claim entries)
- docs/reference/cli/config.md (7 claim entries)
- docs/reference/configuration/config-files.md (9 claim entries)
- docs/reference/configuration/config-keys.md (112 claim entries)
- docs/reference/configuration/environment-variables.md (22 claim entries)
- docs/reference/errors.md [doc section (global)] (4 claim entries)
- docs/reference/errors.md [doc section config] (1 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
connections-providers
Section titled “connections-providers”Named backend connections (shc connection connect/list/rm; provider = deprecated alias) shared by storage/DNS/proxy/CA/restic/volume providers
- HUD Providers view is connections-first by design: connection = top-level branch, capabilities nested
- 2026-07-08 gap-fill: capability registry covers 14 DNS / 11 proxy-LB / 12 volume backends across aws/hetzner/do/vultr/linode/azure/openstack/cloudstack/ovh/pfsense/…
- 2026-07-09: acm-pca dropped from the aws row (capabilities.go) — the signer backend is not implemented; re-add with its caSignerBuilders entry in 1.1
- 2026-07-09: system-tier visibility —
--scope systemconnections stamp _write_scope and resolve cluster-wide via Resolve/ListVisible (connections/scope.go);connection rmrefuses in-use connections (X409903CONUSE) and deletes creds at the exact write tier
cli (7)
- shc connection @ modules/connections/commands/main.go:105 (cobra alias
provider) - shc connection connect @ modules/connections/commands/connect.go:14
- shc connection grant @ modules/connections/commands/grant.go:15
- shc connection grants @ modules/connections/commands/grant.go:66
- shc connection ls @ modules/connections/commands/list.go:24 (alias
list) - shc connection revoke-grant @ modules/connections/commands/grant.go:42
- shc connection rm @ modules/connections/commands/rm.go:15
api (6)
- POST /api/method/shc.provider.connect @ modules/connections/router.go:61
- POST /api/method/shc.provider.grant @ modules/connections/router.go:64
- GET /api/method/shc.provider.grants @ modules/connections/router.go:66
- POST /api/method/shc.provider.revoke_grant @ modules/connections/router.go:65
- GET /api/method/shc.provider.list @ modules/connections/router.go:60
- POST /api/method/shc.provider.rm @ modules/connections/router.go:62
hud (1)
- view providers (key P (admin-only)) @ shc/modules/hud/state/state.go:65
db (1)
- table connection @ ent/schema/connection.go:13
errors (2)
- module connections — 14 X-codes @ modules/connections/ (full list: docs/reference/errors.md)
- module core/openstack — 3 X-codes @ core/openstack/ (full list: docs/reference/errors.md; the shared Keystone v3 client under the dns/designate + proxy/octavia + storage/cinder backends; added 2026-07-30 re-extraction)
storage-volumes
Section titled “storage-volumes”Managed storage: providers (hetzner/NFS/cephfs), RWO block volumes, fencing, attachment placement, auto-failover
shc storage add/link/rm/show/unlinkare dead commands — superseded by provider connections- auto-failover is off by default (storage.volumes.auto_failover)
cli (23)
- shc storage @ modules/storage/commands/main.go:114
- shc storage add [DEAD] @ modules/storage/commands/add.go:24
- shc storage cephfs @ modules/storage/commands/managed.go:16
- shc storage cephfs disable @ modules/storage/commands/managed.go:203
- shc storage cephfs enable @ modules/storage/commands/managed.go:177
- shc storage cephfs join @ modules/storage/commands/managed.go:228
- shc storage cephfs leave @ modules/storage/commands/managed.go:266
- shc storage cephfs status @ modules/storage/commands/managed.go:290
- shc storage link [DEAD] @ modules/storage/commands/link.go:17
- shc storage ls @ modules/storage/commands/list.go:86
- shc storage nfs @ modules/storage/commands/managed.go:16
- shc storage nfs disable @ modules/storage/commands/managed.go:79
- shc storage nfs enable @ modules/storage/commands/managed.go:51
- shc storage nfs join @ modules/storage/commands/managed.go:103
- shc storage nfs leave @ modules/storage/commands/managed.go:129
- shc storage nfs status @ modules/storage/commands/managed.go:151
- shc storage rm [DEAD] @ modules/storage/commands/delete.go:20
- shc storage show [DEAD] @ modules/storage/commands/show.go:17
- shc storage unlink [DEAD] @ modules/storage/commands/link.go:42
- shc volume @ modules/volume/commands/main.go:30
- shc volume ls @ modules/volume/commands/main.go:49
- shc volume rebind @ modules/volume/commands/main.go:86
- shc volume rm @ modules/volume/commands/main.go:69
api (23)
- POST /api/method/shc.storage.add @ modules/storage/router.go:70
- POST /api/method/shc.storage.cephfs.disable @ modules/storage/router.go:98
- POST /api/method/shc.storage.cephfs.enable @ modules/storage/router.go:97
- POST+GET /api/method/shc.storage.cephfs.health @ modules/storage/router.go:118-119
- POST /api/method/shc.storage.cephfs.join @ modules/storage/router.go:101
- POST /api/method/shc.storage.cephfs.leave @ modules/storage/router.go:102
- POST+GET /api/method/shc.storage.cephfs.status @ modules/storage/router.go:116-117
- POST /api/method/shc.storage.delete @ modules/storage/router.go:75
- POST /api/method/shc.storage.get @ modules/storage/router.go:72
- POST /api/method/shc.storage.link @ modules/storage/router.go:73
- POST+GET /api/method/shc.storage.list @ modules/storage/router.go:85-86 (GET duals added for the read verbs;
lsspelling too) - POST+GET /api/method/shc.storage.ls @ modules/storage/router.go:83-84
- POST /api/method/shc.storage.rm @ modules/storage/router.go:90
- GET /api/method/shc.storage.logs.stream @ modules/storage/router.go:91
- POST /api/method/shc.storage.nfs.disable @ modules/storage/router.go:93
- POST /api/method/shc.storage.nfs.enable @ modules/storage/router.go:92
- POST /api/method/shc.storage.nfs.join @ modules/storage/router.go:95
- POST /api/method/shc.storage.nfs.leave @ modules/storage/router.go:96
- POST+GET /api/method/shc.storage.nfs.status @ modules/storage/router.go:110-111
- POST /api/method/shc.storage.unlink @ modules/storage/router.go:74
- POST+GET /api/method/shc.storage.volume.ls @ modules/storage/router.go:97-98
- POST /api/method/shc.storage.volume.rebind @ modules/storage/router.go:108
- POST /api/method/shc.storage.volume.rm @ modules/storage/router.go:107
int-api (8)
- POST /internal/storage/cephfs/disable @ modules/storage/providers/cephfs/internal_router.go:122
- POST /internal/storage/cephfs/enable-client @ modules/storage/providers/cephfs/internal_router.go:121
- POST /internal/storage/nfs/disable @ modules/storage/providers/nfs/internal_router.go:133
- POST /internal/storage/nfs/enable-client @ modules/storage/providers/nfs/internal_router.go:132
- POST /internal/storage/nfs/enable-server @ modules/storage/providers/nfs/internal_router.go:131
- GET /internal/storage/nfs/status @ modules/storage/providers/nfs/internal_router.go:134
- POST /internal/storage/volume/mount @ modules/storage/providers/volume/internal_router.go:129
- POST /internal/storage/volume/unmount @ modules/storage/providers/volume/internal_router.go:130
hud (1)
- view storage (key S (admin-only; non-admin keypress no-ops, app.go:1503)) @ shc/modules/hud/state/state.go:41
daemon (6)
- subsystem volume_self_fence (prio 12) @ subsystems/impl/volume_self_fence.go:484
- subsystem volume_failover (prio 68, leader-only) @ subsystems/impl/volume_failover.go:334
- cron storage_lease_reconcile (every 1 minute, leader-gated) @ modules/storage/crons.go:88
- loop volume_self_fence.renew @ subsystems/impl/volume_self_fence.go:70
- loop volume_failover.tick @ subsystems/impl/volume_failover.go:52
- loop storage.cephfs_post_osd_reconcile @ modules/storage/shared_manager_cephfs.go:249
db (4)
- table storage_provider @ ent/schema/storage_provider.go:15
- table storage_provider_node @ ent/schema/storage_provider_node.go:15
- table volume @ ent/schema/volume.go:30
- table volume_attachment @ ent/schema/volume_attachment.go:26
config (7)
- key storage.providers @ core/config/default.yaml:309
- key storage.volumes.auto_failover @ core/config/default.yaml:323
- key storage.volumes.provider [undocumented] @ daemon/volume_binder.go:234
- key storage.volumes.hcloud.token [undocumented] @ daemon/volume_binder.go:235
- key storage.volumes.hcloud.location [undocumented] @ daemon/volume_binder.go:236
- key storage.volumes.hcloud.filesystem [undocumented] @ daemon/volume_binder.go:237
- cron-override crons.storage_lease_reconcile @ modules/storage/crons.go:26
errors (2)
- module core/volume — 22 X-codes @ core/volume/ (full list: docs/reference/errors.md)
- module storage — 90 X-codes @ modules/storage/ (full list: docs/reference/errors.md)
docs (7)
- docs/architecture/modules/storage.md (1 claim entries)
- docs/guide/operations/storage-providers.md (1 claim entries)
- docs/reference/api/storage.md (17 claim entries)
- docs/reference/cli/nfs.md (7 claim entries)
- docs/reference/cli/storage.md (25 claim entries)
- docs/reference/errors.md [doc section storage] (35 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
docker-runtime
Section titled “docker-runtime”Docker/compose runtime plumbing: docker client bring-up, docker events, docker passthrough API
- docker API routes have no CLI verb by design — consumed by HUD/internal callers
int-api (13)
- POST /internal/containers/{container_id}/fs/create @ modules/docker/internal_fs_router.go:67
- POST /internal/containers/{container_id}/fs/mkdir @ modules/docker/internal_fs_router.go:68
- DELETE /internal/containers/{container_id}/fs/path @ modules/docker/internal_fs_router.go:69
- GET /internal/containers/{container_id}/fs/read @ modules/docker/internal_fs_router.go:65
- GET /internal/containers/{container_id}/fs/readdir @ modules/docker/internal_fs_router.go:64
- POST /internal/containers/{container_id}/fs/rename @ modules/docker/internal_fs_router.go:71
- POST /internal/containers/{container_id}/fs/setattr @ modules/docker/internal_fs_router.go:73
- GET /internal/containers/{container_id}/fs/stat @ modules/docker/internal_fs_router.go:63
- POST /internal/containers/{container_id}/fs/symlink @ modules/docker/internal_fs_router.go:72
- POST /internal/containers/{container_id}/fs/truncate @ modules/docker/internal_fs_router.go:70
- POST /internal/containers/{container_id}/fs/write @ modules/docker/internal_fs_router.go:66
- GET /internal/containers/{container_id}/inspect @ modules/docker/internal_router.go:49
- POST /internal/containers/{container_id}/restart @ modules/docker/internal_router.go:50
daemon (3)
- subsystem container_runtime (prio -20) @ subsystems/impl/container_runtime.go:52
- subsystem docker_events (prio 9) @ subsystems/impl/docker_events.go:72
- loop docker_events.subscription @ subsystems/impl/docker_events.go:179
events (1)
- module docker event types (15): V200300CTRSTR, V200301CTRSTP, V200302CTRRST, V200303CTRPAU, V200304CTRUNP, V200305CTRCRT, V200306CTRMVD, V500300CTRDIE, V500301CTRKIL, V500302CTROMO, V200310CTRHOK, V500310CTRHFL, V200320EXCCRT, V200321EXCSTR, V200322EXCDIE
errors (1)
- module docker — 11 X-codes @ modules/docker/ (full list: docs/reference/errors.md)
docs (4)
- docs/architecture/modules/docker.md (1 claim entries)
- docs/architecture/patterns/docker-file-operations.md (1 claim entries)
- docs/reference/errors.md [doc section docker] (1 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
hud-dashboard
Section titled “hud-dashboard”Real-time TUI dashboard (shc hud): WS snapshot stream, tree/nodes navigation, keymap, action chips, overlays, prefs
- domain views (backups/vault/storage/…) are grouped under their features; core navigation + chrome stay here
- ViewStacks is unreachable/dead; 13 dead/stale HUD findings recorded in the retired extraction snapshot
cli (2)
- shc hud @ shc/modules/hud/command.go:38
- shc hud watch [hidden] @ shc/modules/hud/command.go:56
api (1)
- GET /api/method/shc.hud.stream @ modules/sysroutes/router.go:119
hud (31)
- view tree (key D) @ shc/modules/hud/state/state.go:23
- view nodes (key N) @ shc/modules/hud/state/state.go:24
- view stacks (key NONE (UNREACHABLE)) @ shc/modules/hud/state/state.go:36
- view clientlog (key M) @ shc/modules/hud/state/state.go:71
- cli shc hud @ shc/modules/hud/command.go:23
- cli shc hud watch @ shc/modules/hud/command.go:51
- daemon-side /api/method/shc.hud.stream @ shc/modules/hud/server/register.go:36
- daemon-side hud snapshot builder @ shc/modules/hud/builder/builder.go:302
- daemon-side builder adapters @ shc/modules/hud/adapters/
- overlay confirm strip @ shc/modules/hud/app.go:1726 (panels.InlineConfirm), state.Confirm state/state.go:1340
- overlay help overlay @ shc/modules/hud/app.go:1842 (overlays.Help), sections overlays/help.go:65
- overlay log overlay (audit/raw) @ shc/modules/hud/app.go:1846 (overlays.LogOverlay), state LogOverlay state/state.go:1397
- overlay details overlay @ shc/modules/hud/app.go:1844 (overlays.Details), body renderDetailsForRow details.go:13
- overlay unified embedded form @ shc/modules/hud/unified_form.go:55 (openForm) / :73 (openFieldForm), builder modules/forms/form_builder.go:117 (BuildForm)
- fzf context picker @ shc/modules/hud/actions.go:682 (fzfContextCmd)
- fzf generic picker @ shc/modules/hud/actions.go:711 (fzfPickCmd)
- exported-form RunCLIForm / RunCLIFormSeq @ modules/forms/form_cli.go:46,123
- provider wizard (ProvField catalog / ProviderWritesFrom — successor of the retired ProviderCatalogCLI exports) @ shc/modules/hud/providers_catalog.go:34 / providers_view.go:865
- error-registry X400213HUDISO..X503210HUDBLD (9 codes) @ shc/modules/hud/errors.go (codes counted once under errors surface, module hud)
- 59 global keybindings @ shc/modules/hud/keys.go:407
- 8 extra keys/chords (gg, brace-paging, …) @ shc/modules/hud/app.go
- 13 per-view key intercepts @ shc/modules/hud/app.go
- 33 row-action chip sets @ shc/modules/hud/actionbar_items.go
- 11 search/scoping behaviors (incremental search, broken-only, context scope, …) @ shc/modules/hud/app.go
- 49 API routes dialed by HUD actions (cross-refs; each route counted once under its owning feature) @ the retired 2026-07-02 hud extraction snapshot (api_routes_used)
- 8 subprocess actions (inspect, pager, $SHELL browse, clipboard, …) @ shc/modules/hud
- 6 persisted prefs (broken_only, color_offset, context, …) @ shc/modules/hud/prefs.go
- 6 connection behaviors (WS reconnect, optimistic overlays, sparklines, …) @ shc/modules/hud/wsclient.go
- 13 dead/stale findings (ViewStacks dead, legacy fetch client, …) @ the retired 2026-07-02 hud extraction snapshot (dead_and_stale)
- 4 widgets (badge, resource_bar, sparkline, spinner) @ shc/modules/hud/widgets
- 16 view renderers + 15 row renderers + 9 chrome panels @ shc/modules/hud/panels/
daemon (1)
- sse-keepalive hud.snapshot_tick @ shc/modules/hud/server/handler.go:30
config (5)
- env SHC_HUD_EXEC @ cli/shell_wiring.go:35
- env SHC_HUD_DEBUG @ shc/modules/hud/debuglog.go:34
- env SHC_HUD_TOKEN @ shc/modules/hud/wsclient.go:355
- env SHC_HUD_BEARER @ shc/modules/hud/wsclient.go:358
- env SHC_HUD_BASIC @ shc/modules/hud/wsclient.go:361
errors (2)
- module forms — 2 X-codes @ modules/forms/ (full list: docs/reference/errors.md; the shared CE form toolkit whose builder/CLI-runner citations sit on this feature’s hud surface — raised by RunCLIForm[Seq] on behalf of init/export/update; added 2026-07-30 re-extraction)
- module hud — 9 X-codes @ shc/modules/hud/ (full list: docs/reference/errors.md)
docs (5)
- docs/architecture/modules/hud.md (1 claim entries)
- docs/reference/api/hud.md (3 claim entries)
- docs/reference/cli/hud.md (3 claim entries)
- docs/reference/errors.md [doc section hud] (7 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
x9s-provider
Section titled “x9s-provider”shc-x9s: the SHC data plane for x9s (k9s’s terminal UX over a pluggable provider) — browse :stacks/:nodes/:backups/:tasks/:tenants/:repos/:users off the daemon’s public HTTP API, tenant scope switch, PTY shell, port tunnel, per-row verbs, YAML edit/create
- ADDED in the 2026-07-30 re-extraction — post-dates the 07-02 extraction; no prior graph presence
- commercial component: refuses a community daemon in its first protocol call via shc/core/eegate (shc/cmd/shc-x9s/product.go:42) — see licensing
- reads ride pkg/apiclient against routes owned by other features (each counted once there); every WRITE confirms first, shows the exact
shccommand line it is about to run, and lands in x9s’s :mutations history
cli (1)
- shc-x9s [—socket
| —url —token ] (x9s stdio protocol server; spawned by x9s) @ shc/cmd/shc-x9s/main.go:48
cli-experience
Section titled “cli-experience”CLI framework UX: global flags, output formatting (json/text/yaml, fields/filter/exclude), ctx cluster contexts, shell completion, help
- 2026-07-10 surface rulings: NO
shc dnssubtree and NOshc rollbackverb (see the dns-management / backup-restore notes); the removedTopLevelCommands CLI pin was retired with the edition machinery - 2026-07-08: canonical resource noun is
shc connection;providersurvives only as a deprecated cobra alias - 2026-07-09:
shc ctx updatedeprecated (errors with a pointer toctx login); —fields/—filter/—exclude now apply under -o json/yaml too; completion rides daemonclient (UDS + bearer) and reads context.json
cli (7)
- shc __complete [hidden] @ modules/completion/commands/completion.go:148
- shc completion @ modules/completion/commands/completion.go:87
- shc ctx @ modules/ctx/commands/main.go:42
- shc ctx login @ modules/ctx/commands/login.go:38
- shc ctx logout @ modules/ctx/commands/logout.go:18
- shc ctx update @ modules/ctx/commands/main.go:111
- shc help @ cli/cli.go:118
config (36)
- flag —config (global, all commands) @ cli/globals.go
- flag —debug (global, all commands) @ cli/globals.go
- flag —environment (global, all commands) @ cli/globals.go
- flag —exclude (global, all commands) @ cli/globals.go
- flag —fields (global, all commands) @ cli/globals.go
- flag —filter (global, all commands) @ cli/globals.go
- flag —output (global, all commands) @ cli/globals.go
- flag —stack (global, all commands) @ cli/globals.go
- flag —tenant (global, all commands) @ cli/globals.go
- flag —verbose (global, all commands) @ cli/globals.go
- key clusters @ core/config/default.yaml:362
- prefix clusters.
@ core/daemonclient/cluster.go:126 - env SHC_TENANT @ cli/globals.go:155
- env SHC_ENVIRONMENT @ cli/globals.go:156
- env SHC_STACK @ cli/globals.go:157
- env SHC_OUTPUT @ cli/globals.go:158
- env SHC_VERBOSE @ cli/globals.go:159
- env SHC_DEBUG @ cli/globals.go:160
- env SHC_FIELDS @ cli/globals.go:161
- env SHC_FILTER @ cli/globals.go:162
- env SHC_EXCLUDE @ cli/globals.go:163
- env SHC_URL @ core/daemonclient/client.go:127
- env SHC_API_URL @ modules/completion/service.go:468
- env SHC_COMPLETION_DEBUG @ modules/completion/service.go:417
- env SHC_COMPLETION_TIMEOUT @ modules/completion/service.go:453
- env SHELL @ shc/modules/hud/volume_actions.go:237
- flag -t/—tenant (shadows SHC_TENANT) @ cli/globals.go:118
- flag -e/—environment (shadows SHC_ENVIRONMENT) @ cli/globals.go:119
- flag -s/—stack (shadows SHC_STACK) @ cli/globals.go:120
- flag -o/—output (shadows SHC_OUTPUT) @ cli/globals.go:121
- flag -v/—verbose (shadows SHC_VERBOSE) @ cli/globals.go:122
- flag -d/—debug (shadows SHC_DEBUG) @ cli/globals.go:123
- flag —fields (shadows SHC_FIELDS) @ cli/globals.go:124
- flag —filter (shadows SHC_FILTER) @ cli/globals.go:125
- flag —exclude (shadows SHC_EXCLUDE) @ cli/globals.go:126
- flag —config (shc) (shadows config overlays; CLI-side use is clusters.
endpoint resolution only (daemonclient/cluster.go)) @ cli/globals.go:130
errors (3)
- module completion — 2 X-codes @ modules/completion/ (full list: docs/reference/errors.md)
- module core/daemonclient — 4 X-codes @ core/daemonclient/ (full list: docs/reference/errors.md; the shared CLI→daemon HTTP client — UDS + bearer, cluster-context endpoint resolution, the local-only vault auto-unlock interceptor seam (autounlock.go); added 2026-07-30 re-extraction)
- module ctx — 3 X-codes @ modules/ctx/ (full list: docs/reference/errors.md)
docs (8)
- docs/architecture/modules/completion.md (1 claim entries)
- docs/architecture/modules/ctx.md (1 claim entries)
- docs/reference/cli/ctx.md (2 claim entries)
- docs/reference/cli/overview.md (2 claim entries)
- docs/reference/cli/utility.md (40 claim entries)
- docs/reference/errors.md [doc section (global)] (1 claim entries)
- docs/reference/errors.md [doc section ctx] (1 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
daemon-runtime
Section titled “daemon-runtime”Daemon core runtime: lifecycle subsystems DAG, listeners (UDS/TCP/mTLS internal API), migrations, ent/db plumbing, cron runner + cron inventory, coded-error registry, OpenAPI/docs endpoints
- 2026-07-30 re-extraction: the cron INVENTORY module folded in (modules/cron —
shc cron ls+ shc.cron.list over the registry; docs/reference/cli/shc_cron.md) — it mints no error codes by design (the registry read cannot fail; HTTP fallback surfaces daemonclient’s codes); the RUNNER stays the cron_runner subsystem cited above, with crons.overrides under config-management’s grammar
cli (2)
- shc cron @ modules/cron/commands/main.go:61
- shc cron ls @ modules/cron/commands/ls.go:18
api (5)
- GET /api/capabilities @ modules/capabilities/router.go:42
- GET /api/method/shc.cron.list @ modules/cron/router.go:26
- GET /docs @ core/api/openapi.go:41
- GET /docs/oauth2-redirect @ core/api/openapi.go:42
- GET /openapi.json @ core/api/openapi.go:40
int-api (2)
- GET /internal/_manifest @ core/api/manifest.go:316
- POST /internal/fs/ensure-dirs @ modules/sysroutes/internal_router.go:41
daemon (10)
- subsystem bootstrap (prio -50) @ subsystems/impl/bootstrap.go:30
- subsystem migrations (prio 5) @ subsystems/impl/migrations.go:49
- subsystem ent_client (prio 6) @ subsystems/impl/ent_client.go:42
- subsystem unix_socket (prio 20) @ subsystems/impl/unix_socket.go:82
- subsystem http (prio 30) @ subsystems/impl/http.go:60
- subsystem internal_api (prio 40) @ subsystems/impl/internal_api.go:90
- subsystem cron_runner (prio 72) @ subsystems/impl/cron_runner.go:122
- loop unix_socket.watchdog @ subsystems/impl/unix_socket.go:33
- loop internal_api.bind_retry @ subsystems/impl/internal_api.go:72
- dead-path empty-cron-binding-registry @ modules/task/events.go:177
db (2)
- table _shc_migrations @ core/db/migrate.go:156
- raw-ddl _shc_migrations DDL (mirrors _shc_migrations) @ core/db/migrate.go:156
config (58)
- key dev @ core/config/default.yaml:18
- key rate_limit.requests @ core/config/default.yaml:54
- key rate_limit.window @ core/config/default.yaml:55
- key crons @ core/config/default.yaml:74
- key timeouts.keycloak @ core/config/default.yaml:92
- key timeouts.db_connect @ core/config/default.yaml:93
- key timeouts.rqlite_ready @ core/config/default.yaml:119
- key timeouts.rqlite_shutdown @ core/config/default.yaml:120
- key timeouts.drain @ core/config/default.yaml:96
- key timeouts.mesh_ping @ core/config/default.yaml:97
- key timeouts.quiesce @ core/config/default.yaml:98
- key timeouts.backup @ core/config/default.yaml:99
- key timeouts.compose_converge @ core/config/default.yaml:100
- key timeouts.container_stop @ core/config/default.yaml:101
- key timeouts.exec_idle @ core/config/default.yaml:102
- key timeouts.exec_kill_wait @ core/config/default.yaml:103
- key timeouts.log_idle @ core/config/default.yaml:104
- key timeouts.enroll @ core/config/default.yaml:105
- key timeouts.git_clone @ core/config/default.yaml:106
- key timeouts.git_fetch @ core/config/default.yaml:107
- key log.format [undocumented] @ daemon/daemon.go:479
- key log.level [undocumented] @ daemon/daemon.go:489
- key environment [undocumented] @ daemon/daemon.go:556
- key database.url [undocumented] @ daemon/daemon.go:865
- key database.path [undocumented] @ daemon/daemon.go:868
- key server.tcp.bind [undocumented] @ subsystems/impl/http.go:121
- key server.tcp.enabled [undocumented] @ subsystems/impl/http.go:124
- key internal_api.bind [undocumented] @ subsystems/impl/internal_api.go:121
- key internal_api.token [undocumented] @ subsystems/impl/internal_api.go:124
- prefix crons.<cron_name> @ subsystems/impl/cron_runner.go:258
- prefix timeouts.
@ core/timeouts/timeouts.go:238 - env SHC_LOG_FORMAT @ core/config/config.go:299
- env SHC_LOG_LEVEL @ core/config/config.go:300
- env SHC_INTERNAL_API_BIND @ core/config/config.go:301
- env SHC_BASE_DIR @ core/paths/paths.go:87
- env SHC_STATE_HOME @ core/paths/paths.go:88
- env SHC_CACHE_HOME @ core/paths/paths.go:89
- env SHC_RUNTIME_DIR @ core/paths/paths.go:90
- env SHC_TMP_DIR @ core/paths/paths.go:91
- env SHC_LOGS_DIR @ core/paths/paths.go:92
- env SHC_PID_PATH @ core/paths/paths.go:93
- env SHC_SOCKET_PATH @ core/paths/paths.go:94
- env SHC_DATABASE_PATH @ core/paths/paths.go:95
- env SHC_MODE @ core/config/config.go:146
- env SHC_GROUP @ core/config/config.go:271
- env SHC_INTERNAL_TOKEN @ modules/logs/proxy.go:77
- env SHC_PORT @ subsystems/impl/http.go:134
- env SHC_UDS_GROUP @ subsystems/impl/unix_socket.go:119
- env SHC_NO_INTERNAL_API @ subsystems/lifecycle/lifecycle.go:688
- env SHC_DEV @ core/paths/paths.go:102
- env SHC_MIGRATIONS_NO_VERIFY @ core/db/verify.go:61
- env SHC_HOSTNAME @ modules/test/daemon.go:508
- env NOTIFY_SOCKET @ daemon/sdnotify.go:32
- env GOMEMLIMIT @ daemon/runtime_tune.go:58
- env XDG_CACHE_HOME @ modules/capabilities/cache.go:76
- flag —config (shcd) (shadows config overlays (loader layer 9)) @ cmd/shcd/main.go:49
- flag —log-level (shcd) (shadows log.level / SHC_LOG_LEVEL) @ cmd/shcd/main.go:51
- flag —log-format (shcd) (shadows log.format / SHC_LOG_FORMAT) @ cmd/shcd/main.go:53
errors (6)
- module capabilities — 2 X-codes @ modules/capabilities/ (full list: docs/reference/errors.md)
- module core/api — 11 X-codes @ core/api/ (full list: docs/reference/errors.md)
- module core/coded — 48 X-codes @ core/coded/ (full list: docs/reference/errors.md)
- module core/db — 31 X-codes @ core/db/ + shc/core/db/rqlitedriver/ (full list: docs/reference/errors.md)
- module daemon — 41 X-codes @ daemon/ (full list: docs/reference/errors.md)
- module subsystems — 77 X-codes @ subsystems/impl/ + subsystems/lifecycle/ (full list: docs/reference/errors.md)
docs (16)
- docs/architecture/core/daemon-manager.md (34 claim entries)
- docs/architecture/core/data-model.md (1 claim entries)
- docs/architecture/core/overview.md (1 claim entries)
- docs/architecture/core/tech-stack.md (1 claim entries)
- docs/architecture/lifecycle.md (1 claim entries)
- docs/architecture/patterns/communication-patterns.md (1 claim entries)
- docs/architecture/patterns/cross-module.md (1 claim entries)
- docs/architecture/patterns/implicit-context.md (1 claim entries)
- docs/architecture/patterns/import-dag.md (1 claim entries)
- docs/guide/operations/upgrades.md (1 claim entries)
- docs/reference/configuration/file-locations.md (28 claim entries)
- docs/reference/errors.md [doc section (global)] (127 claim entries)
- docs/reference/errors.md [doc section ctx] (1 claim entries)
- docs/reference/errors.md [doc section subsystems] (5 claim entries)
- docs/reference/errors.md [doc section utils] (17 claim entries)
- docs/reference/errors.md [module-count claims] (3 claim entries)
kv-store
Section titled “kv-store”Generic KV table (shc.modules.kv)
- intentionally retained as a future escape hatch; no CLI/API surface by design — do not remove
db (1)
- table kv @ ent/schema/kv.go:40
errors (1)
- module kv — 3 X-codes @ modules/kv/ (full list: docs/reference/errors.md)
testing-harness
Section titled “testing-harness”Diagnostic/self-test harness and test-only env plumbing
config (5)
- env SHC_TEST_LIB @ modules/test/register.go:67
- env SHC_TEST_TMP_ROOT @ modules/test/daemon.go:459
- env SHC_TEST_TMPDIR @ modules/test/service.go:151
- env SHC_TESTS_DIR @ modules/test/service.go:133
- env SHC_COMMON_LIB @ modules/test/service.go:136
app-schema (1)
- file:tests/*.bats @ modules/test/service.go:52-74 (DetectAppDir)
errors (1)
- module test — 10 X-codes @ modules/test/ (full list: docs/reference/errors.md)
docs (2)
- docs/reference/errors.md [doc section test] (3 claim entries)
- docs/reference/errors.md [module-count claims] (1 claim entries)
docs-governance
Section titled “docs-governance”Documentation corpus and governance: glossary, comparisons, ADRs, drift register, READMEs, onboarding concepts
docs (21)
- README.md (21 claim entries)
- docs/architecture/DRIFT-REGISTER.md (260 claim entries)
- docs/architecture/NEXT-WAVES.md (1 claim entries)
- docs/architecture/README.md (1 claim entries)
- docs/architecture/diagrams/README.md (1 claim entries)
- docs/architecture/flows/README.md (1 claim entries)
- docs/decisions/ADR-0001-pure-di-composition-root.md (1 claim entries)
- docs/decisions/ADR-0002-stack-state-manifest-model.md (1 claim entries)
- docs/decisions/ADR-0003-one-scope-type.md (1 claim entries)
- docs/decisions/ADR-0004-hermetic-default-test-lane.md (1 claim entries)
- docs/decisions/ADR-0005-architectural-fitness-functions.md (1 claim entries)
- docs/decisions/ADR-0006-deps-threading-no-service-locator.md (1 claim entries)
- docs/guide/README.md (1 claim entries)
- docs/guide/getting-started/concepts.md (1 claim entries)
- docs/guide/troubleshooting/README.md (1 claim entries)
- docs/guide/troubleshooting/common-issues.md (1 claim entries)
- docs/reference/README.md (1 claim entries)
- docs/reference/comparisons/coolify.md (9 claim entries)
- docs/reference/comparisons/platforms.md (11 claim entries)
- docs/reference/errors.md [doc section ?] (1 claim entries)
- docs/reference/glossary.md (282 claim entries)
uncategorized
Section titled “uncategorized”Inventory entries with no clear owning feature (kept for total coverage)
How to regenerate / keep honest
Section titled “How to regenerate / keep honest”- This markdown: edit
feature-graph.yaml, thenmake docs/generate(make docs/checkgates drift in CI-less local runs). - The YAML itself: hand-refresh it directly against HEAD — every
surface entry assigned to exactly one feature, anything unmappable into
uncategorized. Targeted refreshes update per-featurenotes+meta.refresh_notes(see the current refresh notes above). - CLI surface spot-check:
go run scripts/dump-cli-tree.goprints the live cobra tree; diff its command paths against the graph’scli:entries (cobra aliases likelistforlswon’t appear in the dump).
The graph is a grouping of extraction-time facts, not a verified audit: the consistency audit (security exposure, dead surfaces, surface parity, naming, docs drift, schema) is a separate pass that consumes this file.