Repository navigation
chore(baseline): bring clix to the repository baseline (B1 to B17) - #110
Merged
Merged
Conversation
Core ADR-0071 rows B4, B5, B6, B7, B14 and B17, B3 org-ADR entries, golangci-lint 2.15.0, and a guard test in tests/baseline/. The README follows core's library standard (ADR-0072); its consumer rules move to docs/specs/consumer-api.md. No product code change.
frostyard-machines
marked this pull request as ready for review
November 6, 2026 05:24
bketelsen
approved these changes
Nov 6, 2026
10 of 12 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR brings clix to frostyard's repository baseline (core ADR-0071, spec, rows B1 to B17): the checklist that every frostyard code repository carries and that the weekly conformance sweep checks. clix is the CLI library that updex and the other frostyard tools import, so its gate, its release path and its security policy must meet the same bar as the rest of the org. It follows the shape of frostyard/std#97 and frostyard/repogen#89. clix met most rows already; this PR closes B4, B5, B6, B7, B14 and B17, extends B3, and adds a guard test. It changes no product code.
ci: verify.make verifyis now a prerequisite ofciinstead of a recursive$(MAKE) verifyline in the recipe; the recipe keeps the race detector, the coverage-instrumented tests, the coverage-script self-test and the 95.0% floor. Same steps, same order.Unit Testsjob runsmake ci(ADR-0073 form 1). Job ids and names do not change, so the required checks stay the same.ci.ymlgets a top-levelpermissions: contents: read(it had none, so jobs took the repository default). Everyactions/checkoutsetspersist-credentials: false(8 checkouts).release.ymlhadcontents: writeat the top level: now the top level ispermissions: {}and the same scope is on its only jobgoreleaser. GoReleaser publishes throughGITHUB_TOKENin its env, not through the git credentials..github/risk-paths.json(9 globs) and.github/workflows/risk-paths.yml, the caller of core's reusable workflow pinned at1b02a129(core#194). Core'svalidateRiskPathsreturns ok.## Risk tiersection in the PR template; the Checks list addsmake ci.SECURITY.md: only the latest tag gets fixes (todayv0.5.0); reports through https://github.com/frostyard/clix/security (private vulnerability reporting is on:gh api repos/frostyard/clix/private-vulnerability-reporting→{"enabled":true}); email fallback; scope (flag checks, JSON output, error rendering,BindViper).README.mdrewritten as kindlibrary(ADR-0072, spec: README). Core's checker printsok README.md (library, 405 words). The consumer rules that left the README (flags and the reserved-flag rule, repeatedRuncalls,RunContext, reporter priority, JSON output outcomes, error rendering, the writer seams,BindViper) moved, checked against the code, to the new specdocs/specs/consumer-api.md.readme_example_test.gostill compiles the README'spackage mainprogram and now resolves everyclix.<Ident>in the README and in the spec against the exported API.docs/org-adrs.mdadds ADR-0040, 0042, 0043, 0044, 0053, 0068, 0071, 0072, 0073, restates ADR-0022 (make ciis the canonical gate), and names ADR-0070 as not applicable (library).frostyard-go-reposkill's Fleet toolchain table;mise lockregeneratedmise.lock. It reports0 issueswith no code change. Go stays attoolchain go1.26.10: the Go 1.27 bump is the B11 follow-up.tests/baseline/baseline_test.go, a test-only package (stdlib only), 1 test per row the tree can show (B1 to B8, B10, B12 to B17), the same guard as std#97. It reads the committed tree withgit ls-files -s -zand skips when git is unusable. The pure checks (theuses:pin, the checkout credentials, the top-level permissions, the Dependabot entries) have table tests with failing fixtures.AGENTS.md(the gate triad,tests/baseline/, the README standard,SECURITY.md, risk paths),docs/design/overview.md(test packages, workflow permissions, the risk-paths workflow, "v0.4.0 and earlier" in the error-rendering note),docs/README.md(spec index),tests/e2e/README.md,.claude/session-summary.md(its state was from August).No product change:
git diff origin/main --stat -- clix.go errors.go flags.go output.go reporter.go go.mod go.sum tests/e2e/exampletoolis empty. The Go files in the diff arereadme_example_test.goand the newtests/baseline/baseline_test.go.Inventory
clix had no agent-framework tree at the root (the
yeti/move was done earlier, ADR-0001 and core ADR-0025), anddocs/plans/holds only its template. Every path that is not product code:AGENTS.md;CLAUDE.md,GEMINI.md,.cursorrules,CONTRIBUTING.md,.github/copilot-instructions.md(symlinks).claude/settings.json,.claude/skills→.agents/skills.claude/session-summary.md.agents/skills/.memory/README.md,.memory/corrections.jsonldocs/README.md,docs/{adr,design,specs,plans}/withTEMPLATE.md, alias filesdocs/{quality,metrics,review-rubric}.mddocs/specs/consumer-api.mddocs/org-adrs.mdMakefile,mise.toml,mise.lockci: verify); golangci-lint 2.15.0..golangci.yml,.svu.yml,.goreleaser.yaml,.editorconfig,.gitignore,.coverage-thresholds.json.github/workflows/ci.ymlcontents: read,persist-credentials)..github/workflows/release.yml.github/workflows/risk-paths.yml,.github/risk-paths.json.github/pull_request_template.md.github/dependabot.ymlgomodandgithub-actionsalready..github/ISSUE_TEMPLATE/,.github/prompts/policies/agent-governance.jsonscripts/(coverage floor and its self-test, docs gate)readme_example_test.gotests/e2e/tests/baseline/README.mdSECURITY.mdLICENSECounts: 0 framework trees, 0 deleted, 5 added, 14 changed, 0 moved (the README facts moved into 1 new spec).
Baseline rows
AGENTS.md100644, 5 aliases 120000 →AGENTS.md. New test.ci: verify;mise.toml,mise.lock. New test.uses:SHA-pinned with a version comment; top-level permissions read-only or{}; every checkoutpersist-credentials: false. New test.make bump, workflows, policy, gate scripts. New test.## Risk tier. New test..svu.yml,make bumprunssvu next. New test.gh api→MIT. New test.toolchain go1.26.10; the fleet is Go 1.27. golangci-lint is at the fleet pin 2.15.0 in this PR (no code change). The Go bump can change behavior: separate PR.ci.yml, jobUnit Testsrunsmake cion pull requests. New test.gomod,github-actions. New test.SECURITY.md; private vulnerability reporting is on. New test..claude/holds the 3 allowed names. New test.library; core checkerok. New test (marker and pkg.go.dev link).Follow-up: B11 Go 1.27 toolchain PR.
Risk tier
Rationale:
risk:high: the PR touches the workflows, the release workflow and the gate. The list is new in this PR, so the base has no list for the workflow to read; the label is set by hand. Each path that the new list matches, and why the change is safe:.github/workflows/release.yml: only thepermissions:block moves from the top to the single jobgoreleaser, with the samecontents: write; the token the job gets does not change. The checkout addspersist-credentials: false; GoReleaser usesGITHUB_TOKENfrom its env.TestBaselineB5ActionsPinnedpins the top level..github/workflows/ci.yml: job ids and names unchanged; top-levelcontents: read(each job needs only to read the repository;securityandrelease-configalready set it on the job);persist-credentials: falseon every checkout; no step changes..github/workflows/risk-paths.yml,.github/risk-paths.json: new;pull_request_target, top level{}, the job getscontents: readandpull-requests: write, checks out nothing, runs core's reusable workflow pinned by full SHA.Makefile:cigetsverifyas its prerequisite in place of the recursive call; same steps in the same order;bumpnot changed.mise.toml,mise.lock: golangci-lint 2.13.1 → 2.15.0 (checksums bymise lock,provenance = "github-attestations").The tag release cannot run on a pull request, so the permission move is shown by the guard test, not by a release run; the next tag shows it.
Verification
make ci(umask 022): exit 0,check-coverage: observed total statement coverage 97.0% (required >= 95.0%).make check: passed;make fmtchanged no file.node scripts/check-docs.mjs:checked: 6 docs, 157 links, 9 symlinks.origin/main):ok README.md (library, 405 words).go mod tidy -diff: empty. golangci-lint 2.15.0:0 issues.validateRiskPathson.github/risk-paths.json: ok, 9 globs.5435466, removed after): withMakefile,ci.yml,release.yml, the PR template andREADME.mdfrom the base, and withoutSECURITY.mdand.github/risk-paths.json,go test -count=1 ./tests/baseline/failsTestBaselineB4MakeGate,TestBaselineB5ActionsPinned(no top-level permissions inci.yml, 8 checkouts withoutpersist-credentials: false,contents: writeat the top ofrelease.yml),TestBaselineB6RiskPaths,TestBaselineB7PRTemplate,TestBaselineB14SecurityPolicyandTestBaselineB17Readme.307bda8: all 7 checks pass. TheRisk pathsworkflow runs from the base branch (pull_request_target), which has no caller yet, sorisk:highis set by hand on this PR.Cross-review
Coder:
deepseek/deepseek-flash, with edits by the author (claude-opus). Reviewer:openai/gpt-6.1-sol(cross-family), read-only.5435466(basee820582; all 18 authored paths;mise.lockexcluded from line review, checked to move only golangci-lint 2.13.1 → 2.15.0): Ready, Blocking: none. The reviewer confirmed thatmake cikeeps its steps and order, thatUnit Testsstill runsmake ci, that no workflow loses a scope it needs (GoReleaser keeps job-levelcontents: writeand needs no persisted git credentials), that the consumer-API spec andSECURITY.mdagree with the code, and that the guard tests can fail.AGENTS.md(core's checker holds R1 to R12; it reaches clix with the skills sync PR chore: sync agent skills from frostyard/core #106); (2) the README checker command inAGENTS.mdpassed.from a core checkout: fixed in307bda8; (3) "a fourth workflow" in the overview: fixed in307bda8.307bda8(delta from5435466): Ready, Blocking: none.