[Schema Consistency] Schema Consistency Check — 2026-02-23 #17876
Closed
Replies: 2 comments
-
|
/plan |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
This discussion was automatically closed because it expired on 2026-02-24T10:14:58.986Z.
|
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
This report covers the seventeenth automated schema consistency run (day 54 → proven strategy). Strategy used: Network/Firewall/Engine Deep Dive + Runtime Typed Struct Audit (Strategy-12). Three parallel analysis agents examined network/firewall files, runtime typed structs, and safe-outputs/permissions schemas.
Summary
Critical Issues
1. Schema
network.firewallDescription Is Wrong — All 4 Engines Support FirewallFiles:
pkg/parser/schemas/main_workflow_schema.json:2225,pkg/workflow/copilot_engine.go:45,pkg/workflow/claude_engine.go:32,pkg/workflow/codex_engine.go:44,pkg/workflow/gemini_engine.go:28The schema
network.firewalldescription reads:In reality all four engines have
supportsFirewall: truein their engine definitions. This is a stale description that will mislead users of the Claude, Codex, and Gemini engines into thinking the firewall is unavailable to them.2. Firewall
log-level/log_levelKey Name Mismatch Across Two Parse PathsFiles:
pkg/workflow/engine.go:220,pkg/workflow/frontmatter_extraction_security.go:123Two separate code paths parse firewall configuration from user YAML using different key names for the same field:
engine.go:220— readsfirewallObj["log_level"](underscore)frontmatter_extraction_security.go:123— readsfirewallObj["log-level"](hyphen)A user who writes
network: firewall: { log-level: debug }gets the expected behavior via the security extraction path. A user who tries to set the log level in anengine.firewall:block must uselog_levelwith an underscore — an inconsistency not documented anywhere. Neither the schema nor docs mention this divergence.3.
cleanup_scriptField Parsed fromengine.firewallbut Absent from SchemaFiles:
pkg/workflow/engine.go:227,pkg/workflow/firewall.go:20,pkg/parser/schemas/main_workflow_schema.jsonengine.go:227silently readsfirewallObj["cleanup_script"]from the user's YAML and stores it inFirewallConfig.CleanupScript. This field is entirely absent from the schema (which hasadditionalProperties: falseon the engine config object properties) and from all documentation. It is a hidden/undiscoverable feature. TheFirewallConfigstruct comment notes the default is./scripts/ci/cleanup.sh, suggesting it has real production significance.4.
hasNetworkRestrictions()IgnoresBlockedDomain ListFiles:
pkg/workflow/engine_firewall_support.go:17-35A workflow specifying only
network: blocked: ["tracker.example.com"]with noallowed:list returnsfalsefrom this function, meaningcheckNetworkSupportskips firewall validation entirely. Attempts to block specific domains without an explicit allowlist will silently pass compilation without the firewall being engaged.5.
computeAllowedDomainsForSanitizationMissinggeminiCaseFiles:
pkg/workflow/domains.go:695-706Gemini falls into
default, which callsGetAllowedDomains()— this does not includeGeminiDefaultDomains. The functionGetGeminiAllowedDomainsWithToolsAndRuntimesatdomains.go:611exists and correctly merges Gemini defaults but is not called from this sanitization path. Gemini workflows therefore receive an incomplete domain allowlist during sanitization.6.
permissionsSchema Missingrepository-projectsandorganization-projectsScopesFiles:
pkg/workflow/permissions.go:39-42, 83-84, 105-106,pkg/parser/schemas/main_workflow_schema.jsonThe permissions schema uses
additionalProperties: falseand lists 16 scopes, but two scopes fully implemented in Go code are absent:repository-projects(PermissionRepositoryProj—permissions.go:40)organization-projects(PermissionOrganizationProj—permissions.go:42)Any workflow YAML that sets either of these scopes will fail schema validation even though the runtime handles them correctly. Additionally, the schema allows an
allkey (forall: readstyle permissions) that has no correspondingcase "all"inconvertStringToPermissionScopeatpermissions.go:28-47, so users settingpermissions: all: writeget a silent "Unknown permission scope key: all" log entry with no compilation error.Documentation Gaps
7.
docs/reference/network.mdUnderstates Engine CoverageFile:
docs/src/content/docs/reference/network.md:10,40,186The docs state:
Codex and Gemini both have
supportsFirewall: trueand dedicated default domain lists (CodexDefaultDomainsatdomains.go:40,GeminiDefaultDomainsatdomains.go:95). The network.md "Implementation" section (line 186) only documents the Copilot engine. Claude, Codex, and Gemini engine subsections are absent.8. Runtime Typed Struct
RuntimeConfigMissingaction-repoandaction-versionFiles:
pkg/workflow/frontmatter_types.go:16-19,pkg/workflow/runtime_overrides.go:41-42, schema runtimes section,docs/src/content/docs/reference/frontmatter.md:148-150RuntimeConfigstruct:Both
action-repoandaction-versionare documented, in the schema, and read from the raw map inruntime_overrides.go:41-42— but absent from the typed struct. If any code path routes throughRuntimesTypedinstead of the rawRuntimesmap, these fields would be silently dropped.9.
RuntimesConfigTyped Struct Missing 5 Supported RuntimesFiles:
pkg/workflow/frontmatter_types.go:16-29, 301-315,pkg/workflow/runtime_definitions.goRuntimesConfigonly models:node,python,go,uv,bun,deno(6 runtimes).knownRuntimesinruntime_definitions.godefines 11 runtimes: the same 6 plusdotnet,elixir,haskell,java,ruby. TheparseRuntimesConfigswitch statement atfrontmatter_types.go:301-315is also missing these 5 cases. All 11 are documented infrontmatter.md:156-165.10.
rustRuntime Silently Dropped for Serena Local ModeFiles:
pkg/workflow/runtime_detection.go(Serena language map),pkg/workflow/runtime_definitions.go,pkg/parser/schemas/main_workflow_schema.json:3318runtime_detection.gomaps Serena language"rust"→ runtime ID"rust"with the comment:// rust is not in knownRuntimes yet, but including for completeness. When a user configures Serena withrustin local mode,findRuntimeByID("rust")returnsniland logs "runtime 'rust' not found" — no setup step is generated, silently. The schema enum at line 3318 includes"rust"as a valid Serena language, so users following the schema believe this configuration is supported.Schema Improvements Needed
Medium Issues: Schema/Struct Serialization Gaps
11.
SafeOutputsConfigPlural YAML Tags vs Singular Schema KeysFiles:
pkg/workflow/compiler_types.go:476-522,pkg/parser/schemas/main_workflow_schema.jsonSeven struct fields use plural yaml tags that don't match the singular schema keys:
CreateIssuescreate-issuescreate-issueCreateDiscussionscreate-discussionscreate-discussionCloseDiscussionsclose-discussionsclose-discussionAddCommentsadd-commentsadd-commentCreatePullRequestscreate-pull-requestscreate-pull-requestCreatePullRequestReviewCommentscreate-pull-request-review-commentscreate-pull-request-review-commentUpdateIssuesupdate-issuesupdate-issueParsing is done via direct
outputMap["create-issue"]key lookups so user-facing behavior is correct today. However, ifSafeOutputsConfigis ever marshaled back to YAML (e.g., viatrial_command.go:516JSON marshal path), the plural yaml keys would failadditionalProperties: falseschema validation — a latent round-trip bug.12.
activation-commentsParsed from Top-Level but Stored in Messages Sub-StructFiles:
pkg/workflow/safe_outputs_config.go:419-428,pkg/workflow/compiler_types.go:540, schemaThe schema places
activation-commentsas a top-level property ofsafe-outputs.safe_outputs_config.go:423correctly reads it from the top-leveloutputMap. However,compiler_types.go:540puts the field insideSafeOutputMessagesConfigwith yaml tagactivation-comments. If the struct is marshaled to YAML, the field would appear undersafe-outputs.messages.activation-comments— a path that does not exist in the schema and would failadditionalProperties: falseonmessages.13.
SafeOutputsConfigMeta Fields Not Merged from Imported Workflows (Confirmed from Strategy-11)Files:
pkg/workflow/imports.go:655-720Still not fixed. Five meta fields are never merged from imported configs:
SafeOutputsConfig.Footer*boolAllowGitHubReferences[]stringGroupReportsboolMaxBotMentions*stringMentions*MentionsConfigConfirmed Unfixed from Previous Runs
These findings from previous strategy runs are confirmed still present:
hasSafeOutputType()missing 11 operations causing silent import conflict pass-throughimports.go:422switch statement unchangedtools.serena.languagesschemaadditionalProperties:falserestricts to 6 languages but runtime supports 32items.enumunchangedRecommendations
Fix
network.firewallschema description — remove "Only supported for Copilot engine"; all four engines support it (main_workflow_schema.json:2225).Fix firewall key name inconsistency — standardize
log_leveltolog-levelinengine.go:220to match the pattern used infrontmatter_extraction_security.go:123.Add
cleanup_scriptto schema — add it to the appropriate schema object (or move its parsing to the correct documented field if it is accidental).Fix
hasNetworkRestrictions()— add a check forlen(networkPermissions.Blocked) > 0to returntruewhen only a blocked list is specified (engine_firewall_support.go:17-35).Add
geminicase tocomputeAllowedDomainsForSanitization— callGetGeminiAllowedDomainsWithToolsAndRuntimesfor the"gemini"engine ID (domains.go:695).Add
repository-projectsandorganization-projectsto permissions schema — withadditionalProperties: falsethese valid scopes currently fail schema validation for users who set them.Update
network.mddocumentation — document Codex and Gemini engine support for network/firewall features; add engine-specific subsections.Add
action-repoandaction-versiontoRuntimeConfigstruct and add missing runtime IDs (dotnet,elixir,haskell,java,ruby) toRuntimesConfigandparseRuntimesConfigswitch (frontmatter_types.go).Add
rusttoknownRuntimesor document in the schema thatrustSerena language support does not generate a runtime setup step.Fix
hasSafeOutputType()missing 11 cases (carry-over from Strategy-11) — add all missing operation type keys toimports.go:422.Expand Serena language enum (carry-over from Strategy-11) — remove or expand the
additionalProperties: falseonserena.languagesto match the 32 languages supported bySerenaLanguageSupport.Strategy Performance
References:
Beta Was this translation helpful? Give feedback.
All reactions