Skip to content

docs(adr): 0022 — spaces-key plan Tasks 5+6 land as no-op confirmation#586

Merged
intel352 merged 1 commit into
mainfrom
docs/adr-0022-tasks-5-6-no-op
May 9, 2026
Merged

docs(adr): 0022 — spaces-key plan Tasks 5+6 land as no-op confirmation#586
intel352 merged 1 commit into
mainfrom
docs/adr-0022-tasks-5-6-no-op

Conversation

@intel352
Copy link
Copy Markdown
Contributor

@intel352 intel352 commented May 9, 2026

Summary

Closes Tasks 5+6 of the spaces-key-iac-resource plan as a no-op confirmation. The planned migration of core-dump/infra.yaml from a two-entry provider_credential schema to canonical single-entry was already done in a prior PR (#190 TC1 cutover or #194 TC2 cutover) before the plan was authored.

This PR is just the durable record (ADR 0022) of that resolution per the user's 1(a) direction.

Smoke evidence

$ /tmp/wfctl infra align --strict -c infra.yaml --env staging
## wfctl infra align

No alignment issues found.
$ echo $?
0

(/tmp/wfctl built from feat/r-a9-error branch, commit 288f68d7, which is the R-A9-as-error change merged in PR #583.)

Reading core-dump/infra.yaml at origin/main HEAD 3bb46833 lines 32-36 confirms canonical single-entry shape:

```yaml
secrets:
generate:
- key: SPACES
type: provider_credential
source: digitalocean.spaces
name: coredump-deploy-key
```

What's protecting against regression going forward

PR1 (workflow #583, merged) flipped R-A9 from WARN to ERROR. Any future reintroduction of the two-entry shape in any infra.yaml will hit ERROR R-A9 from wfctl infra align --strict, exit code 1, before plan/apply ever touches the cloud. PR0 (workflow #581, merged) added wfctl infra audit-secrets as the proactive companion check. Together they cover the same attack surface Tasks 5+6 were originally going to fix manually — at lint time, going forward, for any caller.

Lessons captured in the ADR

  • Planner blind spot: design phase assumed file shape from operator memory rather than re-verifying against origin/main HEAD at plan-write time.
  • Mitigation: before locking a plan that mutates files in another repo, run a freshness check (git fetch origin main && grep -A 10 '<target-block>' <file>) and paste actual BEFORE state into the plan.
  • Two implementers (team-lead + me) initially read the file from stale local branches and asserted the broken shape was still there. Re-fetch before claiming what's at HEAD.

Test plan

  • ADR 0022 file added under decisions/ matching in-tree format (5 H2 sections: Context / Decision / Consequences / Alternatives considered / Lessons / Related)
  • Smoke: wfctl infra align --strict against core-dump/infra.yaml HEAD 3bb46833 → exit 0, no findings
  • No code change in any non-decisions/ path
  • CI green (lint + format checks for markdown, no Go affected)

🤖 Generated with Claude Code

Records the closeout for Tasks 5+6 of the spaces-key-iac-resource plan
(docs/plans/2026-05-08-spaces-key-iac-resource.md, commit 316559f7).

The plan's PR2 was specified as a migration of core-dump/infra.yaml from
a two-entry SPACES_access_key/SPACES_secret_key provider_credential
schema to canonical single-entry. At impl time, verification against
origin/main HEAD 3bb46833 showed the file already had the canonical
shape — the migration had landed in PR #190 (TC1 cutover) or PR #194
(TC2 cutover) before the plan was authored.

Smoke-confirmed: `wfctl infra align --strict -c infra.yaml --env staging`
returns exit 0 with "No alignment issues found." — no R-A9 firing
because there's nothing to fire on.

Tasks 5+6 are marked completed as a no-op confirmation. PR1's R-A9
severity flip (workflow #583, merged) provides the ongoing regression
protection: any future reintroduction of the two-entry shape will hit
ERROR R-A9 at align-strict time, exit 1.

ADR also captures the planner-blindspot lesson (operator memory about
file shapes is unreliable; re-fetch origin/main before locking a plan
that mutates external repo files) for the post-merge retro.

Per team-lead's user-direction routing of the (a/b/c) options I had
surfaced.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 9, 2026 07:44
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 ADR 0022 to document that “spaces-key-iac-resource” plan Tasks 5+6 (intended core-dump/infra.yaml migration) were already completed in earlier cutover PRs, so the planned PR2 lands as a no-op confirmation.

Changes:

  • Add a new ADR under decisions/ explaining the no-op resolution for Tasks 5+6 and the evidence (wfctl infra align --strict pass) supporting it.
  • Capture lessons learned about re-verifying origin/main HEAD before locking plans that mutate external repos.

@@ -0,0 +1,192 @@
# 0022: Spaces-key plan Tasks 5+6 land as no-op confirmation
Comment on lines +90 to +94
the two-entry pattern in any `infra.yaml` will hit
`ERROR R-A9: provider_credential key %q ends in %q; use canonical %q
(auto-derives sub-keys via providerCredentialSubKeys[%q])` from
`wfctl infra align --strict`, exit code 1, before the bad shape
ever touches `wfctl infra plan` or apply.
@intel352 intel352 merged commit 3f6e870 into main May 9, 2026
22 checks passed
@intel352 intel352 deleted the docs/adr-0022-tasks-5-6-no-op branch May 9, 2026 07:55
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 9, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:260: parsing iteration count: invalid syntax
baseline-bench.txt:429054: parsing iteration count: invalid syntax
baseline-bench.txt:811897: parsing iteration count: invalid syntax
baseline-bench.txt:1222085: parsing iteration count: invalid syntax
baseline-bench.txt:1582113: parsing iteration count: invalid syntax
baseline-bench.txt:1998577: parsing iteration count: invalid syntax
benchmark-results.txt:260: parsing iteration count: invalid syntax
benchmark-results.txt:426852: parsing iteration count: invalid syntax
benchmark-results.txt:844987: parsing iteration count: invalid syntax
benchmark-results.txt:1250180: parsing iteration count: invalid syntax
benchmark-results.txt:1659084: parsing iteration count: invalid syntax
benchmark-results.txt:2087593: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 9V74 80-Core Processor                
                            │ baseline-bench.txt │        benchmark-results.txt        │
                            │       sec/op       │    sec/op      vs base              │
InterpreterCreation-4               2.775m ± 95%   2.593m ± 183%       ~ (p=0.937 n=6)
ComponentLoad-4                     2.682m ±  4%   2.706m ±   2%       ~ (p=0.180 n=6)
ComponentExecute-4                  1.416µ ±  0%   1.414µ ±   2%       ~ (p=0.370 n=6)
PoolContention/workers-1-4          781.9n ±  2%   782.5n ±   2%       ~ (p=0.667 n=6)
PoolContention/workers-2-4          785.7n ±  1%   780.0n ±   2%       ~ (p=0.589 n=6)
PoolContention/workers-4-4          783.2n ±  1%   779.4n ±   1%       ~ (p=0.290 n=6)
PoolContention/workers-8-4          781.2n ±  3%   779.6n ±   1%       ~ (p=0.818 n=6)
PoolContention/workers-16-4         784.8n ±  1%   781.9n ±   1%       ~ (p=0.485 n=6)
ComponentLifecycle-4                2.695m ±  0%   2.718m ±   0%  +0.88% (p=0.002 n=6)
SourceValidation-4                  1.612µ ±  1%   1.629µ ±   0%  +1.05% (p=0.004 n=6)
RegistryConcurrent-4                579.4n ±  6%   593.9n ±   4%       ~ (p=0.394 n=6)
LoaderLoadFromString-4              2.723m ±  0%   2.801m ±   3%  +2.88% (p=0.002 n=6)
geomean                             12.90µ         12.90µ         -0.04%

                            │ baseline-bench.txt │        benchmark-results.txt         │
                            │        B/op        │     B/op      vs base                │
InterpreterCreation-4               2.027Mi ± 0%   2.027Mi ± 0%       ~ (p=0.606 n=6)
ComponentLoad-4                     2.180Mi ± 0%   2.180Mi ± 0%       ~ (p=0.387 n=6)
ComponentExecute-4                  1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-1-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-2-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-4-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-8-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-16-4         1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
ComponentLifecycle-4                2.183Mi ± 0%   2.183Mi ± 0%       ~ (p=0.368 n=6)
SourceValidation-4                  1.984Ki ± 0%   1.984Ki ± 0%       ~ (p=1.000 n=6) ¹
RegistryConcurrent-4                1.133Ki ± 0%   1.133Ki ± 0%       ~ (p=1.000 n=6) ¹
LoaderLoadFromString-4              2.182Mi ± 0%   2.182Mi ± 0%       ~ (p=0.087 n=6)
geomean                             15.25Ki        15.25Ki       -0.00%
¹ all samples are equal

                            │ baseline-bench.txt │        benchmark-results.txt        │
                            │     allocs/op      │  allocs/op   vs base                │
InterpreterCreation-4                15.68k ± 0%   15.68k ± 0%       ~ (p=1.000 n=6) ¹
ComponentLoad-4                      18.02k ± 0%   18.02k ± 0%       ~ (p=1.000 n=6)
ComponentExecute-4                    25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-1-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-2-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-4-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-8-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-16-4           25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
ComponentLifecycle-4                 18.07k ± 0%   18.07k ± 0%       ~ (p=1.000 n=6) ¹
SourceValidation-4                    32.00 ± 0%    32.00 ± 0%       ~ (p=1.000 n=6) ¹
RegistryConcurrent-4                  2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
LoaderLoadFromString-4               18.06k ± 0%   18.06k ± 0%       ~ (p=1.000 n=6)
geomean                               183.3         183.3       +0.00%
¹ all samples are equal

pkg: github.com/GoCodeAlone/workflow/middleware
                                  │ baseline-bench.txt │       benchmark-results.txt       │
                                  │       sec/op       │   sec/op     vs base              │
CircuitBreakerDetection-4                  230.9n ± 0%   230.2n ± 2%       ~ (p=0.082 n=6)
CircuitBreakerExecution_Success-4          17.59n ± 1%   17.59n ± 0%       ~ (p=0.729 n=6)
CircuitBreakerExecution_Failure-4          55.17n ± 0%   55.19n ± 0%       ~ (p=0.907 n=6)
geomean                                    60.73n        60.69n       -0.07%

                                  │ baseline-bench.txt │       benchmark-results.txt        │
                                  │        B/op        │    B/op     vs base                │
CircuitBreakerDetection-4                 144.0 ± 0%     144.0 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Success-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Failure-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                              ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │       benchmark-results.txt        │
                                  │     allocs/op      │ allocs/op   vs base                │
CircuitBreakerDetection-4                 1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Success-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Failure-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                              ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
                                 │ baseline-bench.txt │       benchmark-results.txt        │
                                 │       sec/op       │    sec/op     vs base              │
JQTransform_Simple-4                     643.3n ± 23%   642.2n ± 33%       ~ (p=0.937 n=6)
JQTransform_ObjectConstruction-4         1.079µ ±  3%   1.076µ ±  0%       ~ (p=0.225 n=6)
JQTransform_ArraySelect-4                2.601µ ±  0%   2.566µ ±  1%  -1.35% (p=0.002 n=6)
JQTransform_Complex-4                    31.30µ ±  0%   31.31µ ±  0%       ~ (p=0.699 n=6)
JQTransform_Throughput-4                 1.300µ ±  0%   1.294µ ±  1%  -0.42% (p=0.039 n=6)
SSEPublishDelivery-4                     48.89n ±  1%   48.97n ±  2%       ~ (p=0.485 n=6)
geomean                                  1.237µ         1.233µ        -0.34%

                                 │ baseline-bench.txt │        benchmark-results.txt         │
                                 │        B/op        │     B/op      vs base                │
JQTransform_Simple-4                   1.273Ki ± 0%     1.273Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ObjectConstruction-4       1.773Ki ± 0%     1.773Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ArraySelect-4              2.625Ki ± 0%     2.625Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Complex-4                  16.22Ki ± 0%     16.22Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Throughput-4               1.984Ki ± 0%     1.984Ki ± 0%       ~ (p=1.000 n=6) ¹
SSEPublishDelivery-4                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                             ²                 +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │       benchmark-results.txt        │
                                 │     allocs/op      │ allocs/op   vs base                │
JQTransform_Simple-4                     10.00 ± 0%     10.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ObjectConstruction-4         15.00 ± 0%     15.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ArraySelect-4                30.00 ± 0%     30.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Complex-4                    324.0 ± 0%     324.0 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Throughput-4                 17.00 ± 0%     17.00 ± 0%       ~ (p=1.000 n=6) ¹
SSEPublishDelivery-4                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                             ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
                                    │ baseline-bench.txt │       benchmark-results.txt       │
                                    │       sec/op       │   sec/op     vs base              │
SchemaValidation_Simple-4                   865.6n ± 17%   850.0n ± 5%       ~ (p=0.394 n=6)
SchemaValidation_AllFields-4                1.258µ ±  7%   1.260µ ± 2%       ~ (p=0.937 n=6)
SchemaValidation_FormatValidation-4         1.231µ ±  5%   1.228µ ± 1%       ~ (p=0.851 n=6)
SchemaValidation_ManySchemas-4              1.232µ ±  2%   1.236µ ± 1%       ~ (p=0.792 n=6)
geomean                                     1.134µ         1.129µ       -0.41%

                                    │ baseline-bench.txt │       benchmark-results.txt        │
                                    │        B/op        │    B/op     vs base                │
SchemaValidation_Simple-4                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_AllFields-4                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_FormatValidation-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_ManySchemas-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │       benchmark-results.txt        │
                                    │     allocs/op      │ allocs/op   vs base                │
SchemaValidation_Simple-4                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_AllFields-4                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_FormatValidation-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_ManySchemas-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
                                   │ baseline-bench.txt │        benchmark-results.txt        │
                                   │       sec/op       │    sec/op     vs base               │
EventStoreAppend_InMemory-4                737.6n ±  8%   760.0n ±  9%        ~ (p=0.485 n=6)
EventStoreAppend_SQLite-4                  1.764m ± 53%   2.192m ± 79%        ~ (p=0.589 n=6)
GetTimeline_InMemory/events-10-4          10.455µ ±  8%   7.707µ ± 28%  -26.28% (p=0.004 n=6)
GetTimeline_InMemory/events-50-4           44.28µ ±  2%   42.74µ ±  1%   -3.48% (p=0.002 n=6)
GetTimeline_InMemory/events-100-4          89.32µ ±  1%   85.45µ ±  1%   -4.33% (p=0.002 n=6)
GetTimeline_InMemory/events-500-4          458.2µ ±  0%   433.7µ ±  3%   -5.35% (p=0.002 n=6)
GetTimeline_InMemory/events-1000-4         939.0µ ±  3%   881.3µ ±  0%   -6.15% (p=0.002 n=6)
GetTimeline_SQLite/events-10-4             67.02µ ±  1%   64.39µ ±  1%   -3.93% (p=0.002 n=6)
GetTimeline_SQLite/events-50-4             175.6µ ±  1%   170.4µ ±  0%   -2.98% (p=0.002 n=6)
GetTimeline_SQLite/events-100-4            309.8µ ±  1%   298.8µ ±  0%   -3.57% (p=0.002 n=6)
GetTimeline_SQLite/events-500-4            1.359m ±  1%   1.302m ±  1%   -4.15% (p=0.002 n=6)
GetTimeline_SQLite/events-1000-4           2.619m ±  1%   2.528m ±  1%   -3.46% (p=0.002 n=6)
geomean                                    160.9µ         155.1µ         -3.60%

                                   │ baseline-bench.txt │        benchmark-results.txt         │
                                   │        B/op        │     B/op      vs base                │
EventStoreAppend_InMemory-4                 848.5 ± 12%     860.5 ± 3%       ~ (p=0.699 n=6)
EventStoreAppend_SQLite-4                 1.984Ki ±  2%   1.984Ki ± 1%       ~ (p=0.716 n=6)
GetTimeline_InMemory/events-10-4          7.953Ki ±  0%   7.953Ki ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-50-4          46.62Ki ±  0%   46.62Ki ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-100-4         94.48Ki ±  0%   94.48Ki ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-500-4         472.8Ki ±  0%   472.8Ki ± 0%       ~ (p=1.000 n=6)
GetTimeline_InMemory/events-1000-4        944.3Ki ±  0%   944.3Ki ± 0%       ~ (p=1.000 n=6)
GetTimeline_SQLite/events-10-4            16.74Ki ±  0%   16.74Ki ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-50-4            87.14Ki ±  0%   87.14Ki ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-100-4           175.4Ki ±  0%   175.4Ki ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-500-4           846.1Ki ±  0%   846.1Ki ± 0%  -0.00% (p=0.022 n=6)
GetTimeline_SQLite/events-1000-4          1.639Mi ±  0%   1.639Mi ± 0%       ~ (p=0.294 n=6)
geomean                                   67.75Ki         67.82Ki       +0.12%
¹ all samples are equal

                                   │ baseline-bench.txt │        benchmark-results.txt        │
                                   │     allocs/op      │  allocs/op   vs base                │
EventStoreAppend_InMemory-4                  7.000 ± 0%    7.000 ± 0%       ~ (p=1.000 n=6) ¹
EventStoreAppend_SQLite-4                    53.00 ± 2%    53.00 ± 0%       ~ (p=1.000 n=6)
GetTimeline_InMemory/events-10-4             125.0 ± 0%    125.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-50-4             653.0 ± 0%    653.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-100-4           1.306k ± 0%   1.306k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-500-4           6.514k ± 0%   6.514k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-1000-4          13.02k ± 0%   13.02k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-10-4               382.0 ± 0%    382.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-50-4              1.852k ± 0%   1.852k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-100-4             3.681k ± 0%   3.681k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-500-4             18.54k ± 0%   18.54k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-1000-4            37.29k ± 0%   37.29k ± 0%       ~ (p=1.000 n=6) ¹
geomean                                     1.162k        1.162k       +0.00%
¹ all samples are equal

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants