v2.1.0
What's Changed
Added
cuelabs-system-designskill: designs a product's system from a PRD, a
repository, or a description, following the language-by-role pipeline
rule. It decides the services (including when to split a processing
service versus run worker pools), how they communicate, and who owns each
store, and adds reusable patterns: upload tickets, claim-check, outbox,
versioned results, and raw provider events. It writes
docs/system-design.mdand renders a self-contained diagram page
(scripts/render_design.py, stdlib only) with Excalidraw and Mermaid copy
buttons, a layout checker, and an artifact mode for hosts that publish
pages.- Multi-service pipeline canon: a repo may carry more than one non-
common
service when a real multi-stage pipeline exists (gateway + processing),
with Go staying the CRUD/data owner, a processing service owning every
decision with no persistence of its own, and a gateway service staying
thin : expendit'sapi/intake(Node) +api/process(Python) is the
reference case. - Node API service standard (NestJS,
api/<service>, distinct fromweb):
folder layout, file/folder naming row,Dockerfile.node+
dockerignore.nodetemplates, and a NestJS 11.x version pin. - Pub/sub (Aiven Kafka) documented as a standardized transport alongside
gRPC and HTTP/JSON, with fleet-wideKAFKA_BROKERS/KAFKA_USERNAME/
KAFKA_PASSWORD/KAFKA_SSL_CAenv names : chosen over gRPC s2s for
expendit/apparule/upstat's pipeline because it survives a Cloud Run
consumer restart with zero message loss (verified against a live Aiven
instance), where a gRPC channel can silently zombie on scale-to-zero.
Kafka consumers must run as a Cloud Run worker pool, or as a service with
min-instances >= 1and instance-based billing, since a message does not
wake a scaled-to-zero instance. - gRPC s2s client resilience on Cloud Run: a deadline on every call, a real
retry policy (bounded attempts, backoff,UNAVAILABLEonly) for
idempotent methods, and keepalive for active calls.waitForReady: false
is no longer described as a retry policy, and idle dead-connection
detection is no longer promised. - Serverless functions are now explicitly scoped to probe/health-check
endpoints only; real logic always lives in a containerizedapi/<service>. organization-policy.mdpicked up the gRPC s2s client resilience note
thatcloud-and-ci.mdalready had (the two copies had drifted).product-decisions.md: the checklist of values each product chooses
for itself (slug, default theme, Playwright port, service ports, data
store, settings IA, date idiom, KYC tier contents, and more), each with a
stableP-nnID, recorded in the product'sdocs/decisions.md.- "Shared ecosystem services" table in
organization-policy.md: the
observability gateway, analytics events API, identity project, and
infrastructure are named by role and contract; the table is the only place
a providing product is named. validate_catalog.pyfails when a product name appears underskills/
outside that table, or when a reference carries a dated ratification note.cuelabs_standard.py init --name <product> --surface NAME=STATUS: starts a
new product from an empty repository by writing.cuelabs/project.yaml
and, for thecuelabsprofile, adocs/decisions.mdseeded with the
Standard parameters table (assets/templates/decisions.md). It validates
the manifest before writing and never overwrites either file.- "Procedure B : bootstrap a new repo" is now a full walkthrough, from
git initthroughinit, parameter decisions,apply, per-surface
scaffolding, delivery, andverify; the README shows the quick start. - Trigger evaluation cases for starting a new product.
- Bootstrapping asks before it decides: the engineering skill confirms the
product slug, display name, profile, and surface statuses with the user
beforeinit, proposes eachP-nnvalue with a reason and records it only
once confirmed, and reports unconfirmed values as open decisions.
Changed
- References no longer carry duplicate copies of the same canon. Each topic
has one owner: cloud/CI, containers/deploy, and telemetry/environment live
incuelabs-delivery-standard; API conventions, docs contracts, and
analytics live inorganization-policy.md; the design documentation
standard lives incuelabs-design-standard; orchestration and QA loops
live inqa-and-orchestration.md; changelog discipline lives in
repository-and-services.md. The engineering skill keeps short summaries
that point at the owning skill, so it still works when installed alone. - The skills are product-agnostic, so they can bootstrap a brand-new
product. Product names, per-product values, incident stories, dated
ratification notes, and internal decision codes are gone from every
reference; each rule now states its contract directly instead of pointing
at one product's implementation. History stays in this changelog. - Per-product values became product decisions: the marketing product slot,
default theme, Playwright port, settings IA, date idiom, and service port
assignments are recorded by each product (seeproduct-decisions.md). - The Playwright port rule now requires a port in 3100-3399 that no sibling
product uses.
Removed
-
cuelabs-design-standard/references/qa-loop.md, an identical copy of
qa-and-orchestration.md. -
#141: Node API, pub/sub, multi-service pipeline, bootstrap, and system design standards.
Full Changelog: v2.0.1...v2.1.0