Entailment is running. Here is the path to team accounts.

This report states what works today, how to create the first account and invite teammates, what remains in the specification, and the one decision that blocks hosting. It is written for the Shur Creative Partners team.
Issue
Status and rollout
View
Build report
Prepared for
Shur Creative Partners
By
Jonny Dubowsky, with the build agent
3,596
October 24, 2026
Desktop tests passing on the rebranded build
24 rows
Feature inventory
Inventory rows now in specification, teams included
15 slices
P0-S1 shipped
One-day vertical slices from rebrand to hosted teams
2 decisions
Open
The domain name gates hosting; the Apple signing identity gates signed builds
Server
Where registration stands
Registration runs on the local server today
Registration runs on the local server today

A full Entailment server is running on this Mac. Accounts, sync, invitations, and the MCP endpoint all work against it now. The hosted server is specified but not deployed.

  • HTTP API. http://localhost:3010. The health endpoint answers {"ok":true}. Source: app/apps/server/src/index.ts.
  • Sync. WebSocket on ws://localhost:3011, also served at ws://localhost:3010/sync.
  • Database. Postgres 16 in Docker, container context-pg, host port 5439, all 59 migrations applied.
  • Email. Off. Sign-up completes without verification. Invitations are shared as copied links instead of emails. The production sender is Resend, decided and recorded in the prototype specification.
  • Hosted server. Not deployed. Slice PR-S1 deploys this same server to Cloudflare as a Worker-routed container with R2 and managed Postgres, per ADR 0003. It is blocked by the domain decision below.
Your account
Six steps to invites
Create your account and invite a teammate
Create your account and invite a teammate

These steps work now, against the local server. The same steps work against the hosted server once PR-S1 and PR-S2 land. Only the server address changes.

  1. Start the desktop app: corepack pnpm run dev:desktop from the app/ directory.
  2. In the server picker, choose Entailment managed service. The development build points it at localhost:3010. No identity with a personal name ships in any build: the bundle id derives from the domain once it is named.
  3. Sign up with an email address and password. The account activates immediately because email verification is off locally.
  4. Create a vault and make it synced. The vault registers on the server and its notes begin syncing.
  5. Open Members and choose Copy link. Send the link to a teammate. They install the app, point it at the same server, sign up, and open the link to join.
  6. Set access per folder or per file from the access board. Allow and deny rows control what each member reads and writes. Refusals land in the access audit. Source: app/apps/server/src/permissions/, app/apps/server/src/audit/access.ts.

Scope note for collections: access control operates on folders and files inside a shared vault. To share one collection, put it in a folder and grant that folder. To share one note, grant that file.

Scope
15 slices, 4 specs
What is done and what remains
What is done and what remains

The specification lives in the repository at docs/entailment/. Four documents govern the build: the goal document, the P0 identity specification, the prototype specification, and the open decisions list. Every slice merges in one day with tests green.

1 of 4
P0 slices shipped
P0-S1, the rebrand, shipped October 24, 2026
Brand constants, window titles, roughly 120 user-visible strings, and the wordmark now read Entailment. 3,596 desktop tests pass. Durable identifiers keep the neutral codename and wait for P0-S2.
0 of 11
Prototype slices shipped
PR-S1 through PR-S11 are specified and unblocked except for one input
Hosting, accounts, sync validation, the MCP endpoint, integration seams, the parity test suite, the InfraNodus run, and the teams slices. PR-S1 and PR-S2 wait on the domain name.
Slice
Status
Content
Exit test
P0-S1
Shipped
Brand constants and user-visible strings
App shows Entailment in title and About; tests green
P0-S2
Specified
Bundle id, keychain service, deep-link scheme
Fresh install registers entailment:// and the new keychain service
P0-S3
Specified
Updater detached from upstream, new signing key
No upstream URL remains in any shipped config
P0-S4
Specified
Brand guard test and placeholder icon
Guard test green in CI
PR-S1
Blocked
Cloudflare deploy: Worker, container, R2, Postgres
Clean deploy answers the health endpoint on the Entailment domain
PR-S2
Blocked
Accounts against the hosted server, keychain sessions
Fresh install signs up, restarts, stays signed in
PR-S3
Specified
Two-device and offline sync acceptance tests
Concurrent offline edits converge with both changes present
PR-S4
Specified
MCP endpoint hosted: tokens, OAuth, rate limit, revision guard
External client lists tools; a stale write is refused
PR-S5
Specified
Stable id frontmatter, lazy backfill
A renamed and moved note keeps its id over MCP
PR-S6
Specified
JSON-LD export with published context
Export resolves every note to its urn IRI
PR-S7
Specified
Adapter seams with working defaults
Server and app boot with only default adapters
PR-S8
Specified
Local-parity acceptance suite, black box
Suite runs green in CI against a scripted vault
PR-S9
Specified
InfraNodus layer-1 runbook and dry run
Outside agent completes gap analysis over the two MCPs
PR-S10
Specified
Teams on the hosted server: invites, join codes, roles
A second account joins a shared vault from a copied link
PR-S11
Specified
Access control and audit acceptance tests
A denied member cannot read the folder over app or MCP
Teams
Multi-tenant model
One server carries every account
One server carries every account

The server is multi-tenant by inheritance. Teams, invitations, roles, per-folder access, and the audit trail are working upstream code, and as of October 24, 2026 they are in prototype scope as inventory rows INV-27, INV-28, and INV-31.

  • Tenancy unit. A vault. Each vault has an owner, members with roles, and its own access board. One account can own and join many vaults. Source: app/apps/server/src/invitations/, app/apps/server/src/members/.
  • Team rollout. Each teammate installs the app, points it at the shared server, and signs up. Membership in a vault comes from an invite link or a join code. An account by itself grants nothing.
  • Isolation. An account sees only vaults it owns or joined. Within a shared vault, deny rows carve out folders and files per member.
  • Audit. Member activity and access refusals are recorded server-side. Source: app/apps/server/src/audit/access.ts, migration 056.
The access model the client work needs already runs in the inherited code. The work that remains is hosting it, testing it, and writing the provisioning procedure.
Shur Creative Partners · October 24, 2026
Clients
Proposed, pending spec
Client provisioning, as proposed
Client provisioning, as proposed

This section describes the intended client path. It is a proposal. It waits on a detailed specification from Jonny and is not yet in the feature inventory.

  1. A forward-deployed engineer completes the ShurIQ report and the SPBI report for the client.
  2. The engineer provisions a client vault on the shared server: a new vault, the client's members invited by link, access rows set per folder.
  3. Meeting transcripts, after-action reports, and other artifacts route into the client vault through the MCP endpoint, written as Markdown with frontmatter YAML, OKF concepts, and wikilink trails. The seams this uses are specified: stable note ids, revision-guarded MCP writes, and JSON-LD export (inventory row INV-38, ADR 0004).
  4. Graph connections between artifacts come from the wikilinks themselves. The graph view and backlinks panel render them without extra work.
  5. Content-gap and cluster analysis over a client's vault runs through the InfraNodus path: layer 1 as an outside agent now, layer 2 as an in-product Analyze panel after the go decision (rows INV-39 and INV-40).

Boundary rule: Entailment carries no ShurIQ names, code, data, or dependencies. Client routing connects only through the published seams. This rule is ADR 0004 and it is what keeps the clean-room option open.

Decisions
2 open, 7 applied
Two decisions block the next slices
Two decisions block the next slices

Seven decisions were made and applied to the specification on October 24, 2026: the Postgres provider (Neon), the email sender (Resend), the placeholder icon, the InfraNodus test runner, the lazy id backfill, the acceptance-suite location, and the layer-2 adapter shape. Two remain, and both exist to keep personal names out of client-visible surfaces.

  • The domain name. The hosted server needs a domain before PR-S1 can deploy and before PR-S2 can set the default server address. The domain now also sets the app's bundle id and keychain service in reverse-DNS form: the earlier personal bundle id was withdrawn from ADR 0002 on October 24, 2026, because Keychain entries, Application Support paths, and client MDM inventories all expose it. One purchase settles the server address, the bundle id, and the keychain service together. Buy it through Cloudflare Registrar on the account that hosts the server. Record: docs/entailment/OPEN_DECISIONS.md, item 1; docs/adr/0002-identity.md.
  • The Apple Developer signing identity. Gatekeeper shows the signing account's legal name to every client on first launch. A personal account shows a personal name; an organization account shows the company. Enroll an organization account before P0-S3 ships signed builds. Development builds are unsigned and unaffected. Record: docs/entailment/OPEN_DECISIONS.md, item 9.

Sequence once the domain is named: PR-S1 and PR-S2 make the server public, P0-S2 sets the domain-derived identity, P0-S3 detaches the updater under the organization signing identity, PR-S10 and PR-S11 put teams and access under test, and the team onboards. The remaining slices harden sync, seams, and parity in parallel.

What is the Entailment domain? It becomes the server address every account lives at and the identity every client machine records, permanently.
The open question · October 24, 2026