[ConfigManager] Specify the Experimental Configuration Namespace - #4097
Draft
bdchatham wants to merge 1 commit into
Draft
[ConfigManager] Specify the Experimental Configuration Namespace#4097bdchatham wants to merge 1 commit into
bdchatham wants to merge 1 commit into
Conversation
A binary has one place to put a setting today, which is the declared key space, and every key there is a commitment: the schema counter versions that space and changing a key in it is a migration. Paying that per knob is not viable, so a knob either goes unwritten or the commitment happens by accident. This specifies a second namespace under a reserved experimental prefix, registered through one SDK verb. Values in it resolve and reach their readers like any other, and they sit outside the schema contract. Twenty-four criteria across five requirements, each in an EARS template with an ID a test names. The plan marks which of them the minimum version delivers and which belong to the migration chain, and the tasks cut it into six slices that ship on their own. An ADR records the decision the registry forced. A per-key marking was the other shape and it fails on the reader's side, because a reader asks for a key by name and an operator writes that name into a file, so neither sees a flag held in the registry. The registry also refuses a section name carrying a dot, which is why a package cannot register experimental.evm through the section verbs and why the registry owns the prefix and nests under it. Two risks are named rather than deferred. Regenerating sei.toml derives from the legacy files, which carry no experimental key, so a controller regenerating on every start discards every experimental value unless the carry-forward lands with the namespace. And registration is available before any migration chain exists, which is acceptable only while the namespace promises nothing. First specs/ and docs/adr/ in this repository. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
The latest Buf updates on your PR. Results from workflow Buf / buf (pull_request).
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4097 +/- ##
==========================================
- Coverage 61.35% 60.30% -1.06%
==========================================
Files 2187 2079 -108
Lines 191779 179231 -12548
==========================================
- Hits 117673 108083 -9590
+ Misses 62972 61062 -1910
+ Partials 11134 10086 -1048
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
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.
Specify, plan and tasks for the
[experimental]namespace. No code. Independent of#4094 and #4096.
First
specs/anddocs/adr/in this repository, so it sets the shape as well as thecontent.
What it decides
A binary has one place to put a setting today, and every key there is a commitment: the
schema counter versions the declared space, and changing a key in it is a migration the
binary performs. Paying that per knob is not viable, so a knob either goes unwritten or
the commitment happens by accident.
[experimental]is a second namespace, registered through one SDK verb, whose valuesresolve and reach their readers like any other and which sits outside the schema
contract.
The decision the registry forced
I started from pass-through: experimental keys undeclared, installed verbatim, outside
the declared space entirely. That maps neatly onto "not part of the API contract", but
it does not let a package register one, which is what the config SDK has to support.
The registry then settled the shape. It refuses a section name carrying a dot, and says
why: "a dotted name declares keys inside another section's subtree, where the two
sections' defaults land in one map and whichever renders last silently wins." So a
package cannot register
experimental.evmthrough the section verbs. The verb has toown the prefix and nest under it on the caller's behalf, with one owner per name making
that safe.
docs/adr/0001records that, and records why a per-key marking was rejected: a readerasks for a key by name and an operator writes that name into a file, so neither sees a
flag held in the registry. A prefix is visible in the file itself.
Two risks named rather than deferred
Regeneration drops the value.
seid config generatederives its file fromapp.tomlandconfig.toml, and neither carries an experimental key. Under theregenerate-on-every-start model a controller would discard every experimental value, the
node would revert to a registered default, and nothing would say so. EXP-17 and EXP-18
exist for that, and the plan puts the carry-forward in the minimum version rather than
after it.
Registration lands before any migration chain. A key can be written onto real nodes
with no chain to graduate it. Acceptable only while the namespace promises nothing,
which is why EXP-24 is stated now rather than when the chain arrives.
Shape
specs/experimental-config/spec.md— 24 criteria across 5 requirements, each in anEARS template with an ID. Three user stories, each with an independent test.
specs/experimental-config/plan.md— interfaces, the sequence, the risks, and whichrequirements the minimum version leaves to the migration chain.
specs/experimental-config/tasks.md— six slices that ship on their own, each namingthe criteria its tests cover.
docs/adr/0001-experimental-configuration-is-a-namespace.mdVerification
vale specs/experimental-config/spec.mdreports 0 errors and 19 warnings. The warningsare sentence length and passive voice; the gate is errors.
That exit status alone would not tell you the criteria were checked, so I broke one:
stripping
SHALLfrom EXP-1 producesEARS-CriterionShallerror, and restoring itclears. The rule ran.
Two notes on the gate rather than the content.
AgenticWriting.Spec-AcceptanceCriteriais enabled at
[*.md]in the shared vale config rather than scoped to[specs/**/spec.md], so it fires onplan.md,tasks.mdand the ADR, none of whichcarry acceptance criteria by design. Either a repo
.vale.inior a scoping change inthe shared style fixes it, and both are conventions worth deciding rather than my
picking one here.
Open question in the spec
Whether an experimental group answers per kind of node at all. It does in EXP-3, for
consistency with a section, and a group whose value does not vary answers the same for
each kind. The alternative is a plain value and no kind.