Skip to content

Fix incomplete field merging in SafeOutputMessagesConfig imports#15453

Merged
pelikhan merged 5 commits intomainfrom
copilot/fix-footer-messages-import
Feb 13, 2026
Merged

Fix incomplete field merging in SafeOutputMessagesConfig imports#15453
pelikhan merged 5 commits intomainfrom
copilot/fix-footer-messages-import

Conversation

Copy link
Contributor

Copilot AI commented Feb 13, 2026

The mergeMessagesConfig function was only merging 7 of 10 fields from SafeOutputMessagesConfig, causing FooterWorkflowRecompile, FooterWorkflowRecompileComment, and AppendOnlyComments to be silently dropped when importing from shared workflows.

Changes

  • pkg/workflow/imports.go: Added missing fields to mergeMessagesConfig

    if result.FooterWorkflowRecompile == "" && imported.FooterWorkflowRecompile != "" {
        result.FooterWorkflowRecompile = imported.FooterWorkflowRecompile
    }
    if result.FooterWorkflowRecompileComment == "" && imported.FooterWorkflowRecompileComment != "" {
        result.FooterWorkflowRecompileComment = imported.FooterWorkflowRecompileComment
    }
    if !result.AppendOnlyComments && imported.AppendOnlyComments {
        result.AppendOnlyComments = imported.AppendOnlyComments
    }
  • pkg/workflow/safe_outputs_import_test.go: Added tests for complete field coverage and partial override scenarios

Example

.github/workflows/smoke-temporary-id.md now correctly imports footer messages:

safe-outputs:
  messages:
    footer: "> 🧪 *Temporary ID smoke test by [{workflow_name}]({run_url})*"

Previously, this footer was lost during import. Now it appears correctly in the compiled workflow.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI and others added 3 commits February 13, 2026 15:46
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Add FooterWorkflowRecompile, FooterWorkflowRecompileComment, and AppendOnlyComments
to the mergeMessagesConfig function to ensure all SafeOutputMessagesConfig fields
are properly merged when importing from shared workflows.

Fixes footer messages not being properly merged from frontmatter, specifically
affecting workflows like smoke-temporary-id.md where messages.footer was not
being included in the compiled workflow output.

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Apply Go formatting to test file after adding new test cases.

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix footer messages merging from front matter Fix incomplete field merging in SafeOutputMessagesConfig imports Feb 13, 2026
Copilot AI requested a review from pelikhan February 13, 2026 15:52
@pelikhan pelikhan marked this pull request as ready for review February 13, 2026 15:53
Copilot AI review requested due to automatic review settings February 13, 2026 15:53
@pelikhan pelikhan merged commit 27fd168 into main Feb 13, 2026
50 checks passed
@pelikhan pelikhan deleted the copilot/fix-footer-messages-import branch February 13, 2026 15:53
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR attempts to fix incomplete field merging in SafeOutputMessagesConfig by adding merge logic for three previously missing fields: FooterWorkflowRecompile, FooterWorkflowRecompileComment, and AppendOnlyComments. However, the fix is still incomplete as SafeOutputMessagesConfig actually has 13 fields total, not the 10 claimed in the PR description.

Changes:

  • Added merge logic for FooterWorkflowRecompile, FooterWorkflowRecompileComment, and AppendOnlyComments in mergeMessagesConfig
  • Added two comprehensive tests to verify field import and partial override behavior
  • Tests attempt to verify "all fields" but only cover 10 of 13 fields

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
pkg/workflow/imports.go Added merge logic for 3 previously missing fields (FooterWorkflowRecompile, FooterWorkflowRecompileComment, AppendOnlyComments), but still missing 3 more fields (DetectionFailure, AgentFailureIssue, AgentFailureComment)
pkg/workflow/safe_outputs_import_test.go Added two new tests claiming to test "ALL message fields", but only testing 10 of 13 fields from SafeOutputMessagesConfig
Comments suppressed due to low confidence (3)

pkg/workflow/safe_outputs_import_test.go:1825

  • The test assertions claim to verify "ALL message fields were imported correctly", but SafeOutputMessagesConfig has 13 fields (as defined in compiler_types.go:511-525). The test is missing assertions for:
  • DetectionFailure
  • AgentFailureIssue
  • AgentFailureComment

Add assertions for these three fields to ensure complete verification as claimed.

	// Verify message field merging: main overrides specific fields, shared provides others
	require.NotNil(t, workflowData.SafeOutputs.Messages, "Messages should not be nil")

	// Main overrides
	assert.Equal(t, "> Main footer (override)", workflowData.SafeOutputs.Messages.Footer, "Footer from main should take precedence")
	assert.Equal(t, "> Main recompile (override)", workflowData.SafeOutputs.Messages.FooterWorkflowRecompile, "FooterWorkflowRecompile from main should take precedence")
	assert.Equal(t, "Main success (override)", workflowData.SafeOutputs.Messages.RunSuccess, "RunSuccess from main should take precedence")

	// Shared values fill the gaps
	assert.True(t, workflowData.SafeOutputs.Messages.AppendOnlyComments, "AppendOnlyComments should come from shared")
	assert.Equal(t, "> Shared install", workflowData.SafeOutputs.Messages.FooterInstall, "FooterInstall should come from shared")
	assert.Equal(t, "> Shared recompile comment", workflowData.SafeOutputs.Messages.FooterWorkflowRecompileComment, "FooterWorkflowRecompileComment should come from shared")
	assert.Equal(t, "## Shared Title", workflowData.SafeOutputs.Messages.StagedTitle, "StagedTitle should come from shared")
	assert.Equal(t, "Shared description", workflowData.SafeOutputs.Messages.StagedDescription, "StagedDescription should come from shared")
	assert.Equal(t, "Shared started", workflowData.SafeOutputs.Messages.RunStarted, "RunStarted should come from shared")
	assert.Equal(t, "Shared failure", workflowData.SafeOutputs.Messages.RunFailure, "RunFailure should come from shared")
}

pkg/workflow/safe_outputs_import_test.go:1739

  • The test name and comments claim to test "ALL message fields", but SafeOutputMessagesConfig has 13 fields (as defined in compiler_types.go:511-525), not 10. The test is missing assertions for:
  • DetectionFailure
  • AgentFailureIssue
  • AgentFailureComment

Add test coverage for these three fields to ensure complete field coverage as the test name promises.

// TestSafeOutputsImportMessagesAllFields tests that all message fields can be imported correctly
func TestSafeOutputsImportMessagesAllFields(t *testing.T) {
	compiler := NewCompilerWithVersion("1.0.0")

	// Create a temporary directory for test files
	tmpDir := t.TempDir()
	workflowsDir := filepath.Join(tmpDir, ".github", "workflows")
	err := os.MkdirAll(workflowsDir, 0755)
	require.NoError(t, err, "Failed to create workflows directory")

	// Create a shared workflow with ALL message fields defined
	sharedWorkflow := `---
safe-outputs:
  messages:
    append-only-comments: true
    footer: "> Custom footer"
    footer-install: "> Install instructions"
    footer-workflow-recompile: "> Workflow recompile footer"
    footer-workflow-recompile-comment: "> Workflow recompile comment footer"
    staged-title: "## Staged Title"
    staged-description: "Staged description"
    run-started: "Run started"
    run-success: "Run success"
    run-failure: "Run failure"
---

# Shared Messages with All Fields
`

	sharedFile := filepath.Join(workflowsDir, "shared-all-messages.md")
	err = os.WriteFile(sharedFile, []byte(sharedWorkflow), 0644)
	require.NoError(t, err, "Failed to write shared file")

	// Create main workflow that imports all message fields
	mainWorkflow := `---
on: issues
permissions:
  contents: read
imports:
  - ./shared-all-messages.md
safe-outputs:
  create-issue:
    title-prefix: "[test] "
---

# Main Workflow Importing All Message Fields
`

	mainFile := filepath.Join(workflowsDir, "main.md")
	err = os.WriteFile(mainFile, []byte(mainWorkflow), 0644)
	require.NoError(t, err, "Failed to write main file")

	// Change to the workflows directory for relative path resolution
	oldDir, err := os.Getwd()
	require.NoError(t, err, "Failed to get current directory")
	err = os.Chdir(workflowsDir)
	require.NoError(t, err, "Failed to change directory")
	defer func() { _ = os.Chdir(oldDir) }()

	// Parse the main workflow
	workflowData, err := compiler.ParseWorkflowFile("main.md")
	require.NoError(t, err, "Failed to parse workflow")
	require.NotNil(t, workflowData.SafeOutputs, "SafeOutputs should not be nil")

	// Verify ALL message fields were imported correctly
	require.NotNil(t, workflowData.SafeOutputs.Messages, "Messages should be imported")
	assert.True(t, workflowData.SafeOutputs.Messages.AppendOnlyComments, "AppendOnlyComments should be imported")
	assert.Equal(t, "> Custom footer", workflowData.SafeOutputs.Messages.Footer, "Footer should be imported")
	assert.Equal(t, "> Install instructions", workflowData.SafeOutputs.Messages.FooterInstall, "FooterInstall should be imported")
	assert.Equal(t, "> Workflow recompile footer", workflowData.SafeOutputs.Messages.FooterWorkflowRecompile, "FooterWorkflowRecompile should be imported")
	assert.Equal(t, "> Workflow recompile comment footer", workflowData.SafeOutputs.Messages.FooterWorkflowRecompileComment, "FooterWorkflowRecompileComment should be imported")
	assert.Equal(t, "## Staged Title", workflowData.SafeOutputs.Messages.StagedTitle, "StagedTitle should be imported")
	assert.Equal(t, "Staged description", workflowData.SafeOutputs.Messages.StagedDescription, "StagedDescription should be imported")
	assert.Equal(t, "Run started", workflowData.SafeOutputs.Messages.RunStarted, "RunStarted should be imported")
	assert.Equal(t, "Run success", workflowData.SafeOutputs.Messages.RunSuccess, "RunSuccess should be imported")
	assert.Equal(t, "Run failure", workflowData.SafeOutputs.Messages.RunFailure, "RunFailure should be imported")
}

pkg/workflow/safe_outputs_import_test.go:1690

  • The shared workflow in this test claims to have "ALL message fields defined", but SafeOutputMessagesConfig has 13 fields (as defined in compiler_types.go:511-525). The test is missing:
  • detection-failure
  • agent-failure-issue
  • agent-failure-comment

Add these three fields to the shared workflow YAML to match the test's claim of testing all fields.

	sharedWorkflow := `---
safe-outputs:
  messages:
    append-only-comments: true
    footer: "> Custom footer"
    footer-install: "> Install instructions"
    footer-workflow-recompile: "> Workflow recompile footer"
    footer-workflow-recompile-comment: "> Workflow recompile comment footer"
    staged-title: "## Staged Title"
    staged-description: "Staged description"
    run-started: "Run started"
    run-success: "Run success"
    run-failure: "Run failure"
---

# Shared Messages with All Fields
`

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +1752 to +1768
sharedWorkflow := `---
safe-outputs:
messages:
append-only-comments: true
footer: "> Shared footer"
footer-install: "> Shared install"
footer-workflow-recompile: "> Shared recompile"
footer-workflow-recompile-comment: "> Shared recompile comment"
staged-title: "## Shared Title"
staged-description: "Shared description"
run-started: "Shared started"
run-success: "Shared success"
run-failure: "Shared failure"
---

# Shared Messages
`
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test name and comments claim to test "ALL message fields" with partial override, but SafeOutputMessagesConfig has 13 fields (as defined in compiler_types.go:511-525), not 10. The shared workflow is missing:

  • detection-failure
  • agent-failure-issue
  • agent-failure-comment

Add these three fields to ensure complete field coverage in the shared workflow configuration.

This issue also appears in the following locations of the same file:

  • line 1809
  • line 1663
  • line 1674

Copilot uses AI. Check for mistakes.
Comment on lines +676 to 679
if !result.AppendOnlyComments && imported.AppendOnlyComments {
result.AppendOnlyComments = imported.AppendOnlyComments
}
return result
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The mergeMessagesConfig function is still incomplete. SafeOutputMessagesConfig has 13 fields total (as defined in compiler_types.go:511-525), but this function only merges 10 of them. The following fields are still missing from the merge logic:

  • DetectionFailure (documented in frontmatter-full.md)
  • AgentFailureIssue
  • AgentFailureComment

These fields will be silently dropped when importing from shared workflows, which is the exact bug this PR is meant to fix. Add merge logic for these three remaining fields following the same pattern used for the other string fields.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants