You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(cli,runtime): a named artifact that is missing fails loudly, and the ordering claims say what the kernel resolves (#4110 follow-up) (#4138)
One principle throughout: "the platform can boot with no application" (#4085) is
a statement about CAPABILITY, and it does not license reading a missing NAMED
input as "you meant an empty boot".
- #4110 made an absent artifact non-fatal all the way down — right for the
conventional `<cwd>/dist/objectstack.json` ("not compiled yet"), wrong for
`OS_ARTIFACT_PATH` / `{ artifactPath }`, which skip the existence check by
design. `OS_ARTIFACT_PATH=/nope os serve` reached "Server is ready" with the
missing path named NOWHERE in its output. `createDefaultHostConfig` — the boot
with no config, where the artifact IS the deployment — now rejects a named
local artifact that does not exist, naming the path and which source named it.
This restores an invariant `os start` already documents it depends on
("Defer to serve.ts which already prints a precise error").
- `serve`'s "config not found" refusal now says WHERE it looked (config path,
artifact path, OS_ARTIFACT_PATH unset) and still refuses rather than inventing
a zero-object platform, pointing at `os start` for a boot that is app-less on
purpose.
- That refusal was being TRUNCATED: `this.exit(1)` reaches oclif's
`process.exit` without draining a piped stdout, so only the first two lines
survived — the "where to look" part went missing. Both pre-flight refusals emit
one write now. Caught by the e2e added here, not by review.
- The ordering claims in `createStandaloneStack` (and the test that pinned an
array index with a rationale the kernel does not implement) now describe what
the kernel actually resolves: the connect happens in `init()`, and the
dependency graph hoists ObjectQLPlugin ahead of the datasource plugin. The test
pins the declared dependency instead, which deleting the array position cannot
break. #4131 tracks making the AppPlugin end of that contract enforced.
Docs: the artifact resolution-priority list read as one fall-through chain; a
named artifact never participated in it.
A **named** artifact (`--artifact` or `OS_ARTIFACT_PATH`) does *not* participate
328
+
in that fall-through: it is used as given, and a local path that does not exist
329
+
**fails the boot** — naming the path and which of the two named it — instead of
330
+
quietly continuing down the list. You asked for a specific artifact, so booting
331
+
something else (or an empty kernel) would hide the typo behind a running server.
332
+
The fall-through applies to the **conventional** locations only. Remote
333
+
(`http(s)://`) sources cannot be checked up front and are validated when fetched.
334
+
</Callout>
335
+
326
336
**What it boots:**
327
337
- Reads the artifact's `manifest`, `objects`, `views`, `flows`, …
328
338
- Auto-registers the platform services declared in `requires: [...]` (e.g. `ai`, `automation`, `analytics`, `auth`, `ui`). Declaring a **service** capability (`automation`, `analytics`, `ai`, `audit`, …) is a *requirement*: if its provider package isn't installed, boot **fails fast** with a clear error instead of silently starting without a capability you asked for. (`auth` and `ui` are tier-gated with their own opt-in rules — `auth`'s secret-gated skip is described below.)
0 commit comments