Repository navigation
Follow the coding agent on the locked dashboard (Paper LOCK-N) - #397
Merged
Merged
Conversation
A browser sign-up whose project has nothing yet used to land on a page that
said "Browser setup is not available yet" next to one install line. Now the
page shows three steps and ticks them as Tin sees them: run the line, click
Allow in the tab the agent opens, and Tin reads the project. When the plan
waits for picks, the tab moves to the project the agent made, so nobody is
left watching the empty personal one.
The install line also starts the agent with "Set up Tin" (Codex, and Claude
Code with -s user), kept in one place in app.js. It stays one line with an
ellipsis on a desktop and wraps on a phone.
GET /api/projects/{id}/agent-setup is membership checked and reads Postgres
only: the person's project calls (project_mcp_usage) and MCP-started runs for
the agent, and their latest growth.onboarding run that was not superseded for
setup. No migration. The page polls it every 5 s while visible and records
the steps it watched as lock page events.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude Code's authenticate tool prints the sign-in link instead of opening a tab, and its turn ends there, so step 2 says to open the link and reply. Codex keeps the tab copy. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
People who try Tin in the browser hit the locked dashboard, and many never connect an agent. Production, since 14 Sep: 133 people signed in, and only 44 ever made a project call from their agent. 138 visitors saw the lock page; 68 ever reached the agent consent page. The old page said "Browser setup is not available yet" next to a single install line. It gave no next step and didn't change while the agent worked. It also stayed on the empty personal project after the agent had set up the business in a new one.
This builds Paper boards LOCK-N · A and LOCK-N · B and C (file thinklikeanagent, page OSS landing):
Three live steps replace the old copy:
Each step ticks as Tin sees it happen. Done steps show a moss check; while setup runs, step 3 shows a spinner and a mono "started {time}" line.
The plan opens in its project. When the onboarding run waits for picks or has finished, the page shows "{Project}'s plan is ready" and "Open {Project} →". About 3 s later the tab switches to that project by itself; the project list is reloaded first if the project is new to this tab.
The install line starts the agent too:
codex mcp add tin --url … && codex "Set up Tin"claude mcp add -s user -t http tin … && claude "Set up Tin"Both live in
LOCK_PAGE_COMMANDSinapp.js; we're still testing the chained form with both agents, so it may change. The line is one line with an ellipsis on a desktop and wraps on a phone. Copy copies the full line; the toast says "Copied. Paste it in a terminal inside your project."GET /api/projects/{project_id}/agent-setupis new. It checks membership and reads Postgres only, answering for the person across every project they belong to, because the agent usually creates a separate business project. It returns:agent.connected_at: the earliest of the person'sproject_mcp_usagerows and their MCP-started runs (trigger_source = 'mcp').agent.client: the latesttrigger_clienton those runs.setup: their latestgrowth.onboardingrun that wasn't superseded, with its project name.plan_readyis true forneeds_inputorsucceeded.No migration.
Analytics: the lock page event endpoint also accepts
agent_connected,setup_startedandplan_ready. Each is sent once, and only when the open page watched that step happen, so it measures people who followed along.Verification
uv run pytest -n autoagainst a disposable Postgres 17 (-c max_locks_per_transaction=1024): 5764 passed, 22 skipped, 2 failed. Both failures are intests/test_schedule_sync_safety.py, where thelocaltimetimezone is refused. That file and the schedule code aren't touched here.tests/test_agent_setup.py:tests/test_lock_page_event.pycovers the new actions;tests/test_product_ui.pyassertions are updated.npm run test:browser: 148/148 web, 50 + 45 extension, all pass.web/lock-page.browser.test.jsnow covers:uv run ruff format --check .,uv run ruff check .,uv run lint-imports: clean.TIN_LOCK_SCREENSHOTS). They match the boards; they're not attached here.Notes
project_mcp_usagekeeps only the latest call per project, so the time shown can be later than the agent's first call. Step 2 also ticks only at the first project-scoped call (usuallyget_started), not atlist_projectsorcreate_project, so there can be a short gap after Allow. Recording the first MCP call at sign-in would need a column; I left that out on purpose.🤖 Generated with Claude Code