Documentation

Autolace turns a spoken idea into a versioned product brief with an explicit assumption ledger, while the screen assembles the client's product around the conversation. This page is how it works, end to end.

Running a session

  1. 1 · Create the engagement. Name the client and the working app name. Creating it mints a build code of the shape XXX-XXXX, drawn from an alphabet with no ambiguous glyphs so it survives being read out loud.
  2. 2 · Start the session. One live session per engagement, enforced by the database. A second attempt is refused and points at the one already running.
  3. 3 · Answer one round at a time.Each question is multiple choice with a free-text escape. The operator can answer on the client's behalf and record the sentence they actually said, and that quote is what every claim in the brief traces back to.
  4. 4 · Watch it assemble. The diagram docks on the first answer; the ledger, the activity feed and the coverage map follow. A panel never renders empty.
  5. 5 · End the session. The brief is written as a new version. Re-running discovery adds a version; it never replaces one.

What a brief covers

Discovery is scored against a fixed list of sections, and the list is data rather than something written into a screen, so it can be re-derived after more real sessions without a release. Every section carries two names: the one an operator reads, and the one a client reads.

The section list lives in the app's own records, not in this page, so it stays true when a section is added. Sign in to read the list this app is running on right now.

When it stops asking

The interview stops on coverage, not on a feeling. It ends when three things hold at once: at least three rounds are complete, the number of BLOCKING ledger entries is at or under the configured threshold, and the last round added less than the configured share of new coverage. Five rounds is the normal cap; a sixth exists only when the specific unknowns it is buying can be named. If they cannot be named, the session is finished.

The assumption ledger

Every decision made that nobody was asked about is written down as one plain line. Entries carry a kind (taken as read, still to decide, needs a definition, a limit you named, or two answers disagreeing) and a blocking flag for the ones a builder genuinely cannot proceed without. Overriding an entry never deletes it: the correction is a new entry and the original stays beneath it, legible.

Collecting a brief as a machine

One authenticated endpoint serves an engagement's bundle by build code. It is a machine door: no person's session reaches it, and a signed-in operator's browser cannot call it without the factory token.

curl -H "Authorization: Bearer $FACTORY_EXPORT_TOKEN" \
  https://your-autolace-host/api/export/HRB-4K2M

There are exactly two outcomes. Either the bundle, which is the engagement, the latest brief version and its sections with provenance, the full ledger including superseded entries, the glossary, the named outside systems and the transcript, or a refusal naming precisely what is missing. Never a partial. The envelope carries a format_version so the payload can grow without breaking a caller.

Every feature, and where it lives

20 features, 21 declared routes and 31 tables. The list below is not written on this page: it is regenerated from the build's own records, so it says what this build actually promised rather than what somebody remembered.

Rendered from docs/PRD/20-features/ and docs/semantic-layer.json, word for word.

F1

Engagements & the build code

As an operator I can create an engagement for a client and get a short speakable build code so that the call has a record from minute one and a build machine can fetch it later by code.

Lives at/engagements/engagements/new/engagements/[id]

Reads
engagements
build_codes
memberships
users
sessions
brief_versions
Writes
engagements
build_codes
memberships
activity_events
audit_logs
F2

Discovery rounds engine (the server brain)

As an operator I can run a model-led interview whose rounds are generated from the accumulating brief so that the questions are about the client's business, never about software in general.

Lives at/api/sessions/[id]/round/engagements/[id]/session/[sessionId]

Reads
sessions
rounds
answers
ledger_entries
coverage_sections
brief_sections
app_settings
Writes
rounds
ledger_entries
coverage_sections
session_events
jobs
activity_events
F3

The chat surface and the workspace that grows around it

As a client I can land in a conversation that progressively becomes a workspace showing my product so that discovery feels like construction rather than paperwork.

Lives at/engagements/[id]/session/[sessionId]

Reads
sessions
rounds
answers
ledger_entries
coverage_sections
brief_sections
diagrams
activity_events
Writes
activity_events
session_events
F4

Question cards and answering

As a client I can answer one round at a time in cards that teach me which axes exist so that choosing is cheaper than composing and the format never traps me.

Lives at/engagements/[id]/session/[sessionId]

Reads
rounds
answers
sessions
app_settings
Writes
answers
activity_events
session_events
F5

The assumption ledger

As a client I can see every decision the model is making unasked, and override any of them so that an unasked question stops being a silent risk and becomes a visible one.

Lives at/engagements/[id]/session/[sessionId]

Reads
ledger_entries
rounds
sessions
glossary_terms
Writes
ledger_entries
activity_events
session_events
F6

The coverage map

As an operator I can see at a glance which brief sections discovery still owes so that I can tell whether we are done without guessing.

Lives at/engagements/[id]/session/[sessionId]

Reads
coverage_sections
sessions
brief_sections
Writes
coverage_sections
session_events
F7

Brief composition and versioning

As an operator I can end a session holding a brief a build factory can act on so that the call produces the deliverable, with no write-up afterwards.

Lives at/engagements/[id]/brief/engagements/[id]/brief/[version]

Reads
briefs
brief_versions
brief_sections
ledger_entries
coverage_sections
sessions
Writes
briefs
brief_versions
brief_sections
activity_events
session_events
F8

The product diagram

As a client I can watch a diagram of my product assemble as I answer so that I catch a wrong assumption as a shape, in the moment, instead of finding it in a document nobody read.

Lives at/engagements/[id]/session/[sessionId]

Reads
diagrams
brief_sections
sessions
rounds
Writes
diagrams
session_events
activity_events
F9

Background activity feed

As an operator I can see what the session is doing behind the conversation so that the system feels alive and the client can watch it work.

Lives at/engagements/[id]/session/[sessionId]

Reads
activity_events
sessions
Writes
activity_events
F10

Outside-systems capture

As a client I can name the outside systems my product talks to, in my own words so that a niche vendor gets named while I am still in the room, instead of surfacing after everyone has left.

Lives at/engagements/[id]/session/[sessionId]/engagements/[id]/integrations

Reads
named_integrations
sessions
engagements
Writes
named_integrations
activity_events
session_events
F11

Model provider layer and admin settings

As an operator I can choose which provider and model powers discovery so that the model is a setting, not a constant baked into the code.

Lives at/admin/model

Reads
app_settings
Writes
app_settings
audit_logs
F12

Admin engagement overview

As an operator I can see every engagement and its state in one place so that I can find any client's session without hunting.

Lives at/admin/engagements

Reads
engagements
sessions
brief_versions
build_codes
users
memberships
Writes
audit_logs
F13

Invite-only access control

As an operator I can invite a client and assign their role so that nobody self-serves and there is exactly one way in.

Lives at/sign-in/sign-up/admin/invites

Reads
invites
users
memberships
Writes
invites
users
memberships
audit_logs
notifications
F14

Session persistence and resume

As an operator I can resume any session from any client so that a dropped call or a closed laptop never costs the session.

Lives at/engagements/[id]/session/[sessionId]

Reads
sessions
rounds
answers
ledger_entries
activity_events
coverage_sections
Writes
sessions
activity_events
session_events
F15

Authenticated export endpoint

As an factory build machine I can fetch an engagement's bundle by build code so that a build can pick up the intake without anyone coupling to this app's database.

Lives at/api/export/[buildCode]

Reads
engagements
build_codes
briefs
brief_versions
brief_sections
sessions
rounds
answers
ledger_entries
named_integrations
Writes
audit_logs
notifications
F16

Brief download

As an operator I can download the brief as markdown so that the artifact travels by hand when the machine door is not the right one.

Lives at/engagements/[id]/brief

Reads
briefs
brief_versions
brief_sections
ledger_entries
Writes
audit_logs
jobs
F17

Session instrumentation

As an operator I can see round counts, ledger lengths and exit reasons across real sessions so that the ledger-length threshold gets derived from real briefs instead of guessed.

Lives at/admin/instrumentation

Reads
session_metrics
session_events
sessions
Writes
session_events
F18

Notifications

As an operator I can have invitations and session events reach people by email so that an invited client can actually get in, and nobody has to be told verbally that something finished.

Lives at/settings/notifications/api/notifications

Reads
notifications
users
engagements
Writes
notifications
audit_logs
F19

Legal pages

As an visitor I can read the privacy policy and terms so that the app that holds a client's unreleased product idea says plainly how it treats it.

Lives at/legal/privacy/legal/terms/settings/account

Reads
users
memberships
engagements
briefs
brief_versions
brief_sections
sessions
rounds
answers
ledger_entries
named_integrations
Writes
users
memberships
jobs
audit_logs
F20

The public front door

As an visitor I can understand what Autolace is before I ever sign in so that a prospective client who is sent a link arrives somewhere that explains itself.

Lives at/

Every route, and the data behind it

A declared route is a built route. This is the whole list, with the tables each one works with; the feature column links back to what lives there.

Declared routes, the features that live at them, and the data they work with
RouteFeatureData it works with
/F20nothing stored
/admin/engagementsF12audit_logsbrief_versionsbuild_codesengagementsmembershipssessionsusers
/admin/instrumentationF17session_eventssession_metricssessions
/admin/invitesF13audit_logsinvitesmembershipsnotificationsusers
/admin/modelF11app_settingsaudit_logs
/api/export/[buildCode]F15answersaudit_logsbrief_sectionsbrief_versionsbriefsbuild_codesengagementsledger_entriesnamed_integrationsnotificationsroundssessions
/api/notificationsF18audit_logsengagementsnotificationsusers
/api/sessions/[id]/roundF2activity_eventsanswersapp_settingsbrief_sectionscoverage_sectionsjobsledger_entriesroundssession_eventssessions
/engagementsF1activity_eventsaudit_logsbrief_versionsbuild_codesengagementsmembershipssessionsusers
/engagements/[id]F1activity_eventsaudit_logsbrief_versionsbuild_codesengagementsmembershipssessionsusers
/engagements/[id]/briefF7F16activity_eventsaudit_logsbrief_sectionsbrief_versionsbriefscoverage_sectionsjobsledger_entriessession_eventssessions
/engagements/[id]/brief/[version]F7activity_eventsbrief_sectionsbrief_versionsbriefscoverage_sectionsledger_entriessession_eventssessions
/engagements/[id]/integrationsF10activity_eventsengagementsnamed_integrationssession_eventssessions
/engagements/[id]/session/[sessionId]F2F3F4F5F6F8F9F10F14activity_eventsanswersapp_settingsbrief_sectionscoverage_sectionsdiagramsengagementsglossary_termsjobsledger_entriesnamed_integrationsroundssession_eventssessions
/engagements/newF1activity_eventsaudit_logsbrief_versionsbuild_codesengagementsmembershipssessionsusers
/legal/privacyF19answersaudit_logsbrief_sectionsbrief_versionsbriefsengagementsjobsledger_entriesmembershipsnamed_integrationsroundssessionsusers
/legal/termsF19answersaudit_logsbrief_sectionsbrief_versionsbriefsengagementsjobsledger_entriesmembershipsnamed_integrationsroundssessionsusers
/settings/accountF19answersaudit_logsbrief_sectionsbrief_versionsbriefsengagementsjobsledger_entriesmembershipsnamed_integrationsroundssessionsusers
/settings/notificationsF18audit_logsengagementsnotificationsusers
/sign-inF13audit_logsinvitesmembershipsnotificationsusers
/sign-upF13audit_logsinvitesmembershipsnotificationsusers

Where everything lives

Getting in

Nobody self-serves. An operator invites an address and decides its seat before the account exists. A brand-new account holds a client seat with no engagements attached, and sees an empty state naming its operator until one is.

Which means an account made to look around opens onto nothing. Two seats into the seeded world are published on the demo page for exactly that reason.

Anything this page did not answer

Write to Pisteyo through the support form. A person reads it and answers within one business day. What happens to session content, who processes it and how long it is kept are all set out in the privacy policy, and who owns the brief is the first clause of the terms.