diff --git a/.github/workflows/impeccable-skills-reviewer.lock.yml b/.github/workflows/impeccable-skills-reviewer.lock.yml index 45f17efb4b5..5b710de63b3 100644 --- a/.github/workflows/impeccable-skills-reviewer.lock.yml +++ b/.github/workflows/impeccable-skills-reviewer.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"8b871cf8502c1da80f2d7748e931ab72901dd24f4e1156d23a8d26c6039972ca","body_hash":"f7d3d44330eede82de9e3a60fedb1854ba8f2d3960b2349b292efbca5ae9b824","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.6","engine_versions":{"copilot":"1.0.65"}} -# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","version":"v7.0.0"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.16"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.32","digest":"sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.32@sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.5.0","digest":"sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4","pinned_image":"ghcr.io/github/github-mcp-server:v1.5.0@sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4"}]} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"37f04fdb5e0b6dced2ca3cf1ae8ba126538d05c93bbf42d6dbaf9312e1db378b","body_hash":"c82afe5bedbba7f166dbb4bfe8a5174a34ba4a55fd8e6b4e943d252180e5a576","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.6","engine_versions":{"copilot":"1.0.65"}} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","version":"v7.0.0"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.16"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.32","digest":"sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.32@sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.5.0","digest":"sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4","pinned_image":"ghcr.io/github/github-mcp-server:v1.5.0@sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4"}],"skills":["${{ vars.IMPECCABLE_SKILLS_REF || 'needex/skills' }}"]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # # ___ _ _ diff --git a/.github/workflows/mattpocock-skills-reviewer.lock.yml b/.github/workflows/mattpocock-skills-reviewer.lock.yml index d4de9c79a89..96f3c3f09e6 100644 --- a/.github/workflows/mattpocock-skills-reviewer.lock.yml +++ b/.github/workflows/mattpocock-skills-reviewer.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"26e8a754482b7347113adc6d77b27f62e3dee49e84d972a2e35662fd319720b5","body_hash":"62ce0bd5c9851424f73f018934c48ae0ca6493b0bc7415fdc5564e808707829a","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.6","engine_versions":{"copilot":"1.0.67"}} -# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","version":"v7.0.0"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.16"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.32","digest":"sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.32@sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.5.0","digest":"sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4","pinned_image":"ghcr.io/github/github-mcp-server:v1.5.0@sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4"}]} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"26e8a754482b7347113adc6d77b27f62e3dee49e84d972a2e35662fd319720b5","body_hash":"62ce0bd5c9851424f73f018934c48ae0ca6493b0bc7415fdc5564e808707829a","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.6","engine_versions":{"copilot":"1.0.65"}} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","version":"v7.0.0"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.16"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.16"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.32","digest":"sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.32@sha256:63e46b56dfd70895a701b6fc6dd0189e11e2d875f327f1781e81b31848735477"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.5.0","digest":"sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4","pinned_image":"ghcr.io/github/github-mcp-server:v1.5.0@sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4"}],"skills":["mattpocock/skills/diagnosing-bugs@801dca688564c529fa84f247f64472520d9ebe28","mattpocock/skills/tdd@801dca688564c529fa84f247f64472520d9ebe28","mattpocock/skills/improve-codebase-architecture@801dca688564c529fa84f247f64472520d9ebe28","mattpocock/skills/grill-with-docs@801dca688564c529fa84f247f64472520d9ebe28","mattpocock/skills/to-prd@801dca688564c529fa84f247f64472520d9ebe28","mattpocock/skills/codebase-design@801dca688564c529fa84f247f64472520d9ebe28","mattpocock/skills/domain-modeling@801dca688564c529fa84f247f64472520d9ebe28"]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # # ___ _ _ diff --git a/actions/setup/js/add_reaction_and_edit_comment.cjs b/actions/setup/js/add_reaction_and_edit_comment.cjs index eebbf137156..847b67b107e 100644 --- a/actions/setup/js/add_reaction_and_edit_comment.cjs +++ b/actions/setup/js/add_reaction_and_edit_comment.cjs @@ -280,9 +280,7 @@ async function addCommentWithWorkflowLink(endpoint, runUrl, eventName, invocatio const { id: discussionId } = await getDiscussionId(eventRepo.owner, eventRepo.repo, discussionNumber); // For discussion_comment events, thread the reply under the triggering comment. // GitHub Discussions only supports two nesting levels, so resolve the top-level parent node ID. - const replyToId = eventName === "discussion_comment" - ? await resolveTopLevelDiscussionCommentId(github, eventPayload?.comment?.node_id) - : null; + const replyToId = eventName === "discussion_comment" ? await resolveTopLevelDiscussionCommentId(github, eventPayload?.comment?.node_id) : null; const mutation = replyToId ? `mutation($dId: ID!, $body: String!, $replyToId: ID!) { addDiscussionComment(input: { discussionId: $dId, body: $body, replyToId: $replyToId }) { diff --git a/pkg/workflow/compiler_yaml.go b/pkg/workflow/compiler_yaml.go index 23f983cf9eb..28a94b89c30 100644 --- a/pkg/workflow/compiler_yaml.go +++ b/pkg/workflow/compiler_yaml.go @@ -124,7 +124,7 @@ func (c *Compiler) generateWorkflowHeader(yaml *strings.Builder, data *WorkflowD // Embed the gh-aw-manifest immediately after gh-aw-metadata for easy machine parsing. // The manifest records all secrets, external actions, and container images detected at // compile time so that subsequent compilations can perform safe update enforcement. - manifest := NewGHAWManifest(secrets, actions, data.ActionResolutionFailures, data.DockerImagePins, data.Redirect) + manifest := NewGHAWManifest(secrets, actions, data.ActionResolutionFailures, data.DockerImagePins, data.Redirect, data.Skills) if manifestJSON, err := manifest.ToJSON(); err == nil { fmt.Fprintf(yaml, "# gh-aw-manifest: %s\n", manifestJSON) } else { diff --git a/pkg/workflow/lock_schema_test.go b/pkg/workflow/lock_schema_test.go index da7b3811ff6..863c36eac25 100644 --- a/pkg/workflow/lock_schema_test.go +++ b/pkg/workflow/lock_schema_test.go @@ -309,7 +309,7 @@ func TestGenerateLockMetadataStrict(t *testing.T) { metadata := GenerateLockMetadata(LockHashInfo{FrontmatterHash: hash}, stopTime, true, AgentMetadataInfo{}) assert.NotNil(t, metadata, "Metadata should be created") - assert.Equal(t, LockSchemaV4, metadata.SchemaVersion, "Should use v4 schema version") + assert.Equal(t, LockSchemaV4, metadata.SchemaVersion, "Should use v5 schema version") assert.Equal(t, hash, metadata.FrontmatterHash, "Should preserve frontmatter hash") assert.Equal(t, stopTime, metadata.StopTime, "Should preserve stop time") assert.True(t, metadata.Strict, "Strict build should have Strict=true") @@ -638,7 +638,7 @@ func TestGenerateLockMetadataWithAgentInfo(t *testing.T) { metadata := GenerateLockMetadata(LockHashInfo{FrontmatterHash: hash}, "", false, agentInfo) assert.NotNil(t, metadata, "Metadata should be created") - assert.Equal(t, LockSchemaV4, metadata.SchemaVersion, "Should use v4 schema version") + assert.Equal(t, LockSchemaV4, metadata.SchemaVersion, "Should use v5 schema version") assert.Equal(t, "copilot", metadata.AgentID, "Should preserve agent ID") assert.Equal(t, "gpt-5", metadata.AgentModel, "Should preserve agent model") assert.Equal(t, "copilot", metadata.DetectionAgentID, "Should preserve detection agent ID") diff --git a/pkg/workflow/safe_update_manifest.go b/pkg/workflow/safe_update_manifest.go index 5758c1ec80c..1da4a8770e0 100644 --- a/pkg/workflow/safe_update_manifest.go +++ b/pkg/workflow/safe_update_manifest.go @@ -56,10 +56,11 @@ type GHAWManifest struct { ResolutionFailures []GHAWManifestResolutionFailure `json:"resolution_failures,omitempty"` // unresolved action-ref pinning failures Containers []GHAWManifestContainer `json:"containers,omitempty"` // container images used, with digest when available Redirect string `json:"redirect,omitempty"` // frontmatter redirect target for moved workflows + Skills []string `json:"skills,omitempty"` // skill dependencies declared in frontmatter } // NewGHAWManifest builds a GHAWManifest from the raw secret names, action reference -// strings, and container image references produced at compile time. +// strings, container image references, and skill dependencies produced at compile time. // // secretNames entries may include or omit the "secrets." prefix; the prefix is always // stripped before storage so the manifest contains plain names (e.g. "GITHUB_TOKEN"). @@ -68,7 +69,8 @@ type GHAWManifest struct { // "actions/checkout@abc1234 # v4" // // containers is the list of container image entries with full digest info (when available). -func NewGHAWManifest(secretNames []string, actionRefs []string, failures []GHAWManifestResolutionFailure, containers []GHAWManifestContainer, redirect string) *GHAWManifest { +// skills is the list of skill dependency references declared in frontmatter. +func NewGHAWManifest(secretNames []string, actionRefs []string, failures []GHAWManifestResolutionFailure, containers []GHAWManifestContainer, redirect string, skills []string) *GHAWManifest { safeUpdateManifestLog.Printf("Building gh-aw-manifest: raw_secrets=%d, raw_actions=%d, containers=%d", len(secretNames), len(actionRefs), len(containers)) // Normalize secret names to full "secrets.NAME" form and deduplicate. @@ -120,6 +122,7 @@ func NewGHAWManifest(secretNames []string, actionRefs []string, failures []GHAWM ResolutionFailures: resolutionFailures, Containers: sortedContainers, Redirect: strings.TrimSpace(redirect), + Skills: skills, } } diff --git a/pkg/workflow/safe_update_manifest_test.go b/pkg/workflow/safe_update_manifest_test.go index ae81cd431a7..e82b0474d60 100644 --- a/pkg/workflow/safe_update_manifest_test.go +++ b/pkg/workflow/safe_update_manifest_test.go @@ -138,7 +138,7 @@ func TestNewGHAWManifest(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := NewGHAWManifest(tt.secretNames, tt.actionRefs, tt.resolutionFailures, tt.containers, tt.redirect) + m := NewGHAWManifest(tt.secretNames, tt.actionRefs, tt.resolutionFailures, tt.containers, tt.redirect, nil) require.NotNil(t, m, "manifest should not be nil") assert.Equal(t, tt.wantVersion, m.Version, "manifest version") if tt.wantSecrets != nil { @@ -177,7 +177,7 @@ func TestNewGHAWManifestContainerDigest(t *testing.T) { Image: "alpine:3.14", // no digest }, } - m := NewGHAWManifest(nil, nil, nil, containers, "") + m := NewGHAWManifest(nil, nil, nil, containers, "", nil) require.Len(t, m.Containers, 2, "should have two containers") // Sorted: alpine before node @@ -388,3 +388,36 @@ func TestParseActionRefs(t *testing.T) { }) } } + +func TestNewGHAWManifestWithSkills(t *testing.T) { + skills := []string{ + "githubnext/skills@1f181b37d3fe5862ab590648f25a292e345b5de6", + "githubnext/skills/review/security@1f181b37d3fe5862ab590648f25a292e345b5de6", + } + m := NewGHAWManifest(nil, nil, nil, nil, "", skills) + require.NotNil(t, m, "manifest should not be nil") + assert.Equal(t, skills, m.Skills, "skills should be preserved") + + jsonStr, err := m.ToJSON() + require.NoError(t, err) + assert.Contains(t, jsonStr, `"skills":["githubnext/skills@1f181b37d3fe5862ab590648f25a292e345b5de6","githubnext/skills/review/security@1f181b37d3fe5862ab590648f25a292e345b5de6"]`) +} + +func TestNewGHAWManifestSkillsOmittedWhenEmpty(t *testing.T) { + m := NewGHAWManifest(nil, nil, nil, nil, "", nil) + require.NotNil(t, m, "manifest should not be nil") + assert.Empty(t, m.Skills, "skills should be empty") + + jsonStr, err := m.ToJSON() + require.NoError(t, err) + assert.NotContains(t, jsonStr, `"skills"`, "empty skills should be omitted") +} + +func TestExtractGHAWManifestWithSkills(t *testing.T) { + content := `# gh-aw-manifest: {"version":1,"secrets":[],"actions":[],"skills":["githubnext/skills@1f181b37d3fe5862ab590648f25a292e345b5de6"]}` + m, err := ExtractGHAWManifestFromLockFile(content) + require.NoError(t, err) + require.NotNil(t, m) + require.Len(t, m.Skills, 1, "should extract one skill") + assert.Equal(t, "githubnext/skills@1f181b37d3fe5862ab590648f25a292e345b5de6", m.Skills[0]) +} diff --git a/pkg/workflow/stale_check_test.go b/pkg/workflow/stale_check_test.go index 4ca49ccdcf4..544f2119e20 100644 --- a/pkg/workflow/stale_check_test.go +++ b/pkg/workflow/stale_check_test.go @@ -211,7 +211,7 @@ This is the body of the workflow. It contains the agent instructions. require.NoError(t, err, "Lock metadata should be parseable") require.NotNil(t, metadata, "Lock metadata should exist") - assert.Equal(t, LockSchemaV4, metadata.SchemaVersion, "Should use v4 schema with body hash") + assert.Equal(t, LockSchemaV4, metadata.SchemaVersion, "Should use v5 schema with body hash") assert.NotEmpty(t, metadata.BodyHash, "Body hash should be stored in lock metadata") assert.Len(t, metadata.BodyHash, 64, "Body hash should be a 64-character hex string")