From 98b081d0cdb76f3d6d5ff20d9552b5ef2ad74402 Mon Sep 17 00:00:00 2001 From: Dave Thompson Date: Mon, 24 Aug 2026 16:01:24 -0400 Subject: [PATCH 1/6] chore(docs): apply canonical formatting Changes: - Apply canonical Markdown list spacing across repository docs Generated by GPT-5.6-sol via OpenCode under supervision of @3leapsdave Co-Authored-By: GPT-5.6-sol Role: devlead Committer-of-Record: @3leapsdave --- CHANGELOG.md | 4 ++++ docs/decisions/PDR-0004-release-publication-gate.md | 1 + docs/knowledge/toolchains/rust/cargo-deny-cvss4.md | 1 + docs/standards/fierce-collaboration-review.md | 1 + 4 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c57881b..319a998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -650,6 +650,7 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **GitHub Actions release verification and signing handoff** + - `docs/knowledge/cicd/github-actions/artifact-handling.md` - When to use (and avoid) cross-job artifacts - `docs/knowledge/cicd/github-actions/manual-signing-handoff.md` - Local signing workflow for draft releases - `docs/knowledge/cicd/github-actions/release-verification-checklist.md` - Pre-undraft verification gate @@ -668,6 +669,7 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **Windows ARM64 Gaps in TypeScript** (`docs/knowledge/toolchains/typescript/windows-arm64-gaps.md`) + - Native binary availability status for Biome, Rollup/Vitest on Windows ARM64 - CI matrix pattern with skip-lint/skip-test flags for unavailable tools - Cross-platform path handling using `path.sep` and `path.resolve()` @@ -685,6 +687,7 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **Config Layering Pitfalls guide** (`docs/knowledge/toolchains/go/config-layering-pitfalls.md`) + - Multi-layer configuration precedence bug patterns - Guard condition pattern: `cfg.Field != "" && result.Field == ""` - Testing cross-layer combinations to expose hidden bugs @@ -735,6 +738,7 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **Governance tier roles** + - `config/agentic/roles/deliverylead.yaml` - Project lifecycle management and sprint coordination - Projectbook governance for git-backed docsites - Sprint/kanban board structure with WIP limits diff --git a/docs/decisions/PDR-0004-release-publication-gate.md b/docs/decisions/PDR-0004-release-publication-gate.md index b763eee..7223c93 100644 --- a/docs/decisions/PDR-0004-release-publication-gate.md +++ b/docs/decisions/PDR-0004-release-publication-gate.md @@ -96,6 +96,7 @@ publishes. The manual undraft step is eliminated.** uploaded to the tagger's account, so on its own it reduces the publication gate to "anyone with tag-push rights and a self-uploaded key" — a compromised account mints publishable releases. Two assertions, both required: + - **Key identity (authoritative):** the tag verifies in an isolated keyring built solely from the release keys committed at `docs/security/release-signing-keys.asc`, with a full-fingerprint diff --git a/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md b/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md index a438e04..3eaa277 100644 --- a/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md +++ b/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md @@ -76,6 +76,7 @@ cargo-audit may have better CVSS 4.0 support and can run alongside cargo-deny. ## Follow-up Required 1. **Monitor upstream**: Watch cargo-deny releases for CVSS 4.0 fix + - Check: `cargo search cargo-deny` periodically 2. **Re-enable when fixed**: Update Makefile to use full `cargo deny check` diff --git a/docs/standards/fierce-collaboration-review.md b/docs/standards/fierce-collaboration-review.md index 7c2cc37..87e2db5 100644 --- a/docs/standards/fierce-collaboration-review.md +++ b/docs/standards/fierce-collaboration-review.md @@ -344,6 +344,7 @@ Trust-nothing is operational, not attitudinal. Concrete techniques: - Findings carry a **severity**, defined so the rubric does not itself reintroduce variance: + - **P1** — the relied-upon claim is false, unsafe, or unproven as stated (a wrong result, a security hole, a broken contract, a gate that cannot fail). **Blocks until green on re-review.** From 60ba0f2c0374b6b13d5f1bdcec5856b766d18b72 Mon Sep 17 00:00:00 2001 From: Dave Thompson Date: Mon, 24 Aug 2026 16:22:07 -0400 Subject: [PATCH 2/6] chore(release): prepare v0.1.29 Changes: - Synchronize repository version surfaces for v0.1.29 - Publish project-work and local-adoption release notes - Add the v0.1.29 changelog and compare links Generated by GPT-5.6-sol via OpenCode under supervision of @3leapsdave Co-Authored-By: GPT-5.6-sol Role: devlead Committer-of-Record: @3leapsdave --- CHANGELOG.md | 8 ++++- README.md | 2 +- RELEASE_NOTES.md | 23 +++++++++++++ VERSION | 2 +- docs/releases/v0.1.29.md | 72 ++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 6 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 docs/releases/v0.1.29.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 319a998..096c7ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.29] - 2026-08-24 + ### Added - **Portable Project Work Contract (draft).** Add the `project-work/v0` @@ -23,6 +25,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Validation coverage.** `make check` now runs the project-work control battery (examples, structural rejects, classifier-key alignment) and the project-work contract manifest. +- **Local fallback guidance.** Use an org-qualified `3leaps/crucible` sibling + clone from the consuming repository and consistent `../crucible/` paths in + onboarding, adoption, and upstream-sync documentation. ## [0.1.28] - 2026-08-20 @@ -968,7 +973,8 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) - Getting started guide for multiple user personas (new repo, existing repo, adopting org) - Migration guidance for 3leaps and adopting ecosystems -[unreleased]: https://github.com/3leaps/crucible/compare/v0.1.28...HEAD +[unreleased]: https://github.com/3leaps/crucible/compare/v0.1.29...HEAD +[0.1.29]: https://github.com/3leaps/crucible/compare/v0.1.28...v0.1.29 [0.1.28]: https://github.com/3leaps/crucible/compare/v0.1.27...v0.1.28 [0.1.27]: https://github.com/3leaps/crucible/compare/v0.1.25...v0.1.27 [0.1.25]: https://github.com/3leaps/crucible/compare/v0.1.24...v0.1.25 diff --git a/README.md b/README.md index 9af81db..d54f678 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 3leaps Crucible -![Version: 0.1.28](https://img.shields.io/badge/version-0.1.28-blue) +![Version: 0.1.29](https://img.shields.io/badge/version-0.1.29-blue) ![Lifecycle: Beta](https://img.shields.io/badge/lifecycle-beta-blue) ![License: MIT + CC0](https://img.shields.io/badge/license-MIT%20%2B%20CC0-blue) ![Check](https://github.com/3leaps/crucible/actions/workflows/check.yml/badge.svg) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 530aaed..2599472 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -8,6 +8,29 @@ For detailed release content, see [docs/releases/](docs/releases/). --- +## v0.1.29 (2026-08-24) + +**A portable project-work contract for exchanging ready work and project +projections, with executable controls and clearer local adoption guidance.** + +- **Portable project-work family** — `project-work/v0` defines source-neutral + ready packets, project state, control records, and progress events without + importing a board or runtime. +- **Explicit lifecycle and governance boundaries** — the draft contract + distinguishes work readiness from lifecycle class, uses typed subjects for + durable records, and keeps decision impact explicit through decision-owned + `affects` references. +- **Executable contract coverage** — positive examples, structural rejects, + classifier-key alignment checks, and the project-work manifest run through + the repository quality gates. +- **Org-qualified local fallback** — onboarding and adoption documentation now + clones `3leaps/crucible` as `../crucible/` from the consuming repository and + uses that path consistently in upstream-sync examples. + +See [docs/releases/v0.1.29.md](docs/releases/v0.1.29.md). + +--- + ## v0.1.28 (2026-08-20) **A bounded, cooperative presentation-priority hint for portable agent-wait diff --git a/VERSION b/VERSION index baec65a..5ef49d2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.28 +0.1.29 diff --git a/docs/releases/v0.1.29.md b/docs/releases/v0.1.29.md new file mode 100644 index 0000000..2831167 --- /dev/null +++ b/docs/releases/v0.1.29.md @@ -0,0 +1,72 @@ +# Release v0.1.29 + +**A portable project-work contract for exchanging ready work and project +projections, with executable controls and clearer local adoption guidance.** + +## Overview + +v0.1.29 adds the draft `project-work/v0` contract family. It provides +source-neutral JSON structures for moving ready work into execution, publishing +project projections, recording durable decisions and blockers, and emitting +ordered progress events. The contract does not import a board, workflow engine, +or runtime. + +This release also makes the local fallback instructions unambiguous: consumers +clone the org-qualified `3leaps/crucible` repository as a sibling and reference +it consistently through `../crucible/`. + +## Highlights + +### Portable project-work family + +The family contains four discriminated document types: + +- `ready-packet` carries bounded, execution-ready work and assignment state. +- `project-state` publishes a source projection with milestones and lifecycle + summaries. +- `control-record` records typed status, decision, and blocker statements. +- `progress-event` provides ordered, source-neutral lifecycle events. + +An entry manifest and family README expose the contract surfaces to consumers. +The accompanying standard documents the exchange model, frozen vocabulary, and +boundary between portable records and source-specific overlays. + +### Explicit lifecycle and governance boundaries + +Ready packets distinguish readiness from lifecycle class and use classifier +keys aligned with the public catalog. Control records use typed subjects; +decision records require non-empty, unique `affects` references, while status +and blocker records cannot claim decision impact. Milestone targets use full +calendar dates. + +### Executable contract coverage + +Positive examples cover every document type. Focused rejects exercise invalid +assignment, lifecycle, subject, transition, decision-impact, and milestone-date +shapes. The project-work control battery also checks classifier-key alignment, +and the contract manifest participates in repository validation. + +### Consistent local adoption guidance + +The README, getting-started guide, agentic adoption guide, and upstream-sync +guide now direct consumers to clone `https://github.com/3leaps/crucible.git` as +`../crucible/`. Copy and comparison examples use paths relative to the +consuming repository instead of assuming a machine-specific development root. + +## Compatibility + +`project-work/v0` is a new draft contract family and does not change existing +contract families. Consumers should pin the repository revision they adopt +while the family remains at `v0`. + +The documentation changes clarify the existing sibling-clone fallback. They do +not change the canonical GitHub source or require consumers to vendor guidance +that they only reference. + +## References + +- [CHANGELOG](../../CHANGELOG.md) +- [Project-work contract](../standards/project-work-contract.md) +- [Project-work v0 schema family](../../schemas/project-work/v0/) +- [Getting started](../getting-started.md) +- [Upstream sync guide](../operations/upstream-sync-guide.md) diff --git a/package.json b/package.json index 76678b4..9484569 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/crucible", - "version": "0.1.28", + "version": "0.1.29", "private": true, "description": "Lightweight standards and specifications for 3leaps open source projects", "type": "module", From 49b69bb6d02b6a75cfb58a99c4bc0ede5f13e0a7 Mon Sep 17 00:00:00 2001 From: Dave Thompson Date: Mon, 24 Aug 2026 17:27:05 -0400 Subject: [PATCH 3/6] fix(build): make validation non-mutating Changes: - Add a check-only formatting gate using configured goneat assessment - Run non-mutating quality checks from the build target Generated by GPT-5.6-sol via OpenCode under supervision of @3leapsdave Co-Authored-By: GPT-5.6-sol Role: devlead Committer-of-Record: @3leapsdave --- Makefile | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 45a9094..7e79422 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ # make check - Run all quality checks # make fmt - Format all files -.PHONY: all help bootstrap bootstrap-force tools check test fmt lint lint-schemas lint-config lint-role-prompts lint-coverage-attestation build clean version +.PHONY: all help bootstrap bootstrap-force tools check test fmt fmt-check lint lint-schemas lint-config lint-role-prompts lint-coverage-attestation build clean version # lint-config added as dependency of lint - validates config/*.yaml against schemas .PHONY: version-set version-patch version-minor version-major .PHONY: precommit prepush deps-check @@ -211,7 +211,7 @@ tools: ## Verify external tools are available # Quality Gates # ----------------------------------------------------------------------------- -check: fmt lint test ## Run all quality checks +check: fmt-check lint test ## Run all quality checks without modifying files @echo "[ok] All quality checks passed" test: ## Run release-control negative tests @@ -249,6 +249,16 @@ fmt: ## Format code (prettier for md/json, yamlfmt for yaml, shfmt for shell) fi @echo "[ok] Formatting complete" +fmt-check: ## Verify canonical formatting without modifying files + @echo "Checking formatting..." + @if command -v goneat >/dev/null 2>&1; then \ + PATH="$(CURDIR)/node_modules/.bin:$$PATH" goneat assess --categories format --check --fail-on low --ci-summary; \ + else \ + echo "[!!] goneat not found, cannot verify formatting"; \ + exit 1; \ + fi + @echo "[ok] Formatting checks passed" + lint: lint-schemas lint-config ## Run linting checks @echo "Linting..." @# Lint YAML with yamllint @@ -385,7 +395,7 @@ lint-coverage-attestation: ## Run coverage-attestation negative controls echo "[--] goneat not found, skipping coverage-attestation controls"; \ fi -build: ## Build artifacts (validation is the build for standards repo) +build: check ## Build artifacts (validation is the build for standards repo) @echo "Building..." @echo "[ok] Build complete (crucible is docs - validation is the build)" From 12a44895256ccbb3fb104449a570ce5adf63f5e7 Mon Sep 17 00:00:00 2001 From: Dave Thompson Date: Mon, 24 Aug 2026 17:50:03 -0400 Subject: [PATCH 4/6] fix(build): enforce canonical formatter Changes: - Require the lockfile-resolved Prettier for formatting and checks - Fail YAML lint instead of suppressing diagnostics - Align Markdown with the pinned formatter output Generated by GPT-5.6-sol via OpenCode under supervision of @3leapsdave Co-Authored-By: GPT-5.6-sol Role: devlead Committer-of-Record: @3leapsdave --- CHANGELOG.md | 4 ---- Makefile | 18 +++++++++++------- .../PDR-0004-release-publication-gate.md | 1 - .../toolchains/rust/cargo-deny-cvss4.md | 1 - docs/standards/fierce-collaboration-review.md | 1 - 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 096c7ed..90dc7c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -655,7 +655,6 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **GitHub Actions release verification and signing handoff** - - `docs/knowledge/cicd/github-actions/artifact-handling.md` - When to use (and avoid) cross-job artifacts - `docs/knowledge/cicd/github-actions/manual-signing-handoff.md` - Local signing workflow for draft releases - `docs/knowledge/cicd/github-actions/release-verification-checklist.md` - Pre-undraft verification gate @@ -674,7 +673,6 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **Windows ARM64 Gaps in TypeScript** (`docs/knowledge/toolchains/typescript/windows-arm64-gaps.md`) - - Native binary availability status for Biome, Rollup/Vitest on Windows ARM64 - CI matrix pattern with skip-lint/skip-test flags for unavailable tools - Cross-platform path handling using `path.sep` and `path.resolve()` @@ -692,7 +690,6 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **Config Layering Pitfalls guide** (`docs/knowledge/toolchains/go/config-layering-pitfalls.md`) - - Multi-layer configuration precedence bug patterns - Guard condition pattern: `cfg.Field != "" && result.Field == ""` - Testing cross-layer combinations to expose hidden bugs @@ -743,7 +740,6 @@ PDR, EPR}` — as a shared standard, with a thin mandate (type set + naming) ### Added - **Governance tier roles** - - `config/agentic/roles/deliverylead.yaml` - Project lifecycle management and sprint coordination - Projectbook governance for git-backed docsites - Sprint/kanban board structure with WIP limits diff --git a/Makefile b/Makefile index 7e79422..b4002d6 100644 --- a/Makefile +++ b/Makefile @@ -221,15 +221,13 @@ test: ## Run release-control negative tests fmt: ## Format code (prettier for md/json, yamlfmt for yaml, shfmt for shell) @echo "Formatting..." - @# Format markdown and JSON with prettier (prefer bun-installed) + @# Use the lockfile-resolved formatter; system Prettier versions can disagree. @if [ -x "./node_modules/.bin/prettier" ]; then \ echo "[..] Formatting markdown and JSON (prettier via bun)..."; \ - ./node_modules/.bin/prettier --write "**/*.md" "**/*.json" --ignore-path .gitignore 2>/dev/null || true; \ - elif command -v prettier >/dev/null 2>&1; then \ - echo "[..] Formatting markdown and JSON (prettier system)..."; \ - prettier --write "**/*.md" "**/*.json" --ignore-path .gitignore 2>/dev/null || true; \ + ./node_modules/.bin/prettier --write "**/*.md" "**/*.json" --ignore-path .gitignore; \ else \ - echo "[!!] prettier not found, skipping md/json formatting"; \ + echo "[!!] repository-local prettier not found; run make bootstrap"; \ + exit 1; \ fi @# Format YAML with yamlfmt @if command -v yamlfmt >/dev/null 2>&1; then \ @@ -251,6 +249,12 @@ fmt: ## Format code (prettier for md/json, yamlfmt for yaml, shfmt for shell) fmt-check: ## Verify canonical formatting without modifying files @echo "Checking formatting..." + @if [ -x "./node_modules/.bin/prettier" ]; then \ + ./node_modules/.bin/prettier --check "**/*.md" "**/*.json" --ignore-path .gitignore; \ + else \ + echo "[!!] repository-local prettier not found; run make bootstrap"; \ + exit 1; \ + fi @if command -v goneat >/dev/null 2>&1; then \ PATH="$(CURDIR)/node_modules/.bin:$$PATH" goneat assess --categories format --check --fail-on low --ci-summary; \ else \ @@ -264,7 +268,7 @@ lint: lint-schemas lint-config ## Run linting checks @# Lint YAML with yamllint @if command -v yamllint >/dev/null 2>&1; then \ echo "[..] Linting YAML (yamllint)..."; \ - yamllint -c .yamllint . 2>&1 | grep -v "^$$" || true; \ + yamllint -c .yamllint .; \ else \ echo "[!!] yamllint not found, skipping YAML linting"; \ fi diff --git a/docs/decisions/PDR-0004-release-publication-gate.md b/docs/decisions/PDR-0004-release-publication-gate.md index 7223c93..b763eee 100644 --- a/docs/decisions/PDR-0004-release-publication-gate.md +++ b/docs/decisions/PDR-0004-release-publication-gate.md @@ -96,7 +96,6 @@ publishes. The manual undraft step is eliminated.** uploaded to the tagger's account, so on its own it reduces the publication gate to "anyone with tag-push rights and a self-uploaded key" — a compromised account mints publishable releases. Two assertions, both required: - - **Key identity (authoritative):** the tag verifies in an isolated keyring built solely from the release keys committed at `docs/security/release-signing-keys.asc`, with a full-fingerprint diff --git a/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md b/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md index 3eaa277..a438e04 100644 --- a/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md +++ b/docs/knowledge/toolchains/rust/cargo-deny-cvss4.md @@ -76,7 +76,6 @@ cargo-audit may have better CVSS 4.0 support and can run alongside cargo-deny. ## Follow-up Required 1. **Monitor upstream**: Watch cargo-deny releases for CVSS 4.0 fix - - Check: `cargo search cargo-deny` periodically 2. **Re-enable when fixed**: Update Makefile to use full `cargo deny check` diff --git a/docs/standards/fierce-collaboration-review.md b/docs/standards/fierce-collaboration-review.md index 87e2db5..7c2cc37 100644 --- a/docs/standards/fierce-collaboration-review.md +++ b/docs/standards/fierce-collaboration-review.md @@ -344,7 +344,6 @@ Trust-nothing is operational, not attitudinal. Concrete techniques: - Findings carry a **severity**, defined so the rubric does not itself reintroduce variance: - - **P1** — the relied-upon claim is false, unsafe, or unproven as stated (a wrong result, a security hole, a broken contract, a gate that cannot fail). **Blocks until green on re-review.** From 3649364886693399a05710d0581b3b53f6d6fab7 Mon Sep 17 00:00:00 2001 From: Dave Thompson Date: Mon, 24 Aug 2026 18:31:18 -0400 Subject: [PATCH 5/6] fix(build): use goneat assessment policy Changes: - Apply formatting through goneat assessment fix mode - Verify formatting and lint through explicit check mode - Retain schema and configuration validation dependencies Generated by GPT-5.6-sol via OpenCode under supervision of @3leapsdave Co-Authored-By: GPT-5.6-sol Role: devlead Committer-of-Record: @3leapsdave --- Makefile | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index b4002d6..73b7be0 100644 --- a/Makefile +++ b/Makefile @@ -219,44 +219,21 @@ test: ## Run release-control negative tests @./scripts/test-release-guard-release-surfaces.sh @./scripts/release-guard-release-surfaces.sh -fmt: ## Format code (prettier for md/json, yamlfmt for yaml, shfmt for shell) +fmt: ## Format files using the repository goneat assessment policy @echo "Formatting..." - @# Use the lockfile-resolved formatter; system Prettier versions can disagree. - @if [ -x "./node_modules/.bin/prettier" ]; then \ - echo "[..] Formatting markdown and JSON (prettier via bun)..."; \ - ./node_modules/.bin/prettier --write "**/*.md" "**/*.json" --ignore-path .gitignore; \ + @if command -v goneat >/dev/null 2>&1; then \ + goneat assess --categories format --fix --fail-on low --ci-summary; \ + goneat assess --categories lint --fix --lint-shell-fix --fail-on low --ci-summary; \ else \ - echo "[!!] repository-local prettier not found; run make bootstrap"; \ + echo "[!!] goneat not found; run make bootstrap"; \ exit 1; \ fi - @# Format YAML with yamlfmt - @if command -v yamlfmt >/dev/null 2>&1; then \ - echo "[..] Formatting YAML (yamlfmt)..."; \ - yamlfmt . 2>/dev/null || true; \ - else \ - echo "[!!] yamlfmt not found, skipping YAML formatting"; \ - fi - @# Format shell scripts with shfmt. - @# Args must match .goneat/assess.yaml lint.shell.shfmt.args and .editorconfig [*.sh] - @# (goneat checks shell under the lint category; make fmt is the apply path). - @if command -v shfmt >/dev/null 2>&1; then \ - echo "[..] Formatting shell scripts (shfmt -i 4 -ci)..."; \ - shfmt -i 4 -ci -w scripts/*.sh; \ - else \ - echo "[!!] shfmt not found, skipping shell formatting"; \ - fi @echo "[ok] Formatting complete" fmt-check: ## Verify canonical formatting without modifying files @echo "Checking formatting..." - @if [ -x "./node_modules/.bin/prettier" ]; then \ - ./node_modules/.bin/prettier --check "**/*.md" "**/*.json" --ignore-path .gitignore; \ - else \ - echo "[!!] repository-local prettier not found; run make bootstrap"; \ - exit 1; \ - fi @if command -v goneat >/dev/null 2>&1; then \ - PATH="$(CURDIR)/node_modules/.bin:$$PATH" goneat assess --categories format --check --fail-on low --ci-summary; \ + goneat assess --categories format --mode check --fail-on low --ci-summary; \ else \ echo "[!!] goneat not found, cannot verify formatting"; \ exit 1; \ @@ -265,12 +242,11 @@ fmt-check: ## Verify canonical formatting without modifying files lint: lint-schemas lint-config ## Run linting checks @echo "Linting..." - @# Lint YAML with yamllint - @if command -v yamllint >/dev/null 2>&1; then \ - echo "[..] Linting YAML (yamllint)..."; \ - yamllint -c .yamllint .; \ + @if command -v goneat >/dev/null 2>&1; then \ + goneat assess --categories lint --mode check --fail-on low --ci-summary; \ else \ - echo "[!!] yamllint not found, skipping YAML linting"; \ + echo "[!!] goneat not found, cannot run lint assessment"; \ + exit 1; \ fi @echo "[ok] Linting complete" From 3be706053cb9c288d4c507bab5d2081cd370ac8e Mon Sep 17 00:00:00 2001 From: Dave Thompson Date: Tue, 25 Aug 2026 07:20:24 -0400 Subject: [PATCH 6/6] fix(build): require goneat for quality gates Changes: - Remove degraded precommit and prepush fallback behavior - Fail quality hooks when goneat is unavailable - Align help and tool diagnostics with goneat-owned checks Generated by GPT-5.6-sol via OpenCode under supervision of @3leapsdave Co-Authored-By: GPT-5.6-sol Role: devlead Committer-of-Record: @3leapsdave --- Makefile | 38 +++++++++----------------------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/Makefile b/Makefile index 73b7be0..e553f3e 100644 --- a/Makefile +++ b/Makefile @@ -48,10 +48,10 @@ help: ## Show available targets @echo "Required targets:" @echo " help Show this help message" @echo " bootstrap Install tools (sfetch -> goneat -> others)" - @echo " check Run all quality checks (fmt, lint, test)" + @echo " check Run non-mutating quality checks" @echo " test Run release-control negative tests" - @echo " fmt Format code (prettier, yamlfmt)" - @echo " lint Run linting (yamllint, schema validation)" + @echo " fmt Apply the goneat assessment policy" + @echo " lint Run goneat lint and schema validation" @echo " lint-schemas Validate JSON Schema files against meta-schema" @echo " build Build artifacts (validation is the build)" @echo " clean Remove build artifacts" @@ -185,26 +185,6 @@ tools: ## Verify external tools are available else \ echo "[!!] goneat not found - run 'make bootstrap'"; \ fi - @# Check prettier (via bun) - @if [ -x "./node_modules/.bin/prettier" ]; then \ - echo "[ok] prettier: $$(./node_modules/.bin/prettier --version) (bun)"; \ - elif command -v prettier >/dev/null 2>&1; then \ - echo "[ok] prettier: $$(prettier --version)"; \ - else \ - echo "[!!] prettier not found"; \ - fi - @# Check yamlfmt - @if command -v yamlfmt >/dev/null 2>&1; then \ - echo "[ok] yamlfmt: $$(yamlfmt --version 2>&1 | head -n1)"; \ - else \ - echo "[!!] yamlfmt not found"; \ - fi - @# Check yamllint - @if command -v yamllint >/dev/null 2>&1; then \ - echo "[ok] yamllint found"; \ - else \ - echo "[!!] yamllint not found"; \ - fi @echo "" # ----------------------------------------------------------------------------- @@ -407,10 +387,10 @@ clean: ## Remove build artifacts precommit: ## Run pre-commit checks (goneat assess --fail-on critical + schema validation) @echo "Running pre-commit checks..." @if command -v goneat >/dev/null 2>&1; then \ - PATH="$(CURDIR)/node_modules/.bin:$$PATH" goneat assess --categories format,lint,security --fail-on critical --ci-summary; \ + goneat assess --categories format,lint,security --mode check --fail-on critical --ci-summary; \ else \ - echo "[!!] goneat not found, falling back to basic checks"; \ - $(MAKE) fmt lint; \ + echo "[!!] goneat not found; run make bootstrap"; \ + exit 1; \ fi @# Always run schema/config validation (goneat assess doesn't cover these) @$(MAKE) lint-schemas lint-config @@ -419,10 +399,10 @@ precommit: ## Run pre-commit checks (goneat assess --fail-on critical + schema v prepush: ## Run pre-push checks (goneat assess --fail-on low + schema validation) @echo "Running pre-push checks..." @if command -v goneat >/dev/null 2>&1; then \ - PATH="$(CURDIR)/node_modules/.bin:$$PATH" goneat assess --categories format,lint,security --fail-on low --ci-summary; \ + goneat assess --categories format,lint,security --mode check --fail-on low --ci-summary; \ else \ - echo "[!!] goneat not found, falling back to basic checks"; \ - $(MAKE) fmt lint; \ + echo "[!!] goneat not found; run make bootstrap"; \ + exit 1; \ fi @# Always run schema/config validation (goneat assess doesn't cover these) @$(MAKE) lint-schemas lint-config