Skip to content

[purelock] Lock down extractExperimentVariantStubs, isValidToolName, validateObjectInput with pure-function test suites - #52048

Merged
pelikhan merged 3 commits into
mainfrom
purelock/extract-experiment-isvalid-validateobject-ac8ca124f4b490a7
Aug 11, 2026
Merged

[purelock] Lock down extractExperimentVariantStubs, isValidToolName, validateObjectInput with pure-function test suites#52048
pelikhan merged 3 commits into
mainfrom
purelock/extract-experiment-isvalid-validateobject-ac8ca124f4b490a7

Conversation

@github-actions

@github-actions github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Locks down 3 pure Go functions with maximum-coverage testify test suites, selected from the precomputed candidate ranking (purelock/candidates.json).

extractExperimentVariantStubspkg/cli/forecast_metadata.go:158

func extractExperimentVariantStubs(cfg *workflow.FrontmatterConfig) []ForecastVariantResult

Purity: no observable side effects (per precomputed purity_notes); confirmed manually — reads only from the input cfg.ExperimentConfigs map, builds a new slice, and sorts it deterministically with slices.SortFunc. No I/O, no globals, no mutation of inputs.

  • Coverage (function): 0% → 88.9%
  • Coverage (package pkg/cli): 61.8% → 61.8% (function is small relative to a large package; net package coverage unaffected within reported precision, added tests cover previously untested logic)
  • Tests: 6 top-level tests, 0 subtests, 15+ assertions
  • Fuzzing: not used (not marked fuzz_friendly)
  • Residual uncovered: one branch inside slices.SortFunc's comparator (equal variant strings, default: return 0) is exercised only implicitly by Go's sort algorithm and not directly hit by the added cases; low risk since logic is trivial.

isValidToolNamepkg/cli/logs_report_tools.go:34

func isValidToolName(toolName string) bool

Purity: no observable side effects; confirmed manually — pure string predicate over toolNameStopWords (package-level constant map, read-only) and the input string. No mutation, no I/O.

  • Coverage (function): 0% → 100%
  • Coverage (package pkg/cli): 61.8% → 61.8%
  • Tests: table-driven test (18 cases) + all-stop-words sweep + idempotency check + Go native fuzz test (FuzzIsValidToolName)
  • Fuzzing: used, as the candidate was flagged fuzz_friendly
  • Residual uncovered: none

validateObjectInputpkg/parser/import_schema_validation.go:75

func validateObjectInput(name string, value any, paramDef map[string]any, importPath string) error

Purity: no observable side effects; confirmed manually — validates an object value against a schema definition, returning an error or nil. No mutation of value/paramDef, no I/O.

  • Coverage (function): 22.2% → 100%
  • Coverage (package pkg/parser): 70.9% → 71.3%
  • Tests: 12 top-level tests, 0 subtests, 25+ assertions
  • Fuzzing: not used (not marked fuzz_friendly)
  • Residual uncovered: none

Validation

  • gofmt -l — clean on all 3 new test files
  • go vet ./pkg/cli/ ./pkg/parser/ — clean
  • go test ./pkg/cli/ -race -count=1 and go test ./pkg/parser/ -race -count=1 — all new tests pass (2 pre-existing, unrelated failures in pkg/cliTestRenderScheduleCalendarCell_UsesANSIInColorTerminal and TestConfirmRunAddedWorkflow_ContextCancelled — were already failing before this change and are untouched by it)

Draft PR — please review test cases for edge-case completeness before merging.

Generated by 🔐 PureLock · auto · 93.1 AIC · ⌖ 11 AIC · ⊞ 10.8K ·

  • expires on Aug 16, 2026, 4:55 AM UTC-08:00

Run: https://github.com/github/gh-aw/actions/runs/31511130973> Generated by 👨‍🍳 PR Sous Chef · gpt54 · 8.27 AIC · ⌖ 5.37 AIC · ⊞ 8.5K ·

Comment /souschef to run again

…, isValidToolName, validateObjectInput

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@pelikhan
pelikhan marked this pull request as ready for review August 11, 2026 13:00
Copilot AI balanced review requested due to automatic review settings August 11, 2026 13:00
@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

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

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

Test Quality Sentinel completed test quality analysis.

🧪 Test quality analysis by Test Quality Sentinel

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

PR Code Quality Reviewer completed the code quality review.

Warning

Threat Detection Engine Failure — The analysis engine could not complete. This is a tooling failure, not a security finding.

What happened

The threat detection engine failed to produce results.

Review the workflow run logs for details.

Warning

Firewall blocked 1 domain

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

  • api.individual.githubcopilot.com

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

network:
  allowed:
    - defaults
    - "api.individual.githubcopilot.com"

See Network Configuration for more information.

🔎 Code quality review by PR Code Quality Reviewer

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

Ponytail Reviewer completed successfully!

Generated by Ponytail Reviewer for #52048

Copilot AI left a comment

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.

Pull request overview

Adds focused regression coverage for three pure helper functions across CLI metadata, tool-name validation, and parser schema validation.

Changes:

  • Tests deterministic experiment-variant extraction and sorting.
  • Adds table-driven, stop-word, and fuzz coverage for tool names.
  • Covers object-schema validation success and error paths.
Show a summary per file
File Description
pkg/cli/forecast_metadata_extract_experiment_variant_stubs_test.go Tests variant extraction, ordering, nil entries, and defaults.
pkg/cli/logs_report_tools_isvalidtoolname_test.go Tests tool-name rules and fuzz invariants.
pkg/parser/import_schema_validation_object_input_test.go Tests object property and nested type validation.

Review details

Tip

Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

  • Files reviewed: 3/3 changed files
  • Comments generated: 0
  • Review effort level: Balanced

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The three new test files add solid pure-function coverage for extractExperimentVariantStubs, isValidToolName, and validateObjectInput. Tests are correct, edge cases are well-chosen, and the fuzz test for isValidToolName is a nice addition. No issues found.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 · 18.9 AIC · ⌖ 6.21 AIC · ⊞ 5.4K

@github-actions

Copy link
Copy Markdown
Contributor Author

⚠️ Design Decision Gate — Implementation Diverges from ADR

ADR reviewed: ADR-51783: Pure-Function Test Suites with Purity Assertions — 3 divergence(s) found.

Either update the code to align with the ADR, or update the ADR to reflect the revised decision.

🔍 Divergences Found (3 items)

ADR-51783 mandates a two-layer test pattern for all PureLock-driven pure-function suites:

  1. A primary table-driven subtest suite covering every meaningful branch
  2. A dedicated purity test asserting idempotency (repeated calls return the same result) and no input mutation

isValidToolNamepkg/cli/logs_report_tools_isvalidtoolname_test.goAligned ✔️

  • Layer 1: TestIsValidToolName (18 table-driven cases) + TestIsValidToolName_AllStopWords
  • Layer 2: TestIsValidToolName_Idempotent (idempotency assertion) + FuzzIsValidToolName

Divergence 1extractExperimentVariantStubspkg/cli/forecast_metadata_extract_experiment_variant_stubs_test.go:

  • Uses 6 separate top-level test functions instead of a single table-driven subtest suite (form divergence from ADR Layer 1)
  • Missing Layer 2 entirely: no idempotency check and no input-mutation assertion for cfg or the returned slice

Divergence 2validateObjectInputpkg/parser/import_schema_validation_object_input_test.go:

  • Uses 12 separate top-level test functions instead of a single table-driven subtest suite (form divergence from ADR Layer 1)
  • Missing Layer 2 entirely: no idempotency check and no assertion that value or paramDef are not mutated by the function

Divergence 3 — ADR coverage scope:

  • ADR-51783 was written against removeUnsafeEngineEnvKeys and migrateMessagesEffectiveTokensSuffixToAICreditsSuffix. Its Neutral consequence states it "codifies the testing pattern that PureLock-driven PRs should follow for pure functions." This PR introduces three new PureLock-driven test suites but does not reference or link this ADR, leaving it ambiguous whether the pattern was intentionally adapted or the ADR was overlooked.
📋 What to do next

For extractExperimentVariantStubs and validateObjectInput, choose one of:

  1. Update the test files to add Layer 2 purity tests, e.g.:
    • An _Idempotent function that calls the function twice with the same input and asserts the results are equal
    • An _NoInputMutation function that captures the input before and after the call and asserts it is unchanged
    • Optionally consolidate the top-level functions into a single table-driven t.Run suite to match Layer 1 exactly
  2. Update ADR-51783 to explicitly acknowledge that the two-layer pattern applies differently to simpler pure functions (non-state-machine) — if the purity layer is intentionally omitted for functions where mutation is structurally impossible, document that rationale

Also, add a reference to ADR-51783 in this PR body to make the coverage gate pass on re-run:

ADR: ADR-51783: Pure-Function Test Suites with Purity Assertions

The ADR and implementation must be in sync before this PR can merge.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · sonnet46 · 70.5 AIC · ⌖ 18.4 AIC · ⊞ 8.7K ·
Comment /review to run again

@github-actions

Copy link
Copy Markdown
Contributor Author

🧪 Test Quality Sentinel Report

Test Quality Score: 95/100 — Excellent

Analyzed 22 test(s): 22 design, 0 implementation, 1 violation.

📊 Metrics (22 tests)
Metric Value
Analyzed 22 (Go: 22, JS: 0)
✅ Design 22 (100%)
⚠️ Implementation 0 (0%)
Edge/error coverage 18 (82%)
Duplicate clusters 0
Inflation No
🚨 Violations 1

Per-Test Classification

Test File Classification Issues
TestExtractExperimentVariantStubs_NoExperiments forecast_metadata_extract_experiment_variant_stubs_test.go design_test / high_value
TestExtractExperimentVariantStubs_NilExperimentConfig forecast_metadata_extract_experiment_variant_stubs_test.go design_test / high_value
TestExtractExperimentVariantStubs_SingleExperiment forecast_metadata_extract_experiment_variant_stubs_test.go design_test / high_value
TestExtractExperimentVariantStubs_SortsByExperimentNameThenVariant forecast_metadata_extract_experiment_variant_stubs_test.go design_test / high_value
TestExtractExperimentVariantStubs_MultipleExperimentsMixedNil forecast_metadata_extract_experiment_variant_stubs_test.go design_test / high_value
TestExtractExperimentVariantStubs_RunCountAndFractionDefaultZero forecast_metadata_extract_experiment_variant_stubs_test.go design_test / high_value
TestIsValidToolName (table: 19 cases) logs_report_tools_isvalidtoolname_test.go design_test / high_value Pure-function boundary cases ✓
TestIsValidToolName_AllStopWords logs_report_tools_isvalidtoolname_test.go design_test / high_value Exhaustive stop-word validation ✓
TestIsValidToolName_Idempotent logs_report_tools_isvalidtoolname_test.go design_test / high_value Pure-function invariant ✓
FuzzIsValidToolName logs_report_tools_isvalidtoolname_test.go design_test / high_value Determinism + panic guard ✓
TestValidateObjectInput_NotAnObject import_schema_validation_object_input_test.go design_test / high_value Type check + error message ✓
TestValidateObjectInput_NoPropertiesDeclared_AcceptsAnyObject import_schema_validation_object_input_test.go design_test / high_value
TestValidateObjectInput_PropertiesNotAMap_AcceptsAnyObject import_schema_validation_object_input_test.go design_test / high_value Robustness ✓
TestValidateObjectInput_UnknownSubKey import_schema_validation_object_input_test.go design_test / high_value Error detection + message ✓
TestValidateObjectInput_RequiredSubFieldMissing import_schema_validation_object_input_test.go design_test / high_value Missing field detection ✓
TestValidateObjectInput_RequiredSubFieldPresent import_schema_validation_object_input_test.go design_test / high_value
TestValidateObjectInput_OptionalSubFieldMissing_NoError import_schema_validation_object_input_test.go design_test / high_value
TestValidateObjectInput_NoTypeDeclared_SkipsTypeValidation import_schema_validation_object_input_test.go design_test / high_value Robustness ✓
TestValidateObjectInput_TypeMismatch import_schema_validation_object_input_test.go design_test / high_value Type validation ✓
TestValidateObjectInput_TypeMatch import_schema_validation_object_input_test.go design_test / high_value Happy path ✓
TestValidateObjectInput_PropDefNotAMap_SkipsValidation import_schema_validation_object_input_test.go design_test / high_value Robustness ✓
TestValidateObjectInput_QualifiedNameInErrorMessage import_schema_validation_object_input_test.go design_test / high_value Error context ✓
⚠️ Coding Guideline Violation

Missing Build Tags (Hard Violation)

All three new test files lack the required (go/redacted):build !integration tag on line 1:

  • pkg/cli/forecast_metadata_extract_experiment_variant_stubs_test.go
  • pkg/cli/logs_report_tools_isvalidtoolname_test.go
  • pkg/parser/import_schema_validation_object_input_test.go

Fix: Add (go/redacted):build !integration as the first line of each file (before package declaration).

Violation severity: BLOCKING — guideline compliance is mandatory for all new test files in this repository.

Verdict

REQUEST_CHANGES. Test design quality is excellent (95/100, 100% design tests, 82% edge coverage), but the PR has a hard coding guideline violation: missing (go/redacted):build !integration build tags on all new test files. This must be fixed before merging.

🧪 Test quality analysis by Test Quality Sentinel · haiku45 · 23.8 AIC · ⌖ 2.71 AIC · ⊞ 7.6K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

❌ Test Quality Sentinel: 95/100. Hard violation detected: missing (go/redacted):build !integration build tags on all new test files. This is a mandatory coding guideline that must be fixed before merging. Test design quality is excellent (100% design tests, 82% edge coverage), but coding compliance is required.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

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 — commenting with actionable suggestions; no blocking correctness issues.

📋 Key Themes & Highlights

Key Themes

  • Assertion consistency: mixing assert.Nil and assert.Empty for the same emptiness concept creates fragile expectations.
  • Redundant test: the idempotency test duplicates what the fuzz corpus already proves more thoroughly.
  • Opaque fallback contract: the "permissive on malformed schema" behaviour needs a comment or a better name to survive future refactors.
  • Monolithic multi-type assertion: packing three type checks into one test reduces failure diagnosability.

Positive Highlights

  • ✅ Excellent fuzz test for isValidToolName with meaningful seeds and a determinism invariant
  • TestIsValidToolName_AllStopWords iterates the live map — zero drift risk
  • validateObjectInput suite reaches 100% and covers all documented edge cases
  • ✅ Good use of assert.Contains on error messages to pin the contract without over-specifying the full string

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 · 32.7 AIC · ⌖ 6.88 AIC · ⊞ 7.1K
Comment /matt to run again

func TestExtractExperimentVariantStubs_NoExperiments(t *testing.T) {
cfg := &workflow.FrontmatterConfig{}
stubs := extractExperimentVariantStubs(cfg)
assert.Nil(t, stubs)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

[/tdd] assert.Nil vs assert.Emptyassert.Nil(t, stubs) enforces a nil-slice contract, but the companion test at line 23 uses assert.Empty. If the implementation ever returns a non-nil empty slice instead of nil, the first test fails while the second passes silently. Either make both assertions consistent (assert.Empty for emptiness-only) or add a comment documenting that the nil return is a deliberate contract worth enforcing.

@copilot please address this.

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.

Updated in 472e5e3: the no-experiments case now uses assert.Empty, consistent with the companion empty-result case.

assert.Equal(t, "y", stubs[1].Variant)
assert.Equal(t, "zeta", stubs[2].ExperimentName)
assert.Equal(t, "a", stubs[2].Variant)
assert.Equal(t, "zeta", stubs[3].ExperimentName)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

[/tdd] No test for an experiment with an empty Variants slice — TestExtractExperimentVariantStubs_MultipleExperimentsMixedNil covers a nil config but exp3 uses {Variants: []string{}}. The test asserts Len(t, stubs, 1) which implicitly validates the empty-variants case, but there is no standalone test that names this contract. A dedicated _EmptyVariants case makes the specification explicit and easier to maintain.

@copilot please address this.

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.

Added a dedicated TestExtractExperimentVariantStubs_EmptyVariants case in 472e5e3.

{"single character", "a", false},
{"single character uppercase", "X", false},
{"stop word calls", "calls", false},
{"stop word to", "to", false},

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

[/tdd] The comment // len 9 < 10 is correct, but the case name "short lowercase single word exactly under length limit" could be sharpened — "abcdefghi" is 9 chars, and the rule is len < 10, so "exactly under" is accurate. However, there is no boundary test for len == 10 with mixed-case ("abcdefghiJ") to confirm that a capital letter alone makes a 10-char string pass. The existing cases test length and capitalisation independently but not their interaction at the boundary.

@copilot please address this.

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.

Added the mixed-case len == 10 boundary case (abcdefghiJ) in 472e5e3.

}
}

func TestIsValidToolName_Idempotent(t *testing.T) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

[/tdd] TestIsValidToolName_Idempotent checks purity (same in → same out), which the fuzz test already covers more thoroughly. These are the same property. Consider replacing this test with one that adds real coverage value — e.g., asserting that stop-word lookup is case-sensitive ("Calls" vs "calls") or that Unicode multi-byte input does not panic.

@copilot please address this.

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.

Removed the redundant standalone idempotency test in 472e5e3; determinism remains covered by the fuzz test.

paramDef := map[string]any{"properties": "not-a-map"}
value := map[string]any{"key": "value"}
err := validateObjectInput("config", value, paramDef, "import")
assert.NoError(t, err)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

[/tdd] TestValidateObjectInput_PropertiesNotAMap_AcceptsAnyObject confirms that a non-map properties value causes the function to silently accept anything. This is important behaviour, but the test name does not hint that this is a lenient fallback — a future reader might change the implementation to return an error and not realise this test encodes a deliberate "permissive" contract. A one-line comment in the test body (or a name like _MalformedPropertiesField_FallsBackToPermissive) would make the intent explicit.

@copilot please address this.

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.

Renamed the case to TestValidateObjectInput_MalformedPropertiesField_FallsBackToPermissive in 472e5e3 to make the fallback contract explicit.

"count": map[string]any{"type": "number"},
},
}
value := map[string]any{"count": "not-a-number"}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

[/tdd] TestValidateObjectInput_TypeMatch packs three distinct type checks (number, string, boolean) into one assertion. When it fails, Go will report only which field was wrong, but the test reads as one monolithic pass/fail. Per /tdd, each case should be independently identifiable — either split into three top-level tests or use t.Run sub-tests so failures are individually named and CI output is immediately actionable.

@copilot please address this.

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.

Converted the type-match checks to independently named table-driven subtests in 472e5e3.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Ponytail review (over-engineering only).

net: -7 lines possible.

Generated by ✂️ Ponytail Reviewer for #52048 · auto · 19.6 AIC · ⌖ 6.52 AIC · ⊞ 6.8K
Comment /ponytail to run again

Comment on lines +55 to +61
func TestIsValidToolName_Idempotent(t *testing.T) {
// Pure function property: calling twice with the same input yields the same result.
inputs := []string{"", "-", "a", "run_tests", "calls", " spaced ", "camelCase"}
for _, in := range inputs {
assert.Equal(t, isValidToolName(in), isValidToolName(in))
}
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

L55-61: delete: TestIsValidToolName_Idempotent duplicates the determinism check already inlined in FuzzIsValidToolName (got1 != got2). Nothing replaces it.

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.

Removed TestIsValidToolName_Idempotent in 472e5e3; the fuzz test remains the single determinism check.

@github-actions

Copy link
Copy Markdown
Contributor Author

🎯 Excellent work on this test coverage PR! The PureLock workflow has generated three well-scoped, high-quality test suites that lock down pure functions with comprehensive coverage.

What's great here:

  • ✅ All three functions are properly validated as pure (no side effects, no I/O, deterministic)
  • ✅ Test coverage improvements are significant: extractExperimentVariantStubs 0% → 88.9%, isValidToolName 0% → 100%, validateObjectInput 22.2% → 100%
  • ✅ Tests are well-structured: table-driven tests, edge cases (nil values, empty inputs, sorting), fuzzing where appropriate (FuzzIsValidToolName)
  • ✅ Validation confirms all tests pass (go test -race) and code is formatted correctly (gofmt, go vet clean)
  • ✅ The PR description is thorough, documenting purity notes, test strategies, and residual uncovered branches with risk assessments

Ready for review — this PR demonstrates strong test engineering practices and is well-aligned with the project's testing standards. The focused scope and comprehensive edge-case coverage make this a solid addition to the codebase.

Generated by ✅ Contribution Check · auto · 49.6 AIC · ⌖ 3.67 AIC · ⊞ 8.8K ·

@pelikhan

Copy link
Copy Markdown
Collaborator

@copilot run pr-finisher skill

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot Please address the open review feedback, refresh the branch if needed, and use the pr-finisher skill before handing back.

Open review threads (newest reviewer feedback first):

No failed checks were reported in the compact candidate set for this run.
Branch update was requested by sous-chef in run https://github.com/github/gh-aw/actions/runs/31511130973.

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 8.27 AIC · ⌖ 5.37 AIC · ⊞ 8.5K ·
Comment /souschef to run again

Copilot AI commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

@copilot Please address the open review feedback, refresh the branch if needed, and use the pr-finisher skill before handing back.

Open review threads (newest reviewer feedback first):...

Addressed in 472e5e3 and replied to both linked threads. The branch already includes current main via 6da4b0f; make fmt, make lint, targeted tests, make test-unit, make test, make recompile, and make agent-report-progress all pass.

@pelikhan
pelikhan merged commit f945139 into main Aug 11, 2026
2 of 3 checks passed
Copilot stopped work on behalf of gh-aw-bot due to an error August 11, 2026 16:51
@pelikhan
pelikhan deleted the purelock/extract-experiment-isvalid-validateobject-ac8ca124f4b490a7 branch August 11, 2026 16:51
@github-actions github-actions Bot mentioned this pull request Aug 11, 2026
Copilot AI requested a review from gh-aw-bot August 11, 2026 17:03
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.

4 participants