Repository navigation
feat!: one name per meaning in the CLI, typed and snake_case output - #15
Merged
Merged
Conversation
audit, services status and dashboard required it, while observe writes tmp/observed by default, so `observe && audit` failed. The operator's drift checks refresh the same directory instead of tmp/operator/observed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ponent-env-file deploy --release and --env-file take one value; migrate's took COMPONENT=VALUE pairs under the same names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
operations kept both the catalog and the decision records, one letter pair away from operator's proposal receipts, and each had an approve. Decision records move to `decisions list|show|approve`; `decisions show` is new. `data migrate` (copy one database) is `data copy`, no longer read as `migrate`, and `services inspect` is `services observe`, as `observe` collects server evidence. The old paths answer REDIRECTED (exit 13) with the new command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
meta used snake_case and data camelCase in the same envelope. Field names in data are now snake_case at every depth (openProposals is open_proposals). Map keys that are data keep their spelling: resource kinds, environment variable names and ids. A record or resource embedded in data, anything with an apiVersion, keeps the form it is stored in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every command's output schema listed its data keys with no types, so an
agent could not tell a list from a string without running the command.
Each key now declares its type in the operating contract (one table by
name, overridden per shape where a name holds something else), and treaty
checks every answer against it. As treaty's agent spec requires, an
optional list or object is written empty, not null: inventory show's
ansible is {} for a project.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Items 1 to 5 of the CLI review. Each one is a breaking change best made before 1.0.
Names
decisions list|show|approve.operations decisionsandoperations approvemove there, anddecisions showis new.operationskeeps the catalog:list,show,proposedata migrateisdata copy, no longer read asmigrate.services inspectisservices observe, matchingobserveREDIRECTEDand the new command inerror.redirect.commandFlags
migrate:--releaseand--env-fileare now--component-releaseand--component-env-file. They takeCOMPONENT=VALUEpairs, whiledeploy's flags of the same name take one value--observed: defaults totmp/observedeverywhere. Before,observe && auditfailed becauseauditrequired the flag, and the operator usedtmp/operator/observedOutput
datakeys: field names indataare snake_case, like treaty'smetaapiVersion, stay as storeddatakey now has a JSON type, from one table incommands.py, with a per-shapename:typeoverride where a name holds something else. treaty checks every answer against it[]/{}rather thannull, as treaty's agent spec requiresNot in this PR
--schemas,--engine, gateway TLS): blocked on two treaty gaps:mcp servetool provider and provided tools can't read the settings.cloudfall.tomlfrom the current directory, not from the project directoryChecks
ruffandmypyare clean, andpytestpasses: 363 tests--observed,decisions show, the redirects, and the snake_case ruletreaty auditis unchanged: the same 5 known advice and warning findingsDownstream
services inspect, which now redirects toservices observedata migratein a note, which now redirects todata copy🤖 Generated with Claude Code