Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions .github/workflows/check-links.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,30 +62,39 @@ jobs:
# green at all: 1286 root-relative links fail as "Cannot resolve
# root-relative link ... provide a root dir".
#
# ⛔ Do NOT add `docs/adr/**/*.md` here. It looks like the one-line fix
# for #6592 and it is not: measured on the pinned lychee 0.24.2, that
# glob reports 8 broken links today, every one a pre-existing ADR →
# source-tree link whose target moved out of this repo. This job would
# be red on every PR from the moment it merged, which is how an
# advisory lane becomes a lane nobody reads (#6028 landed it
# advisory-first specifically to earn a green streak). `docs/adr/` is
# checked by the `Check ADR cross-links` step below instead, which can
# freeze those 8 on a shrink-only baseline and fail on a NEW one --
# something neither `exclude` nor `.lycheeignore` can express, because
# neither ever tells you an entry stopped being needed.
# `ARCHITECTURE.md` joined this glob in #6867: unlike `docs/adr/**`, it
# carried no pre-existing rot once its 10 dead links + 2 stale path
# references were fixed in the same PR, so -- unlike the ADR directory
# above -- it needs no KNOWN_DEAD_TARGETS-style baseline to land clean.
# ⛔ `docs/adr/` stays OUT of lychee's reach: `'docs/**/*.md'` below
# would sweep it in, so `--exclude-path '^docs/adr/'` takes it back out
# (a regex over the input path as globbed, measured to drop exactly that
# directory on the pinned 0.24.2 while `lychee.toml`'s own `exclude_path`
# entries keep applying -- the CLI flag adds to them, it does not replace
# them). The decision registry has ONE link owner, the `Check ADR
# cross-links` step below, which can freeze a pre-existing break on a
# shrink-only baseline and fail on a NEW one -- something neither
# `exclude` nor `.lycheeignore` can express, because neither ever tells
# you an entry stopped being needed. Checking the same files twice, under
# two rule sets, would put two verdicts on one link.
# `ARCHITECTURE.md` joined this glob in #6867; `docs/**` and the root
# history/governance pages (CHANGELOG, RELEASE_NOTES, CONTRIBUTING,
# ROADMAP, LICENSING, CODE_OF_CONDUCT) joined in #26087, each landing
# clean once its dead links were fixed in the same PR, so none needs a
# KNOWN_DEAD_TARGETS-style baseline.
LYCHEE_ARGS: >-
--offline
--root-dir ${{ github.workspace }}/content
--fallback-extensions mdx,md
--config lychee.toml
--exclude-path '^docs/adr/'
'content/**/*.md'
'content/**/*.mdx'
'README.md'
'ARCHITECTURE.md'
'docs/**/*.md'
'CHANGELOG.md'
'RELEASE_NOTES.md'
'CONTRIBUTING.md'
'ROADMAP.md'
'LICENSING.md'
'CODE_OF_CONDUCT.md'

# ⛔ Pin the lychee binary explicitly rather than inheriting the action's
# default (#8238). Three comments in this file already reason about "the
Expand Down
7 changes: 3 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ the `organization_id` auto-stamp middleware, the `sys_organization`
post-create seed-replay pipeline, the default-organization bootstrap,
and the `cloneTenantSeedData` export.

**New package**: [`@objectstack/plugin-org-scoping`](packages/plugins/plugin-org-scoping/README.md)
ships the row-level Organization scoping primitives — `organization_id`
**New package**: `@objectstack/plugin-org-scoping` (since retired from this
repository) ships the row-level Organization scoping primitives — `organization_id`
auto-stamp, per-org seed replay, default-org bootstrap, orphan-row
claim, and a new `org-scoping` service that `plugin-security` probes at
start time to decide whether to keep wildcard `tenant_isolation` RLS
Expand Down Expand Up @@ -1027,7 +1027,7 @@ Followup to M10.30a. Walked every Setup menu in a real tenant; produced verdict
- **Dynamic seed values** (`@objectstack/runtime` SeedLoader) — `Dataset.records` now accepts `cel\`...\`` expressions for fields whose value depends on the install-time clock or identity. SeedLoader walks records and evaluates expressions through `ExpressionEngine` with a single per-load pinned `now`, so package authors can ship `close_date: cel\`daysFromNow(45)\`` without baking their laptop's timestamp into the artifact. Determinism gate enforced via SHA-1 comparison of two consecutive `objectstack build` runs. Resolves D11.
- **CRM example migrated to CEL** (`examples/app-crm`) — All 4 formula fields (`lead.full_name`, `contact.full_name`, `campaign.response_rate`, `campaign.roi`) re-written in CEL using the `coalesce()` / ternary patterns. 48 dynamic-date seed values migrated from `new Date()` (compile-time) to `cel\`daysFromNow(N)\`` / `cel\`daysAgo(N)\`` (install-time). Browser-verified end-to-end via `pnpm dev:crm`: `Lead.full_name` renders "Lisa Thompson", `Campaign.roi` renders `1907.04` in the dashboard.
- **`planFormulaProjection` evaluates on default REST projection** (`@objectstack/objectql`) — Previously formulas were only computed when the caller passed an explicit `?fields=` projection. The REST default returns all columns but no formulas, so `Field.type === 'formula'` columns came back as `null` in the dashboard's auto-generated views. Fix: when `requestedFields` is empty/undefined, target every field in the schema for formula evaluation while leaving `projected` undefined so the driver still returns the default column set.
- **New `objectstack-formula` skill** ([`skills/objectstack-formula/SKILL.md`](skills/objectstack-formula/SKILL.md)) and rewritten [`content/docs/guides/formula.mdx`](content/docs/guides/formula.mdx) — Author-facing documentation of the canonical CEL contract: stdlib reference, mandatory patterns for AI emission, mechanical translation table from the legacy Salesforce-flavor DSL, and the determinism contract.
- **New `objectstack-formula` skill** ([`skills/objectstack-formula/SKILL.md`](skills/objectstack-formula/SKILL.md)) and rewritten [`content/docs/data-modeling/formulas.mdx`](content/docs/data-modeling/formulas.mdx) — Author-facing documentation of the canonical CEL contract: stdlib reference, mandatory patterns for AI emission, mechanical translation table from the legacy Salesforce-flavor DSL, and the determinism contract.

### Removed — M9 Expression Unification
- **Custom Salesforce-flavor formula engine** (`@objectstack/objectql`) — Deleted `packages/objectql/src/formula.ts` (433 LoC hand-written recursive-descent parser exposing 22 functions: `CONCAT`/`UPPER`/`IF`/`AND`/`OR`/`ISBLANK`/`TODAY`/…) and its companion `packages/spec/docs/formula-functions.md`. The engine had no formal grammar, no public training corpus, no AST persistence, and was a single-vendor surface. **Salesforce compatibility is not pursued** — see [north-star §8](content/docs/concepts/north-star.mdx) "No private expression DSL". Authors targeting Salesforce semantics rewrite their formulas in CEL using the translation table in the formula skill. Resolves D9.
Expand Down Expand Up @@ -1352,7 +1352,6 @@ Followup to M10.30a. Walked every Setup menu in a real tenant; produced verdict
- All commands support `--url` and `--token` flags, or use stored credentials from `~/.objectstack/credentials.json`
- Multiple output formats: `--format json|table|yaml` (yaml available on all commands)
- Environment variable support: `OBJECTSTACK_URL`, `OBJECTSTACK_TOKEN`
- See [REMOTE_API_COMMANDS.md](./REMOTE_API_COMMANDS.md) for full documentation

### Changed
- **i18n: `I18nLabelSchema` now accepts `string` only** — `label`, `description`, `title`,
Expand Down
4 changes: 1 addition & 3 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ See individual CHANGELOG.md files in each package:
- [packages/client/CHANGELOG.md](packages/client/CHANGELOG.md)
- [packages/objectql/CHANGELOG.md](packages/objectql/CHANGELOG.md)
- [packages/runtime/CHANGELOG.md](packages/runtime/CHANGELOG.md)
- [packages/plugins/driver-memory/CHANGELOG.md](packages/plugins/driver-memory/CHANGELOG.md)
- [packages/drivers/driver-memory/CHANGELOG.md](packages/drivers/driver-memory/CHANGELOG.md)
- [packages/plugins/plugin-hono-server/CHANGELOG.md](packages/plugins/plugin-hono-server/CHANGELOG.md)
- [packages/types/CHANGELOG.md](packages/types/CHANGELOG.md)

Expand Down Expand Up @@ -321,9 +321,7 @@ Version tag `v0.2.0` has been created for this release.
## 📚 Documentation

Full documentation is available at:
- Development Roadmap: [DEVELOPMENT_ROADMAP.md](internal/planning/DEVELOPMENT_ROADMAP.md)
- Architecture: [ARCHITECTURE.md](ARCHITECTURE.md)
- Quick Start: [QUICK_START_IMPLEMENTATION.md](QUICK_START_IMPLEMENTATION.md)

## 🛠️ Build Status

Expand Down
Loading