dsh-env-manager-plugin 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +274 -250
  3. package/client.js +2581 -2581
  4. package/cordis.patch.yml +4 -4
  5. package/docs/00-project/current-state.md +32 -6
  6. package/docs/00-project/glossary.md +215 -215
  7. package/docs/00-project/project-brief.md +114 -114
  8. package/docs/00-project/roadmap.md +89 -89
  9. package/docs/01-architecture/DSH_Environment_Service_Memory_Skill_Brainstorm.md +493 -493
  10. package/docs/01-architecture/api-verification.md +416 -416
  11. package/docs/01-architecture/architecture-overview.md +222 -222
  12. package/docs/01-architecture/data-model.md +930 -930
  13. package/docs/01-architecture/decisions/ADR-0001-plugin-as-bundle.md +29 -29
  14. package/docs/01-architecture/decisions/ADR-0002-file-based-storage.md +25 -25
  15. package/docs/01-architecture/decisions/ADR-0003-skill-router-over-search.md +25 -25
  16. package/docs/01-architecture/decisions/ADR-0004-typescript-host-js-client.md +31 -31
  17. package/docs/01-architecture/decisions/ADR-0005-layered-rule-resolution.md +36 -36
  18. package/docs/01-architecture/decisions/ADR-0006-credentials-as-references.md +30 -30
  19. package/docs/01-architecture/decisions/ADR-0007-session-scoped-default-environment.md +28 -28
  20. package/docs/01-architecture/decisions/ADR-0008-memory-bridge-not-second-store.md +31 -31
  21. package/docs/01-architecture/decisions/ADR-0009-client-host-http-transport.md +87 -87
  22. package/docs/01-architecture/decisions/ADR-0010-environment-plane-model.md +87 -87
  23. package/docs/01-architecture/decisions/ADR-0011-k8s-node-execution-model.md +92 -92
  24. package/docs/01-architecture/design.md +666 -666
  25. package/docs/01-architecture/detailed-design.md +961 -961
  26. package/docs/01-architecture/implementation-plan.md +323 -323
  27. package/docs/01-architecture/module-boundaries.md +306 -306
  28. package/docs/01-architecture/security-model.md +227 -227
  29. package/docs/01-architecture/storage-contract.md +224 -224
  30. package/docs/01-architecture/tool-contract.md +438 -438
  31. package/docs/01-architecture/ui-design.md +587 -587
  32. package/docs/02-harness/agent-behavior.md +36 -36
  33. package/docs/02-harness/change-snapshot-policy.md +29 -29
  34. package/docs/02-harness/client-ui-integration.md +110 -110
  35. package/docs/02-harness/context-policy.md +43 -43
  36. package/docs/02-harness/harness-standard.md +91 -91
  37. package/docs/02-harness/task-execution-policy.md +26 -26
  38. package/docs/02-harness/verification-policy.md +97 -97
  39. package/docs/03-openspec/archive-rule.md +25 -25
  40. package/docs/03-openspec/bugfix-rule.md +30 -30
  41. package/docs/03-openspec/design-rule.md +33 -33
  42. package/docs/03-openspec/openspec-usage-guide.md +31 -31
  43. package/docs/03-openspec/proposal-rule.md +70 -70
  44. package/docs/03-openspec/spec-rule.md +33 -33
  45. package/docs/03-openspec/tasks-rule.md +31 -31
  46. package/docs/04-development/coding-style.md +67 -67
  47. package/docs/04-development/dependency-policy.md +43 -43
  48. package/docs/04-development/development-guide.md +85 -85
  49. package/docs/04-development/directory-convention.md +105 -105
  50. package/docs/04-development/local-run-guide.md +61 -55
  51. package/docs/04-development/testing-guide.md +102 -102
  52. package/docs/05-domain/deployment-template.md +76 -76
  53. package/docs/05-domain/environment-template.md +165 -165
  54. package/docs/05-domain/operation-binding-template.md +55 -55
  55. package/docs/05-domain/operation-record-template.md +55 -55
  56. package/docs/05-domain/prompt-template.md +90 -90
  57. package/docs/05-domain/rule-template.md +73 -73
  58. package/docs/05-domain/service-template.md +39 -39
  59. package/docs/06-operations/deployment-guide.md +54 -54
  60. package/docs/06-operations/release.md +198 -188
  61. package/docs/06-operations/security-policy.md +53 -53
  62. package/docs/06-operations/troubleshooting.md +141 -91
  63. package/docs/07-templates/adr-template.md +21 -21
  64. package/docs/07-templates/bugfix-template.md +11 -11
  65. package/docs/07-templates/case-template.md +15 -15
  66. package/docs/07-templates/design-template.md +29 -29
  67. package/docs/07-templates/proposal-template.md +19 -19
  68. package/docs/07-templates/spec-template.md +15 -15
  69. package/docs/07-templates/tasks-template.md +12 -12
  70. package/docs/99-archive/README.md +13 -13
  71. package/docs/README.md +142 -142
  72. package/icon.svg +4 -4
  73. package/index.js +31 -8
  74. package/lib/app/app.d.ts +1 -1
  75. package/lib/app/app.js +4 -1
  76. package/lib/app/app.js.map +1 -1
  77. package/lib/skill.js +37 -37
  78. package/locale/en.json +6 -6
  79. package/locale/zh.json +6 -6
  80. package/package.json +101 -99
  81. package/scripts/repair-profile.mjs +141 -0
@@ -1,87 +1,87 @@
1
- # ADR-0010: Environment as one network, planes as role views
2
-
3
- - **Status:** Accepted
4
- - **Date:** 2026-11-01
5
- - **Supersedes:** the one-step "environment + first host + password" creation flow
6
- described in earlier V1 UI notes
7
-
8
- ## Context
9
-
10
- Operators describe an environment as a complete network set: management nodes, business
11
- nodes, database nodes (sometimes many), expansion nodes, and 1–100 IPs. They need to work
12
- one network at a time and switch between planes inside it.
13
-
14
- The original V1 panel treated the environment as a flat list of hosts plus accounts, and
15
- its **New environment** form created the environment, first host, account and SSH endpoint
16
- in one save. That mixed three concerns (network identity, node topology, credentials),
17
- made every new environment inherit a node it might not need, and hid the plane structure
18
- inside a generic host table.
19
-
20
- Two alternatives were considered:
21
-
22
- 1. **A separate environment per plane.** Easy filtering, but duplicates the network,
23
- breaks shared nodes and forces the operator to maintain several YAML documents for one
24
- network.
25
- 2. **One environment with a flat host list.** Already supported by the schema, but the UI
26
- had no way to work plane-by-plane, so it did not match the operator's mental model.
27
-
28
- ## Decision
29
-
30
- 1. **One environment = one complete network = one YAML document = one configuration
31
- page.** Management, business, database and expansion are **logical roles**, not
32
- separate environments.
33
- 2. **Planes are views over the same `Environment.hosts[]`.** The detail page renders one
34
- tab per declared role by filtering `hosts[]`. A node serving two planes is one `Host`
35
- with two role ids and appears in both tabs; it is never copied per plane.
36
- 3. **`New environment` creates only the shell.** The form collects name, optional id,
37
- category and description, seeds the four standard roles (`management`, `business`,
38
- `database`, `extension`) and creates empty `hosts`, `clusters`, `endpoints` and
39
- `loginRecords`. Nodes are added inside the environment.
40
- 4. **Roles are mandatory where they carry meaning.**
41
- - `Environment.roles` must contain at least one entry.
42
- - Every `Host.roles` must contain at least one entry.
43
- - Every host role must reference a declared logical role.
44
- - A plane with zero nodes is valid; a node with zero roles is not.
45
- 5. **A node supports multiple roles.** Add/edit node uses role checkboxes; opening the form
46
- from a plane preselects that role. Co-location is represented once.
47
- 6. **Nodes are first-class in the panel.** Add/edit node, optional account creation,
48
- expandable account tables, a shared search across id/name/IP/platform/admin/role, and
49
- batch import in the form `IP,name,roles,port,user` (multiple roles separated by `|` or
50
- `/`). Batch import never accepts passwords.
51
- 7. **Credentials remain transient and namespaced.** The add/edit node form may collect a
52
- login username and password; the password is sent once to `ctx.credentials.set`, the
53
- record keeps `credentialRef` only. Shell creation and batch import collect no secrets.
54
- 8. **Database topology is deferred.** Phase 1 treats `database` as a role and keeps
55
- primary/replica/sharding detail in node notes. Modeling it now would add a schema the
56
- rest of the UI does not consume.
57
-
58
- ## Consequences
59
-
60
- Positive:
61
-
62
- - One network has one YAML document, one backup unit and one atomic write.
63
- - A shared management/business/database host is represented once, avoiding duplicate-IP
64
- errors and split audit context.
65
- - The UI matches the operator's vocabulary: open the network, switch planes, add nodes.
66
- - New environments are cheap: four empty plane tabs are immediately usable.
67
- - Schema validation prevents a node from disappearing from every plane because it has no
68
- role.
69
-
70
- Costs / limits:
71
-
72
- - Every plane view is a filter, so large environments need search and a future
73
- virtualization strategy; V1 assumes up to a few hundred nodes.
74
- - Deleting a plane role would affect every node that references it; the panel currently
75
- edits the role catalog through YAML, not a dedicated role editor.
76
- - Phase 1 cannot express primary/replica/sharding relationships, read/write split or
77
- shard ranges; those remain Phase 2.
78
- - A node with no accounts is valid, but the panel shows `0 accounts` and no credential
79
- reference until one is added.
80
-
81
- ## Follow-up
82
-
83
- - Phase 2: database topology metadata and plane-aware expansion modeling.
84
- - Add row-level delete for nodes/accounts/login records and credential rotation.
85
- - Consider an optional JumpServer/PAM import adapter for accounts and login observations.
86
- - Keep `docs/01-architecture/data-model.md` §3 and `ui-design.md` §6.3 as the normative
87
- references for this decision.
1
+ # ADR-0010: Environment as one network, planes as role views
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-11-01
5
+ - **Supersedes:** the one-step "environment + first host + password" creation flow
6
+ described in earlier V1 UI notes
7
+
8
+ ## Context
9
+
10
+ Operators describe an environment as a complete network set: management nodes, business
11
+ nodes, database nodes (sometimes many), expansion nodes, and 1–100 IPs. They need to work
12
+ one network at a time and switch between planes inside it.
13
+
14
+ The original V1 panel treated the environment as a flat list of hosts plus accounts, and
15
+ its **New environment** form created the environment, first host, account and SSH endpoint
16
+ in one save. That mixed three concerns (network identity, node topology, credentials),
17
+ made every new environment inherit a node it might not need, and hid the plane structure
18
+ inside a generic host table.
19
+
20
+ Two alternatives were considered:
21
+
22
+ 1. **A separate environment per plane.** Easy filtering, but duplicates the network,
23
+ breaks shared nodes and forces the operator to maintain several YAML documents for one
24
+ network.
25
+ 2. **One environment with a flat host list.** Already supported by the schema, but the UI
26
+ had no way to work plane-by-plane, so it did not match the operator's mental model.
27
+
28
+ ## Decision
29
+
30
+ 1. **One environment = one complete network = one YAML document = one configuration
31
+ page.** Management, business, database and expansion are **logical roles**, not
32
+ separate environments.
33
+ 2. **Planes are views over the same `Environment.hosts[]`.** The detail page renders one
34
+ tab per declared role by filtering `hosts[]`. A node serving two planes is one `Host`
35
+ with two role ids and appears in both tabs; it is never copied per plane.
36
+ 3. **`New environment` creates only the shell.** The form collects name, optional id,
37
+ category and description, seeds the four standard roles (`management`, `business`,
38
+ `database`, `extension`) and creates empty `hosts`, `clusters`, `endpoints` and
39
+ `loginRecords`. Nodes are added inside the environment.
40
+ 4. **Roles are mandatory where they carry meaning.**
41
+ - `Environment.roles` must contain at least one entry.
42
+ - Every `Host.roles` must contain at least one entry.
43
+ - Every host role must reference a declared logical role.
44
+ - A plane with zero nodes is valid; a node with zero roles is not.
45
+ 5. **A node supports multiple roles.** Add/edit node uses role checkboxes; opening the form
46
+ from a plane preselects that role. Co-location is represented once.
47
+ 6. **Nodes are first-class in the panel.** Add/edit node, optional account creation,
48
+ expandable account tables, a shared search across id/name/IP/platform/admin/role, and
49
+ batch import in the form `IP,name,roles,port,user` (multiple roles separated by `|` or
50
+ `/`). Batch import never accepts passwords.
51
+ 7. **Credentials remain transient and namespaced.** The add/edit node form may collect a
52
+ login username and password; the password is sent once to `ctx.credentials.set`, the
53
+ record keeps `credentialRef` only. Shell creation and batch import collect no secrets.
54
+ 8. **Database topology is deferred.** Phase 1 treats `database` as a role and keeps
55
+ primary/replica/sharding detail in node notes. Modeling it now would add a schema the
56
+ rest of the UI does not consume.
57
+
58
+ ## Consequences
59
+
60
+ Positive:
61
+
62
+ - One network has one YAML document, one backup unit and one atomic write.
63
+ - A shared management/business/database host is represented once, avoiding duplicate-IP
64
+ errors and split audit context.
65
+ - The UI matches the operator's vocabulary: open the network, switch planes, add nodes.
66
+ - New environments are cheap: four empty plane tabs are immediately usable.
67
+ - Schema validation prevents a node from disappearing from every plane because it has no
68
+ role.
69
+
70
+ Costs / limits:
71
+
72
+ - Every plane view is a filter, so large environments need search and a future
73
+ virtualization strategy; V1 assumes up to a few hundred nodes.
74
+ - Deleting a plane role would affect every node that references it; the panel currently
75
+ edits the role catalog through YAML, not a dedicated role editor.
76
+ - Phase 1 cannot express primary/replica/sharding relationships, read/write split or
77
+ shard ranges; those remain Phase 2.
78
+ - A node with no accounts is valid, but the panel shows `0 accounts` and no credential
79
+ reference until one is added.
80
+
81
+ ## Follow-up
82
+
83
+ - Phase 2: database topology metadata and plane-aware expansion modeling.
84
+ - Add row-level delete for nodes/accounts/login records and credential rotation.
85
+ - Consider an optional JumpServer/PAM import adapter for accounts and login observations.
86
+ - Keep `docs/01-architecture/data-model.md` §3 and `ui-design.md` §6.3 as the normative
87
+ references for this decision.
@@ -1,92 +1,92 @@
1
- # ADR-0011: Model Kubernetes nodes and Pod hosts as machines with command surfaces
2
-
3
- - **Status:** Accepted
4
- - **Date:** 2026-11-01
5
- - **Related:** ADR-0010 (environment plane model), ADR-0006 (credentials as references)
6
-
7
- ## Context
8
-
9
- Operators use three Kubernetes-adjacent deployment shapes in the same business:
10
-
11
- 1. **K8s all-in-one.** The control plane and a worker run on the same machine. Operators
12
- can run `kubectl` there and, when the runtime is Docker, may also use `docker`.
13
- 2. **K8s + Pod hosts.** A Kubernetes cluster exists, but business Pods run on separate
14
- machines. Our team operates those machines with `docker exec`, not by treating each Pod
15
- as an inventory node. Other departments use standard worker nodes in the same cluster.
16
- 3. **Generic machines.** VMs and physical machines that are not Kubernetes nodes.
17
-
18
- The Phase 1 environment model had only generic `Host` records. It could store an IP and a
19
- role, but it could not say whether a node is an all-in-one control plane, a worker, or a
20
- Pod-hosting machine, nor whether operators reach it with SSH, `kubectl`, or `docker`.
21
- Adding a new logical plane was the wrong fix: a node's Kubernetes role is a property of the
22
- machine and its runtime, while planes remain management/business/database/extension views.
23
-
24
- ## Decision
25
-
26
- 1. **A node is a machine, not a Pod.** `Host` represents a VM, physical machine, Kubernetes
27
- node or Pod-hosting machine. A Pod is a workload; it stays in the deployment model
28
- (`location.kind: kubernetes`) and is not added to `hosts[]`.
29
- 2. **Add `Host.kind`.** Allowed values:
30
- - `vm`
31
- - `physical`
32
- - `k8s-all-in-one` — control plane and worker on the same machine
33
- - `k8s-worker` — worker node in a cluster
34
- - `pod-host` — machine running Pods, operated through `docker exec`
35
-
36
- The schema defaults a missing value to `vm` so existing environment YAML remains
37
- readable. The kind is a classification, not a new logical role.
38
- 3. **Add `Host.access`.** Allowed values are `ssh`, `kubectl` and `docker`. This records the
39
- command surfaces that exist on the machine. It is metadata, not an authorization grant
40
- and not a credential. The registry stores no passwords, kubeconfigs or Docker
41
- credentials; those remain behind `credentialRef`.
42
- 4. **Add `Host.clusterRef`.** Kubernetes nodes and Pod hosts may reference a `Cluster` in
43
- the same environment. `k8s-all-in-one` and `k8s-worker` require an existing cluster
44
- reference; `pod-host` may omit it for a Docker-only machine outside the cluster.
45
- 5. **Add `Cluster.topology`.** Allowed values are `all-in-one`, `separate` and `external`.
46
- Topology is a descriptive cluster hint. Per-host `kind` remains authoritative; the schema
47
- does not force a particular mix of node kinds while an environment is being migrated.
48
- 6. **Keep access methods independent of kind.** A worker may have Docker; a VM may have
49
- `kubectl`; an all-in-one node may have all three. The UI pre-fills defaults but never
50
- hides an access method based on the kind.
51
- 7. **Model the operational entry point, not the Pod.** A `pod-host` tells an operator that
52
- the machine is reached with `docker exec`; it intentionally has no `podName` or
53
- `containerName` field in V1. Adding Pod/container inventory is a separate future model.
54
- 8. **Expose the model in the panel.** The node form has kind, cluster and access controls;
55
- node cards show kind/access badges and cluster references; search covers kind, access and
56
- cluster name/reference; the detail page has a Kubernetes/clusters tab for adding and
57
- editing cluster metadata. Batch import still creates generic `vm`/`ssh` nodes and never
58
- accepts secrets.
59
-
60
- ## Consequences
61
-
62
- Positive:
63
-
64
- - The three deployment shapes operators actually use are representable without inventing a
65
- Kubernetes plane or duplicating a machine per Pod.
66
- - The command surface is explicit, so a future execution skill can choose SSH, `kubectl` or
67
- `docker exec` from declared metadata instead of guessing from the node name.
68
- - Cluster references and topology make the relationship between all-in-one, worker and Pod
69
- hosts visible in one environment document.
70
- - Existing YAML remains valid: missing `kind` reads as `vm`, missing `access` is unknown,
71
- and missing topology is displayed as `—`.
72
-
73
- Costs / limits:
74
-
75
- - `access` states what is available, not whether the current operator is allowed to use it.
76
- Approval and execution policy remain outside this model.
77
- - The schema does not prove that a host really has `kubectl` or Docker, nor that a cluster's
78
- topology matches its nodes. The values are operator-maintained facts.
79
- - A Pod host is still one record even when it runs many Pods; per-Pod inventory, container
80
- ids and restart counts are out of scope for V1.
81
- - Batch import does not yet accept kind/access/cluster columns; those nodes are created as
82
- generic VMs and must be edited, or imported through YAML.
83
-
84
- ## Follow-up
85
-
86
- - Add a future Pod/container inventory only if operations need per-workload targeting; keep
87
- it separate from `Host`.
88
- - Add batch-import columns for kind/access/cluster when bulk Kubernetes onboarding becomes a
89
- real workflow.
90
- - Consider validating cluster topology consistency as a warning, not a hard error.
91
- - Keep `docs/01-architecture/data-model.md` §3.2 and `docs/01-architecture/ui-design.md`
92
- synchronized with this decision.
1
+ # ADR-0011: Model Kubernetes nodes and Pod hosts as machines with command surfaces
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-11-01
5
+ - **Related:** ADR-0010 (environment plane model), ADR-0006 (credentials as references)
6
+
7
+ ## Context
8
+
9
+ Operators use three Kubernetes-adjacent deployment shapes in the same business:
10
+
11
+ 1. **K8s all-in-one.** The control plane and a worker run on the same machine. Operators
12
+ can run `kubectl` there and, when the runtime is Docker, may also use `docker`.
13
+ 2. **K8s + Pod hosts.** A Kubernetes cluster exists, but business Pods run on separate
14
+ machines. Our team operates those machines with `docker exec`, not by treating each Pod
15
+ as an inventory node. Other departments use standard worker nodes in the same cluster.
16
+ 3. **Generic machines.** VMs and physical machines that are not Kubernetes nodes.
17
+
18
+ The Phase 1 environment model had only generic `Host` records. It could store an IP and a
19
+ role, but it could not say whether a node is an all-in-one control plane, a worker, or a
20
+ Pod-hosting machine, nor whether operators reach it with SSH, `kubectl`, or `docker`.
21
+ Adding a new logical plane was the wrong fix: a node's Kubernetes role is a property of the
22
+ machine and its runtime, while planes remain management/business/database/extension views.
23
+
24
+ ## Decision
25
+
26
+ 1. **A node is a machine, not a Pod.** `Host` represents a VM, physical machine, Kubernetes
27
+ node or Pod-hosting machine. A Pod is a workload; it stays in the deployment model
28
+ (`location.kind: kubernetes`) and is not added to `hosts[]`.
29
+ 2. **Add `Host.kind`.** Allowed values:
30
+ - `vm`
31
+ - `physical`
32
+ - `k8s-all-in-one` — control plane and worker on the same machine
33
+ - `k8s-worker` — worker node in a cluster
34
+ - `pod-host` — machine running Pods, operated through `docker exec`
35
+
36
+ The schema defaults a missing value to `vm` so existing environment YAML remains
37
+ readable. The kind is a classification, not a new logical role.
38
+ 3. **Add `Host.access`.** Allowed values are `ssh`, `kubectl` and `docker`. This records the
39
+ command surfaces that exist on the machine. It is metadata, not an authorization grant
40
+ and not a credential. The registry stores no passwords, kubeconfigs or Docker
41
+ credentials; those remain behind `credentialRef`.
42
+ 4. **Add `Host.clusterRef`.** Kubernetes nodes and Pod hosts may reference a `Cluster` in
43
+ the same environment. `k8s-all-in-one` and `k8s-worker` require an existing cluster
44
+ reference; `pod-host` may omit it for a Docker-only machine outside the cluster.
45
+ 5. **Add `Cluster.topology`.** Allowed values are `all-in-one`, `separate` and `external`.
46
+ Topology is a descriptive cluster hint. Per-host `kind` remains authoritative; the schema
47
+ does not force a particular mix of node kinds while an environment is being migrated.
48
+ 6. **Keep access methods independent of kind.** A worker may have Docker; a VM may have
49
+ `kubectl`; an all-in-one node may have all three. The UI pre-fills defaults but never
50
+ hides an access method based on the kind.
51
+ 7. **Model the operational entry point, not the Pod.** A `pod-host` tells an operator that
52
+ the machine is reached with `docker exec`; it intentionally has no `podName` or
53
+ `containerName` field in V1. Adding Pod/container inventory is a separate future model.
54
+ 8. **Expose the model in the panel.** The node form has kind, cluster and access controls;
55
+ node cards show kind/access badges and cluster references; search covers kind, access and
56
+ cluster name/reference; the detail page has a Kubernetes/clusters tab for adding and
57
+ editing cluster metadata. Batch import still creates generic `vm`/`ssh` nodes and never
58
+ accepts secrets.
59
+
60
+ ## Consequences
61
+
62
+ Positive:
63
+
64
+ - The three deployment shapes operators actually use are representable without inventing a
65
+ Kubernetes plane or duplicating a machine per Pod.
66
+ - The command surface is explicit, so a future execution skill can choose SSH, `kubectl` or
67
+ `docker exec` from declared metadata instead of guessing from the node name.
68
+ - Cluster references and topology make the relationship between all-in-one, worker and Pod
69
+ hosts visible in one environment document.
70
+ - Existing YAML remains valid: missing `kind` reads as `vm`, missing `access` is unknown,
71
+ and missing topology is displayed as `—`.
72
+
73
+ Costs / limits:
74
+
75
+ - `access` states what is available, not whether the current operator is allowed to use it.
76
+ Approval and execution policy remain outside this model.
77
+ - The schema does not prove that a host really has `kubectl` or Docker, nor that a cluster's
78
+ topology matches its nodes. The values are operator-maintained facts.
79
+ - A Pod host is still one record even when it runs many Pods; per-Pod inventory, container
80
+ ids and restart counts are out of scope for V1.
81
+ - Batch import does not yet accept kind/access/cluster columns; those nodes are created as
82
+ generic VMs and must be edited, or imported through YAML.
83
+
84
+ ## Follow-up
85
+
86
+ - Add a future Pod/container inventory only if operations need per-workload targeting; keep
87
+ it separate from `Host`.
88
+ - Add batch-import columns for kind/access/cluster when bulk Kubernetes onboarding becomes a
89
+ real workflow.
90
+ - Consider validating cluster topology consistency as a warning, not a hard error.
91
+ - Keep `docs/01-architecture/data-model.md` §3.2 and `docs/01-architecture/ui-design.md`
92
+ synchronized with this decision.