{"record":{"id":"81fd76d2c46a5f5e","repo":"JuliusBrussee/caveman","slug":"s-s-s-capabilities-verified-at-is-in-the-futur","errorCode":null,"errorMessage":"%s %s/%s: capabilities_verified_at is in the future","messagePattern":"(.+?) (.+?)/(.+?): capabilities_verified_at is in the future","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"shared/platform/catalog/catalog.go","lineNumber":285,"sourceCode":"\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: unsupported currency %q\", label, entry.Provider, entry.Model, entry.Currency)\n\t\t}\n\t\tif !cost.ValidPrice(entry.Pricing) {\n\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: invalid pricing\", label, entry.Provider, entry.Model)\n\t\t}\n\t\tverified, err := time.Parse(time.RFC3339, entry.VerifiedAt)\n\t\tif err != nil || verified.IsZero() {\n\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: verified_at must be RFC3339\", label, entry.Provider, entry.Model)\n\t\t}\n\t\tif verified.After(time.Now().UTC().Add(24 * time.Hour)) {\n\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: verified_at is in the future\", label, entry.Provider, entry.Model)\n\t\t}\n\t\tif entry.CapabilitiesVerifiedAt != \"\" {\n\t\t\tcapVerified, err := time.Parse(time.RFC3339, entry.CapabilitiesVerifiedAt)\n\t\t\tif err != nil || capVerified.IsZero() {\n\t\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: capabilities_verified_at must be RFC3339\", label, entry.Provider, entry.Model)\n\t\t\t}\n\t\t\tif capVerified.After(time.Now().UTC().Add(24 * time.Hour)) {\n\t\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: capabilities_verified_at is in the future\", label, entry.Provider, entry.Model)\n\t\t\t}\n\t\t}\n\t\tif len(entry.Sources) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: at least one source is required\", label, entry.Provider, entry.Model)\n\t\t}\n\t\tfor _, rawURL := range entry.Sources {\n\t\t\tu, err := url.ParseRequestURI(rawURL)\n\t\t\tif err != nil || u.Scheme != \"https\" || u.Host == \"\" {\n\t\t\t\treturn nil, fmt.Errorf(\"%s %s/%s: invalid HTTPS source %q\", label, entry.Provider, entry.Model, rawURL)\n\t\t\t}\n\t\t}\n\t\tkey := entry.Provider + \"\\x00\" + entry.Model + \"\\x00\" + entry.Region\n\t\tif _, duplicate := seen[key]; duplicate {\n\t\t\treturn nil, fmt.Errorf(\"duplicate provider/model/region row %s/%s@%s\", entry.Provider, entry.Model, entry.Region)\n\t\t}\n\t\tseen[key] = struct{}{}\n\t}\n\treturn decoded, nil","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/shared/platform/catalog/catalog.go#L267-L303","documentation":"Thrown by the catalog YAML loader when the optional capabilities_verified_at timestamp is more than 24 hours in the future (UTC). Same staleness/lying guard as verified_at, applied to the capabilities check date.","triggerScenarios":"capabilities_verified_at set beyond now+24h — a typo'd year, or generated on a clock-skewed host.","commonSituations":"Copy-paste from a template row with a placeholder future date; regenerated catalog on a machine with a wrong system clock.","solutions":["Set the field to the real capabilities-verification date (past or within 24h).","Or delete the field if capabilities verification hasn't happened yet.","Fix the generating host's clock (NTP) so future-dated rows stop appearing."],"exampleFix":"# before\ncapabilities_verified_at: 2027-01-01T00:00:00Z\n\n# after\ncapabilities_verified_at: 2026-08-14T18:30:00Z","handlingStrategy":"validation","validationCode":"if entry.CapabilitiesVerifiedAt != \"\" {\n    t, _ := time.Parse(time.RFC3339, entry.CapabilitiesVerifiedAt)\n    if t.After(time.Now().UTC().Add(24 * time.Hour)) {\n        return fmt.Errorf(\"capabilities_verified_at is future-dated\")\n    }\n}","typeGuard":null,"tryCatchPattern":"Fail catalog load at startup; fix the timestamp or drop the field.","preventionTips":["Never paste placeholder future dates from templates.","Generate both timestamp fields at verification time from the real clock.","Fix host clock skew on catalog-generating machines."],"tags":["catalog","yaml","timestamp","validation"],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}