Skip to content

Commit fceddfe

Browse files
committed
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 <noreply@anthropic.com>
1 parent 69aa630 commit fceddfe

3 files changed

Lines changed: 28 additions & 22 deletions

File tree

‎.github/workflows/check-links.yml‎

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,30 +62,39 @@ jobs:
6262
# green at all: 1286 root-relative links fail as "Cannot resolve
6363
# root-relative link ... provide a root dir".
6464
#
65-
# ⛔ Do NOT add `docs/adr/**/*.md` here. It looks like the one-line fix
66-
# for #6592 and it is not: measured on the pinned lychee 0.24.2, that
67-
# glob reports 8 broken links today, every one a pre-existing ADR →
68-
# source-tree link whose target moved out of this repo. This job would
69-
# be red on every PR from the moment it merged, which is how an
70-
# advisory lane becomes a lane nobody reads (#6028 landed it
71-
# advisory-first specifically to earn a green streak). `docs/adr/` is
72-
# checked by the `Check ADR cross-links` step below instead, which can
73-
# freeze those 8 on a shrink-only baseline and fail on a NEW one --
74-
# something neither `exclude` nor `.lycheeignore` can express, because
75-
# neither ever tells you an entry stopped being needed.
76-
# `ARCHITECTURE.md` joined this glob in #6867: unlike `docs/adr/**`, it
77-
# carried no pre-existing rot once its 10 dead links + 2 stale path
78-
# references were fixed in the same PR, so -- unlike the ADR directory
79-
# above -- it needs no KNOWN_DEAD_TARGETS-style baseline to land clean.
65+
# ⛔ `docs/adr/` stays OUT of lychee's reach: `'docs/**/*.md'` below
66+
# would sweep it in, so `--exclude-path '^docs/adr/'` takes it back out
67+
# (a regex over the input path as globbed, measured to drop exactly that
68+
# directory on the pinned 0.24.2 while `lychee.toml`'s own `exclude_path`
69+
# entries keep applying -- the CLI flag adds to them, it does not replace
70+
# them). The decision registry has ONE link owner, the `Check ADR
71+
# cross-links` step below, which can freeze a pre-existing break on a
72+
# shrink-only baseline and fail on a NEW one -- something neither
73+
# `exclude` nor `.lycheeignore` can express, because neither ever tells
74+
# you an entry stopped being needed. Checking the same files twice, under
75+
# two rule sets, would put two verdicts on one link.
76+
# `ARCHITECTURE.md` joined this glob in #6867; `docs/**` and the root
77+
# history/governance pages (CHANGELOG, RELEASE_NOTES, CONTRIBUTING,
78+
# ROADMAP, LICENSING, CODE_OF_CONDUCT) joined in #26087, each landing
79+
# clean once its dead links were fixed in the same PR, so none needs a
80+
# KNOWN_DEAD_TARGETS-style baseline.
8081
LYCHEE_ARGS: >-
8182
--offline
8283
--root-dir ${{ github.workspace }}/content
8384
--fallback-extensions mdx,md
8485
--config lychee.toml
86+
--exclude-path '^docs/adr/'
8587
'content/**/*.md'
8688
'content/**/*.mdx'
8789
'README.md'
8890
'ARCHITECTURE.md'
91+
'docs/**/*.md'
92+
'CHANGELOG.md'
93+
'RELEASE_NOTES.md'
94+
'CONTRIBUTING.md'
95+
'ROADMAP.md'
96+
'LICENSING.md'
97+
'CODE_OF_CONDUCT.md'
8998
9099
# ⛔ Pin the lychee binary explicitly rather than inheriting the action's
91100
# default (#8238). Three comments in this file already reason about "the

‎CHANGELOG.md‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ the `organization_id` auto-stamp middleware, the `sys_organization`
160160
post-create seed-replay pipeline, the default-organization bootstrap,
161161
and the `cloneTenantSeedData` export.
162162

163-
**New package**: [`@objectstack/plugin-org-scoping`](packages/plugins/plugin-org-scoping/README.md)
164-
ships the row-level Organization scoping primitives — `organization_id`
163+
**New package**: `@objectstack/plugin-org-scoping` (since retired from this
164+
repository) ships the row-level Organization scoping primitives — `organization_id`
165165
auto-stamp, per-org seed replay, default-org bootstrap, orphan-row
166166
claim, and a new `org-scoping` service that `plugin-security` probes at
167167
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
10271027
- **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.
10281028
- **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.
10291029
- **`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.
1030-
- **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.
1030+
- **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.
10311031

10321032
### Removed — M9 Expression Unification
10331033
- **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
13521352
- All commands support `--url` and `--token` flags, or use stored credentials from `~/.objectstack/credentials.json`
13531353
- Multiple output formats: `--format json|table|yaml` (yaml available on all commands)
13541354
- Environment variable support: `OBJECTSTACK_URL`, `OBJECTSTACK_TOKEN`
1355-
- See [REMOTE_API_COMMANDS.md](./REMOTE_API_COMMANDS.md) for full documentation
13561355

13571356
### Changed
13581357
- **i18n: `I18nLabelSchema` now accepts `string` only** — `label`, `description`, `title`,

‎RELEASE_NOTES.md‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ See individual CHANGELOG.md files in each package:
286286
- [packages/client/CHANGELOG.md](packages/client/CHANGELOG.md)
287287
- [packages/objectql/CHANGELOG.md](packages/objectql/CHANGELOG.md)
288288
- [packages/runtime/CHANGELOG.md](packages/runtime/CHANGELOG.md)
289-
- [packages/plugins/driver-memory/CHANGELOG.md](packages/plugins/driver-memory/CHANGELOG.md)
289+
- [packages/drivers/driver-memory/CHANGELOG.md](packages/drivers/driver-memory/CHANGELOG.md)
290290
- [packages/plugins/plugin-hono-server/CHANGELOG.md](packages/plugins/plugin-hono-server/CHANGELOG.md)
291291
- [packages/types/CHANGELOG.md](packages/types/CHANGELOG.md)
292292

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

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

328326
## 🛠️ Build Status
329327

0 commit comments

Comments
 (0)