moose-inventory 2.0 → 2.1
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.
- checksums.yaml +4 -4
- data/.github/workflows/release.yml +2 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +21 -0
- data/BACKLOG.md +630 -8
- data/Gemfile +2 -0
- data/Gemfile.lock +1 -1
- data/README.md +315 -39
- data/Rakefile +2 -0
- data/bin/moose-inventory +2 -1
- data/docs/architecture/architecture-and-trust-boundaries.md +444 -0
- data/docs/compatibility/cli-output-compatibility.md +76 -0
- data/docs/governance/approval-register.md +37 -0
- data/docs/maintenance/database-backup-restore-guidance.md +162 -0
- data/docs/maintenance/package-maintenance-and-agent-boundaries.md +260 -0
- data/docs/process/conformance-gap-analysis-2026-05-28.md +192 -0
- data/docs/product/product-brief.md +161 -0
- data/docs/product/requirements-baseline.md +477 -0
- data/docs/qa/qa-documentation-and-release-gates.md +283 -0
- data/docs/release/package-provenance-hardening.md +126 -0
- data/docs/release/publishing.md +11 -3
- data/docs/release/release-environment-protection.md +70 -0
- data/docs/release/release-readiness.md +23 -4
- data/docs/security/accepted-risk-register.md +84 -0
- data/docs/security/security-privacy-process.md +287 -0
- data/docs/security-audit-2026-05-26-rerun.md +2 -2
- data/docs/ux/cli-workflow-notes.md +287 -0
- data/examples/ansible/ansible.cfg +3 -0
- data/examples/ansible/inventory/moose_inventory.yml +5 -0
- data/examples/ansible/inventory_plugins/moose_inventory.py +100 -0
- data/examples/ci/README.md +16 -0
- data/examples/ci/github-actions/inventory-review.yml +38 -0
- data/examples/ci/inventory/example-snapshot.yml +19 -0
- data/examples/ci/scripts/validate-inventory-snapshot.sh +30 -0
- data/lib/moose_inventory/cli/application.rb +133 -5
- data/lib/moose_inventory/cli/association_rendering.rb +74 -0
- data/lib/moose_inventory/cli/association_rendering_support.rb +89 -0
- data/lib/moose_inventory/cli/audit.rb +62 -0
- data/lib/moose_inventory/cli/audit_recording.rb +40 -0
- data/lib/moose_inventory/cli/child_relation_rendering.rb +110 -0
- data/lib/moose_inventory/cli/console.rb +135 -0
- data/lib/moose_inventory/cli/db.rb +64 -0
- data/lib/moose_inventory/cli/factory.rb +28 -0
- data/lib/moose_inventory/cli/formatter.rb +8 -12
- data/lib/moose_inventory/cli/group.rb +5 -2
- data/lib/moose_inventory/cli/group_add.rb +11 -9
- data/lib/moose_inventory/cli/group_addchild.rb +23 -65
- data/lib/moose_inventory/cli/group_addhost.rb +16 -67
- data/lib/moose_inventory/cli/group_addvar.rb +27 -47
- data/lib/moose_inventory/cli/group_get.rb +8 -42
- data/lib/moose_inventory/cli/group_list.rb +7 -40
- data/lib/moose_inventory/cli/group_listvars.rb +9 -55
- data/lib/moose_inventory/cli/group_rm.rb +12 -10
- data/lib/moose_inventory/cli/group_rmchild.rb +26 -82
- data/lib/moose_inventory/cli/group_rmhost.rb +18 -53
- data/lib/moose_inventory/cli/group_rmvar.rb +30 -41
- data/lib/moose_inventory/cli/group_tags.rb +33 -0
- data/lib/moose_inventory/cli/helpers.rb +68 -1
- data/lib/moose_inventory/cli/host.rb +6 -3
- data/lib/moose_inventory/cli/host_add.rb +69 -29
- data/lib/moose_inventory/cli/host_addgroup.rb +22 -58
- data/lib/moose_inventory/cli/host_addvar.rb +28 -52
- data/lib/moose_inventory/cli/host_get.rb +9 -37
- data/lib/moose_inventory/cli/host_list.rb +24 -21
- data/lib/moose_inventory/cli/host_listvars.rb +9 -62
- data/lib/moose_inventory/cli/host_rm.rb +60 -42
- data/lib/moose_inventory/cli/host_rmgroup.rb +25 -44
- data/lib/moose_inventory/cli/host_rmvar.rb +31 -45
- data/lib/moose_inventory/cli/host_tags.rb +33 -0
- data/lib/moose_inventory/cli/listvars_support.rb +55 -0
- data/lib/moose_inventory/cli/plan_rendering.rb +50 -0
- data/lib/moose_inventory/cli/relation_transaction_support.rb +51 -0
- data/lib/moose_inventory/cli/tag_support.rb +97 -0
- data/lib/moose_inventory/cli/variable_rendering.rb +67 -0
- data/lib/moose_inventory/config/config.rb +185 -108
- data/lib/moose_inventory/db/db.rb +170 -195
- data/lib/moose_inventory/db/exceptions.rb +6 -3
- data/lib/moose_inventory/db/models.rb +16 -0
- data/lib/moose_inventory/db/schema_migrations.rb +248 -0
- data/lib/moose_inventory/inventory_context.rb +68 -2
- data/lib/moose_inventory/operations/add_associations.rb +20 -16
- data/lib/moose_inventory/operations/add_groups.rb +21 -13
- data/lib/moose_inventory/operations/add_hosts.rb +30 -17
- data/lib/moose_inventory/operations/add_variables.rb +77 -0
- data/lib/moose_inventory/operations/entity_variable_operation_support.rb +46 -0
- data/lib/moose_inventory/operations/group_child_relations.rb +23 -16
- data/lib/moose_inventory/operations/group_cleanup.rb +23 -8
- data/lib/moose_inventory/operations/import_inventory_snapshot.rb +41 -0
- data/lib/moose_inventory/operations/inventory_doctor.rb +172 -0
- data/lib/moose_inventory/operations/inventory_snapshot.rb +60 -0
- data/lib/moose_inventory/operations/inventory_snapshot_applier.rb +112 -0
- data/lib/moose_inventory/operations/inventory_snapshot_preview.rb +174 -0
- data/lib/moose_inventory/operations/inventory_snapshot_validator.rb +134 -0
- data/lib/moose_inventory/operations/operation_event_support.rb +27 -0
- data/lib/moose_inventory/operations/query_inventory/base_query.rb +24 -0
- data/lib/moose_inventory/operations/query_inventory/group_queries.rb +86 -0
- data/lib/moose_inventory/operations/query_inventory/host_queries.rb +106 -0
- data/lib/moose_inventory/operations/query_inventory.rb +47 -0
- data/lib/moose_inventory/operations/remove_associations.rb +30 -18
- data/lib/moose_inventory/operations/remove_groups.rb +12 -12
- data/lib/moose_inventory/operations/remove_hosts.rb +68 -0
- data/lib/moose_inventory/operations/remove_variables.rb +67 -0
- data/lib/moose_inventory/runtime_options.rb +31 -0
- data/lib/moose_inventory/version.rb +3 -1
- data/lib/moose_inventory.rb +10 -7
- data/moose-inventory.gemspec +19 -35
- data/scripts/check.sh +1 -0
- data/scripts/ci/check_generated_artifacts.sh +41 -0
- data/scripts/ci/check_permissions.sh +2 -0
- data/scripts/ci/check_rubocop.sh +30 -25
- data/scripts/files.rb +5 -4
- data/spec/examples/ci_examples_spec.rb +37 -0
- data/spec/lib/moose_inventory/ansible_plugin_examples_spec.rb +29 -0
- data/spec/lib/moose_inventory/cli/application_doctor_spec.rb +50 -0
- data/spec/lib/moose_inventory/cli/application_import_export_spec.rb +100 -0
- data/spec/lib/moose_inventory/cli/application_spec.rb +25 -15
- data/spec/lib/moose_inventory/cli/audit_spec.rb +56 -0
- data/spec/lib/moose_inventory/cli/cli_spec.rb +15 -19
- data/spec/lib/moose_inventory/cli/console_spec.rb +98 -0
- data/spec/lib/moose_inventory/cli/factory_spec.rb +27 -0
- data/spec/lib/moose_inventory/cli/formatter_spec.rb +95 -3
- data/spec/lib/moose_inventory/cli/group_add_spec.rb +140 -116
- data/spec/lib/moose_inventory/cli/group_addchild_spec.rb +89 -35
- data/spec/lib/moose_inventory/cli/group_addhost_spec.rb +81 -84
- data/spec/lib/moose_inventory/cli/group_addvar_spec.rb +65 -68
- data/spec/lib/moose_inventory/cli/group_get_spec.rb +17 -33
- data/spec/lib/moose_inventory/cli/group_list_spec.rb +16 -38
- data/spec/lib/moose_inventory/cli/group_listvar_spec.rb +33 -40
- data/spec/lib/moose_inventory/cli/group_rm_spec.rb +136 -96
- data/spec/lib/moose_inventory/cli/group_rmchild_spec.rb +66 -41
- data/spec/lib/moose_inventory/cli/group_rmhost_spec.rb +76 -78
- data/spec/lib/moose_inventory/cli/group_rmvar_spec.rb +57 -63
- data/spec/lib/moose_inventory/cli/group_spec.rb +2 -0
- data/spec/lib/moose_inventory/cli/helpers_spec.rb +146 -0
- data/spec/lib/moose_inventory/cli/host_add_spec.rb +170 -116
- data/spec/lib/moose_inventory/cli/host_addgroup_spec.rb +100 -83
- data/spec/lib/moose_inventory/cli/host_addvar_spec.rb +92 -74
- data/spec/lib/moose_inventory/cli/host_get_spec.rb +14 -33
- data/spec/lib/moose_inventory/cli/host_list_spec.rb +41 -33
- data/spec/lib/moose_inventory/cli/host_listvar_spec.rb +45 -53
- data/spec/lib/moose_inventory/cli/host_rm_spec.rb +66 -48
- data/spec/lib/moose_inventory/cli/host_rmgroup_spec.rb +73 -83
- data/spec/lib/moose_inventory/cli/host_rmvar_spec.rb +56 -63
- data/spec/lib/moose_inventory/cli/host_spec.rb +2 -0
- data/spec/lib/moose_inventory/cli/tags_spec.rb +81 -0
- data/spec/lib/moose_inventory/config/config_spec.rb +41 -3
- data/spec/lib/moose_inventory/db/db_spec.rb +396 -36
- data/spec/lib/moose_inventory/db/exceptions_spec.rb +18 -0
- data/spec/lib/moose_inventory/db/models_spec.rb +7 -3
- data/spec/lib/moose_inventory/db_lifecycle_spec.rb +73 -0
- data/spec/lib/moose_inventory/inventory_context_spec.rb +10 -0
- data/spec/lib/moose_inventory/operations/add_associations_spec.rb +34 -0
- data/spec/lib/moose_inventory/operations/add_groups_spec.rb +15 -0
- data/spec/lib/moose_inventory/operations/add_hosts_spec.rb +13 -0
- data/spec/lib/moose_inventory/operations/add_variables_spec.rb +103 -0
- data/spec/lib/moose_inventory/operations/group_child_relations_spec.rb +46 -0
- data/spec/lib/moose_inventory/operations/import_inventory_snapshot_spec.rb +226 -0
- data/spec/lib/moose_inventory/operations/inventory_doctor_spec.rb +77 -0
- data/spec/lib/moose_inventory/operations/inventory_snapshot_spec.rb +50 -0
- data/spec/lib/moose_inventory/operations/operation_event_support_spec.rb +78 -0
- data/spec/lib/moose_inventory/operations/query_inventory_spec.rb +146 -0
- data/spec/lib/moose_inventory/operations/remove_associations_spec.rb +35 -0
- data/spec/lib/moose_inventory/operations/remove_groups_spec.rb +21 -0
- data/spec/lib/moose_inventory/operations/remove_hosts_spec.rb +55 -0
- data/spec/lib/moose_inventory/operations/remove_variables_spec.rb +83 -0
- data/spec/shared/shared_config_setup.rb +4 -3
- data/spec/spec_helper.rb +50 -40
- data/spec/support/cli_harness.rb +33 -0
- metadata +80 -41
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Moose Inventory Product Brief
|
|
2
|
+
|
|
3
|
+
## Approval status
|
|
4
|
+
|
|
5
|
+
Status: **Approved product-framing baseline**
|
|
6
|
+
|
|
7
|
+
Approval reference: `GOV-PRODUCT-001` in `docs/governance/approval-register.md` approves this document as the product-framing baseline for Moose Inventory.
|
|
8
|
+
|
|
9
|
+
Approved tailoring reference: `GOV-TAILOR-001` in `docs/governance/approval-register.md` approves Moose Inventory as **Class 4 with target profile Software Library / Package**.
|
|
10
|
+
|
|
11
|
+
Scope limit: this approval covers product framing only. It is not detailed requirements approval, CLI UX approval, architecture approval, security/privacy design approval, release approval, accepted-risk approval, public/compliance-claim approval, or RubyGems publishing approval.
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
|
|
15
|
+
Moose Inventory is a RubyGem and CLI for managing Ansible-compatible dynamic inventory state across local SQLite, MySQL/MariaDB, and PostgreSQL databases. It helps operators and automation workflows create, inspect, change, validate, import/export, and audit inventory data without hand-editing dynamic inventory structures.
|
|
16
|
+
|
|
17
|
+
The product is a software library/package and command-line tool, not a hosted service. It ships code, examples, CLI workflows, release artifacts, and documentation. It does not currently operate a production service on behalf of users.
|
|
18
|
+
|
|
19
|
+
## Target users
|
|
20
|
+
|
|
21
|
+
Primary users:
|
|
22
|
+
|
|
23
|
+
- Infrastructure engineers managing Ansible inventory data.
|
|
24
|
+
- DevOps/SRE practitioners who need repeatable CLI-based inventory changes.
|
|
25
|
+
- Automation maintainers who want machine-readable inventory export, validation, and dry-run plans.
|
|
26
|
+
- Ruby/Ansible users who prefer a packaged CLI and local database-backed inventory manager.
|
|
27
|
+
|
|
28
|
+
Secondary users:
|
|
29
|
+
|
|
30
|
+
- Security or release reviewers checking inventory changes before application.
|
|
31
|
+
- CI/CD maintainers integrating inventory review into pipelines.
|
|
32
|
+
- Future maintainers of the Moose Inventory RubyGem and release process.
|
|
33
|
+
|
|
34
|
+
## Core user problems
|
|
35
|
+
|
|
36
|
+
Moose Inventory is intended to solve these problems:
|
|
37
|
+
|
|
38
|
+
1. Keep dynamic Ansible inventory data in a structured database rather than scattered hand-maintained files.
|
|
39
|
+
2. Provide CLI operations for common host, group, variable, tag, and relationship changes.
|
|
40
|
+
3. Support reviewable dry-runs and machine-readable plans before mutating inventory state.
|
|
41
|
+
4. Export and import inventory snapshots for migration, review, backup, and automation workflows.
|
|
42
|
+
5. Validate inventory health before release, deployment, or operational change.
|
|
43
|
+
6. Preserve append-only audit evidence for successful mutating CLI commands.
|
|
44
|
+
7. Package and publish the tool through RubyGems with repeatable verification and trusted publishing.
|
|
45
|
+
|
|
46
|
+
## Primary use cases
|
|
47
|
+
|
|
48
|
+
### Manage inventory entities
|
|
49
|
+
|
|
50
|
+
Users can create, list, inspect, and remove hosts and groups. Host/group relationships and child-group relationships model Ansible-style inventory organization.
|
|
51
|
+
|
|
52
|
+
### Manage variables and metadata
|
|
53
|
+
|
|
54
|
+
Users can add/remove host and group variables and attach metadata tags that are separate from Ansible variables. Tags support operational labels such as environment, owner, lifecycle, location, role, and criticality.
|
|
55
|
+
|
|
56
|
+
### Review changes before applying them
|
|
57
|
+
|
|
58
|
+
Mutating commands support `--dry-run`. Dry-runs render planned progress without database mutation. For automation and review, `--plan-format yaml|json|pjson` emits structured planned events.
|
|
59
|
+
|
|
60
|
+
### Validate inventory health
|
|
61
|
+
|
|
62
|
+
The `doctor` command performs read-only inventory checks and returns non-zero when findings are present, supporting CI/release-gate workflows.
|
|
63
|
+
|
|
64
|
+
### Import/export inventory snapshots
|
|
65
|
+
|
|
66
|
+
Users can export portable inventory snapshots and import validated snapshots into another database. Import is additive/update-oriented and validates the snapshot before writing.
|
|
67
|
+
|
|
68
|
+
### Maintain database schema safely
|
|
69
|
+
|
|
70
|
+
Database lifecycle commands inspect, migrate, and back up supported databases. Schema migrations are explicit and ordered. The tool refuses to write to databases with a newer schema version than it supports.
|
|
71
|
+
|
|
72
|
+
### Support CI/CD and Ansible integration
|
|
73
|
+
|
|
74
|
+
The repository includes Ansible inventory plugin examples and CI integration examples without adding Ansible/Python runtime dependencies to the RubyGem itself.
|
|
75
|
+
|
|
76
|
+
## Product goals
|
|
77
|
+
|
|
78
|
+
1. Provide a reliable, scriptable CLI for database-backed Ansible dynamic inventory management.
|
|
79
|
+
2. Preserve existing command behavior and output compatibility unless a breaking change is deliberately approved.
|
|
80
|
+
3. Prefer safe change workflows: transactions, dry-run previews, validation before write, explicit migrations, and audit logging.
|
|
81
|
+
4. Support common local and server-backed database adapters: SQLite, MySQL/MariaDB, and PostgreSQL.
|
|
82
|
+
5. Keep the package lightweight and avoid unnecessary runtime dependencies.
|
|
83
|
+
6. Maintain strong release hygiene through tests, linting, dependency security checks, secret scanning, package sanity checks, and trusted publishing.
|
|
84
|
+
7. Keep documentation practical for CLI users, maintainers, reviewers, and automation consumers.
|
|
85
|
+
|
|
86
|
+
## Non-goals
|
|
87
|
+
|
|
88
|
+
The current product baseline does not include:
|
|
89
|
+
|
|
90
|
+
- Hosted service operation, web UI, SaaS control plane, or managed inventory hosting.
|
|
91
|
+
- General-purpose configuration-management replacement beyond inventory management.
|
|
92
|
+
- A full rollback system for audit events or imported snapshots.
|
|
93
|
+
- Silent destructive restore semantics.
|
|
94
|
+
- Windows support as a committed compatibility target.
|
|
95
|
+
- Compliance certification claims such as SOC 2, ISO 27001, ISO 42001, or similar readiness claims.
|
|
96
|
+
- Release approval, risk acceptance, public compliance claims, or RubyGems publishing without explicit human approval.
|
|
97
|
+
|
|
98
|
+
## Security-sensitive context
|
|
99
|
+
|
|
100
|
+
Moose Inventory can affect infrastructure operations because inventory data drives Ansible execution. A wrong host/group/variable relationship can point automation at the wrong machines or wrong environment.
|
|
101
|
+
|
|
102
|
+
Security-sensitive assets and flows include:
|
|
103
|
+
|
|
104
|
+
- Local or server-backed inventory databases.
|
|
105
|
+
- Configuration files that identify environments and database connections.
|
|
106
|
+
- Database credentials, especially legacy plaintext `password` values.
|
|
107
|
+
- Environment variables used for database passwords.
|
|
108
|
+
- Exported inventory snapshots.
|
|
109
|
+
- Audit logs that may reveal host/group names, actors, and operational structure.
|
|
110
|
+
- RubyGem release artifacts and GitHub Actions trusted-publishing configuration.
|
|
111
|
+
|
|
112
|
+
Current product posture:
|
|
113
|
+
|
|
114
|
+
- Prefer `password_env` over plaintext database passwords.
|
|
115
|
+
- Avoid committing database credentials and generated/runtime inventory files.
|
|
116
|
+
- Use transactions for mutating commands.
|
|
117
|
+
- Use validation before import writes.
|
|
118
|
+
- Exclude dry-run commands from audit mutation history because no mutation occurred.
|
|
119
|
+
- Treat release publishing, accepted risk, and public/security claims as human-owned decisions.
|
|
120
|
+
|
|
121
|
+
## Compatibility and stability expectations
|
|
122
|
+
|
|
123
|
+
Until explicitly changed by an approved requirements baseline:
|
|
124
|
+
|
|
125
|
+
- Existing documented CLI commands should remain compatible.
|
|
126
|
+
- Existing default human-readable output should be preserved where tests already lock behavior.
|
|
127
|
+
- Machine-readable formats should remain stable enough for automation consumers.
|
|
128
|
+
- Schema migrations should be additive and ordered where practical.
|
|
129
|
+
- Older code must refuse newer schemas rather than downgrade or corrupt them.
|
|
130
|
+
- Database-adapter behavior should remain conservative and explicit.
|
|
131
|
+
|
|
132
|
+
## Assumptions
|
|
133
|
+
|
|
134
|
+
- Users are comfortable with command-line workflows and Ansible inventory concepts.
|
|
135
|
+
- Users can install Ruby and native database client build dependencies when required.
|
|
136
|
+
- SQLite is suitable for local/small workflows; MySQL/MariaDB and PostgreSQL are available for server-backed inventory stores.
|
|
137
|
+
- Users manage their own database backups, especially for MySQL/MariaDB and PostgreSQL.
|
|
138
|
+
- Users are responsible for protecting their inventory data, database credentials, and generated artifacts.
|
|
139
|
+
|
|
140
|
+
## Success criteria
|
|
141
|
+
|
|
142
|
+
A release or major change is product-aligned when:
|
|
143
|
+
|
|
144
|
+
- CLI behavior remains compatible or the breaking change has explicit approval and migration guidance.
|
|
145
|
+
- The full verification gate passes for the release candidate.
|
|
146
|
+
- Security/dependency/secret/package checks pass or exceptions are explicitly recorded as accepted risk.
|
|
147
|
+
- README and relevant docs are updated in the existing style.
|
|
148
|
+
- Release evidence includes a human release decision, not just passing checks.
|
|
149
|
+
- New features include tests, documentation, and backlog closure evidence.
|
|
150
|
+
- Security-sensitive flows have dry-run, validation, transaction, or documented recovery behavior where appropriate.
|
|
151
|
+
|
|
152
|
+
## Open product questions
|
|
153
|
+
|
|
154
|
+
These remain unresolved until future approval or requirements work:
|
|
155
|
+
|
|
156
|
+
1. Should Moose Inventory formally support Windows, or continue documenting UNIX/Linux as the supported target?
|
|
157
|
+
2. What compatibility policy should apply to CLI human-readable output vs machine-readable output?
|
|
158
|
+
3. Should audit logs grow into rollback/change-set functionality, or remain accountability/debug evidence only?
|
|
159
|
+
4. Should snapshot import ever support destructive sync/restore semantics, and if so what confirmation/recovery controls are required?
|
|
160
|
+
5. What is the expected support policy for Ruby versions and database adapter versions after each release?
|
|
161
|
+
6. Should package signing or provenance beyond RubyGems trusted publishing be added?
|
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
# Moose Inventory Requirements and Acceptance Criteria Baseline
|
|
2
|
+
|
|
3
|
+
## Approval status
|
|
4
|
+
|
|
5
|
+
Status: **Approved requirements and acceptance criteria baseline**
|
|
6
|
+
|
|
7
|
+
Approval reference: `GOV-REQ-001` in `docs/governance/approval-register.md` approves this document as the requirements and acceptance criteria baseline for Moose Inventory.
|
|
8
|
+
|
|
9
|
+
Approved references:
|
|
10
|
+
|
|
11
|
+
- `GOV-TAILOR-001`: Moose Inventory is approved as Class 4 with target profile Software Library / Package.
|
|
12
|
+
- `GOV-PRODUCT-001`: `docs/product/product-brief.md` is approved as the product-framing baseline.
|
|
13
|
+
|
|
14
|
+
Scope limit: this approval covers the requirements and acceptance criteria baseline only. It is not CLI UX approval, architecture approval, security/privacy design approval, release approval, accepted-risk approval, public/compliance-claim approval, RubyGems publishing approval, or approval of any open requirements question that requires a separate decision.
|
|
15
|
+
|
|
16
|
+
## Change-control note
|
|
17
|
+
|
|
18
|
+
Until this document is approved, the README, specs, and current CLI behavior remain the practical behavior baseline. After approval:
|
|
19
|
+
|
|
20
|
+
- New features should map to one or more requirements or add/update a requirement.
|
|
21
|
+
- Breaking CLI/API/schema behavior changes require explicit approval and migration notes.
|
|
22
|
+
- Release candidates should produce evidence that the applicable acceptance criteria pass or that exceptions are explicitly accepted as risk.
|
|
23
|
+
- Documents, tests, scans, and checklists are evidence, not approval.
|
|
24
|
+
|
|
25
|
+
## Requirement categories
|
|
26
|
+
|
|
27
|
+
Requirement IDs use these prefixes:
|
|
28
|
+
|
|
29
|
+
- `CLI`: command-line behavior
|
|
30
|
+
- `CFG`: configuration and environment selection
|
|
31
|
+
- `DB`: database lifecycle, adapters, and schema
|
|
32
|
+
- `INV`: inventory model and mutation behavior
|
|
33
|
+
- `DRY`: dry-run and plan output
|
|
34
|
+
- `SNAP`: import/export snapshots
|
|
35
|
+
- `DOC`: inventory doctor/lint behavior
|
|
36
|
+
- `AUD`: audit/change history
|
|
37
|
+
- `TAG`: metadata tags
|
|
38
|
+
- `ANS`: Ansible integration
|
|
39
|
+
- `CI`: CI/CD integration examples
|
|
40
|
+
- `PKG`: package/release integrity
|
|
41
|
+
- `SEC`: security/privacy expectations
|
|
42
|
+
- `COMPAT`: compatibility and support boundaries
|
|
43
|
+
- `DOCS`: user/maintainer documentation
|
|
44
|
+
|
|
45
|
+
## Functional requirements
|
|
46
|
+
|
|
47
|
+
### CLI behavior
|
|
48
|
+
|
|
49
|
+
#### CLI-001: Help and discoverability
|
|
50
|
+
|
|
51
|
+
The CLI must expose help at the top level and command-family level.
|
|
52
|
+
|
|
53
|
+
Acceptance criteria:
|
|
54
|
+
|
|
55
|
+
- `moose-inventory help` displays top-level help.
|
|
56
|
+
- `moose-inventory help group` displays group help.
|
|
57
|
+
- `moose-inventory group help add` displays command-specific help.
|
|
58
|
+
- Help examples in README remain representative of supported command families.
|
|
59
|
+
|
|
60
|
+
#### CLI-002: Output formats
|
|
61
|
+
|
|
62
|
+
Read/list/get/report commands that document `--format` must support `yaml`, `json`, and `pjson` where applicable.
|
|
63
|
+
|
|
64
|
+
Acceptance criteria:
|
|
65
|
+
|
|
66
|
+
- Supported formats are documented in README.
|
|
67
|
+
- Unsupported formats fail predictably without mutating inventory.
|
|
68
|
+
- Machine-readable output remains parseable by the declared format.
|
|
69
|
+
|
|
70
|
+
#### CLI-003: Existing behavior preservation
|
|
71
|
+
|
|
72
|
+
Existing documented command behavior and tested output should remain compatible unless a breaking change is explicitly approved.
|
|
73
|
+
|
|
74
|
+
Acceptance criteria:
|
|
75
|
+
|
|
76
|
+
- Regression tests cover legacy behavior that is intentionally preserved.
|
|
77
|
+
- Breaking changes include an approval record and migration/release note.
|
|
78
|
+
- Default human-readable output is not changed accidentally during refactors.
|
|
79
|
+
|
|
80
|
+
### Configuration and environment selection
|
|
81
|
+
|
|
82
|
+
#### CFG-001: Config discovery
|
|
83
|
+
|
|
84
|
+
The CLI must search documented config locations in precedence order and allow an explicit `--config <FILE>` override.
|
|
85
|
+
|
|
86
|
+
Acceptance criteria:
|
|
87
|
+
|
|
88
|
+
- Explicit `--config` takes precedence and must reference an existing file.
|
|
89
|
+
- Default search paths remain documented.
|
|
90
|
+
- Missing/invalid config errors are clear and non-mutating.
|
|
91
|
+
|
|
92
|
+
#### CFG-002: Environment selection
|
|
93
|
+
|
|
94
|
+
The CLI must use `general.defaultenv` by default and allow `--env <SECTION>` to select another environment.
|
|
95
|
+
|
|
96
|
+
Acceptance criteria:
|
|
97
|
+
|
|
98
|
+
- Missing environment sections fail clearly.
|
|
99
|
+
- Environment sections remain isolated by database configuration.
|
|
100
|
+
- Commands use the selected environment consistently.
|
|
101
|
+
|
|
102
|
+
#### CFG-003: Database credential handling
|
|
103
|
+
|
|
104
|
+
Database configuration must support `password_env` for MySQL/MariaDB and PostgreSQL and retain legacy plaintext `password` compatibility.
|
|
105
|
+
|
|
106
|
+
Acceptance criteria:
|
|
107
|
+
|
|
108
|
+
- README recommends `password_env` over plaintext `password`.
|
|
109
|
+
- Doctor/security checks flag plaintext database password configuration.
|
|
110
|
+
- Plaintext password support is treated as compatibility, not preferred posture.
|
|
111
|
+
|
|
112
|
+
### Database lifecycle, adapters, and schema
|
|
113
|
+
|
|
114
|
+
#### DB-001: Supported adapters
|
|
115
|
+
|
|
116
|
+
Moose Inventory must support SQLite, MySQL/MariaDB, and PostgreSQL adapters as documented.
|
|
117
|
+
|
|
118
|
+
Acceptance criteria:
|
|
119
|
+
|
|
120
|
+
- SQLite is exercised by the automated test suite.
|
|
121
|
+
- MySQL/MariaDB and PostgreSQL adapter dispatch/error paths have smoke coverage without requiring live servers.
|
|
122
|
+
- Adapter-specific configuration requirements are documented.
|
|
123
|
+
|
|
124
|
+
#### DB-002: Transactional mutations
|
|
125
|
+
|
|
126
|
+
Mutating commands must perform database changes transactionally where practical.
|
|
127
|
+
|
|
128
|
+
Acceptance criteria:
|
|
129
|
+
|
|
130
|
+
- A command either applies its intended database changes or rolls them back on failure.
|
|
131
|
+
- Import validation completes before import writes begin.
|
|
132
|
+
- Dry-run commands do not mutate database state.
|
|
133
|
+
|
|
134
|
+
#### DB-003: Explicit schema versioning and migration
|
|
135
|
+
|
|
136
|
+
Database schema changes must use explicit ordered migrations.
|
|
137
|
+
|
|
138
|
+
Acceptance criteria:
|
|
139
|
+
|
|
140
|
+
- Schema version metadata is maintained.
|
|
141
|
+
- Known migrations run in order.
|
|
142
|
+
- Older code refuses to write to a database with a newer schema version.
|
|
143
|
+
- `db status`, `db doctor`, and `db migrate` report/handle schema state as documented.
|
|
144
|
+
|
|
145
|
+
#### DB-004: Backup support
|
|
146
|
+
|
|
147
|
+
The CLI must provide documented database backup behavior for SQLite and clear boundaries for server-backed databases.
|
|
148
|
+
|
|
149
|
+
Acceptance criteria:
|
|
150
|
+
|
|
151
|
+
- SQLite backup command copies the configured database to the requested destination.
|
|
152
|
+
- MySQL/MariaDB and PostgreSQL backup limitations are documented or reported clearly in `docs/maintenance/database-backup-restore-guidance.md`.
|
|
153
|
+
- Server-backed backup/restore operations remain user-managed through native database tools or hosting-platform controls.
|
|
154
|
+
- Backup commands avoid destructive behavior.
|
|
155
|
+
|
|
156
|
+
### Inventory model and mutation behavior
|
|
157
|
+
|
|
158
|
+
#### INV-001: Host and group management
|
|
159
|
+
|
|
160
|
+
The CLI must support creating, listing, inspecting, and removing hosts and groups.
|
|
161
|
+
|
|
162
|
+
Acceptance criteria:
|
|
163
|
+
|
|
164
|
+
- Host/group create operations are idempotent or report existing state as currently documented/tested.
|
|
165
|
+
- Removal operations clean up related associations according to documented behavior.
|
|
166
|
+
- Group recursive removal behavior is explicit and tested.
|
|
167
|
+
|
|
168
|
+
#### INV-002: Host-group relationships
|
|
169
|
+
|
|
170
|
+
The CLI must support adding/removing hosts to/from groups through host-oriented and group-oriented command families.
|
|
171
|
+
|
|
172
|
+
Acceptance criteria:
|
|
173
|
+
|
|
174
|
+
- `host addgroup`, `host rmgroup`, `group addhost`, and `group rmhost` preserve existing output contracts.
|
|
175
|
+
- Automatic `ungrouped` behavior is preserved.
|
|
176
|
+
- Missing host/group behavior remains explicit and non-surprising.
|
|
177
|
+
|
|
178
|
+
#### INV-003: Child-group relationships
|
|
179
|
+
|
|
180
|
+
The CLI must support adding/removing child groups while preventing invalid group hierarchy states.
|
|
181
|
+
|
|
182
|
+
Acceptance criteria:
|
|
183
|
+
|
|
184
|
+
- Circular child-group relationships are rejected or reported by validation/doctor checks.
|
|
185
|
+
- `--delete-orphans` behavior remains explicit.
|
|
186
|
+
- Parent/child cleanup behavior is tested.
|
|
187
|
+
|
|
188
|
+
#### INV-004: Variables
|
|
189
|
+
|
|
190
|
+
The CLI must support host and group variable creation, update, listing, and removal.
|
|
191
|
+
|
|
192
|
+
Acceptance criteria:
|
|
193
|
+
|
|
194
|
+
- Variable names and values are validated according to current CLI/import rules.
|
|
195
|
+
- Variable mutation commands preserve transactional behavior.
|
|
196
|
+
- Variable list/get output remains machine-readable where documented.
|
|
197
|
+
|
|
198
|
+
#### INV-005: Host list filtering
|
|
199
|
+
|
|
200
|
+
Host listing must support documented filters using database-backed queries where implemented.
|
|
201
|
+
|
|
202
|
+
Acceptance criteria:
|
|
203
|
+
|
|
204
|
+
- Group, tag, and variable filters behave as AND predicates when multiple filters are provided.
|
|
205
|
+
- Missing filters return empty results rather than broadening results.
|
|
206
|
+
- Output shape and ordering remain compatible with documented/tested behavior.
|
|
207
|
+
|
|
208
|
+
### Dry-run and plan output
|
|
209
|
+
|
|
210
|
+
#### DRY-001: Dry-run support for mutating commands
|
|
211
|
+
|
|
212
|
+
Documented mutating command families must support `--dry-run`.
|
|
213
|
+
|
|
214
|
+
Acceptance criteria:
|
|
215
|
+
|
|
216
|
+
- Dry-run renders planned progress without database mutation.
|
|
217
|
+
- Dry-run ends with `Dry run complete. No changes applied.`
|
|
218
|
+
- Dry-run behavior covers host/group create/remove, variable mutations, host/group associations, and child-group relationship commands as documented.
|
|
219
|
+
|
|
220
|
+
#### DRY-002: Machine-readable plan output
|
|
221
|
+
|
|
222
|
+
Dry-run commands must support `--plan-format yaml|json|pjson` for automation/review workflows.
|
|
223
|
+
|
|
224
|
+
Acceptance criteria:
|
|
225
|
+
|
|
226
|
+
- `--plan-format` requires `--dry-run`.
|
|
227
|
+
- Without `--dry-run`, the command aborts before writes with the documented error.
|
|
228
|
+
- Plan events include ordered event type and payload details sufficient for scripts to inspect intended changes.
|
|
229
|
+
|
|
230
|
+
### Import/export snapshots
|
|
231
|
+
|
|
232
|
+
#### SNAP-001: Snapshot export
|
|
233
|
+
|
|
234
|
+
The CLI must export the full inventory as a portable snapshot.
|
|
235
|
+
|
|
236
|
+
Acceptance criteria:
|
|
237
|
+
|
|
238
|
+
- Snapshot includes version, hosts, groups, variables, tags, host/group memberships, and child-group relationships.
|
|
239
|
+
- YAML/JSON output is parseable.
|
|
240
|
+
- Export does not mutate inventory.
|
|
241
|
+
|
|
242
|
+
#### SNAP-002: Snapshot import validation
|
|
243
|
+
|
|
244
|
+
The CLI must validate snapshots before writing.
|
|
245
|
+
|
|
246
|
+
Acceptance criteria:
|
|
247
|
+
|
|
248
|
+
- Malformed snapshots, unknown references, unsupported fields, invalid variable shapes, duplicate normalized keys, whitespace-only names, and circular group hierarchies are rejected before writes.
|
|
249
|
+
- Failed import leaves the database unchanged.
|
|
250
|
+
|
|
251
|
+
#### SNAP-003: Additive import semantics
|
|
252
|
+
|
|
253
|
+
Snapshot import must remain additive/update-oriented unless destructive restore/sync semantics are separately approved.
|
|
254
|
+
|
|
255
|
+
Acceptance criteria:
|
|
256
|
+
|
|
257
|
+
- Import creates missing hosts/groups, adds missing associations/tags, and creates/updates variables found in the snapshot.
|
|
258
|
+
- Import does not delete existing inventory records absent from the file.
|
|
259
|
+
- Any future destructive import mode requires explicit requirements, UX, recovery, and approval records.
|
|
260
|
+
|
|
261
|
+
#### SNAP-004: Snapshot import preview
|
|
262
|
+
|
|
263
|
+
Snapshot import must support a non-mutating preview/diff mode for review before writes.
|
|
264
|
+
|
|
265
|
+
Acceptance criteria:
|
|
266
|
+
|
|
267
|
+
- `import FILE --preview` validates the snapshot and reports the additive changes without writing.
|
|
268
|
+
- `--preview-format yaml|json|pjson` emits parseable machine-readable preview output.
|
|
269
|
+
- Preview output shows creates, variable updates, association additions, unchanged items, ignored existing records, and destructive-change count.
|
|
270
|
+
- Validation failures still leave the database unchanged.
|
|
271
|
+
|
|
272
|
+
### Inventory doctor/lint behavior
|
|
273
|
+
|
|
274
|
+
#### DOC-001: Read-only health checks
|
|
275
|
+
|
|
276
|
+
The `doctor` command must run read-only health checks and exit non-zero when findings are present.
|
|
277
|
+
|
|
278
|
+
Acceptance criteria:
|
|
279
|
+
|
|
280
|
+
- Doctor finds documented inventory/config issues.
|
|
281
|
+
- Doctor supports human-readable output plus `yaml`, `json`, and `pjson` machine-readable formats.
|
|
282
|
+
- Doctor does not mutate inventory.
|
|
283
|
+
|
|
284
|
+
### Audit/change history
|
|
285
|
+
|
|
286
|
+
#### AUD-001: Append-only audit evidence
|
|
287
|
+
|
|
288
|
+
Successful mutating commands must record append-only audit evidence where audit support applies.
|
|
289
|
+
|
|
290
|
+
Acceptance criteria:
|
|
291
|
+
|
|
292
|
+
- Audit records include useful action, actor, target, metadata, and timestamp details.
|
|
293
|
+
- Dry-runs do not create mutation audit records.
|
|
294
|
+
- Audit listing supports documented formats and limits.
|
|
295
|
+
|
|
296
|
+
### Metadata tags
|
|
297
|
+
|
|
298
|
+
#### TAG-001: Host/group metadata tags
|
|
299
|
+
|
|
300
|
+
Hosts and groups must support metadata tags separate from Ansible variables.
|
|
301
|
+
|
|
302
|
+
Acceptance criteria:
|
|
303
|
+
|
|
304
|
+
- Tag add/list/remove commands work for hosts and groups.
|
|
305
|
+
- Tags are normalized to lowercase, stripped of surrounding whitespace, and deduplicated per host/group.
|
|
306
|
+
- CLI tag commands and snapshot import apply the same tag normalization rule.
|
|
307
|
+
|
|
308
|
+
### Ansible integration
|
|
309
|
+
|
|
310
|
+
#### ANS-001: Dynamic inventory compatibility
|
|
311
|
+
|
|
312
|
+
Moose Inventory must support Ansible-compatible dynamic inventory workflows.
|
|
313
|
+
|
|
314
|
+
Acceptance criteria:
|
|
315
|
+
|
|
316
|
+
- README documents how to use Moose Inventory with Ansible.
|
|
317
|
+
- Example inventory plugin/shim files remain packaged as examples.
|
|
318
|
+
- The RubyGem does not take an unnecessary Python/Ansible runtime dependency solely for examples.
|
|
319
|
+
|
|
320
|
+
#### ANS-002: Inventory mutation from Ansible
|
|
321
|
+
|
|
322
|
+
Documented Ansible write-back patterns must remain accurate where supported.
|
|
323
|
+
|
|
324
|
+
Acceptance criteria:
|
|
325
|
+
|
|
326
|
+
- README examples reflect supported command behavior.
|
|
327
|
+
- Security-sensitive write-back assumptions are documented or deferred to security guidance.
|
|
328
|
+
|
|
329
|
+
### CI/CD integration examples
|
|
330
|
+
|
|
331
|
+
#### CI-001: Inventory review examples
|
|
332
|
+
|
|
333
|
+
The repository should include CI/CD examples for validating and reviewing inventory snapshots.
|
|
334
|
+
|
|
335
|
+
Acceptance criteria:
|
|
336
|
+
|
|
337
|
+
- Example workflows/scripts are present under `examples/ci/`.
|
|
338
|
+
- Examples avoid embedding credentials or environment-specific secrets.
|
|
339
|
+
- Examples are covered by repository checks where practical.
|
|
340
|
+
|
|
341
|
+
## Non-functional requirements
|
|
342
|
+
|
|
343
|
+
### Package/release integrity
|
|
344
|
+
|
|
345
|
+
#### PKG-001: Release verification gate
|
|
346
|
+
|
|
347
|
+
Release candidates must pass the full project verification gate or record explicit accepted-risk exceptions.
|
|
348
|
+
|
|
349
|
+
Acceptance criteria:
|
|
350
|
+
|
|
351
|
+
- `MOOSE_INVENTORY_REQUIRE_SECURITY_TOOLS=1 ./scripts/check.sh` passes for release-candidate code unless an exception is explicitly accepted.
|
|
352
|
+
- Gate includes tests, coverage, RuboCop, whitespace/permission checks, generated-artifact guards, dependency security checks, secret scanning, and package sanity.
|
|
353
|
+
- Release evidence records the exact command and result.
|
|
354
|
+
|
|
355
|
+
#### PKG-002: Trusted publishing
|
|
356
|
+
|
|
357
|
+
RubyGems publishing should use trusted publishing/OIDC where configured.
|
|
358
|
+
|
|
359
|
+
Acceptance criteria:
|
|
360
|
+
|
|
361
|
+
- Release workflow uses the documented trusted-publishing path.
|
|
362
|
+
- Publishing requires explicit human release approval.
|
|
363
|
+
- Release docs describe required RubyGems/GitHub setup and post-release verification.
|
|
364
|
+
|
|
365
|
+
#### PKG-003: Dependency and platform support
|
|
366
|
+
|
|
367
|
+
Runtime and development dependency ranges must remain intentional and reviewed.
|
|
368
|
+
|
|
369
|
+
Acceptance criteria:
|
|
370
|
+
|
|
371
|
+
- Gem dependency ranges are reviewed during release prep.
|
|
372
|
+
- Supported Ruby versions align with CI matrix and gemspec requirements.
|
|
373
|
+
- Dependency security checks pass or exceptions are accepted risk.
|
|
374
|
+
|
|
375
|
+
### Security/privacy expectations
|
|
376
|
+
|
|
377
|
+
#### SEC-001: Secret handling
|
|
378
|
+
|
|
379
|
+
Moose Inventory must avoid encouraging committed plaintext secrets.
|
|
380
|
+
|
|
381
|
+
Acceptance criteria:
|
|
382
|
+
|
|
383
|
+
- README recommends `password_env`.
|
|
384
|
+
- Doctor flags plaintext password config.
|
|
385
|
+
- Secret scanning is part of the verification gate.
|
|
386
|
+
|
|
387
|
+
#### SEC-002: Inventory data sensitivity
|
|
388
|
+
|
|
389
|
+
Docs and future security guidance must treat inventory data as potentially sensitive operational information.
|
|
390
|
+
|
|
391
|
+
Acceptance criteria:
|
|
392
|
+
|
|
393
|
+
- Exported snapshots, audit logs, and DB files are treated as sensitive artifacts.
|
|
394
|
+
- Examples avoid real credentials, hosts, or organization-specific secrets.
|
|
395
|
+
- Future docs do not imply inventory data is harmless.
|
|
396
|
+
|
|
397
|
+
#### SEC-003: Human-owned security decisions
|
|
398
|
+
|
|
399
|
+
Accepted risks, release security gates, public/security claims, and publishing decisions require human approval.
|
|
400
|
+
|
|
401
|
+
Acceptance criteria:
|
|
402
|
+
|
|
403
|
+
- Approval register or release evidence records human decisions.
|
|
404
|
+
- Passing scans are not represented as approval.
|
|
405
|
+
- Public/compliance claims are not made without explicit approval.
|
|
406
|
+
|
|
407
|
+
### Compatibility and support boundaries
|
|
408
|
+
|
|
409
|
+
#### COMPAT-001: Operating-system support boundary
|
|
410
|
+
|
|
411
|
+
UNIX/Linux remains the documented target unless Windows support is separately approved.
|
|
412
|
+
|
|
413
|
+
Acceptance criteria:
|
|
414
|
+
|
|
415
|
+
- README continues to warn that Windows is not currently a committed target.
|
|
416
|
+
- Windows support claims are not added without requirements, tests, and approval.
|
|
417
|
+
|
|
418
|
+
#### COMPAT-002: Machine-readable compatibility
|
|
419
|
+
|
|
420
|
+
Machine-readable formats are automation-facing interfaces governed by `CLI-OUTPUT-v1` in `docs/compatibility/cli-output-compatibility.md`.
|
|
421
|
+
|
|
422
|
+
Acceptance criteria:
|
|
423
|
+
|
|
424
|
+
- Changes to JSON/YAML/pjson structures are reviewed for compatibility impact.
|
|
425
|
+
- Breaking format changes require approval, migration notes, and a release-note declaration of any successor compatibility baseline.
|
|
426
|
+
- Existing machine-readable shapes are not retrofitted with version fields unless the compatibility impact is approved.
|
|
427
|
+
|
|
428
|
+
#### COMPAT-003: Human-readable compatibility
|
|
429
|
+
|
|
430
|
+
Human-readable output is also governed by `CLI-OUTPUT-v1` when tests, README examples, or downstream scripts rely on exact wording.
|
|
431
|
+
|
|
432
|
+
Acceptance criteria:
|
|
433
|
+
|
|
434
|
+
- Refactors preserve existing wording/newline behavior where tests lock it.
|
|
435
|
+
- Intentional wording changes include test updates and release notes or backlog evidence.
|
|
436
|
+
- Human-readable output remains discouraged as an automation interface when machine-readable output is available.
|
|
437
|
+
|
|
438
|
+
### Documentation
|
|
439
|
+
|
|
440
|
+
#### DOCS-001: README as user-facing source
|
|
441
|
+
|
|
442
|
+
Every new user-facing feature must be documented in README in the existing style.
|
|
443
|
+
|
|
444
|
+
Acceptance criteria:
|
|
445
|
+
|
|
446
|
+
- Feature branches update README for new commands/options/behavior.
|
|
447
|
+
- README examples are kept accurate enough for users to follow.
|
|
448
|
+
- Generated/runtime artifacts are not committed as documentation unless intentional.
|
|
449
|
+
|
|
450
|
+
#### DOCS-002: Process evidence docs
|
|
451
|
+
|
|
452
|
+
Process docs must distinguish draft evidence from approval.
|
|
453
|
+
|
|
454
|
+
Acceptance criteria:
|
|
455
|
+
|
|
456
|
+
- Approval status appears in product/process docs where relevant.
|
|
457
|
+
- Approval decisions are recorded in the approval register or equivalent durable evidence.
|
|
458
|
+
- Backlog status is updated when process artifacts are drafted or approved.
|
|
459
|
+
|
|
460
|
+
## Release acceptance summary
|
|
461
|
+
|
|
462
|
+
A release candidate is not requirements-conformant until:
|
|
463
|
+
|
|
464
|
+
1. Applicable functional requirements are implemented or explicitly deferred.
|
|
465
|
+
2. The full verification gate passes or exceptions are accepted as risk.
|
|
466
|
+
3. README and relevant docs reflect the release behavior.
|
|
467
|
+
4. Security-sensitive changes have validation, transaction, dry-run, audit, or recovery behavior as appropriate.
|
|
468
|
+
5. Release approval and accepted-risk disposition are recorded by a human approver.
|
|
469
|
+
6. RubyGems publishing, if any, is explicitly approved for that release.
|
|
470
|
+
|
|
471
|
+
## Open requirements questions
|
|
472
|
+
|
|
473
|
+
1. Should snapshot import gain an explicitly destructive sync/restore mode, and what confirmation/recovery controls would be required?
|
|
474
|
+
2. Should audit history become a rollback/change-set system or remain accountability/debug evidence?
|
|
475
|
+
3. What exact Ruby/database support window should apply after each release?
|
|
476
|
+
4. Should package signing/provenance beyond RubyGems trusted publishing become a requirement?
|
|
477
|
+
5. Should tag normalization be fully case-insensitive across all import/export/CLI paths?
|