Standardized the grammar and spoken_word modules on a shared editorial_review validator

This commit is contained in:
2026-05-14 09:30:10 -05:00
parent b103bb2e7d
commit 6dae15656d
11 changed files with 9 additions and 65 deletions

View File

@@ -15,8 +15,6 @@ Built-in validator construction is package-owned under `internal/validators/<val
- `internal/validators/spoken_form_plausibility` - `internal/validators/spoken_form_plausibility`
- `internal/validators/meaning_reversal_review` - `internal/validators/meaning_reversal_review`
- `internal/validators/editorial_review` - `internal/validators/editorial_review`
- `internal/validators/grammar_review`
- `internal/validators/spoken_word_review`
Registry and chain wiring stay in: Registry and chain wiring stay in:
- `internal/validators/registry.go` - `internal/validators/registry.go`
@@ -67,10 +65,6 @@ Current 1.0 boundary:
- checks for likely meaning reversal or semantic contradiction. - checks for likely meaning reversal or semantic contradiction.
- `editorial_review` - `editorial_review`
- performs conservative editorial safety review. - performs conservative editorial safety review.
- `grammar_review`
- checks grammar-stage proposals for grammar-focused safety constraints.
- `spoken_word_review`
- checks spoken-word-stage proposals for dysfluency-cleanup safety constraints.
## Built-in module chains ## Built-in module chains
@@ -100,7 +94,7 @@ Current built-in chains resolved from `internal/validators/chains.go`:
- `confidence_threshold` - `confidence_threshold`
- `protected_terms` - `protected_terms`
- `non_empty_corrected_text` - `non_empty_corrected_text`
- `spoken_word_review` - `editorial_review`
- `meaning_reversal_review` - `meaning_reversal_review`
- `grammar` - `grammar`
@@ -109,7 +103,7 @@ Current built-in chains resolved from `internal/validators/chains.go`:
- `confidence_threshold` - `confidence_threshold`
- `protected_terms` - `protected_terms`
- `non_empty_corrected_text` - `non_empty_corrected_text`
- `grammar_review` - `editorial_review`
- `meaning_reversal_review` - `meaning_reversal_review`
## Protected terms construction ## Protected terms construction

View File

@@ -52,8 +52,6 @@ func buildCorrectionLedger(runDirPath string, runOutput *runner.RunOutput) []cor
"spoken_form_plausibility": true, "spoken_form_plausibility": true,
"meaning_reversal_review": true, "meaning_reversal_review": true,
"editorial_review": true, "editorial_review": true,
"grammar_review": true,
"spoken_word_review": true,
} }
for _, module := range runOutput.ModuleResults { for _, module := range runOutput.ModuleResults {

View File

@@ -3564,8 +3564,8 @@ func TestRunProcessExplicitSpokenWordMeaningChangingCleanupRejected(t *testing.T
if len(module.ValidatorRejected) != 1 { if len(module.ValidatorRejected) != 1 {
t.Fatalf("expected one semantic guardrail rejection, got %+v", module.ValidatorRejected) t.Fatalf("expected one semantic guardrail rejection, got %+v", module.ValidatorRejected)
} }
if module.ValidatorRejected[0].ValidatorName != "spoken_word_review" { if module.ValidatorRejected[0].ValidatorName != "editorial_review" {
t.Fatalf("expected spoken_word_review rejection, got %+v", module.ValidatorRejected[0]) t.Fatalf("expected editorial_review rejection, got %+v", module.ValidatorRejected[0])
} }
} }

View File

@@ -14,6 +14,6 @@
"total_skipped_changes": 1, "total_skipped_changes": 1,
"validator_rejected_reason_codes": ["llm_rejected"], "validator_rejected_reason_codes": ["llm_rejected"],
"expected_proposal_calls": ["grammar:proposal"], "expected_proposal_calls": ["grammar:proposal"],
"expected_validation_calls": ["grammar:section-0000:grammar_review:batch-0000"] "expected_validation_calls": ["grammar:section-0000:editorial_review:batch-0000"]
} }
} }

View File

@@ -136,7 +136,7 @@ func TestGrammarModuleValidatorChain(t *testing.T) {
"confidence_threshold", "confidence_threshold",
"protected_terms", "protected_terms",
"non_empty_corrected_text", "non_empty_corrected_text",
"grammar_review", "editorial_review",
"meaning_reversal_review", "meaning_reversal_review",
} }
if strings.Join(got, ",") != strings.Join(want, ",") { if strings.Join(got, ",") != strings.Join(want, ",") {

View File

@@ -137,7 +137,7 @@ func TestSpokenWordModuleValidatorChain(t *testing.T) {
"confidence_threshold", "confidence_threshold",
"protected_terms", "protected_terms",
"non_empty_corrected_text", "non_empty_corrected_text",
"spoken_word_review", "editorial_review",
"meaning_reversal_review", "meaning_reversal_review",
} }
if strings.Join(got, ",") != strings.Join(want, ",") { if strings.Join(got, ",") != strings.Join(want, ",") {

View File

@@ -32,7 +32,7 @@ var builtInChains = map[string][]string{
KeyConfidenceThreshold, KeyConfidenceThreshold,
KeyProtectedTerms, KeyProtectedTerms,
KeyNonEmptyCorrectedText, KeyNonEmptyCorrectedText,
KeySpokenWordReview, KeyEditorialReview,
KeyMeaningReversalReview, KeyMeaningReversalReview,
}, },
"grammar": { "grammar": {
@@ -41,7 +41,7 @@ var builtInChains = map[string][]string{
KeyConfidenceThreshold, KeyConfidenceThreshold,
KeyProtectedTerms, KeyProtectedTerms,
KeyNonEmptyCorrectedText, KeyNonEmptyCorrectedText,
KeyGrammarReview, KeyEditorialReview,
KeyMeaningReversalReview, KeyMeaningReversalReview,
}, },
} }

View File

@@ -1,17 +0,0 @@
package grammar_review
import (
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
frameworkvalidators "gitea.maximumdirect.net/eric/audita/internal/framework/validators"
validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata"
)
const Key = "grammar_review"
func New() (contracts.Validator, error) {
v, err := frameworkvalidators.NewLLMBackedValidator(Key, frameworkvalidators.LLMValidatorTypeGrammarReview, "")
if err != nil {
return nil, err
}
return validatormetadata.Wrap(v, validatormetadata.ExecutionClassLLMBacked), nil
}

View File

@@ -7,14 +7,12 @@ import (
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts" "gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
"gitea.maximumdirect.net/eric/audita/internal/validators/confidence_threshold" "gitea.maximumdirect.net/eric/audita/internal/validators/confidence_threshold"
"gitea.maximumdirect.net/eric/audita/internal/validators/editorial_review" "gitea.maximumdirect.net/eric/audita/internal/validators/editorial_review"
"gitea.maximumdirect.net/eric/audita/internal/validators/grammar_review"
"gitea.maximumdirect.net/eric/audita/internal/validators/meaning_reversal_review" "gitea.maximumdirect.net/eric/audita/internal/validators/meaning_reversal_review"
"gitea.maximumdirect.net/eric/audita/internal/validators/no_effect" "gitea.maximumdirect.net/eric/audita/internal/validators/no_effect"
"gitea.maximumdirect.net/eric/audita/internal/validators/non_empty_corrected_text" "gitea.maximumdirect.net/eric/audita/internal/validators/non_empty_corrected_text"
"gitea.maximumdirect.net/eric/audita/internal/validators/original_text_presence" "gitea.maximumdirect.net/eric/audita/internal/validators/original_text_presence"
"gitea.maximumdirect.net/eric/audita/internal/validators/protected_terms" "gitea.maximumdirect.net/eric/audita/internal/validators/protected_terms"
"gitea.maximumdirect.net/eric/audita/internal/validators/spoken_form_plausibility" "gitea.maximumdirect.net/eric/audita/internal/validators/spoken_form_plausibility"
"gitea.maximumdirect.net/eric/audita/internal/validators/spoken_word_review"
) )
const ( const (
@@ -27,8 +25,6 @@ const (
KeySpokenFormPlausibility = "spoken_form_plausibility" KeySpokenFormPlausibility = "spoken_form_plausibility"
KeyMeaningReversalReview = "meaning_reversal_review" KeyMeaningReversalReview = "meaning_reversal_review"
KeyEditorialReview = "editorial_review" KeyEditorialReview = "editorial_review"
KeyGrammarReview = "grammar_review"
KeySpokenWordReview = "spoken_word_review"
) )
type BuiltInValidatorDefinition struct { type BuiltInValidatorDefinition struct {
@@ -51,8 +47,6 @@ func NewBuiltInRegistry() *Registry {
{Key: KeySpokenFormPlausibility, LLMBacked: true, Build: spoken_form_plausibility.New}, {Key: KeySpokenFormPlausibility, LLMBacked: true, Build: spoken_form_plausibility.New},
{Key: KeyMeaningReversalReview, LLMBacked: true, Build: meaning_reversal_review.New}, {Key: KeyMeaningReversalReview, LLMBacked: true, Build: meaning_reversal_review.New},
{Key: KeyEditorialReview, LLMBacked: true, Build: editorial_review.New}, {Key: KeyEditorialReview, LLMBacked: true, Build: editorial_review.New},
{Key: KeyGrammarReview, LLMBacked: true, Build: grammar_review.New},
{Key: KeySpokenWordReview, LLMBacked: true, Build: spoken_word_review.New},
} }
m := make(map[string]BuiltInValidatorDefinition, len(defs)) m := make(map[string]BuiltInValidatorDefinition, len(defs))

View File

@@ -9,7 +9,6 @@ import (
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals" "gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
"gitea.maximumdirect.net/eric/audita/internal/validators/confidence_threshold" "gitea.maximumdirect.net/eric/audita/internal/validators/confidence_threshold"
"gitea.maximumdirect.net/eric/audita/internal/validators/editorial_review" "gitea.maximumdirect.net/eric/audita/internal/validators/editorial_review"
"gitea.maximumdirect.net/eric/audita/internal/validators/grammar_review"
"gitea.maximumdirect.net/eric/audita/internal/validators/meaning_reversal_review" "gitea.maximumdirect.net/eric/audita/internal/validators/meaning_reversal_review"
validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata" validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata"
"gitea.maximumdirect.net/eric/audita/internal/validators/no_effect" "gitea.maximumdirect.net/eric/audita/internal/validators/no_effect"
@@ -17,7 +16,6 @@ import (
"gitea.maximumdirect.net/eric/audita/internal/validators/original_text_presence" "gitea.maximumdirect.net/eric/audita/internal/validators/original_text_presence"
"gitea.maximumdirect.net/eric/audita/internal/validators/protected_terms" "gitea.maximumdirect.net/eric/audita/internal/validators/protected_terms"
"gitea.maximumdirect.net/eric/audita/internal/validators/spoken_form_plausibility" "gitea.maximumdirect.net/eric/audita/internal/validators/spoken_form_plausibility"
"gitea.maximumdirect.net/eric/audita/internal/validators/spoken_word_review"
) )
func TestBuiltInRegistryRegistersAllKeys(t *testing.T) { func TestBuiltInRegistryRegistersAllKeys(t *testing.T) {
@@ -31,8 +29,6 @@ func TestBuiltInRegistryRegistersAllKeys(t *testing.T) {
KeySpokenFormPlausibility, KeySpokenFormPlausibility,
KeyMeaningReversalReview, KeyMeaningReversalReview,
KeyEditorialReview, KeyEditorialReview,
KeyGrammarReview,
KeySpokenWordReview,
} { } {
def, ok := r.Lookup(key) def, ok := r.Lookup(key)
if !ok { if !ok {
@@ -64,8 +60,6 @@ func TestBuiltInValidatorPackagesConstruct(t *testing.T) {
{name: "spoken_form_plausibility", key: KeySpokenFormPlausibility, build: spoken_form_plausibility.New, wantClass: validatormetadata.ExecutionClassLLMBacked}, {name: "spoken_form_plausibility", key: KeySpokenFormPlausibility, build: spoken_form_plausibility.New, wantClass: validatormetadata.ExecutionClassLLMBacked},
{name: "meaning_reversal_review", key: KeyMeaningReversalReview, build: meaning_reversal_review.New, wantClass: validatormetadata.ExecutionClassLLMBacked}, {name: "meaning_reversal_review", key: KeyMeaningReversalReview, build: meaning_reversal_review.New, wantClass: validatormetadata.ExecutionClassLLMBacked},
{name: "editorial_review", key: KeyEditorialReview, build: editorial_review.New, wantClass: validatormetadata.ExecutionClassLLMBacked}, {name: "editorial_review", key: KeyEditorialReview, build: editorial_review.New, wantClass: validatormetadata.ExecutionClassLLMBacked},
{name: "grammar_review", key: KeyGrammarReview, build: grammar_review.New, wantClass: validatormetadata.ExecutionClassLLMBacked},
{name: "spoken_word_review", key: KeySpokenWordReview, build: spoken_word_review.New, wantClass: validatormetadata.ExecutionClassLLMBacked},
} }
for _, tc := range cases { for _, tc := range cases {
@@ -88,8 +82,6 @@ func TestRegistryBuildsClassifiedValidators(t *testing.T) {
KeySpokenFormPlausibility: true, KeySpokenFormPlausibility: true,
KeyMeaningReversalReview: true, KeyMeaningReversalReview: true,
KeyEditorialReview: true, KeyEditorialReview: true,
KeyGrammarReview: true,
KeySpokenWordReview: true,
} }
for _, key := range r.RegisteredKeys() { for _, key := range r.RegisteredKeys() {
v, err := r.MustBuild(key) v, err := r.MustBuild(key)

View File

@@ -1,17 +0,0 @@
package spoken_word_review
import (
"gitea.maximumdirect.net/eric/audita/internal/framework/contracts"
frameworkvalidators "gitea.maximumdirect.net/eric/audita/internal/framework/validators"
validatormetadata "gitea.maximumdirect.net/eric/audita/internal/validators/metadata"
)
const Key = "spoken_word_review"
func New() (contracts.Validator, error) {
v, err := frameworkvalidators.NewLLMBackedValidator(Key, frameworkvalidators.LLMValidatorTypeSpokenWordReview, "")
if err != nil {
return nil, err
}
return validatormetadata.Wrap(v, validatormetadata.ExecutionClassLLMBacked), nil
}