Skip to content

docs(adr): seed ADR home + propose ADR-0001 (CD primitives) and ADR-0002 (auth/secrets) (#167)#177

Merged
ChrisonSimtian merged 3 commits into
mainfrom
docs/167-add-adr-0001-0002
May 25, 2026
Merged

docs(adr): seed ADR home + propose ADR-0001 (CD primitives) and ADR-0002 (auth/secrets) (#167)#177
ChrisonSimtian merged 3 commits into
mainfrom
docs/167-add-adr-0001-0002

Conversation

@ChrisonSimtian
Copy link
Copy Markdown
Owner

Summary

Seeds docs/adr/ as the home for Architecture Decision Records and lands the first two ADRs that frame the v13 CD work — both Proposed, dated 2026-05-24.

File What
docs/adr/README.md Locks MADR-lite format, status lifecycle (Proposed → Accepted / Superseded), NNNN-kebab-case-title.md filename convention, and the rule that ADRs are history (corrections happen via new ADRs, not in-place edits).
docs/adr/0001-cd-primitives-attributes-vs-tasks.md Two-pattern split for CD primitives: attribute → file writer (state in git) vs tasks → REST (state in an external DB), with a sparingly-used hybrid for stable config that lives in an external DB. Validated against GitHub Releases/Environments, Octopus 2019, and the RFC #113 deployment agent.
docs/adr/0002-cross-provider-auth-and-secret-conventions.md Shared auth/secret convention across providers: canonical SCREAMING_SNAKE from PascalCase field names, [Secret] as the trust marker, plugins receive resolved values only (never raw stores), documented resolution chain (CLI > env var > provider secret > encrypted parameters > Keychain > prompt).

Status

Both ADRs land as Proposed. This PR's review is the vehicle that promotes them to Accepted (or supersedes either with a follow-up ADR) — per the convention codified in the new docs/adr/README.md.

Review checklist (from #167)

ADR-0001 — the two patterns split

  • Is the file-shaped vs API-shaped split the right cut? Alternative: collapse everything to tasks, lose the declarative environment story.
  • Hybrid attribute ([GitHubEnvironment], [OctopusProject]) capped at stable config, dynamic stuff in tasks — defensible line, or do we need a sharper rule?
  • Monorepo fan-out sketch (12 agents + 3 UIs + N libraries) — does the inventory-in-static-fields pattern hold up at that scale?
  • Octopus-as-v12-sample-plugin placement — agreed it's the right validation vehicle for the plugin SDK?

ADR-0002 — the resolution chain + naming

  • Canonical SCREAMING_SNAKE from PascalCase field name — locking this in across all providers?
  • Plugins receive resolved values, never raw stores — agreed this is the right trust boundary for v12 SDK?
  • Log masking — ADR flags that no explicit RegisterSensitiveValue / output scrubber appears to be wired to [Secret]. Needs verification before either ADR can move to Accepted. If missing, follow-up framework PR; if present, ADR should cite the file.
  • Windows / Linux CredentialStore — macOS-only today. Non-blocking; surface as a separate issue before plugin authors hit it.
  • Naming escape hatch ([Parameter("custom_name")]) — sufficient for the cases that matter, or do we need provider-side mapping dictionaries?

Cross-cutting

  • Are there CD shapes not sketched that would invalidate either ADR? Specifically: K8s-native (Helm releases, ArgoCD applications), serverless (AWS Lambda, Cloudflare Workers), package-manager promotion (NuGet → public feed gates).

Outcome

  • Either ADR → status Accepted via this PR's review, with the date updated.
  • Or one/both → status Superseded by NNNN, with the replacing ADR explaining the divergence.

Test plan

  • docs/adr/README.md renders on GitHub with the index table pointing at the right files.
  • Internal cross-link from ADR-0002 → ADR-0001 resolves to the relative path.
  • Reviewer confirms the status flip (Proposed → Accepted, or supersedes).

Closes

🤖 Generated with Claude Code

…002 (auth/secrets)

Introduces docs/adr/ as the home for Architecture Decision Records, with a
README that locks the MADR-lite format, status lifecycle, and filename
convention. Adds the first two ADRs — both Proposed, dated 2026-05-24 — as
the architectural framing for the v13 CD work:

- ADR-0001 splits CD primitives into attribute-driven file generators
  (config that lives in git) vs tasks-driven REST calls (state that lives
  in an external system's DB), with a sparingly-used hybrid for stable
  config that lives in an external DB. Validates the split against
  GitHub Releases/Environments, Octopus, and the RFC #113 deployment
  agent.

- ADR-0002 codifies a shared auth/secret convention across providers:
  canonical SCREAMING_SNAKE from PascalCase field names, plugins receive
  resolved values only (never raw stores), [Secret] as the trust marker,
  and a documented resolution chain (CLI > env var > provider secret >
  encrypted parameters > Keychain > prompt).

Lands as Proposed so review (#167) is where the status flips to Accepted
or supersedes either with a follow-up ADR. Per docs/adr/README.md, ADRs
are history — corrections happen via new ADRs, not in-place edits.

Refs #167
ChrisonSimtian added a commit that referenced this pull request May 25, 2026
Fixes the branch-protection vs paths-ignore mismatch that left docs-only
PRs (e.g. #177) BLOCKED with no status check reporting:

- main protection requires `ubuntu-latest`
- ubuntu-latest.yml has `paths-ignore: docs/**, .assets/**, **/*.md`
- Docs PRs never trigger a check → never satisfy protection

The new ubuntu-latest-docs.yml fires on the inverse path set, runs
nothing of substance, and reports success under the same `ubuntu-latest`
status-check context. Pattern mirrors the existing hand-written
release.yml (auto-generation can't quite express it).

CI minutes cost: ~30s of a single ubuntu runner per docs PR.
@ChrisonSimtian ChrisonSimtian merged commit d0982c4 into main May 25, 2026
1 check passed
@ChrisonSimtian ChrisonSimtian deleted the docs/167-add-adr-0001-0002 branch May 25, 2026 08:41
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.

1 participant