Get started
In this tutorial we run the whole platform on one machine and open the illustrative program. It takes
about twenty minutes and needs Docker, uv (Python 3.12) and Node. At the end we have a database on port
5434 migrated to 0005 (60 tables) with the application role in place, the API answering on port 8100, a development token for an organisation owner, and
the web app on port 3100 showing program trv-101 with records labelled “Illustrative”.
Every product is designed. What you will see are intended workflows against the API contract, with
seeded illustrative records; the ELN and QMS connectors talk to fake servers, and the agent runtime is a
fake that returns canned, illustrative results.
What you will build
A local copy of the three runtime pieces: the compose database (trovensa-db, port 5434), the API
(http://localhost:8100) and the web app (http://localhost:3100) in dev-identity mode, signed in as
owner@example.com with the org_owner and program_owner personas.
Step 1: Start the database and migrate it
cd api
cp .env.example .env
uv sync
make db-up # vector-enabled database image as container trovensa-db on localhost:5434, waits until healthy
make migrate # alembic upgrade head with the owner DSN: 0001 to 0005 create 60 tables and seed the 10 personas
make dsn-check # the application role cannot update, delete or truncate audit or signature rowsmake db-up prints db healthy; the compose init script creates the application role trovensa_app and the
owner role, and 0002 grants them (role split). The API and the worker
use the application DSN; make migrate uses the owner DSN (MIGRATE_DATABASE_URL). Port 5434 is used
because 5433 is taken on the development machine.
Step 2: Run the API and seed the illustrative program
make dev # uvicorn app.main:app --reload on :8100In a second shell:
cd api
curl -s localhost:8100/api/v1/health/ready # {"status":"ok","version":"0.1.0","env":"dev","database":"ok"}
uv run python scripts/seed_illustrative.py # organisation trovensa-demo, programs default and trv-101The seed is idempotent. It creates organisation trovensa-demo with the program default and the
program trv-101 (“Illustrative program TRV-101”), plus records whose titles start with “Illustrative:”
and whose illustrative flag is true.
Step 3: Mint a development token
TOKEN=$(uv run python scripts/dev_token.py --user owner@example.com --org trovensa-demo --roles org_owner,program_owner)
curl -s -H "Authorization: Bearer $TOKEN" localhost:8100/api/v1/me | jq .The response lists the two programs with their permissions. Development tokens are HS256 with the header
kid: dev, signed with DEV_TOKEN_SECRET, and the API accepts them only when APP_ENV is dev or
test. Keep the shell open; the next step needs $TOKEN.
Step 4: Run the web app in dev-identity mode
cd ../web
npm ci
cp .env.example .env.localEdit .env.local: leave NEXT_PUBLIC_AUTH_CLIENT_ID and NEXT_PUBLIC_AUTH_AUTHORITY empty, keep
NEXT_PUBLIC_API_BASE_URL=http://localhost:8100, and set NEXT_PUBLIC_DEV_TOKEN to the value of $TOKEN.
Then:
npm run dev # next dev -p 3100Without a client id the app skips the identity provider and sends the development token as the bearer on every API call.
Step 5: Open the illustrative program
Open http://localhost:3100. The resolver reads /me, finds no last_program cookie and sends you to
the first program’s home page, /p/<slug>/home. Use the program switcher in the topbar (labelled “Switch
program”) to choose Illustrative program TRV-101; the URL becomes /p/trv-101/home.
The rail on the left lists Home, Evidence, Plans, Review, Progress, Console, Setup and Organization; the panel next to it lists the sections of the selected product. Choose Evidence in the rail and Questions in the panel: the illustrative questions appear, each with the “Illustrative” label.
Step 6: Start the worker (optional)
cd ../api
make worker # two lanes: interactive (console turns) and background (sync runs, jobs, tool invocations)With the worker running, an agent action such as Compare findings on a question is queued as an agent run and completed by the fake runtime with illustrative, agent-origin findings that a person then decides on; the Ask the agent tutorial continues from here in the console.
What you have done
You migrated the database to 0003, ran the API with a development token, ran the web app in dev-identity
mode and opened the illustrative program. The database holds one organisation with two programs; the token
grants the org_owner and program_owner bundles, so every rail item and every section is visible.
Next steps
- Ask the agent opens the console and accepts two proposed findings.
- How to connect a source adds a designed connection under Setup.
- How to run an evidence comparison starts an agent run from a question.
- Permissions explains what the two personas you granted contain.