Ownership boundaries
Decide whether a task belongs in business code, application code, Git automation, or a platform operation.
Farther Shore has one source of truth for each fact. The dashboard and CLI may display repository-owned state, but that does not make it editable there.
The four execution paths
| Path | Owns | How it changes |
|---|---|---|
| Business contract | routes, plans, prices, meters, limits, resources, grants, policies, RBAC, backend declarations, frontend integrations | edit any module under business/, build, and push |
| Application code | backend logic, frontend source, database schema, product-specific data | edit the managed repository and use its normal build/deploy workflow |
| Git automation | validating and applying pushed business code; production frontend builds; preview frontend builds | push the mapped branch or create the production GitHub Release |
| Platform operations | live state without a code representation | use farthershore CLI or the equivalent dashboard action |
The compiler discovers the whole business/ folder and requires one
default-exported fs.business() result. No filename is part of the contract.
Repository-owned contract state
These are code changes, even when the dashboard displays them:
- routes, route groups, features, and surfaces;
- plans (declared kind, recurring price, usage-pricing binding, funding buckets, lifecycle, spend policy), pricing catalogs, and grants;
- measures, dimensions, meters, and meter-route bindings with their admission bounds;
- rate, quota, concurrency, resource, and capacity limits;
- tenancy, RBAC, and backend/frontend integration declarations.
The loop is always edit → farthershore build → push → inspect checks and Apply
Timeline. There is no imperative contract writer.
Platform-owned operating state
Typical CLI jobs include:
- business presentation metadata and origin settings;
- preview-environment lifecycle and organization context;
- backend instances, origin bindings, runtime tokens, and variables;
- frontend status and rollback pointers;
- subscriber inspection, blocking, removal, and accepted-version migration;
- usage, analytics, denials, audit logs, notifications, and workflow status;
- webhook endpoints (always platform-owned — never repository state), test personas, operating agents, and Bulletin handoffs.
Use the live catalog rather than inferring a command:
farthershore operations list --format json
farthershore business --help
An operation without a command is not automatically missing. The catalog tells you whether it is repository-authored, Git-triggered, a subscriber-portal or human decision, a runtime SDK action, covered by another command, or a genuine platform gap.
Non-obvious examples
| Request | Owner | Correct path |
|---|---|---|
Declare a backend named api | Repository | add fs.backend("api") and attach routes |
| Bind that backend to a preview origin | Platform | create/read the environment-local backend row, then use backend bind |
| Deploy a production hosted frontend | Git | create the approved GitHub Release; there is no frontend deploy command |
| Roll back a hosted frontend | Platform | farthershore frontend rollback … --release-id … |
| Roll back a bad business publish | Platform | farthershore business rollback …, which starts a new forward workflow from a captured snapshot |
| Change a price | Repository | edit fs.plan(), then follow the economic release gate |
| Rebind existing commercial pins | Deferred | generalized recurring/non-current pricing rebind is unavailable; pricing.current() still follows activated catalogs forward |
| Store a customer record | Application | use the signed principal and a race-safe database upsert |
Decision procedure
- Can the desired fact be represented in
business/? Edit the repository. - Is it application behavior or data? Edit the application, not the platform contract.
- Does the operation catalog say
git_triggered? Push or release, then poll status. - Does the operation have a CLI command? Run it and read the resource back.
- Does it belong to a human or subscriber principal? Hand it off.
- Only report a platform gap when the live catalog labels it
not_implemented.
See Your coding agent for the complete loop and the live documentation index for task-specific details.