fix(provisioner#24 SCAFFOLD): template-asset interface + de-dup cfg.ConfigFiles loop (PR-1 of keystone) #2855

Closed
agent-dev-b wants to merge 1 commits from fix/2845-scaffold into main
Member

PR-1 of the RFC #2843 #24 keystone (per the driver design-owner dispatch). This is the memory-preserving NO-OP SCAFFOLD that the driver will merge first as the clean-no-op contract; PR-A (Gitea fetcher) and PR-B (wire + reconcile) follow on top.

Scaffold semantics: the new TemplateAssetFetcher interface + TemplateIdentity/TemplateAssetFetcher fields on WorkspaceConfig are plumbed but unused by default. The default fetcher (DefaultTemplateAssetFetcher()) returns (nil, nil), so even when assigned, the for-loop in collectCPConfigFiles is a no-op. Zero behavior change, touches no agent files. Self-host callers see no difference.

What this lands:

  • workspace-server/internal/provisioner/template_assets.go (NEW): TemplateAssetFetcher interface + private noopTemplateAssetFetcher + exported DefaultTemplateAssetFetcher() factory. Lint-clean (the type is 'used' via the exported function, avoiding the original 766b6563 defaultTemplateAssetFetcher lint blocker).
  • workspace-server/internal/provisioner/provisioner.go: new TemplateIdentity (string) and TemplateAssetFetcher (interface) fields on WorkspaceConfig. Both zero-valued by default.
  • workspace-server/internal/provisioner/cp_provisioner.go: SCAFFOLD call site in collectCPConfigFiles gated by if cfg.TemplateAssetFetcher != nil && cfg.TemplateIdentity != "". Pre-scaffold behavior preserved (the gate prevents any fetch unless BOTH are set).
  • workspace-server/internal/handlers/workspace_provision.go: de-dup the if cfg.ConfigFiles == nil { cfg.ConfigFiles = make(...) } ceremony at two inject sites (line 425-428 + 475-478). Extracted to ensureConfigFiles(cfg) helper. Behavior-preserving: same allocation pattern, same map identity.

6 new tests (all pass):

  • TestTemplateAssetFetcher_DefaultIsNoop: DefaultTemplateAssetFetcher returns non-nil whose Load returns (nil, nil).
  • TestCollectCPConfigFiles_NilFetcherNoAssets: nil fetcher + empty identity → no fetcher-side assets. Pre-scaffold behavior.
  • TestCollectCPConfigFiles_NoopFetcherStillNoAssets: explicit no-op fetcher assigned + non-empty identity → still no assets. SCAFFOLD is a true no-op.
  • TestCollectCPConfigFiles_GateRejectsEmptyIdentity: spy fetcher + EMPTY identity → Load NOT called. Gate is the load-bearing guard.
  • TestEnsureConfigFiles_AllocatesWhenNil: nil ConfigFiles → allocates + returns the SAME map. mapsSamePointer sentinel-write trick.
  • TestEnsureConfigFiles_ReusesWhenNonNil: non-nil ConfigFiles → returns the SAME map. Pre-populated entries preserved.

Compile-time pin: var _ = WorkspaceConfig{TemplateIdentity: "", TemplateAssetFetcher: nil} in the scaffold test — a future refactor that removes the SCAFFOLD fields would break the compile.

Local validation:

  • go test ./internal/provisioner/ — clean (0.09s, all 4 new SCAFFOLD tests pass + all existing)
  • go test ./internal/handlers/ — clean (25.4s, all 2 new de-dup tests pass + all existing)
  • go vet + go build — clean
  • golangci-lint not runnable locally (Go 1.22 build of the linter vs Go 1.25 target mismatch); CI will run the official Platform Go job

Auth pattern honored: all Gitea API calls used ${GIT_HTTP_PASSWORD} / ${GITEA_ISSUE_TOKEN} env vars in -H headers (no curl -u).

Diff stat: 4 modified + 2 new = 6 files, +290 / -6.

Closes #2845 in the sense that this IS the cleaned memory-preserving scaffold per the dispatch. The driver should:

  1. Close #2845 (or re-point it to this branch) as superseded-by-scaffold
  2. Merge this SCAFFOLD PR as the clean no-op contract
  3. Land PR-A (Gitea fetcher) + PR-B (wire + reconcile) on top of this branch

Refs RFC #2843 #24, keystone plan, PR #2845 (this replaces it as the SCAFFOLD per the dispatch).

PR-1 of the RFC #2843 #24 keystone (per the driver design-owner dispatch). This is the **memory-preserving NO-OP SCAFFOLD** that the driver will merge first as the clean-no-op contract; PR-A (Gitea fetcher) and PR-B (wire + reconcile) follow on top. **Scaffold semantics:** the new `TemplateAssetFetcher` interface + `TemplateIdentity`/`TemplateAssetFetcher` fields on `WorkspaceConfig` are plumbed but unused by default. The default fetcher (`DefaultTemplateAssetFetcher()`) returns `(nil, nil)`, so even when assigned, the for-loop in `collectCPConfigFiles` is a no-op. **Zero behavior change, touches no agent files.** Self-host callers see no difference. **What this lands:** - `workspace-server/internal/provisioner/template_assets.go` (NEW): `TemplateAssetFetcher` interface + private `noopTemplateAssetFetcher` + exported `DefaultTemplateAssetFetcher()` factory. Lint-clean (the type is 'used' via the exported function, avoiding the original 766b6563 `defaultTemplateAssetFetcher` lint blocker). - `workspace-server/internal/provisioner/provisioner.go`: new `TemplateIdentity` (string) and `TemplateAssetFetcher` (interface) fields on `WorkspaceConfig`. Both zero-valued by default. - `workspace-server/internal/provisioner/cp_provisioner.go`: SCAFFOLD call site in `collectCPConfigFiles` gated by `if cfg.TemplateAssetFetcher != nil && cfg.TemplateIdentity != ""`. Pre-scaffold behavior preserved (the gate prevents any fetch unless BOTH are set). - `workspace-server/internal/handlers/workspace_provision.go`: de-dup the `if cfg.ConfigFiles == nil { cfg.ConfigFiles = make(...) }` ceremony at two inject sites (line 425-428 + 475-478). Extracted to `ensureConfigFiles(cfg)` helper. Behavior-preserving: same allocation pattern, same map identity. **6 new tests (all pass):** - `TestTemplateAssetFetcher_DefaultIsNoop`: DefaultTemplateAssetFetcher returns non-nil whose Load returns (nil, nil). - `TestCollectCPConfigFiles_NilFetcherNoAssets`: nil fetcher + empty identity → no fetcher-side assets. Pre-scaffold behavior. - `TestCollectCPConfigFiles_NoopFetcherStillNoAssets`: explicit no-op fetcher assigned + non-empty identity → still no assets. SCAFFOLD is a true no-op. - `TestCollectCPConfigFiles_GateRejectsEmptyIdentity`: spy fetcher + EMPTY identity → Load NOT called. Gate is the load-bearing guard. - `TestEnsureConfigFiles_AllocatesWhenNil`: nil ConfigFiles → allocates + returns the SAME map. `mapsSamePointer` sentinel-write trick. - `TestEnsureConfigFiles_ReusesWhenNonNil`: non-nil ConfigFiles → returns the SAME map. Pre-populated entries preserved. Compile-time pin: `var _ = WorkspaceConfig{TemplateIdentity: "", TemplateAssetFetcher: nil}` in the scaffold test — a future refactor that removes the SCAFFOLD fields would break the compile. **Local validation:** - `go test ./internal/provisioner/` — clean (0.09s, all 4 new SCAFFOLD tests pass + all existing) - `go test ./internal/handlers/` — clean (25.4s, all 2 new de-dup tests pass + all existing) - `go vet + go build` — clean - golangci-lint not runnable locally (Go 1.22 build of the linter vs Go 1.25 target mismatch); CI will run the official Platform Go job **Auth pattern honored:** all Gitea API calls used `${GIT_HTTP_PASSWORD}` / `${GITEA_ISSUE_TOKEN}` env vars in `-H` headers (no `curl -u`). **Diff stat:** 4 modified + 2 new = 6 files, +290 / -6. **Closes #2845** in the sense that this IS the cleaned memory-preserving scaffold per the dispatch. The driver should: 1. Close #2845 (or re-point it to this branch) as superseded-by-scaffold 2. Merge this SCAFFOLD PR as the clean no-op contract 3. Land PR-A (Gitea fetcher) + PR-B (wire + reconcile) on top of this branch Refs RFC #2843 #24, keystone plan, PR #2845 (this replaces it as the SCAFFOLD per the dispatch).
agent-dev-b added 1 commit 2026-06-14 14:52:41 +00:00
fix(provisioner#24 SCAFFOLD): template-asset interface + de-dup cfg.ConfigFiles loop
CI / Python Lint & Test (pull_request) Successful in 5s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 7s
sop-checklist / review-refire (pull_request_target) Has been skipped
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 5s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Harness Replays / detect-changes (pull_request) Successful in 7s
CI / Detect changes (pull_request) Successful in 12s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 7s
E2E Peer Visibility (literal MCP list_peers) / detect-changes (pull_request) Successful in 10s
Harness Replays / Harness Replays (pull_request) Successful in 2s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 12s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Has been skipped
qa-review / approved (pull_request_target) Failing after 8s
E2E Chat / detect-changes (pull_request) Successful in 15s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
CI / Shellcheck (E2E scripts) (pull_request) Successful in 1s
CI / Canvas (Next.js) (pull_request) Successful in 2s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 10s
security-review / approved (pull_request_target) Failing after 10s
gate-check-v3 / gate-check (pull_request_target) Failing after 12s
CI / Canvas Deploy Status (pull_request) Successful in 1s
reserved-path-review / reserved-path-review (pull_request_target) Successful in 12s
E2E Chat / E2E Chat (pull_request) Successful in 3s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 17s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Successful in 6s
E2E API Smoke Test / detect-changes (pull_request) Successful in 21s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 20s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 4s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 41s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 42s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Failing after 2m0s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2m27s
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge user_tasks (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Workspace Requests (core#2606) (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Creates Workspace (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Platform Agent (pull_request) Has been skipped
CI / Platform (Go) (pull_request) Successful in 3m29s
CI / all-required (pull_request) Successful in 4s
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Failing after 14s
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge (compile+skip) (pull_request) Successful in 21s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 23s
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Failing after 5m56s
audit-force-merge / audit (pull_request_target) Has been skipped
f2b242225f
CLEAN PR #2845 to a mergeable memory-preserving NO-OP scaffold
per the keystone plan: fix the Platform Go lint (already clean
on this head — no unused defaultTemplateAssetFetcher stub),
de-dup the cfg.ConfigFiles init ceremony across the two
inject sites, and add the SCAFFOLD interface + fields for the
Gitea fetcher that PR-A will provide. The stub Load returns
nil (zero behavior change, touches no agent files). PR-A
and PR-B will land the real impl + wire-up on top of this
scaffold.

WHAT THIS LANDS:
- NEW workspace-server/internal/provisioner/template_assets.go:
  - TemplateAssetFetcher interface (Load(ctx, templateIdentity)
    → (map[relpath][]byte, error))
  - noopTemplateAssetFetcher type (private; the 'stub' —
    Load returns (nil, nil))
  - DefaultTemplateAssetFetcher() exported factory returning
    a no-op fetcher (lint-clean: the type is 'used' via the
    exported function, avoiding the original 766b6563 lint
    blocker)
  - Full doc-comments explaining the SCAFFOLD semantics and
    pointing to PR-A / PR-B for the real impl

- workspace-server/internal/provisioner/provisioner.go:
  - New fields on WorkspaceConfig: TemplateIdentity (string)
    and TemplateAssetFetcher (interface). Both zero-valued
    by default; callers leave them empty for self-host.

- workspace-server/internal/provisioner/cp_provisioner.go:
  - New SCAFFOLD call site in collectCPConfigFiles: gated by
    'if cfg.TemplateAssetFetcher != nil && cfg.TemplateIdentity !=
    ""', so the pre-scaffold behavior is preserved (no fetch
    happens unless BOTH are set). The DefaultTemplateAssetFetcher
    returns (nil, nil) so even when the field is assigned to
    the no-op default, the for-loop over the asset map is a
    no-op. Fail-closed on transport/resolve errors.

- workspace-server/internal/handlers/workspace_provision.go:
  - De-dup the cfg.ConfigFiles nil-check + make() ceremony
    that's repeated in issueAndInjectToken (line 425-428) and
    issueAndInjectInboundSecret (line 475-478). Extracted
    to ensureConfigFiles(cfg) helper: allocates on demand,
    returns the same map for caller-visibility. Behavior-
    preserving: same allocation pattern, same map identity,
    same nil-check semantics. The two call sites now read
    'ensureConfigFiles(cfg)[".auth_token"] = []byte(token)'
    instead of the 4-line 'if nil { make }' ceremony.

NEW TESTS (6 — all pass):
- TestTemplateAssetFetcher_DefaultIsNoop: DefaultTemplateAssetFetcher
  returns a non-nil interface value whose Load returns (nil, nil).
- TestCollectCPConfigFiles_NilFetcherNoAssets: nil fetcher + empty
  identity → no fetcher-side assets in the bundle. Pre-scaffold
  behavior preserved (only caller's ConfigFiles present).
- TestCollectCPConfigFiles_NoopFetcherStillNoAssets: explicit
  DefaultTemplateAssetFetcher assigned + non-empty identity → still
  no assets (the no-op returns nil). Proves the SCAFFOLD is a
  true no-op regardless of whether the field is nil or assigned.
- TestCollectCPConfigFiles_GateRejectsEmptyIdentity: spy fetcher
  + EMPTY identity → Load NOT called (the gate is the load-
  bearing guard). A real fetcher would record the call; the
  SCAFFOLD's gate prevents it.
- TestEnsureConfigFiles_AllocatesWhenNil: nil ConfigFiles →
  ensureConfigFiles allocates + returns the SAME map. The
  mapsSamePointer sentinel-write trick verifies the same-map
  contract.
- TestEnsureConfigFiles_ReusesWhenNonNil: non-nil ConfigFiles →
  ensureConfigFiles returns the SAME map (no copy). Pre-populated
  entries preserved.

Compile-time pin in template_assets_scaffold_test.go:
- 'var _ = WorkspaceConfig{TemplateIdentity: "", TemplateAssetFetcher: nil}'
  Catches a future refactor that removes the SCAFFOLD fields.

LOCAL VALIDATION:
- go test ./internal/provisioner/  -> clean (0.09s, all 4 new
  SCAFFOLD tests pass + all existing)
- go test ./internal/handlers/     -> clean (25.4s, all 2 new
  de-dup tests pass + all existing)
- go vet ./...                     -> clean
- go build ./...                   -> clean
- (golangci-lint not runnable locally — Go 1.22 build of the
  linter vs Go 1.25 target mismatch; CI will run the official
  Platform Go job)

Refs #24 (RFC #2843), PR #2845 (this is the cleaned
memory-preserving SCAFFOLD per the keystone plan; PR-A
(Gitea fetcher) and PR-B (wire + reconcile) follow).
Diff stat: 4 modified + 2 new = 6 files, +290 / -6.
agent-dev-b requested review from agent-researcher 2026-06-14 14:52:59 +00:00
agent-dev-b requested review from agent-reviewer-cr2 2026-06-14 14:52:59 +00:00
agent-dev-b closed this pull request 2026-06-14 15:02:29 +00:00
Author
Member

Closing per PM reconcile (1bcb2e75 keystone-structure call): #2845 was MERGED at 14:51:11Z (acbc0da9) — the full channel impl (interface + IsCPTemplateAssetPath + transport split + 16MiB cap + tests). This SCAFFOLD PR was built off origin/main 5c0ee9fa BEFORE the merge landed, so most of its content is now redundant (the interface + fields + call site are all in main).

Preserved value: the ensureConfigFiles de-dup helper in workspace_provision.go is an orthogonal cleanup (the cfg.ConfigFiles nil-check + make() ceremony at line 425 + 475 on origin/main was not touched by #2845). Landing that as a separate tiny low-pri PR.

Dropped: the noopTemplateAssetFetcher + DefaultTemplateAssetFetcher() factory — PM note: PR-B defines fetcher selection, so the noop is no longer needed.

Pivoting to PR-B (real Gitea fetcher + wire + #25 reconcile + Infisical token + e2e, no stubs) on merged main. No further pushes from this branch.

Closing per PM reconcile (1bcb2e75 keystone-structure call): #2845 was MERGED at 14:51:11Z (acbc0da9) — the full channel impl (interface + IsCPTemplateAssetPath + transport split + 16MiB cap + tests). This SCAFFOLD PR was built off origin/main 5c0ee9fa BEFORE the merge landed, so most of its content is now redundant (the interface + fields + call site are all in main). Preserved value: the `ensureConfigFiles` de-dup helper in `workspace_provision.go` is an orthogonal cleanup (the cfg.ConfigFiles nil-check + make() ceremony at line 425 + 475 on origin/main was not touched by #2845). Landing that as a separate tiny low-pri PR. Dropped: the `noopTemplateAssetFetcher` + `DefaultTemplateAssetFetcher()` factory — PM note: PR-B defines fetcher selection, so the noop is no longer needed. Pivoting to PR-B (real Gitea fetcher + wire + #25 reconcile + Infisical token + e2e, no stubs) on merged main. No further pushes from this branch.
Author
Member

Closing rationale (per driver keystone reconcile 2026-06-14): superseded by the merged #2845 (acbc0da9). The interface, IsCPTemplateAssetPath allowlist, WorkspaceConfig.TemplateIdentity/TemplateAssetFetcher fields, gated call site in collectCPConfigFiles, transport split (TemplateAssets vs ConfigFiles), 16 MiB cap, and tests are all already merged in #2845.

The ensureConfigFiles de-dup and the noopTemplateAssetFetcher/factory are NOT re-landed here — they belong in their proper homes (de-dup: tiny standalone PR; fetcher selection: PR-B).

Branch fix/2855-template-asset-scaffold (head f2b24222) is PRESERVED (no delete/force-push) per the keystone reconcile rules.

Closing rationale (per driver keystone reconcile 2026-06-14): superseded by the merged #2845 (acbc0da9). The interface, IsCPTemplateAssetPath allowlist, WorkspaceConfig.TemplateIdentity/TemplateAssetFetcher fields, gated call site in collectCPConfigFiles, transport split (TemplateAssets vs ConfigFiles), 16 MiB cap, and tests are all already merged in #2845. The ensureConfigFiles de-dup and the noopTemplateAssetFetcher/factory are NOT re-landed here — they belong in their proper homes (de-dup: tiny standalone PR; fetcher selection: PR-B). Branch fix/2855-template-asset-scaffold (head f2b24222) is PRESERVED (no delete/force-push) per the keystone reconcile rules.
Some optional checks failed
CI / Python Lint & Test (pull_request) Successful in 5s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 7s
sop-checklist / review-refire (pull_request_target) Has been skipped
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 5s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Harness Replays / detect-changes (pull_request) Successful in 7s
CI / Detect changes (pull_request) Successful in 12s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 7s
Required
Details
E2E Peer Visibility (literal MCP list_peers) / detect-changes (pull_request) Successful in 10s
Harness Replays / Harness Replays (pull_request) Successful in 2s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 12s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Has been skipped
qa-review / approved (pull_request_target) Failing after 8s
E2E Chat / detect-changes (pull_request) Successful in 15s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
CI / Shellcheck (E2E scripts) (pull_request) Successful in 1s
CI / Canvas (Next.js) (pull_request) Successful in 2s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 10s
security-review / approved (pull_request_target) Failing after 10s
gate-check-v3 / gate-check (pull_request_target) Failing after 12s
CI / Canvas Deploy Status (pull_request) Successful in 1s
reserved-path-review / reserved-path-review (pull_request_target) Successful in 12s
E2E Chat / E2E Chat (pull_request) Successful in 3s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 17s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Successful in 6s
Required
Details
E2E API Smoke Test / detect-changes (pull_request) Successful in 21s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 20s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 4s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 41s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 42s
Required
Details
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Failing after 2m0s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2m27s
Required
Details
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge user_tasks (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Workspace Requests (core#2606) (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Creates Workspace (pull_request) Has been skipped
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Platform Agent (pull_request) Has been skipped
CI / Platform (Go) (pull_request) Successful in 3m29s
CI / all-required (pull_request) Successful in 4s
Required
Details
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Failing after 14s
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge (compile+skip) (pull_request) Successful in 21s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 23s
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Failing after 5m56s
audit-force-merge / audit (pull_request_target) Has been skipped

Pull request closed

Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2855