Skip to content

feat: Anthropic WIF support in EngineAuthConfig and ClaudeEngine#35939

Merged
pelikhan merged 5 commits into
mainfrom
copilot/awf-compiler-anthropic-wif-support
May 30, 2026
Merged

feat: Anthropic WIF support in EngineAuthConfig and ClaudeEngine#35939
pelikhan merged 5 commits into
mainfrom
copilot/awf-compiler-anthropic-wif-support

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 30, 2026

The compiler had no support for Anthropic Workload Identity Federation (WIF): EngineAuthConfig was Azure-only, and ClaudeEngine unconditionally required ANTHROPIC_API_KEY — causing WIF-configured workflows to fail secret validation before the agent runs. The firewall side already supports Anthropic WIF; this closes the compiler gap.

Changes

EngineAuthConfig — new fields (pkg/workflow/engine.go)

  • Added Provider string ("azure" | "anthropic")
  • Added four Anthropic WIF fields: AnthropicFederationRuleID, AnthropicOrganizationID, AnthropicServiceAccountID, AnthropicWorkspaceID

parseEngineAuthConfig — parse Anthropic frontmatter

Reads provider, federation-rule-id, organization-id, service-account-id, workspace-id from the engine.auth map.

applyEngineAuthEnv — emit Anthropic env vars

When Anthropic WIF fields are set, emits AWF_AUTH_PROVIDER and the four AWF_AUTH_ANTHROPIC_* vars consumed by the firewall api-proxy.

ClaudeEngine — branch on WIF auth (pkg/workflow/claude_engine.go)

  • GetRequiredSecretNames: skips ANTHROPIC_API_KEY when WIF is active; MCP secrets still collected normally
  • GetSecretValidationStep: returns empty step (no-op) when WIF is active
  • isAnthropicWIF helper: auth.Type == "github-oidc" && auth.Provider == "anthropic"

Example frontmatter

engine: claude
engine-auth:
  type: github-oidc
  provider: anthropic
  federation-rule-id: fr_01ABC
  organization-id: org_01XYZ
  service-account-id: sa_01DEF
  workspace-id: ws_01GHI

With this config the compiler emits AWF_AUTH_TYPE, AWF_AUTH_PROVIDER, and all four AWF_AUTH_ANTHROPIC_* env vars, and skips the ANTHROPIC_API_KEY secret validation step entirely.

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
Copilot AI changed the title [WIP] Add Anthropic WIF support to compiler for ClaudeEngine feat: Anthropic WIF support in EngineAuthConfig and ClaudeEngine May 30, 2026
Copilot finished work on behalf of lpcox May 30, 2026 14:57
Copilot AI requested a review from lpcox May 30, 2026 14:57
@lpcox lpcox marked this pull request as ready for review May 30, 2026 15:04
Copilot AI review requested due to automatic review settings May 30, 2026 15:04
@lpcox lpcox added the smoke label May 30, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 30, 2026

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 30, 2026

PR Code Quality Reviewer completed the code quality review.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 30, 2026

🧪 Test Quality Sentinel completed test quality analysis.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 30, 2026

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

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

Adds compiler/runtime support for Anthropic Workload Identity Federation (WIF) by extending engine auth configuration, emitting the required AWF auth environment variables, and teaching the Claude engine to skip static ANTHROPIC_API_KEY secret validation when WIF is configured.

Changes:

  • Extend EngineAuthConfig parsing and env emission to support an Anthropic auth provider and Anthropic WIF identifiers.
  • Update ClaudeEngine secret requirements + validation step generation to no-op when github-oidc + provider=anthropic is configured.
  • Add unit tests covering Anthropic WIF env mapping and the Claude WIF secret-validation skip behavior.
Show a summary per file
File Description
pkg/workflow/engine.go Adds Provider and Anthropic WIF fields; parses new frontmatter keys; emits AWF_AUTH_PROVIDER and AWF_AUTH_ANTHROPIC_* env vars.
pkg/workflow/claude_engine.go Skips ANTHROPIC_API_KEY requirements and secret validation step when Anthropic WIF is active; adds isAnthropicWIF helper.
pkg/workflow/engine_config_test.go Tests Anthropic WIF frontmatter mapping into EngineAuthConfig and emitted AWF env vars.
pkg/workflow/engine_helpers_secrets_test.go Tests GetRequiredSecretNames behavior for Claude under Anthropic WIF (including MCP secrets).
pkg/workflow/secret_validation_test.go Tests that Claude secret validation step is empty under Anthropic WIF.
pkg/workflow/claude_engine_test.go Adds tests for isAnthropicWIF helper behavior.

Copilot's findings

Tip

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

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

Comment thread pkg/workflow/claude_engine_test.go Outdated
Comment on lines +936 to +941
func TestIsAnthropicWIF(t *testing.T) {
tests := []struct {
name string
workflowData *WorkflowData
want bool
}{
@pelikhan
Copy link
Copy Markdown
Collaborator

We should really split engine from providers.

Let's have:

providers:
anthropic:
auth:
... # auth stuff

This will allow to mix and match engines and providers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (228 new lines under pkg/, above the 100-line threshold) but does not have a linked Architecture Decision Record (ADR).

📄 Draft ADR committed: docs/adr/35939-anthropic-wif-support-in-compiler.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 captures the decision to add Anthropic Workload Identity Federation (WIF) as a first-class auth provider in the compiler.
  2. Complete the missing sections — add context the AI couldn't infer (e.g. the originating motivation, deciders), refine the decision rationale, and confirm the alternatives reflect what you actually considered.
  3. Commit the finalized ADR to docs/adr/ on your branch.
  4. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-35939: Anthropic Workload Identity Federation Support in the Compiler

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., 35939-anthropic-wif-support-in-compiler.md for PR #35939).

🔒 Blocking notice: this gate will not pass until an ADR is linked in the PR body.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · opus48 764.6K ·

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 — requesting changes on one blocking issue (test formatting) and flagging three important correctness/design concerns.

📋 Key Themes & Highlights

Blocking

  • Test formatting: TestIsAnthropicWIF body has no indentation — go fmt / make fmt will fail CI immediately.

Correctness

  • Anthropic env vars not gated on provider: The four AWF_AUTH_ANTHROPIC_* vars are emitted based solely on field presence, not on provider == "anthropic". A misconfigured Azure+Anthropic-field workflow would silently leak Anthropic vars into the environment.

Design

  • Generic frontmatter key names: organization-id, service-account-id, etc. break the <provider>- prefix convention established by the Azure fields (azure-tenant-id, etc.). This will cause collisions when a future provider needs similar concepts.
  • Unvalidated Provider string: A typo silently emits a bad AWF_AUTH_PROVIDER and quietly falls back to API key mode — consider validating against the known set.
  • Partial WIF edge case untested: provider: anthropic with no IDs skips API key validation but emits zero WIF vars; the firewall will reject this at runtime with no compiler guidance.

Positive Highlights

  • ✅ Clean nil-guard chain in isAnthropicWIF — all three nil paths are covered.
  • ✅ Good use of a dedicated helper rather than inlining the WIF check in each method.
  • ✅ Thorough test coverage for the happy path and all isAnthropicWIF boolean combinations.
  • ✅ PR description is exemplary — example frontmatter, env var list, and firewall-side context all in one place.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 1.8M

Comment thread pkg/workflow/claude_engine_test.go Outdated
}

func TestIsAnthropicWIF(t *testing.T) {
tests := []struct {
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] Test body is entirely unindented — go fmt will reject this and fail CI.

Every line inside TestIsAnthropicWIF is missing its leading tab. Run make fmt to fix.

💡 Expected shape after formatting
func TestIsAnthropicWIF(t *testing.T) {
	tests := []struct {
		name         string
		workflowData *WorkflowData
		want         bool
	}{
		// ...
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := isAnthropicWIF(tt.workflowData)
			assert.Equal(t, tt.want, got)
		})
	}
}

Comment thread pkg/workflow/engine.go
config.Env["AWF_AUTH_PROVIDER"] = config.Auth.Provider
}
}
if config.Auth.AnthropicFederationRuleID != "" {
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] Anthropic env vars are emitted independently of Provider — they'll appear even when provider: azure if someone accidentally provides an organization-id in the frontmatter.

Wrap all four AWF_AUTH_ANTHROPIC_* emissions inside the provider == "anthropic" guard (or a dedicated if isAnthropicProvider block) to prevent cross-provider env var leakage.

💡 Suggested fix
if config.Auth.Provider == "anthropic" {
    if config.Auth.AnthropicFederationRuleID != "" {
        if _, exists := config.Env["AWF_AUTH_ANTHROPIC_FEDERATION_RULE_ID"]; !exists {
            config.Env["AWF_AUTH_ANTHROPIC_FEDERATION_RULE_ID"] = config.Auth.AnthropicFederationRuleID
        }
    }
    // ... same for other Anthropic fields
}

A test demonstrating provider: azure does not emit any AWF_AUTH_ANTHROPIC_* vars would lock this in.

Comment thread pkg/workflow/engine.go
if s, ok := authObj["azure-cloud"].(string); ok {
auth.AzureCloud = s
}
if s, ok := authObj["federation-rule-id"].(string); ok {
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] The frontmatter keys organization-id, service-account-id, and workspace-id are generic and not namespaced to Anthropic. A future provider with similar concepts would collide.

Consider prefixing them (anthropic-organization-id, anthropic-federation-rule-id, etc.) or nesting them under a provider-specific sub-key, consistent with how Azure fields use the azure- prefix throughout this file.

💡 Contrast with Azure naming

Existing Azure keys: azure-tenant-id, azure-client-id, azure-scope, azure-cloud — all namespaced.

New Anthropic keys: federation-rule-id, organization-id, service-account-id, workspace-id — un-namespaced.

Applying the same convention:

engine-auth:
  type: github-oidc
  provider: anthropic
  anthropic-federation-rule-id: fr_01ABC
  anthropic-organization-id: org_01XYZ
  anthropic-service-account-id: sa_01DEF
  anthropic-workspace-id: ws_01GHI

Comment thread pkg/workflow/engine.go
Audience string
Type string
Audience string
Provider string // "azure" or "anthropic"
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] Provider is an unvalidated free-form string — a typo like "anthropic2" emits AWF_AUTH_PROVIDER=anthropic2 without any warning, and isAnthropicWIF silently falls back to requiring ANTHROPIC_API_KEY, which may confuse the user.

Consider validating Provider against a known set ("azure", "anthropic") in parseEngineAuthConfig and surfacing a compiler warning (or error) for unknown values, consistent with how other enum-like fields are handled in the codebase.

}

secrets := engine.GetRequiredSecretNames(workflowData)

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] Missing edge case: WIF active but no WIF fields populated (only type: github-oidc + provider: anthropic, none of the four IDs set). In this state the compiler skips ANTHROPIC_API_KEY and emits no AWF_AUTH_ANTHROPIC_* vars — the firewall will likely reject the request at runtime with a confusing error.

A test asserting either (a) this configuration is rejected at compile time, or (b) the expected runtime behaviour is explicitly documented, would prevent a silent footgun for users migrating to WIF.

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.

Two blockers must be fixed before merge

1. Schema not updated (pkg/parser/schemas/main_workflow_schema.json) — the engine.auth object schema has "additionalProperties": false and none of the five new Anthropic WIF fields are declared. Every workflow that uses Anthropic WIF will fail at gh aw compile time with a schema validation error. The Go-level parsing code is fine; the schema is the missing piece.

2. TestIsAnthropicWIF is un-indented (pkg/workflow/claude_engine_test.go) — the entire test body sits at column 0. make fmt (enforced by CI) rejects this immediately.

Other findings (non-blocking)

Missing compile-time validation of Anthropic WIF identity fields — when isAnthropicWIF is true the compiler skips secret validation but doesn't check that federation-rule-id, organization-id, service-account-id are non-empty. A partial configuration will compile cleanly and produce a cryptic runtime failure during OIDC token exchange. See inline comment.

provider string is unvalidated — an unknown value (e.g. provider: Anthropic) silently falls through to the non-WIF path and demands ANTHROPIC_API_KEY, with no user-visible error. A schema enum on the new provider field (fix #1 above) covers this automatically.

🔎 Code quality review by PR Code Quality Reviewer · sonnet46 2.6M

Comment thread pkg/workflow/claude_engine_test.go Outdated
}

func TestIsAnthropicWIF(t *testing.T) {
tests := []struct {
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.

TestIsAnthropicWIF body is entirely un-indented — make fmt will fail and block CI.

Every line inside the function (struct definition, table entries, loop) is at column 0 instead of being tab-indented. gofmt requires consistent indentation; this causes the make fmt check to fail immediately.

💡 Suggested fix

Run gofmt -w pkg/workflow/claude_engine_test.go (or make fmt) to auto-fix the indentation. The test logic itself is correct — it just wasn't formatted before committing.

Example of what the first few lines should look like after formatting:

func TestIsAnthropicWIF(t *testing.T) {
	tests := []struct {
		name         string
		workflowData *WorkflowData
		want         bool
	}{
		{
			name:         "nil workflowData returns false",
			workflowData: nil,
			want:         false,
		},

// When Anthropic WIF (github-oidc + provider=anthropic) is configured, no static API key
// is needed and only common MCP secrets are returned.
func (e *ClaudeEngine) GetRequiredSecretNames(workflowData *WorkflowData) []string {
if isAnthropicWIF(workflowData) {
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.

No validation that required Anthropic WIF fields are non-empty when WIF is active — runtime failure will be cryptic.

When isAnthropicWIF returns true, the compiler silently skips secret validation and emits env vars. But all four Anthropic WIF fields (federation-rule-id, organization-id, service-account-id, workspace-id) are optional at parse time. A workflow with only type: github-oidc + provider: anthropic and none of the other fields will compile cleanly but fail at runtime in the OIDC token exchange with no useful error message traced back to frontmatter.

💡 Suggested fix

Add a compile-time check in GetSecretValidationStep (or a new Validate() method called from the compiler) that returns an error if WIF is active but the mandatory identity fields are missing:

func validateAnthropicWIF(workflowData *WorkflowData) error {
    auth := workflowData.EngineConfig.Auth
    var missing []string
    if auth.AnthropicFederationRuleID == "" {
        missing = append(missing, "federation-rule-id")
    }
    if auth.AnthropicOrganizationID == "" {
        missing = append(missing, "organization-id")
    }
    if auth.AnthropicServiceAccountID == "" {
        missing = append(missing, "service-account-id")
    }
    if len(missing) > 0 {
        return fmt.Errorf("engine.auth provider=anthropic requires: %s", strings.Join(missing, ", "))
    }
    return nil
}

@github-actions
Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 80/100 — Excellent

Analyzed 5 test function(s) across 4 files: 5 design tests, 0 implementation tests, 0 guideline violations (mock libraries / missing build tags). Minor warnings: missing assertion messages in several tests.

📊 Metrics & Test Classification (5 tests analyzed)
Metric Value
New/modified tests analyzed 5
✅ Design tests (behavioral contracts) 5 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 5 (100%)
Duplicate test clusters 0
Test inflation detected Yes — claude_engine_test.go (69 additions vs 20 in prod, 3.45:1)
🚨 Coding-guideline violations 0 (no mock libraries, all build tags present)

Test Classification Details

Test File Classification Issues Detected
TestIsAnthropicWIF pkg/workflow/claude_engine_test.go:936 ✅ Design Missing assertion message on assert.Equal(t, tt.want, got); also non-standard indentation
TestExtractEngineConfig_EngineEnvTakesPrecedenceOverEngineAuth pkg/workflow/engine_config_test.go:420 ✅ Design Missing assertion messages on assert.Equal calls
TestExtractEngineConfig_AnthropicWIFMapsToAWFEnv pkg/workflow/engine_config_test.go:441 ✅ Design Missing assertion messages on assert.Equal / assert.NotNil calls
TestGetRequiredSecretNames_Claude (WIF sub-tests) pkg/workflow/engine_helpers_secrets_test.go:225 ✅ Design Missing assertion messages on assert.NotContains / assert.Contains
TestClaudeEngineWIFSkipsSecretValidation pkg/workflow/secret_validation_test.go:114 ✅ Design None

Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 5 tests — unit (//go:build !integration)
  • 🟨 JavaScript (*.test.cjs, *.test.js): 0 tests
⚠️ Flagged Tests — Non-blocking Warnings (4 issues)

⚠️ TestIsAnthropicWIF (pkg/workflow/claude_engine_test.go:936)

Classification: Design test
Issue: The table-driven runner uses assert.Equal(t, tt.want, got) with no message argument. When a row fails, the output won't identify which case failed without manually counting rows. Also, the struct literal for test cases is missing tab indentation (non-standard formatting).
Suggested improvement: Add a message: assert.Equal(t, tt.want, got, "isAnthropicWIF(%s)", tt.name). Run make fmt to fix indentation.


⚠️ TestExtractEngineConfig_EngineEnvTakesPrecedenceOverEngineAuth (pkg/workflow/engine_config_test.go:420)

Classification: Design test
Issue: assert.Equal(t, "static", config.Env["AWF_AUTH_TYPE"]) and the companion call have no message, so failures report only raw values with no context.
Suggested improvement: assert.Equal(t, "static", config.Env["AWF_AUTH_TYPE"], "engine.env should take precedence over engine.auth for AWF_AUTH_TYPE")


⚠️ TestExtractEngineConfig_AnthropicWIFMapsToAWFEnv (pkg/workflow/engine_config_test.go:441)

Classification: Design test
Issue: All six assert.Equal calls mapping Anthropic WIF fields to AWF_AUTH_* env vars lack a message argument.
Suggested improvement: Add field names as message strings, e.g. assert.Equal(t, "fr_01ABC", config.Env["AWF_AUTH_ANTHROPIC_FEDERATION_RULE_ID"], "federation rule ID env var")


⚠️ WIF sub-tests in TestGetRequiredSecretNames_Claude (pkg/workflow/engine_helpers_secrets_test.go:239)

Classification: Design test
Issue: assert.NotContains and assert.Contains calls have no message argument.
Suggested improvement: assert.NotContains(t, secrets, "ANTHROPIC_API_KEY", "WIF should suppress ANTHROPIC_API_KEY from required secrets")

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). All 5 new tests enforce real behavioral contracts for the Anthropic WIF feature. The 4 flagged items are assertion-message style warnings (non-blocking) and a formatting issue in TestIsAnthropicWIF.

📖 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.

References:

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

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: 80/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). All 5 new tests enforce real behavioral contracts for the Anthropic WIF feature. Minor non-blocking warnings: missing assertion messages in 4 tests and a formatting issue in TestIsAnthropicWIF.

@github-actions
Copy link
Copy Markdown
Contributor

@copilot refresh the branch, rerun the failing checks, and summarize any remaining blockers.

Generated by 👨‍🍳 PR Sous Chef · gpt54 11.5M ·

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot review all comments and reviews from copilot and github-actions actor. lint go.

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

Copilot AI commented May 30, 2026

@copilot review all comments and reviews from copilot and github-actions actor. lint go.

Fixed and pushed in cbd3c35: gofmt was applied to pkg/workflow/claude_engine_test.go (the table block in TestClaudeEngineGetSecretValidationStep). I then ran make lint and go test ./pkg/workflow, both passing.

Copilot AI requested a review from pelikhan May 30, 2026 16:42
@github-actions
Copy link
Copy Markdown
Contributor

@copilot review all comments and address unresolved review feedback. Please fix lint-go, summarize remaining blockers, and rerun checks.

Generated by 👨‍🍳 PR Sous Chef · gpt54 24.3M ·

@pelikhan pelikhan merged commit a465cab into main May 30, 2026
@pelikhan pelikhan deleted the copilot/awf-compiler-anthropic-wif-support branch May 30, 2026 17:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[awf] Compiler lacks Anthropic WIF support — EngineAuthConfig and ClaudeEngine need extension

4 participants