The safety mechanism
Three commands work together:ekanos sources answers “which sources do I hold a seat on?” From there, ekanos use pins a target and ekanos publish verifies it before uploading anything.
Sources and seats
ekanos sources lists every source on which you hold a developer or source_admin seat:
* marks the source saved in this project’s ekanos.json. If that slug is not in your list, the output says so. In JSON mode, data is { host, sources: [{ id, slug, name, roles }], activeSource }.
Publish target resolution
ekanos publish resolves its target from:
--sourceflag (explicit)sourcefield inekanos.json(implicit)
validation (exit 3): No Ekanos source given for the submission. The hint lists your seats when they can be fetched.
Safety rules
Before packing or submitting anything,publish fetches your seat list and applies these rules:
Plain English
- One seat? Just publish. Nothing to disambiguate.
- Explicit
--source? Just publish. You said which one. - Several seats, source from
ekanos.json, human at a terminal? The CLI prints the target and asksProceed? [y/N]. - Several seats, source from
ekanos.json, script/agent/pipe? Pass--source, or--yesto confirm the target already inekanos.json. - Not a seat you hold? Always forbidden, with a hint listing your actual seats.
Workflow examples
One source
After the first publish,ekanos.json remembers the source:
Several sources
Useekanos use to switch targets:
Agent publishing
Never pass--yes through an ambiguity you haven’t resolved:
CI/CD pipeline
Commitekanos.json with the intended source, then either pass --source explicitly or confirm the committed target with --yes:
--yes exists for a human’s already-confirmed intent and for CI pipelines pinned to one source — not as a way to silence the check.
Complete publish flow
-
Preflight
- Resolve the host and require a stored session (exit 4 without one)
- Load
ekanos.jsonand run the schema-skew gate (exit 9) - Refuse if the host has declared this CLI version unsupported (exit 9)
- Resolve the source (exit 3 without one)
-
Validate
- Run the same findings pass as
ekanos validate - Escalate
project.host-compiler-rulesfromwarntoerror - Refuse on any error-severity finding with
gate_failed(exit 10) and the findings indata.findings— nothing is uploaded
- Run the same findings pass as
-
Verify the target
- Fetch your seat list and apply the safety rules above
-
Pack
- Build a gzipped tarball of
ekanos.json,package.json,README.md(if present), roottsconfig*.jsonand vitest config, and everything undersrc/ - Dotfiles,
node_modules, and symlinks are excluded - Archives over 4 MiB fail with
validation(exit 3)
- Build a gzipped tarball of
-
Submit
- POST to
/api/partner/submissionsat thepackage.jsonversion
- POST to
-
Report
data.sourceis{ id, slug, name }— exactly which source received the submission — alongsidesubmissionId,state, andarchiveSha256source(andhost, if absent) are saved toekanos.json
Error handling
Forbidden (exit 5)
ekanos use <source> or ekanos publish --source <source>.
Ambiguous target (exit 3)
- Pass
--sourceexplicitly this run - Run
ekanos useto change the project’s default - Pass
--yesonly ifekanos.jsonalready names the target you intend
Refused on findings (exit 10)
In human mode, the CLI printsRefusing to publish: 2 findings., then the findings, then ekanos publish failed: 2 errors. In JSON mode, error.message is Refusing to publish: 2 validation findings. and the findings are in data.findings. Nothing was uploaded.
Fix: Run ekanos validate, fix the error-severity findings, and publish again.
Version already submitted (exit 7)
Post-submit monitoring
Useekanos status to track your submission:
submitted (awaiting the gate) to gated (passed the gate, awaiting admission) or rejected, then dev. status --watch polls every 30 seconds and exits 0 on gated or dev, or 10 on rejected with the gate’s findings in data.findings. ekanos status --findings renders each version’s full finding list.
See Commands: status for full details.
Troubleshooting
No source configured
publish found no --source and no source in ekanos.json. Either:
- Run
ekanos use <source>to pick one - Pass
--source <source>to this publish
Source not in your seat list
A typo in the slug, or you don’t hold a seat on it. Runekanos sources to check the slug; if you need a seat, ask your Ekanos operator.
Republishing the same version
Submitted versions are immutable: republishing the samepackage.json version exits 7. Bump version in package.json (and in defineIntegration(), which validate checks against it) and publish again.