Facet

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.

List installed Python versions
py -0p

Continue with either py -3.12 or py -3.13. The examples below use Python 3.13.

2. Prove a new account starts empty

  1. Open a private or incognito browser window.
  2. Go to Facet sign-in and create a new account.
  3. Complete the email-confirmation link if Supabase asks for it.
  4. Return to Your reports.
  5. 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

  1. Open Developer access while signed in.
  2. Label the key release acceptance.
  3. Click Create access key and copy the complete fct_live_... value.
  4. 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.

Create a clean Python 3.13 environment
py -3.13 -m venv D:\Dev\venvs\facet-release-acceptance
Install the candidate
& "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"
Check the installation
& "D:\Dev\venvs\facet-release-acceptance\Scripts\facet.exe" doctor --json

After 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.

Set the hosted API and key for this terminal
$env:FACET_API_URL = "https://api.facetcode.dev"
$env:FACET_API_TOKEN = "<PASTE_THE_KEY_SHOWN_ONCE>"
Confirm configuration without printing the key
& "D:\Dev\venvs\facet-release-acceptance\Scripts\facet.exe" doctor --json

The 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.

Run from the repository you want to inspect
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 --json

Both commands must say paid_actions: 0. The estimate is provisional. It must not start a hosted measurement.

7. Run one website profile

  1. Return to Your reports.
  2. Click Try a sample, or paste a small Python file you own.
  3. Optionally rank Security and Readability as the first two priorities.
  4. Read the third-party processing disclosure, then click Run profile.
  5. Confirm a report opens and exactly one report appears on the dashboard.
  6. 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.

Submit a small authorised sample from PowerShell
$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
  1. Confirm the response contains a profile identifier and no raw key.
  2. Refresh the dashboard and confirm the report appears only in this account.
  3. 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.

Set user-level variables for newly opened coding clients
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"
Add the installed MCP server to Codex
codex mcp add facet -- "D:\Dev\venvs\facet-release-acceptance\Scripts\facet-mcp.exe"
codex mcp list
Claude Code alternative
claude mcp add --transport stdio facet --scope user -- "D:\Dev\venvs\facet-release-acceptance\Scripts\facet-mcp.exe"
claude mcp get facet
Cursor alternative: save as .cursor/mcp.json in the target repository
{
  "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

  1. Return to Developer access and revoke the test key.
  2. Repeat the API request from step 8. It must return HTTP 401.
  3. Restart the coding client. Authenticated MCP operations must no longer work.
  4. Create a replacement key. The old key must remain invalid.

11. Test billing last

  1. Open Pricing in a normal browser while signed in.
  2. Complete one Pro checkout and one 25-credit purchase.
  3. Return to the dashboard and confirm each grant appears once.
  4. 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.