Skip to content

Add body hash to lock metadata; support on.stale-check: full#34941

Merged
pelikhan merged 13 commits into
mainfrom
copilot/lock-metadata-include-body
May 26, 2026
Merged

Add body hash to lock metadata; support on.stale-check: full#34941
pelikhan merged 13 commits into
mainfrom
copilot/lock-metadata-include-body

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 26, 2026

Lock files only hashed the workflow frontmatter, so prompt-body edits could silently drift from the compiled lock without any detection signal. This adds a body_hash field (covering the markdown body + all imported files) to lock metadata and introduces on.stale-check: full to enable runtime body hash verification.

Lock metadata (schema v4)

Every compiled .lock.yml now includes a body_hash alongside the existing frontmatter_hash:

# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"<hex>","body_hash":"<hex>",...}

The body hash is an opaque SHA-256 string computed by concatenating the normalized body text and all transitively imported body texts (sorted, joined with \n---\n) and hashing the result directly — no JSON wrapper.

Old lock files without body_hash remain valid (field is omitempty).

on.stale-check: full

Opt into body hash verification at runtime by setting stale-check: full in the on: section of the workflow frontmatter:

---
engine: copilot
on:
  stale-check: full
---

This injects GH_AW_STALE_CHECK_FULL=true into the "Check workflow lock file" activation step. When set, the runtime JS checker verifies both hashes after the frontmatter check passes — on both the GitHub API path and the local filesystem fallback path.

Key changes

Go (compile-time)

  • pkg/parser/frontmatter_hash.gocollectImportedBodies, ComputeBodyHashFromParsedContent, ComputeBodyHashFromFile
  • pkg/workflow/lock_schema.goLockSchemaV4, BodyHash field on LockMetadata, LockHashInfo struct replaces positional hash params in GenerateLockMetadata
  • pkg/workflow/compiler_yaml.go — computes body hash at compile time; computeWorkflowHash closure deduplicates the parsed-content/file-fallback pattern used by both hash computations; body hash failure is non-fatal
  • pkg/workflow/workflow_builder.go / compiler_activation_job_builder.go / compiler_types.goon.stale-check: fullStaleCheckFull flag → GH_AW_STALE_CHECK_FULL=true env injection
  • pkg/parser/schemas/main_workflow_schema.jsonstale-check (under on) now accepts boolean | "full"

JS (runtime)

  • frontmatter_hash_pure.cjscollectImportedBodies, computeBodyHash, extractBodyHashFromLockFile
  • check_workflow_timestamp_api.cjscompareBodyHashes helper (destructured { fileReader }, gracefully skips on pre-v4 lock files); called on both API and local filesystem paths when full mode is active

Behaviour change for body edits

The compiler's skip-write optimization (preserve lock file timestamp when content is unchanged) now correctly triggers on body-only edits — a body change updates body_hash in the metadata, producing different lock file content and causing a rewrite. TestCompilerWritesWhenBodyContentChanged covers this.

Copilot AI and others added 4 commits May 26, 2026 14:33
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
…lper

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
…xtBased, compareBodyHashes

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
…rkflowHash helper, destructured options

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Update lock metadata to cover .md body Add body hash to lock metadata; support stale-check: full May 26, 2026
Copilot AI requested a review from pelikhan May 26, 2026 14:43
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot body_hash should be a single hash string opaque

…apper)

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 26, 2026

@copilot body_hash should be a single hash string opaque

Done in the latest commit. body_hash is now computed by concatenating the normalized body text and all imported body texts (sorted, joined with \n---\n) and hashing the result directly with SHA-256 — no canonical JSON wrapper. The change is applied consistently in both the Go (ComputeBodyHashFromParsedContent) and JS (computeBodyHash) implementations, and all lock files have been regenerated with the updated hashes.

@pelikhan pelikhan marked this pull request as ready for review May 26, 2026 15:31
Copilot AI review requested due to automatic review settings May 26, 2026 15:31
Copy link
Copy Markdown
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 upgrades workflow lock metadata to schema v4 by adding a body_hash (in addition to frontmatter_hash) so prompt-body and imported-file changes are detectable, and introduces on.stale-check: full to enable runtime verification of both hashes via an activation-step environment flag.

Changes:

  • Add body_hash support to lock metadata (schema v4) and update lock schema generation inputs to use a struct (LockHashInfo).
  • Add on.stale-check: full support in compilation flow and inject GH_AW_STALE_CHECK_FULL=true into the activation job when enabled.
  • Update the main workflow JSON schema and regenerate existing .lock.yml files to include v4 metadata.
Show a summary per file
File Description
pkg/workflow/workflow_builder.go Parses on.stale-check: full into WorkflowData.StaleCheckFull.
pkg/workflow/lock_schema.go Introduces lock schema v4 and body_hash in LockMetadata; refactors lock metadata generation to accept LockHashInfo.
pkg/workflow/compiler_yaml_helpers_test.go Updates tests for the expanded generateWorkflowHeader signature (now includes bodyHash).
pkg/workflow/compiler_types.go Adds WorkflowData.StaleCheckFull flag used during activation-job generation.
pkg/workflow/compiler_activation_job_builder.go Injects GH_AW_STALE_CHECK_FULL=true when full stale-check mode is enabled.
pkg/parser/schemas/main_workflow_schema.json Expands on.stale-check schema to accept `boolean
.github/workflows/*.lock.yml Regenerates workflow lock files to schema v4 and embeds body_hash in the gh-aw-metadata header.

Copilot's findings

Tip

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

  • Files reviewed: 251/251 changed files
  • Comments generated: 1

Comment on lines +137 to +145
// Populate stale-check flag: disabled when on.stale-check: false is set in frontmatter;
// full mode when on.stale-check: full is set.
if onVal, ok := result.Frontmatter["on"]; ok {
if onMap, ok := onVal.(map[string]any); ok {
if staleCheck, ok := onMap["stale-check"]; ok {
if boolVal, ok := staleCheck.(bool); ok && !boolVal {
workflowData.StaleCheckDisabled = true
} else if strVal, ok := staleCheck.(string); ok && strVal == "full" {
workflowData.StaleCheckFull = true
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

🧪 Test Quality Sentinel completed test quality analysis.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

Design Decision Gate 🏗️ completed the design decision gate check.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

⚠️ Security scanning failed for Matt Pocock Skills Reviewer. Review the logs for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

⚠️ Security scanning failed for PR Code Quality Reviewer. Review the logs for details.

@github-actions
Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (398 new lines across pkg/ and .github/workflows/shared/mcp/) but does not have a linked Architecture Decision Record (ADR).

📄 Draft ADR committed: docs/adr/34941-body-hash-in-lock-metadata-and-stale-check-full.md — review and complete it before merging.

🔒 This PR cannot merge until an ADR is linked in the PR body.

📋 What to do next
  1. Review the draft ADR committed to your branch — it was generated from the PR diff and description
  2. Complete the missing sections — confirm the Context framing, refine the Decision rationale, and adjust the Alternatives if you weighed others (Deciders is currently Unknown)
  3. Sanity-check the normative spec (Part 2) — the MUST/SHOULD requirements were inferred from the PR description; tighten or relax them so they match the actual contract
  4. Commit the finalized ADR to docs/adr/ on this branch
  5. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-34941: Body Hash in Lock Metadata and stale-check: full Runtime Verification

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

❓ Why ADRs Matter

"AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say 'I'll deal with this later.' Deferring decisions corroded my ability to think clearly."

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.

📋 Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 34941-body-hash-in-lock-metadata-and-stale-check-full.md for PR #34941).

References: §26458153802

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · opus47 5.4M ·

@github-actions
Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 87/100 — Excellent

Analyzed 21 new/modified tests: 21 design tests (behavioral contracts), 0 implementation tests, 0 guideline violations.

📊 Metrics & Test Classification (21 tests analyzed)
Metric Value
New/modified tests analyzed 21
✅ Design tests (behavioral contracts) 21 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 18 (86%)
Duplicate test clusters 0
Test inflation detected No
🚨 Coding-guideline violations 0

Test Classification Details

Test File Classification Issues Detected
should pass when both frontmatter and body hashes match check_workflow_timestamp_api.test.cjs ✅ Design
should log that it is checking both frontmatter and body hashes check_workflow_timestamp_api.test.cjs ✅ Design Asserts internal log message; acceptable since log messages are the observable output of this action step
should fail when frontmatter matches but body hash differs check_workflow_timestamp_api.test.cjs ✅ Design Error path covered
should skip body hash check when lock file has no body hash (backward compat) check_workflow_timestamp_api.test.cjs ✅ Design Backward-compat edge case covered
should not perform body hash check when GH_AW_STALE_CHECK_FULL is not set check_workflow_timestamp_api.test.cjs ✅ Design Feature-flag off edge case
should check body hash via local filesystem fallback when API is unavailable check_workflow_timestamp_api.test.cjs ✅ Design Error path (API unavailable) + fallback behavior
should fail body hash check via local filesystem fallback when body has changed check_workflow_timestamp_api.test.cjs ✅ Design Error path via filesystem fallback
extractBodyHashFromLockFile — return empty when no body hash frontmatter_hash_pure.test.cjs ✅ Design Edge case: absent field
extractBodyHashFromLockFile — extract from JSON metadata format frontmatter_hash_pure.test.cjs ✅ Design Happy path
extractBodyHashFromLockFile — return empty when no gh-aw-metadata comment frontmatter_hash_pure.test.cjs ✅ Design Edge case: old format
extractBodyHashFromLockFile — return empty when metadata JSON is invalid frontmatter_hash_pure.test.cjs ✅ Design Error path: malformed JSON
computeBodyHash — compute a 64-char hex SHA-256 hash frontmatter_hash_pure.test.cjs ✅ Design Output format invariant
computeBodyHash — same hash for identical body content frontmatter_hash_pure.test.cjs ✅ Design Determinism invariant
computeBodyHash — different hashes when body content differs frontmatter_hash_pure.test.cjs ✅ Design Collision-resistance invariant
computeBodyHash — same hash when only frontmatter changes frontmatter_hash_pure.test.cjs ✅ Design Key behavioral contract: body-only hashing
computeBodyHash — includes imported file bodies in the hash frontmatter_hash_pure.test.cjs ✅ Design Import-tracking invariant
computeBodyHash — not affected by changes to imported file frontmatter only frontmatter_hash_pure.test.cjs ✅ Design Edge case: import frontmatter isolation
TestCompilerWritesWhenBodyContentChanged compiler_skip_write_test.go ✅ Design Behavioral: file rewrite triggered by body change
TestBodyHashStoredInLockMetadata stale_check_test.go ✅ Design End-to-end: hash stored and recomputable
TestBodyHashChangesWhenBodyChanges stale_check_test.go ✅ Design Behavioral contract: hash sensitivity
TestBodyHashStableWhenFrontmatterChanges stale_check_test.go ✅ Design Behavioral contract: frontmatter isolation

Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 4 tests (unit //go:build !integration) — all build tags present ✅
  • 🟨 JavaScript (*.test.cjs): 17 tests (vitest)

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). The test suite thoroughly exercises behavioral contracts for the new body_hash feature — hash computation, lock metadata storage, stale-check full mode, backward compatibility, and filesystem fallback paths are all covered.

📖 Understanding Test Classifications

Design Tests (High Value) verify what the system does:

  • Assert on observable outputs, return values, or state changes
  • Cover error paths and boundary conditions
  • Would catch a behavioral regression if deleted
  • Remain valid even after internal refactoring

Implementation Tests (Low Value) verify how the system does it:

  • Assert on internal function calls (mocking internals)
  • Only test the happy path with typical inputs
  • Break during legitimate refactoring even when behavior is correct
  • Give false assurance: they pass even when the system is wrong

Goal: Shift toward tests that describe the system's behavioral contract — the promises it makes to its users and collaborators.

🧪 Test quality analysis by Test Quality Sentinel · sonnet46 2.3M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

✅ Test Quality Sentinel: 87/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). All 21 new tests enforce behavioral contracts for the body_hash feature.

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

Skills-Based Review 🧠

Applied /tdd and /grill-with-docs — approving with minor suggestions.

📋 Key Themes & Highlights

Key Themes

  • Cross-language hash consistency: Go and JS implementations match algorithm exactly (sorted imports, \n---\n separator, SHA-256). No blocking issues found.
  • Test coverage: Comprehensive — unit tests for hash computation, integration tests for stale-check modes, backward compat tests for pre-v4 lock files.
  • Schema evolution: Clean v3→v4 bump with omitempty for backward compat. LockHashInfo struct is a good pattern.

Positive Highlights

  • ✅ Graceful degradation: body hash failure is non-fatal at compile time
  • ✅ Backward compat: old lock files without body_hash work seamlessly
  • ✅ Skip-write optimization correctly updated to include body hash
  • ✅ Tests cover both API and local filesystem paths for runtime verification

Minor Suggestions (Non-blocking)

  • Consider adding a golden parity test to verify Go/JS produce identical hashes for a fixed input
  • The warning log when body hash fails could be more explicit about continuing without it
  • Note: Existing review flagged the PR description showing stale-check: full at top-level vs. on.stale-check: full in implementation

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · opus45 6.3M

allParts = append(allParts, normalizedBodies...)
}

combined := strings.Join(allParts, "\n---\n")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/tdd] Cross-language hash parity: The join separator \n---\n is correct and matches JS, but no explicit test verifies Go/JS parity on identical inputs.

💡 Suggested addition

Consider adding a golden test that asserts Go and JS produce the same hash for a fixed workflow file. A simple approach:

// pkg/workflow/body_hash_parity_test.go
func TestBodyHashParityWithJS(t *testing.T) {
    workflowMD := `---\nengine: copilot\n---\n\n# Test Workflow`
    // Pre-compute expected hash from JS once and embed it
    expectedHash := "<computed from JS>" // run JS once, store here
    actualHash, _ := parser.ComputeBodyHashFromParsedContent(...)
    assert.Equal(t, expectedHash, actualHash)
}

This guards against subtle Unicode normalisation or encoding divergence.

func GenerateLockMetadata(frontmatterHash string, stopTime string, strict bool, agentInfo AgentMetadataInfo) *LockMetadata {
lockSchemaLog.Printf("Generating lock metadata: schema=%s, strict=%t, hasStopTime=%t", LockSchemaV3, strict, stopTime != "")
func GenerateLockMetadata(hashInfo LockHashInfo, stopTime string, strict bool, agentInfo AgentMetadataInfo) *LockMetadata {
lockSchemaLog.Printf("Generating lock metadata: schema=%s, strict=%t, hasStopTime=%t, hasBodyHash=%t", LockSchemaV4, strict, stopTime != "", hashInfo.BodyHash != "")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/grill-with-docs] Schema versioning and backward compat: Good — the omitempty on BodyHash ensures pre-v4 lock files remain valid.

💡 Consideration for future schema changes

LockHashInfo is a nice pattern for grouping related fields. If future versions add more hash-like fields (e.g., importsHash), this struct scales cleanly.

Consider documenting the "schema version changelog" pattern somewhere (perhaps in lock_schema.go header comments or scratchpad/) so future contributors know when to bump the version vs. add optional fields.

} else {
bodyHash = bHash
compilerYamlLog.Printf("Computed body hash: %s", bodyHash)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/tdd] Good graceful degradation on body hash failure.

💡 Suggestion: Add warning log context

The warning logs could not compute body hash but doesn't show the BodyHash field ends up empty. Consider adding:

if bErr != nil {
    compilerYamlLog.Printf("Warning: could not compute body hash for %q: %v (continuing without body hash)", markdownPath, bErr)
} else {
    bodyHash = bHash
    compilerYamlLog.Printf("Computed body hash: %s", bodyHash)
}

This makes it clearer in debug logs that body hash is intentionally omitted vs. missing due to oversight.

core.info(`No body hash found in lock file; skipping body hash check${suffix} (lock file may predate body hash support)`);
return true;
}
const recomputedBodyHash = await computeBodyHash(mdPath, { fileReader });
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/tdd] Good test coverage for the compareBodyHashes helper — all paths covered.

✅ Test verification

Tests in check_workflow_timestamp_api.test.cjs cover:

  • Both hashes match → pass
  • Frontmatter matches but body differs → fail
  • Old lock file without body hash → graceful skip
  • Full mode disabled → body hash ignored
  • Local filesystem fallback path

The backward compat case (no body_hash in lock) is correctly handled by returning true early.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 26, 2026

🚀 Smoke Pi MISSION COMPLETE! Pi delivered. 🥧

@github-actions
Copy link
Copy Markdown
Contributor

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions github-actions Bot removed the smoke label May 26, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.54.0
jq 1.7
yq v4.53.2
curl 8.5.0
gh 2.92.0
node v22.22.3
python3 3.14.5
go 1.24.13
java openjdk 21.0.11
dotnet 10.0.300

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · sonnet46 504K ·

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test: Gemini - 26468168663

  • GitHub MCP: ✅
  • Web Fetch: ✅
  • File Writing: ✅
  • Bash Tool: ✅
  • Build gh-aw: ❌

Overall Status: FAIL

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • localhost

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "localhost"

See Network Configuration for more information.

Smoke Gemini — Powered by Gemini ·

@github-actions
Copy link
Copy Markdown
Contributor

Smoke test #26468168621: FAIL

  • PRs: feat: SPDD daily work items 2026-05-26 — spec sync, compliance tests, security norms; Optimize include extraction hot path in findIncludesInContent
  • GitHub MCP ✅ | Serena ✅ | Playwright ✅
  • Web-fetch ❌
  • File/Bash/Build/Memory ✅
  • Issue field ❌

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

🔮 The oracle has spoken through Smoke Codex · gpt54 14.7M ·

@github-actions
Copy link
Copy Markdown
Contributor

Comment Memory

Quiet terminal hum
Build lights blink in the midnight room
Git trees hold steady

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

🔮 The oracle has spoken through Smoke Codex · gpt54 14.7M ·

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot merge main and recompile

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Copilot 26468168604: FAIL
PRs: [docs] docs: unbloat triggers.md (1040 → 810 lines, 22% reduction); Correct Anthropic API key setup link in auth reference docs
Author: app/copilot-swe-agent; assignees: pelikhan, Copilot
✅ GitHub reads, Serena, Playwright, file/bash, discussion comment, build/artifact, workflow dispatch, PR review, sub-agent, check run
❌ mcpscripts-gh exact tool, direct web-fetch tool, discussion label/temp-ID support, comment-memory files

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

📰 BREAKING: Report filed by Smoke Copilot · gpt55 8.6M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

Smoke review completed. Inline notes are informational only.

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

📰 BREAKING: Report filed by Smoke Copilot · gpt55 8.6M

Comment thread .github/aw/syntax.md
- **`stale-check:`** - Control whether the activation job verifies the frontmatter hash matches the compiled workflow (boolean, default: `true`)
- **`stale-check:`** - Control whether the activation job verifies hashes against the compiled workflow (boolean or `"full"`, default: `true`)
- When `false`, disables the hash check step; useful when workflow files are managed outside the default repository context (e.g., cross-repo org rulesets)
- When `"full"`, checks both the frontmatter hash and body hash; use when prompt-body edits should also trigger recompilation detection
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Smoke note: full mode docs now say body hash too. Me see clear user signal.

@@ -1,4 +1,4 @@
# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"36cdbbbe4882806612f8dad2f77146ac361dff5ec231ef9eba66ffb8e0d02ca1","strict":true,"agent_id":"copilot"}
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"36cdbbbe4882806612f8dad2f77146ac361dff5ec231ef9eba66ffb8e0d02ca1","body_hash":"c0c6b51ff748c32142fa383ae68e04752e079d02bf22356046bf39761521b93c","strict":true,"agent_id":"copilot"}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Smoke note: lock metadata moved to schema v4 and carries body_hash. Generated lock looks aligned.

@github-actions
Copy link
Copy Markdown
Contributor

📰 DEVELOPING STORY: Smoke Copilot reports failed to deliver outputs. Our correspondents are investigating the incident...

@github-actions
Copy link
Copy Markdown
Contributor

🤖 Smoke Test: Claude — Run 26468168627

Core (1–13): ✅ all passed
PR review (14–20): 14✅ 15✅ 16✅ 17✅ 18✅ 19✅ · 20⚠️ skipped

Overall: ⚠️ PARTIAL (1 intentional skip, 0 failures)

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

💥 [THE END] — Illustrated by Smoke Claude · opus47 14.3M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

💥 Automated smoke test review - all systems nominal!

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

💥 [THE END] — Illustrated by Smoke Claude · opus47 14.3M

if staleCheck, ok := onMap["stale-check"]; ok {
if boolVal, ok := staleCheck.(bool); ok && !boolVal {
workflowData.StaleCheckDisabled = true
} else if strVal, ok := staleCheck.(string); ok && strVal == "full" {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💥 Smoke-test review: comment on the stale-check parsing branch. (Run 26468168627)

workflowData.StaleCheckFull = true
}
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💥 Smoke-test review #2: consider documenting the StaleCheckFull semantics. (Run 26468168627)

Copilot AI and others added 3 commits May 26, 2026 21:09
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
…-include-body

# Conflicts:
#	.github/workflows/daily-cache-strategy-analyzer.lock.yml
#	.github/workflows/daily-fact.lock.yml
#	.github/workflows/daily-observability-report.lock.yml
#	.github/workflows/dev.lock.yml
#	.github/workflows/duplicate-code-detector.lock.yml
#	.github/workflows/grumpy-reviewer.lock.yml
#	.github/workflows/issue-arborist.lock.yml
#	.github/workflows/necromancer.lock.yml
#	.github/workflows/schema-feature-coverage.lock.yml
#	.github/workflows/smoke-call-workflow.lock.yml
#	.github/workflows/smoke-codex.lock.yml

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 26, 2026

@copilot merge main and recompile

Done. Merged origin/main (resolved 11 lock file conflicts by taking main's versions) and recompiled all 236 workflows — 0 errors. All lock files now carry v4 body_hash metadata.

Copilot AI changed the title Add body hash to lock metadata; support stale-check: full Add body hash to lock metadata; support on.stale-check: full May 26, 2026
@pelikhan
Copy link
Copy Markdown
Collaborator

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 26, 2026

@copilot fix tests https://github.com/github/gh-aw/actions/runs/26475443613/job/77960884740

Fixed — the failure was a Prettier formatting issue in parse_threat_detection_results.test.cjs. Applied prettier --write to fix the style in the latest commit.

@pelikhan pelikhan merged commit f09eb72 into main May 26, 2026
@pelikhan pelikhan deleted the copilot/lock-metadata-include-body branch May 26, 2026 21:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Lock metadata should cover .md body, not just frontmatter

3 participants