From fceddfe9d7f36c94ea70c38e95875196668cb1ba Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 26 Oct 2026 20:11:56 +0000 Subject: [PATCH] ci(check-links): widen lychee's inputs to docs/** and the root history pages Add 'docs/**/*.md' (with docs/adr/ excluded via --exclude-path, since the Check ADR cross-links step owns that registry) and CHANGELOG.md, RELEASE_NOTES.md, CONTRIBUTING.md, ROADMAP.md, LICENSING.md and CODE_OF_CONDUCT.md to the job's LYCHEE_ARGS. Fix the six dead links the widened run reported on origin/main: two targets that moved (the formula guide, the driver-memory changelog) now point at their new paths; four whose targets were deleted on purpose (plugin-org-scoping's README, REMOTE_API_COMMANDS.md, the internal roadmap and the quick-start doc) lose the link or the sentence. Claude-Session: https://claude.ai/code/session_019PqtBRVkBPJHnCXGWvUQED Co-authored-by: Claude --- .github/workflows/check-links.yml | 39 +++++++++++++++++++------------ CHANGELOG.md | 7 +++--- RELEASE_NOTES.md | 4 +--- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index 24d2913e18e..2dce269cdaa 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index ad7300b7c67..a9e2fc892b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 @@ -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. @@ -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`, diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index b16e55b7a05..c8163028151 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -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) @@ -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