{"record":{"id":"0849ac5a73d6e350","repo":"larksuite/cli","slug":"input-relations-d-stage-q-is-invalid","errorCode":null,"errorMessage":"Input.Relations[%d].Stage %q is invalid","messagePattern":"Input\\.Relations\\[(.+?)\\]\\.Stage %q is invalid","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"shortcuts/common/typed_compile_contract.go","lineNumber":33,"sourceCode":"\tseen := make(map[string]struct{})\n\tfor i, definition := range definitions {\n\t\tminimum := 2\n\t\texact := 0\n\t\tswitch definition.Kind {\n\t\tcase typedRelationExactlyOne, typedRelationAtLeastOne, typedRelationCoOccur, typedRelationConflicts:\n\t\tcase typedRelationRequires:\n\t\t\texact = 2\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"Input.Relations[%d].Kind %q is invalid\", i, definition.Kind)\n\t\t}\n\t\tif exact > 0 && len(definition.Params) != exact || exact == 0 && len(definition.Params) < minimum {\n\t\t\treturn nil, fmt.Errorf(\"Input.Relations[%d] kind %s has invalid param count %d\", i, definition.Kind, len(definition.Params))\n\t\t}\n\t\tif definition.Presence != typedPresenceExplicit && definition.Presence != typedPresenceNonZero {\n\t\t\treturn nil, fmt.Errorf(\"Input.Relations[%d].Presence %q is invalid\", i, definition.Presence)\n\t\t}\n\t\tif definition.Stage != typedStageSourcePreRun && definition.Stage != typedStageAfterPrepare {\n\t\t\treturn nil, fmt.Errorf(\"Input.Relations[%d].Stage %q is invalid\", i, definition.Stage)\n\t\t}\n\t\tcompiled := compiledRelation{kind: definition.Kind, presence: definition.Presence, stage: definition.Stage}\n\t\tlocal := make(map[string]struct{})\n\t\tfor _, name := range definition.Params {\n\t\t\tfield, ok := fieldByName[name]\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"Input.Relations[%d] references unknown param --%s\", i, name)\n\t\t\t}\n\t\t\tif _, duplicate := local[name]; duplicate {\n\t\t\t\treturn nil, fmt.Errorf(\"Input.Relations[%d] repeats param --%s\", i, name)\n\t\t\t}\n\t\t\tlocal[name] = struct{}{}\n\t\t\tcompiled.fields = append(compiled.fields, field)\n\t\t}\n\t\tkeyBytes, _ := json.Marshal(definition)\n\t\tkey := string(keyBytes)\n\t\tif _, duplicate := seen[key]; duplicate {\n\t\t\treturn nil, fmt.Errorf(\"Input.Relations[%d] duplicates an earlier relation\", i)","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/shortcuts/common/typed_compile_contract.go#L15-L51","documentation":"compileRelations requires each relation's Stage to be typedStageSourcePreRun or typedStageAfterPrepare; anything else is rejected at compile time. Stage decides when the relation check runs (against raw CLI source flags or after the prepare phase), so an invalid stage would leave enforcement timing undefined.","triggerScenarios":"Setting Stage to an empty string (struct zero value) or an unknown string like \"pre-run\" in a typedRelation declaration.","commonSituations":"Omitting Stage when constructing relations literally; renaming or misremembering stage constants across versions.","solutions":["Set Stage to typedStageSourcePreRun or typedStageAfterPrepare explicitly","Choose source_pre_run for checks on raw flags, after_prepare for checks that depend on prepared state","Update any definitions copied from older code that used a different stage value"],"exampleFix":"// before\n{Kind: typedRelationAtLeastOne, Params: []string{\"a\",\"b\"}, Stage: \"\"}\n// after\n{Kind: typedRelationAtLeastOne, Params: []string{\"a\",\"b\"}, Stage: typedStageSourcePreRun}","handlingStrategy":"validation","validationCode":"func knownStage(s typedStage) bool {\n\treturn s == typedStageSourcePreRun || s == typedStageAfterPrepare\n}","typeGuard":"func isTypedStage(v any) bool {\n\ts, ok := v.(typedStage)\n\treturn ok && knownStage(s)\n}","tryCatchPattern":null,"preventionTips":["Always set Stage explicitly when building typedRelation literals","Use typedStageSourcePreRun for raw-flag checks and typedStageAfterPrepare for prepared-state checks","Add a compile test asserting Stage on every declared relation"],"tags":["go","validation","compile-time","relations"],"backgroundTag":"invalid-enum-value","analyzedSha":"7fd6ef3c07182257ce776cdc5a614e122d5bd4b3","analyzedAt":"2026-09-04T21:17:44.649Z","contentChangedAt":"2026-09-04T21:17:44.649Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}