Resolve glossary list clearing and configuration handoff

This commit is contained in:
2026-11-09 12:53:18 +00:00
parent 7e9bf6f149
commit f016471880
2 changed files with 71 additions and 35 deletions

View File

@@ -137,11 +137,13 @@ file remain terminal.
Register its [collection-scoped entry IDs](glossary-stages.md#entry-identity--resolved)
through native sequence identity registration. Apply its
[extensible entry content contract](glossary-stages.md#entry-content-fields--resolved)
using native typed fields and inline extension data.
using native typed fields and inline extension data. Honor its
[list-input and handoff contract](glossary-stages.md#list-inputs-and-configuration-handoff--resolved):
complete configuration resolution through ConfigKit before handoff; runtime
consumers treat null selections as empty without restoring defaults.
Complete its required durable decision record. The glossary roadmap owns
the remaining selection-input and attribution decisions. This
application scope model does not change native source composition or
sibling-inheritance semantics.
the remaining stage-identity and attribution decision. This application scope
model does not change native source composition or sibling-inheritance semantics.
## Documentation and Acceptance

View File

@@ -29,7 +29,8 @@ Finalize the glossary representation with the agreed
so operators migrate once. Collection placement and named selection are selected;
default import sources, their tier, entry identity, and content fields are also
selected. Runtime ordering and deduplication are selected below, with existing
business logic retained. Remaining selection and attribution details are open.
business logic retained. List clearing and the configuration handoff boundary
are resolved; stage identity and attribution remain open.
## Glossary Configuration Ownership — Resolved
@@ -40,6 +41,13 @@ registrations where applicable, and domain validation through supported public
APIs. Use native imports and layering rather than an Audita YAML loader or
private glossary merge engine.
ConfigKit owns the entire configuration-resolution lifecycle up to handoff,
including explicit CLI assignment, presence tracking, defaults, and stage
inheritance. Audita supplies its domain-specific resolution rules through
ConfigKit's supported application lifecycle. Complete those rules before handing
off fully resolved configuration; do not add a second resolution pass in Audita's
processing code.
Before transcript processing, hand off fully resolved, typed Go glossary
configuration and stage selections to Audita. Configuration-level domain checks
belong in the supported ConfigKit validation lifecycle; structural decoding alone
@@ -439,16 +447,17 @@ and rich-input order are selected above. Configuration composition
must follow ConfigKit's contracts rather than a local rule to concatenate
independently parsed files.
Resolve these settings in this order:
Resolve these settings through ConfigKit before deriving runtime views:
1. Load and compose glossary configuration and apply explicit CLI assignments
through ConfigKit.
2. If root `protected_terms` is omitted, derive it from a copy of the effective
root `glossaries`. Preserve any explicit root protection selection, including
`[]`.
`[]` or `null`.
3. Independently inherit the effective root `glossaries` and `protected_terms`
into each stage wherever that stage omits the corresponding setting. A stage
override replaces only its own selected list.
override replaces only its own selected list; explicit `[]` or `null` suppresses
inheritance for that setting.
4. After the configuration handoff, derive runtime views. For a glossary module
stage, construct its effective protected vocabulary by subtracting its active
glossary terms from its selected protected terms.
@@ -529,8 +538,8 @@ zero repairs is valid, while a zero operation timeout is invalid.
| Explicit input | Meaning |
| --- | --- |
| `context.description: ""` | Clear the inherited description. |
| `glossaries: []` | Clear correction/context inputs; a glossary-correction stage then lacks its required input. |
| `protected_terms: []` | Disable glossary-derived protection without changing correction/context inputs. |
| `glossaries: []` or `glossaries: null` | Clear correction/context inputs; a glossary-correction stage then lacks its required input. |
| `protected_terms: []` or `protected_terms: null` | Disable glossary-derived protection without changing correction/context inputs. |
| `llm.validation_profile: null` | Clear the inherited selection, then use the effective proposal profile. |
| `llm.validation_profile: ""` | Error: use null to clear the selection deliberately. |
| Empty or null proposal profile | Invalid for a stage requiring model execution. |
@@ -538,19 +547,50 @@ zero repairs is valid, while a zero operation timeout is invalid.
Declare genuinely optional selectors nullable and preserve omission versus
explicit null through resolution. Null is not a universal reset operation;
settings groups are not nullable. Preserve explicit empty selection semantics
(`[]` for list selectors) in the final glossary schema; null handling remains open
below. This concerns stage selections, not ConfigKit-owned definition collections.
settings groups are not nullable. For glossary and protection selection lists,
apply the resolved null-as-empty contract below. This concerns stage selections,
not ConfigKit-owned definition collections.
Reject a glossary-correction stage's missing or empty effective input
before execution. Other stages may operate without glossary context where their
operation supports it, independently of their protection selection.
Lists replace the entire inherited list where list-valued stage settings apply;
`[]` explicitly selects an empty list. Do not append or union implicitly.
`[]` and `null` explicitly select no entries. Do not append or union implicitly.
Preserve the owning library's semantics for library-owned resources and
identified collections. These scope rules do not introduce a custom merge
language or change ConfigKit source composition.
### List Inputs and Configuration Handoff — Resolved
Use ConfigKit's native nullable-list decoding and explicit-presence tracking for
`glossaries` and `protected_terms`. Omission can trigger the agreed root defaults
or stage inheritance within ConfigKit's application-resolution lifecycle;
explicit `null` and `[]` both suppress that defaulting or inheritance. Resolve
all effective selections before handoff.
Once Audita receives the fully resolved configuration, treat a null selection
as equivalent to an empty set. Do not restore defaults, inherit another value,
or run a second configuration-resolution pass because a received list is nil.
Nonempty selections retain their agreed ordering. ConfigKit may preserve the
input distinction between `null` and `[]` in provenance and inspection without
that distinction affecting processing; no normalization of the resolved
configuration is required solely to erase it.
An empty effective protection selection contributes no protected vocabulary.
An empty effective glossary selection is invalid for a glossary-correction
stage, whether it originated from null, an empty list, or absent configuration.
Enforce that domain requirement through ConfigKit's supported validation
lifecycle before processing.
Use standard CommandKit/parser conventions for CLI list inputs and ConfigKit's
native override API for explicit root assignments. Pass the completed parser
selection as one override for its root field; let ConfigKit apply it and resolve
the resulting configuration. Exact flag spelling is an implementation detail
within that boundary. Do not introduce custom clearing syntax or merge machinery.
Explicit stage selections remain authoritative under the resolved precedence
rules. Use `[]` as the usual configuration example for clearing while accepting
native null values.
### CLI Overrides and Stage Precedence — Resolved
Ordinary CLI setting flags override the corresponding root settings through
@@ -565,7 +605,8 @@ selection changes grammar's inherited input and, with root `protected_terms`
omitted, the derived protection inherited by all three stages. The explicit party
and spell correction selections stay unchanged.
An explicit root protection list is not changed by a root glossary assignment;
an explicit stage protection list or `[]` remains authoritative for that stage.
an explicit stage protection list, `[]`, or `null` remains authoritative for that
stage.
Apply this precedence consistently to all stage-capable settings. Submit only
explicitly supplied CLI values to ConfigKit; preserve false, zero, and empty
values under their per-field rules rather than allowing parser defaults to
@@ -621,7 +662,8 @@ use `configkit.Default` for root `protected_terms`, copying effective root
`glossaries` and recording that path as its dependency. Then default each omitted
stage protection list from the effective root protection list, even when that
root value was derived. Preserve source context through both steps and avoid
shared mutable list storage. Explicit empty lists must suppress defaulting.
shared mutable list storage. Explicit empty lists and nulls must suppress
defaulting.
Leave `protected_terms` absent from the bundled configuration underlay. ConfigKit
does not express this live list-to-list dependency as a declarative underlay
@@ -674,9 +716,9 @@ requirement visible during library design without expanding those migrations
into feature implementation.
1. Apply named collection selection, default file/directory underlay imports,
recursive placement, and the extensible entry content contract. Settle CLI
selection syntax and remaining domain decisions below. Preserve the selected
scope, clearing, CLI precedence, and fallback semantics in version 3.
recursive placement, and the extensible entry content contract. Apply native
CLI list conventions and settle stage identity and attribution below. Preserve
the selected scope, clearing, CLI precedence, and fallback semantics in version 3.
2. Adopt ConfigKit loading for glossary configuration. Register the selected
collection identities, supply domain validation, and deliver final typed
definitions and selections before transcript processing. Remove the redundant
@@ -772,6 +814,14 @@ initial transcript sections. Cover all validation-profile fallback cases above
and preserve the distinction between explicit and derived values in inspection.
Cover partial and empty settings groups, explicit zero and false, nullable
selectors, empty-list replacement, and invalid empty strings or group nulls.
For glossary and protection selections, cover omitted, null, empty, and nonempty
root and stage inputs through ConfigKit resolution. Confirm explicit null and
empty lists suppress defaulting and inheritance while inspection preserves native
provenance. Verify equivalent null/empty behavior in runtime consumers, with no
post-handoff default restoration or configuration resolution. Both forms must
fail domain validation when they leave a glossary-correction stage without input.
Exercise CLI list assignment through the standard parser and ConfigKit override
path, including explicit empty selections and unchanged explicit stage settings.
Verify that clearing a validation selection follows the effective proposal
profile without disabling validation, and that clearing a required glossary
fails before execution. Check recorded dependencies and retained clear-input
@@ -798,22 +848,6 @@ guidance are in place before declaring this feature complete.
The recommendations below are proposals, not selected contracts.
### List Inputs and CLI Representation
**Recommendation:** accept explicit null as an empty selection, preserving native
ConfigKit slice decoding and presence without an additional rejection rule. Keep
`[]` as the primary documented clearing form. This requires documenting a second
clearing form and ensuring null suppresses protection defaulting just as `[]`
does. Select CLI syntax for whole root name selections using native ConfigKit
overrides. These are ordinary selection lists,
not entry collections governed by native identity/operation policies.
**Alternative:** reject null for the two selection lists and require `[]` for
clearing. This offers one explicit empty-list spelling but adds application
validation beyond ConfigKit's nullable slice decoding. CLI spelling remains to
be selected; it does not reopen root-versus-stage precedence or imply
targeted-stage overrides.
### Stage Identity and Attribution
**Recommendation:** support optional operator-chosen stage IDs alongside execution