Compare commits

...

3 Commits

Author SHA1 Message Date
MechaCat02
bb88b024d2 docs(versioning): post-1.0 policy with expansion-phase carve-out
Rewrites the "When to bump what" section now that the project is
post-1.0. Replaces the pre-1.0 framing with three explicit rules:

  - Major: surface major bump on a user-facing contract
  - Minor: phase milestone or coherent capability cluster, aligned
    with blueprint Phase boundaries (Phase 5 -> v1.2, etc.)
  - Patch: bug fixes AND additive-only surface changes

The carve-out (patch for additive surface changes) resolves the
tension with the v1.1.x roadmap: every v1.1.x release adds SDK or
schema surface, and strict "minor product bump per minor surface
bump" would inflate the version faster than the user-perceived
"platform changed" milestones warrant.

Examples updated to reflect post-1.0 numbers and the new policy:
adding KV in v1.1.1 (patch), cutting v1.2 as a phase milestone
(minor), renaming a ctx field (major).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 20:41:48 +02:00
MechaCat02
9d01f42d5e chore(release): bump workspace to v1.1.0
Aligns the Cargo package version with the blueprint roadmap labels.
v1.1.0 = SDK foundation (#0) + stdlib utilities (#0.5), the first
release of the Phase 4 / v1.1 series.

Also updates docs/versioning.md:

  - Current versions table: Product 0.6.0 -> 1.1.0
  - Docker / Git tag examples: 0.2.0 -> 1.1.0

Cargo.lock regenerated by `cargo check --workspace`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 20:39:34 +02:00
MechaCat02
1a6324078c Merge branch 'feat/v1.1.0-stdlib-utilities'
v1.1.0 PR #0.5 — Stdlib Utilities. Second and final PR of v1.1.0.

Seven stateless utility modules registered once at engine build:

  - regex:: — is_match/find/find_all/replace/replace_all/split/captures
    via the Rust regex crate (linear-time, no backtracking).
  - random:: — int/float/bytes/string/uuid via OsRng (CSPRNG only;
    bytes capped at 64 KiB, string at 4 KiB).
  - time:: — now/now_ms/parse/format/add_seconds/diff_seconds (UTC
    only, RFC 3339, checked arithmetic).
  - json:: — parse/stringify/stringify_pretty (reuses the existing
    dynamic <-> JSON bridge).
  - base64:: — encode/decode + encode_url/decode_url, String+Blob
    inputs on encode.
  - hex:: — encode/decode (lowercase out, case-insensitive in).
  - url:: — encode/decode + encode_query (RFC 3986 unreserved set,
    BTreeMap-ordered query iteration).

Plus docs/stdlib-reference.md covering Rhai's built-in math/string/
array/map plus all seven new namespaces in one reference page, and a
CLAUDE.md pointer to that doc.

Three new workspace deps: regex 1, hex 0.4, percent-encoding 2.
+43 integration tests in crates/executor-core/tests/stdlib.rs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 20:33:16 +02:00
3 changed files with 30 additions and 30 deletions

18
Cargo.lock generated
View File

@@ -1505,7 +1505,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "picloud"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"anyhow",
"async-trait",
@@ -1531,7 +1531,7 @@ dependencies = [
[[package]]
name = "picloud-cli"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"anyhow",
"assert_cmd",
@@ -1552,7 +1552,7 @@ dependencies = [
[[package]]
name = "picloud-executor"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"anyhow",
"picloud-executor-core",
@@ -1564,7 +1564,7 @@ dependencies = [
[[package]]
name = "picloud-executor-core"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"base64",
"chrono",
@@ -1583,7 +1583,7 @@ dependencies = [
[[package]]
name = "picloud-manager"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"anyhow",
"picloud-manager-core",
@@ -1595,7 +1595,7 @@ dependencies = [
[[package]]
name = "picloud-manager-core"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"argon2",
"async-trait",
@@ -1619,7 +1619,7 @@ dependencies = [
[[package]]
name = "picloud-orchestrator"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"anyhow",
"picloud-orchestrator-core",
@@ -1631,7 +1631,7 @@ dependencies = [
[[package]]
name = "picloud-orchestrator-core"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"async-trait",
"axum",
@@ -1650,7 +1650,7 @@ dependencies = [
[[package]]
name = "picloud-shared"
version = "0.6.0"
version = "1.1.0"
dependencies = [
"async-trait",
"chrono",

View File

@@ -13,7 +13,7 @@ members = [
]
[workspace.package]
version = "0.6.0"
version = "1.1.0"
edition = "2021"
rust-version = "1.92"
license = "MIT OR Apache-2.0"

View File

@@ -14,8 +14,8 @@ All of these carry the same version and are bumped together:
- Every crate in the Cargo workspace (via `version.workspace = true`)
- The dashboard's `package.json`
- Docker image tags (`picloud:0.2.0`)
- Git tags (`v0.2.0`)
- Docker image tags (`picloud:1.1.0`)
- Git tags (`v1.1.0`)
Defined once in [`Cargo.toml`](../Cargo.toml) under `[workspace.package]`. There is no scenario where one crate is at a different version than another in the same build.
@@ -106,19 +106,15 @@ A versioning scheme without enforcement decays in months. Five cheap mechanical
## When to bump what
The product version follows SemVer applied pragmatically — we're pre-1.0, so the rules are looser:
The product version uses SemVer with one carve-out for the platform's expansion cadence:
- **Patch** (`0.2.00.2.1`) — bug fixes, no surface change
- **Minor** (`0.2 → 0.3`) — any surface bump, new features, or breaking changes (pre-1.0 license)
- **Major** (`0 → 1`) — first stable release; SDK and API both committed to long-term compatibility
- **Major** (`1.x → 2.0`) — surface major bump on a user-facing contract: removed/renamed/retyped SDK function, retired API version, breaking schema change that requires user action, breaking wire-protocol change.
- **Minor** (`1.1 → 1.2`) — phase milestone or coherent capability cluster. Bumped when the maintainer marks a release as "the platform moved forward in a way that warrants a number". Typically aligned with blueprint Phase boundaries (Phase 5 → v1.2, Phase 6 → v1.3+).
- **Patch** (`1.1.0 → 1.1.1`) — everything else: bug fixes AND **additive-only surface changes**. New SDK function, new admin endpoint, new schema migration that only adds tables/columns, new env var, new trigger kind — all patch.
After `1.0`, the product version follows strict SemVer based on the *worst* surface change:
**Why the carve-out:** PiCloud ships in many small additive PRs (every v1.1.x release adds SDK surface). A strict "minor product bump per minor surface bump" rule would inflate the product version faster than the actual user-perceived "platform changed" milestones warrant. Patch-for-additions keeps the minor digit aligned with capability clusters, not individual feature drops.
- Any surface major bump → product major bump
- Any surface minor bump → product minor bump (at minimum)
- No surface changes → product patch
A surface can hit its own `1.0` independently of the product. The SDK in particular is likely to stabilize before the platform does, since scripts in production demand it.
**Surface versions follow their own rules** (table above) and don't track the product version. A surface can independently hit its own `1.0` or `2.0`. The SDK in particular is likely to stabilize before the platform does, since scripts in production demand it.
---
@@ -126,7 +122,7 @@ A surface can hit its own `1.0` independently of the product. The SDK in particu
| | Version |
|---|---|
| Product | `0.6.0` |
| Product | `1.1.0` |
| SDK | `1.1` (adds `ctx.request.params`, `ctx.request.query`, `ctx.request.rest`) |
| API | `1` (additive: `Script.app_id`, `Route.app_id`, `ExecutionLog.app_id`, new `/api/v1/admin/apps/*` and `/api/v1/admin/api-keys/*` endpoints, `?app=` filter on script list, `Authorization: Bearer pic_…` credential type, 403 responses on previously-401-only admin endpoints when the caller lacks the required capability) |
| Schema | `6` (matches `migrations/0006_users_authz.sql`) |
@@ -138,15 +134,19 @@ Read live from `GET /version` on any running instance.
## Examples
**Adding a `kv.*` SDK in v1.1+:**
- Workspace bump: `0.2.0 → 0.3.0` (pre-1.0 minor)
- SDK bump: `"1.0" → "1.1"` (added functions only)
- API bump: none (no new endpoints affect existing API contract)
- Schema bump: `12` (`0002_kv_store.sql` adds the `kv_store` table)
**Adding a `kv.*` SDK in v1.1.1:**
- Workspace bump: `1.1.0 → 1.1.1` (patch — additive SDK + schema, no breakage)
- SDK bump: `"1.1" → "1.2"` (added functions only)
- API bump: none (admin endpoints for trigger CRUD are additive)
- Schema bump: `67` (`0007_kv_store.sql` adds the `kv_store` table)
**Cutting the v1.2 release (Phase 5: workflows, advanced query, interceptors):**
- Workspace bump: `1.1.8 → 1.2.0` (minor — phase milestone)
- Even if no individual change is breaking, the maintainer-marked phase transition warrants the minor digit.
**Renaming `ctx.execution_id` to `ctx.exec_id`:**
- SDK bump: `"1.x" → "2.0"` (breaking)
- Product: minor bump pre-1.0, major bump post-1.0
- SDK bump: `"1.x" → "2.0"` (breaking — removed/retyped script-visible field)
- Workspace bump: `1.x.y → 2.0.0` (product major — user-facing contract break)
- Migration path: keep `ctx.execution_id` available in 1.x for a deprecation window, add `ctx.exec_id` alongside; flip to 2.0 only when both fields have shipped together for a release.
**Adding pagination to `GET /api/v1/admin/scripts`:**