Skip to content
SHC Docs

Feature graph — human overview

Generated file — do not edit by hand. Rendered from feature-graph.yaml (the machine-checkable source of truth) by scripts/gen-feature-graph-md.go. Edit the YAML, then run make docs/generate.

Graph generated 2026-07-02, last refreshed 2026-07-31. 45 features.

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. config prefix is retired (providers live in the storage_provider table); the removedTopLevelCommands CLI pin went with the edition machinery; ProviderCatalogCLI-family form exports were superseded by the HUD provider views; hud.yaml extraction-snapshot anchors marked retired; 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.

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.

featurecliapiint-apihuddaemondbeventsconfigapp-schemaerrorsdocsnotes
app-catalog711·2421512113
app-install-lifecycle33·2··1321172
app-packaging········812·1
presets51······8···
vapps········12···
integrations43···1··27···
stack-operations5105·531··272
logs-shell-exec357······25·
inspect-validate22·······13·
backup-restore2721412103124162115
schedules88·1311··151
import-export33······7161
clone-move23····1··17·
origin-adapters4········134
jobs-tasks1411··16411202101
vault-secrets121532121196162
tls-certificates-ca116·162·4·1·3
ingress-routing·5··42·5·213
dns-management·5·····36·162
port-forward1112·····233
mesh-networking1258·5111·36·
network-fabric·····1·2·125
cluster-membership25308·9125·6165
init-system-apps22·····1··32
tenants64·······14·
auth-access1211·4··112·26·
quotas-usage56·121110·15·
licensing88··71·6·359
system-image-extensions·2··6··4··28
health-status461·15·617·281
metrics-observability·12·4·15·151
events-audit1411733··214·
notifications21··1·19·14·
config-management64·12212·29·
connections-providers76·1·1···2·4
storage-volumes23238164·7·272
docker-runtime··13·3·1··141
hud-dashboard21·311··5·252
x9s-provider1··········3
cli-experience7······36·383
daemon-runtime252·102·58·6161
kv-store·····1···1·1
testing-harness·······5112·
docs-governance··········21·
uncategorized············

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: 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)

Install, uninstall and update apps as stacks (incl. install-watch UX and lifecycle hooks)

  • the app Go 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 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)

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

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)

Operate deployed stacks: start/stop/restart/scale, list, per-stack status/config, cross-node stack ops

  • shc scale is 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)

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 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 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 rollback verb — safety-snapshot rollback is shc 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)

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)

Export/import deployment data archives driven by app exporter.yaml schemas

  • FIXED since 07-02: shc export ls is daemon-backed; shc export show was 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 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: 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)

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, alias list; Python-era ps retired)
  • 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 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)

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)

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 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 validate CLI 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)

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)

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)

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 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-tokens added
  • 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)

First-boot cluster init wizard and system apps (traefik/keycloak/openobserve) plan/reconcile

  • shc init and shc cluster init are 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)

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)

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)

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 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)

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.sum in 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)

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 show subcommand 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 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)

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)

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)

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)

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 system connections stamp _write_scope and resolve cluster-wide via Resolve/ListVisible (connections/scope.go); connection rm refuses 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)

Managed storage: providers (hetzner/NFS/cephfs), RWO block volumes, fencing, attachment placement, auto-failover

  • shc storage add/link/rm/show/unlink are 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; ls spelling 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/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)

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)

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 shc command 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 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 dns subtree and NO shc rollback verb (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; provider survives only as a deprecated cobra alias
  • 2026-07-09: shc ctx update deprecated (errors with a pointer to ctx 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 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)

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)

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)

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)

Inventory entries with no clear owning feature (kept for total coverage)

  1. This markdown: edit feature-graph.yaml, then make docs/generate (make docs/check gates drift in CI-less local runs).
  2. 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-feature notes + meta.refresh_notes (see the current refresh notes above).
  3. CLI surface spot-check: go run scripts/dump-cli-tree.go prints the live cobra tree; diff its command paths against the graph’s cli: entries (cobra aliases like list for ls won’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.