Skip to content

Commit ba3e1ba

Browse files
committed
Merge branch 'issue-13-release-matrix-r060-stack' into release/0.6.0
2 parents a72a1ef + f1783bb commit ba3e1ba

File tree

3 files changed

+108
-11
lines changed

3 files changed

+108
-11
lines changed

Makefile

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,14 @@ publish-crates-dry: test banner
195195
@printf "$(CYAN)$(BOLD)║ Pre-Publish Verification ║$(RESET)\n"
196196
@printf "$(CYAN)$(BOLD)╚══════════════════════════════════════════════════════════╝$(RESET)\n\n"
197197
@printf "$(GREEN)$(CHECK) All tests passed$(RESET)\n"
198-
@printf "$(ARROW) Publishing order: $(GRAY)core → macros → scoring → config → solver → facade → cli$(RESET)\n\n"
199-
@printf "$(GRAY)Note: cargo publish --dry-run cannot validate unpublished workspace inter-dependencies.$(RESET)\n"
200-
@printf "$(GRAY)Tests passing indicates crates are ready. Use 'make publish-crates' to publish.$(RESET)\n\n"
198+
@printf "$(ARROW) Publishing order: $(GRAY)core → macros → scoring → config → solver → cvrp → console → facade → cli$(RESET)\n\n"
199+
@printf "$(PROGRESS) Running cargo publish --dry-run for standalone crates...\n"
200+
@cargo publish --dry-run -p solverforge-core >/dev/null && printf "$(GREEN)$(CHECK) solverforge-core dry-run passed$(RESET)\n" || exit 1
201+
@cargo publish --dry-run -p solverforge-macros >/dev/null && printf "$(GREEN)$(CHECK) solverforge-macros dry-run passed$(RESET)\n" || exit 1
202+
@cargo publish --dry-run -p solverforge-console >/dev/null && printf "$(GREEN)$(CHECK) solverforge-console dry-run passed$(RESET)\n" || exit 1
203+
@cargo publish --dry-run -p solverforge-cli >/dev/null && printf "$(GREEN)$(CHECK) solverforge-cli dry-run passed$(RESET)\n" || exit 1
204+
@printf "$(GRAY)Dependent crates still need staggered dry-runs once their exact-version dependencies are visible on crates.io.$(RESET)\n"
205+
@printf "$(GRAY)Run cargo publish --dry-run for scoring, config, solver, cvrp, and facade immediately before each upload.$(RESET)\n\n"
201206

202207
publish-crates: banner
203208
@printf "$(CYAN)$(BOLD)╔══════════════════════════════════════════════════════════╗$(RESET)\n"
@@ -207,25 +212,31 @@ publish-crates: banner
207212
@printf "$(YELLOW)Press Ctrl+C to abort, or Enter to continue...$(RESET)\n"
208213
@read dummy
209214
@printf "\n$(PROGRESS) Publishing crates in dependency order...\n\n"
210-
@printf "$(ARROW) [1/7] Publishing solverforge-core...\n"
215+
@printf "$(ARROW) [1/9] Publishing solverforge-core...\n"
211216
@cargo publish -p solverforge-core && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
212217
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
213-
@printf "$(ARROW) [2/7] Publishing solverforge-macros...\n"
218+
@printf "$(ARROW) [2/9] Publishing solverforge-macros...\n"
214219
@cargo publish -p solverforge-macros && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
215220
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
216-
@printf "$(ARROW) [3/7] Publishing solverforge-scoring...\n"
221+
@printf "$(ARROW) [3/9] Publishing solverforge-scoring...\n"
217222
@cargo publish -p solverforge-scoring && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
218223
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
219-
@printf "$(ARROW) [4/7] Publishing solverforge-config...\n"
224+
@printf "$(ARROW) [4/9] Publishing solverforge-config...\n"
220225
@cargo publish -p solverforge-config && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
221226
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
222-
@printf "$(ARROW) [5/7] Publishing solverforge-solver...\n"
227+
@printf "$(ARROW) [5/9] Publishing solverforge-solver...\n"
223228
@cargo publish -p solverforge-solver && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
224229
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
225-
@printf "$(ARROW) [6/7] Publishing solverforge (facade)...\n"
230+
@printf "$(ARROW) [6/9] Publishing solverforge-cvrp...\n"
231+
@cargo publish -p solverforge-cvrp && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
232+
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
233+
@printf "$(ARROW) [7/9] Publishing solverforge-console...\n"
234+
@cargo publish -p solverforge-console && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
235+
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
236+
@printf "$(ARROW) [8/9] Publishing solverforge (facade)...\n"
226237
@cargo publish -p solverforge && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
227238
@printf "$(GRAY)Waiting 45s for crates.io index...$(RESET)\n" && sleep 45
228-
@printf "$(ARROW) [7/7] Publishing solverforge-cli...\n"
239+
@printf "$(ARROW) [9/9] Publishing solverforge-cli...\n"
229240
@cargo publish -p solverforge-cli && printf "$(GREEN)$(CHECK) Published$(RESET)\n" || exit 1
230241
@printf "\n$(GREEN)$(BOLD)╔══════════════════════════════════════════════════════════╗$(RESET)\n"
231242
@printf "$(GREEN)$(BOLD)$(CHECK) All crates published successfully! ║$(RESET)\n"
@@ -286,7 +297,7 @@ help: banner
286297
@/bin/echo -e ""
287298
@/bin/echo -e "$(CYAN)$(BOLD)Publishing:$(RESET)"
288299
@/bin/echo -e " $(GREEN)make publish-crates-dry$(RESET) - Dry-run publish to crates.io"
289-
@/bin/echo -e " $(GREEN)make publish-crates$(RESET) - $(RED)$(BOLD)Publish to crates.io (all 8 crates)$(RESET)"
300+
@/bin/echo -e " $(GREEN)make publish-crates$(RESET) - $(RED)$(BOLD)Publish to crates.io (all 9 publishable crates)$(RESET)"
290301
@/bin/echo -e ""
291302
@/bin/echo -e "$(CYAN)$(BOLD)CLI:$(RESET)"
292303
@/bin/echo -e " $(GREEN)make install-cli$(RESET) - Install solverforge CLI binary"

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ solverforge = { version = "0.5", features = ["console"] }
8383
| `decimal` | Decimal score support via `rust_decimal` |
8484
| `serde` | Serialization support for domain types |
8585

86+
## Release Operations
87+
88+
The workspace release checklist, publish order, and crate stability matrix live in [RELEASE.md](RELEASE.md).
89+
8690
## Quick Start
8791

8892
### 1. Define Your Domain Model

RELEASE.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# Release Guide
2+
3+
Release reference for the `release/0.6.0` line and later patch releases.
4+
5+
## Stability Matrix
6+
7+
| Crate | Status | Release Expectation | Notes |
8+
|-------|--------|---------------------|-------|
9+
| `solverforge-core` | Stable | Publish on every coordinated release | Foundational score/domain traits; lowest-level dependency |
10+
| `solverforge-macros` | Stable | Publish on every coordinated release | Proc-macro surface used by the facade and templates |
11+
| `solverforge-scoring` | Stable | Publish on every coordinated release | Constraint-stream and incremental scoring engine |
12+
| `solverforge-config` | Stable | Publish on every coordinated release | Runtime configuration consumed by the solver layer |
13+
| `solverforge-solver` | Stable | Publish on every coordinated release | Main solve engine and manager APIs |
14+
| `solverforge` | Stable | Publish on every coordinated release | Public facade crate and primary library entry point |
15+
| `solverforge-cli` | Beta | Publish when scaffold or operator workflow changes | User-facing binary; validate generated projects before release |
16+
| `solverforge-cvrp` | Beta | Publish on every facade version change | Required by the facade's exact-version dependency set |
17+
| `solverforge-console` | Beta | Publish on every facade version change | Required for the facade's exact-version optional `console` feature |
18+
| `solverforge-test` | Internal | Do not publish | Shared test fixtures only |
19+
20+
Status definitions:
21+
22+
- `Stable`: public API expected to remain coherent across the release line; regressions block release.
23+
- `Beta`: supported and versioned, but still more likely to receive usability and coverage fixes between patch releases.
24+
- `Internal`: workspace-only support crate; not part of the published product surface.
25+
26+
## Publish Order
27+
28+
When versions change across the workspace, publish crates in dependency order:
29+
30+
1. `solverforge-core`
31+
2. `solverforge-macros`
32+
3. `solverforge-scoring`
33+
4. `solverforge-config`
34+
5. `solverforge-solver`
35+
6. `solverforge-cvrp`
36+
7. `solverforge-console`
37+
8. `solverforge`
38+
9. `solverforge-cli`
39+
40+
`solverforge-test` stays unpublished.
41+
42+
## Release Checklist
43+
44+
1. Confirm the release branch is correct.
45+
Use `release/0.6.0` as the base for this release line.
46+
2. Confirm all release-blocking PRs are merged.
47+
Verify open issues/PRs targeted at the release branch are either merged or explicitly deferred.
48+
3. Sync version and changelog state.
49+
Update `CHANGELOG.md` and ensure workspace crate versions are coherent.
50+
4. Validate canonical docs.
51+
Check `README.md`, crate `WIREFRAME.md` files, and this document for stale public-surface details.
52+
5. Run formatting and lint gates.
53+
`cargo fmt --all -- --check`
54+
`cargo clippy --workspace --all-targets --all-features -- -D warnings`
55+
6. Run test gates.
56+
`cargo test --workspace --all-features`
57+
`make pre-release`
58+
7. Validate scaffolded user flows.
59+
Run `cargo test -p solverforge-cli`
60+
Run ignored scaffold cargo-check tests if template-affecting changes landed.
61+
8. Verify publishability.
62+
Run real package dry-runs for crates that can be verified before publish:
63+
`cargo publish --dry-run -p solverforge-core`
64+
`cargo publish --dry-run -p solverforge-macros`
65+
`cargo publish --dry-run -p solverforge-console`
66+
`cargo publish --dry-run -p solverforge-cli`
67+
For dependent crates (`solverforge-scoring`, `solverforge-config`, `solverforge-solver`, `solverforge-cvrp`, `solverforge`), rerun `cargo publish --dry-run -p <crate>` immediately before uploading each crate, after its exact-version dependencies are visible on crates.io.
68+
9. Publish crates in dependency order.
69+
Use `make publish-crates` or publish manually in the order listed above.
70+
10. Post-publish verification.
71+
Confirm crates.io versions, docs.rs builds, and install smoke tests:
72+
`cargo install solverforge-cli --version <version>`
73+
`cargo add solverforge@<version>`
74+
75+
## Release Notes Inputs
76+
77+
Capture these before tagging:
78+
79+
- Merged PR list against `release/0.6.0`
80+
- Breaking public-surface changes, if any
81+
- New templates, commands, macros, or helper APIs
82+
- New validation coverage or release-risk reductions

0 commit comments

Comments
 (0)