Public-beta acceptance test
Test every released Facet surface.
Follow this in order with a new account and a small repository you own. Stop at the first unexpected result and record the step, message, time, browser, Python version, and command.
What this guide covers
This tests the public beta: account isolation, website profiling, API-key management, the local CLI, local MCP, the hosted synchronous API, caching, revocation, and Stripe credits. Hosted repository jobs and automated before-and-after verification are not public-beta features yet.
1. Check your machine
Facet supports Python 3.12 and 3.13. A virtual environment is recommended because it keeps Facet and its dependencies separate from your other projects. It is not required.
py -0pContinue with either py -3.12 or py -3.13. The examples below use Python 3.13.
2. Prove a new account starts empty
- Open a private or incognito browser window.
- Go to Facet sign-in and create a new account.
- Complete the email-confirmation link if Supabase asks for it.
- Return to Your reports.
- Confirm the page says
No profiles yet
and all usage counters are zero.
A sample report may be viewed separately. It must never appear in the account’s own report list.
3. Create an API key
- Open Developer access while signed in.
- Label the key
release acceptance. - Click Create access key and copy the complete
fct_live_...value. - Reload the page. The complete key must be gone. Only its prefix and metadata remain.
The mailing-list form does not create a key. Never paste the key into a prompt, commit, screenshot, issue, or test report.
4. Install the release candidate
Before PyPI publication, use the candidate wheel. These commands create the environment on the D: drive and do not change the repository being tested.
py -3.13 -m venv D:\Dev\venvs\facet-release-acceptance& "D:\Dev\venvs\facet-release-acceptance\Scripts\python.exe" -m pip install --upgrade "D:\Dev\Downloads\facet-release-candidate-0.3.0-final-r2\facet_code-0.3.0-py3-none-any.whl"& "D:\Dev\venvs\facet-release-acceptance\Scripts\facet.exe" doctor --jsonAfter publication, a new user can replace the wheel command with py -m pip install --upgrade facet-code.
5. Connect this terminal to your Facet account
Set the key for the current PowerShell window first. This is temporary and disappears when the terminal closes.
$env:FACET_API_URL = "https://api.facetcode.dev"
$env:FACET_API_TOKEN = "<PASTE_THE_KEY_SHOWN_ONCE>"& "D:\Dev\venvs\facet-release-acceptance\Scripts\facet.exe" doctor --jsonThe doctor output should report Python, Git, API URL, and token as configured. It never prints the token.
6. Test the CLI without spending credits
Change into any Git repository you own. Facet reads the current directory by default. You do not need to copy Facet into that repository or activate the virtual environment when you use the absolute executable path.
Set-Location "C:\path\to\your\repository"
New-Item -ItemType Directory -Force .tmp | Out-Null
& "D:\Dev\venvs\facet-release-acceptance\Scripts\facet.exe" map . --json .tmp\facet-map.json
& "D:\Dev\venvs\facet-release-acceptance\Scripts\facet.exe" estimate --repo --dimensions D6,D3 --jsonBoth commands must say paid_actions: 0. The estimate is provisional. It must not start a hosted measurement.
7. Run one website profile
- Return to Your reports.
- Click Try a sample, or paste a small Python file you own.
- Optionally rank Security and Readability as the first two priorities.
- Read the third-party processing disclosure, then click Run profile.
- Confirm a report opens and exactly one report appears on the dashboard.
- Record the credit count. Run the identical code again and confirm the cached result uses no additional credit.
8. Test the API with the same account
This submits one small Python function to the same hosted measurement path used by the website. It may use one credit when the content is new.
$facetHeaders = @{ Authorization = "Bearer $env:FACET_API_TOKEN" }
$facetBody = @{
code = "def add(a, b):`n return a + b"
language = "python"
consent_third_party = $true
} | ConvertTo-Json
$facetResult = Invoke-RestMethod -Method Post -Uri "$env:FACET_API_URL/profile" -Headers $facetHeaders -ContentType "application/json" -Body $facetBody
$facetResult | Select-Object profile_id, slug, usage_count, inferred_profile- Confirm the response contains a profile identifier and no raw key.
- Refresh the dashboard and confirm the report appears only in this account.
- Repeat the exact request and confirm the usage count does not increase again.
9. Connect the MCP server
MCP runs locally while your coding client is open. Set the target repository and persistent account variables, close the coding client completely, then reopen it.
setx FACET_API_URL "https://api.facetcode.dev"
setx FACET_API_TOKEN "<PASTE_THE_KEY_SHOWN_ONCE>"
setx FACET_REPO_ROOT "C:\path\to\your\repository"codex mcp add facet -- "D:\Dev\venvs\facet-release-acceptance\Scripts\facet-mcp.exe"
codex mcp listclaude mcp add --transport stdio facet --scope user -- "D:\Dev\venvs\facet-release-acceptance\Scripts\facet-mcp.exe"
claude mcp get facet{
"mcpServers": {
"facet": {
"command": "D:\\Dev\\venvs\\facet-release-acceptance\\Scripts\\facet-mcp.exe",
"args": []
}
}
}In the coding client, send this test instruction:
Use Facet to map this repository and estimate a D6 security and D3 readability scan. Do not start paid work or upload source.
Confirm the client lists Facet tools, calls facet_repo_map and facet_estimate_scan, reports zero paid actions, and shuts down without hanging.
10. Prove revocation works
- Return to Developer access and revoke the test key.
- Repeat the API request from step 8. It must return HTTP 401.
- Restart the coding client. Authenticated MCP operations must no longer work.
- Create a replacement key. The old key must remain invalid.
11. Test billing last
- Open Pricing in a normal browser while signed in.
- Complete one Pro checkout and one 25-credit purchase.
- Return to the dashboard and confirm each grant appears once.
- Cancel or refund the test payment and confirm the final account state is correct.
Use Stripe test details only when the deployment is in test mode. A live deployment requires a real payment followed by an operator refund.
12. Record the result
Account isolation: PASS / FAIL
Key create and show-once: PASS / FAIL
Python version:
CLI doctor, map, estimate: PASS / FAIL
Website profile and cache: PASS / FAIL
API profile and cache: PASS / FAIL
MCP client and tools:
Key revocation: PASS / FAIL
Stripe Pro: PASS / FAIL
Stripe credit pack: PASS / FAIL
Unexpected message, time, and screenshot path:Stop-release failures
Stop if one account sees another account’s private report, a revoked key still works, a cached repeat consumes another credit, a key appears in logs or output, source uploads without an explicit action, billing grants the wrong account, or the package contains private measurement machinery.