skip to content
Control

Parallax

Control

Every key of parallax.yml, the switches that exist, how to opt out at each level, how to remove the App, and what is kept for how long.

parallax.yml

The file at a repository’s root does two things: its presence turns capture on for every developer’s sessions in that repository, and its keys tell the sandbox how to run the code. The connect PR writes it; you edit it like any file. The reader takes one key: value per line; check may also be a list.

keymeans
testThe command that runs the suite. Every proof is a comparison against it. Absent, the door guesses from the root: package.json with a test script → npm test, Cargo.toml → cargo test, pyproject.toml or pytest.ini → pytest -q, go.mod → go test ./…; the check run then says "guessed".
setupRun once in the sandbox before test (npm ci, pip install -r …). Guessed with test when a lockfile or requirements file is present.
checkA command, or a list of commands, run with the change applied before reviewers read: a type-check, a lint. Absent, the precheck's defaults by root marker file.
benchThe command that runs the repository's benchmark. Profiled for the reviewers instead of the suite. Never guessed.
commenttrue posts the one terminal result comment per reviewed head on a pull request; false (what the connect PR writes) posts none. The check run and the line suggestions are posted either way: the suggestions are the review.
deliver: proven-onlyOnly proven findings are eligible for suggestions and the fix PR. The rest stay listed in the check run. The first pass, which delivers only unverified code, posts nothing. Absent (the default): findings are delivered with their evidence labels. Refuted patches and patches that regress the suite are never offered one-click or included in the fix PR.
review: offOpt out of pull-request reviews while retaining the marker for session capture. The door reads this setting from the pull request's target branch before cloning; explicit re-runs obey it too. An absent key or marker does not opt out of PR review.
parallax.yml
# Repository commands and review delivery options.
# This marker also enables session capture in the repository.
test: npm test
setup: npm ci --no-audit --no-fund
check:
  - npm run typecheck
  - npm run lint
comment: false
# bench: npm run bench
# deliver: proven-only

Source: packages/github/src/config.ts · packages/github/cards/github.input.json · packages/lens/cards/delivery.json · packages/latency/cards/latency.input.json

Lenses and switches

The keys above are the whole file. There is no per-lens key in parallax.yml today, and no per-path key: a review runs every lens (bugs and security as one question, perf, hygiene, drift) and the mechanical dead-code scan on the diff, and delivers what it finds labelled by evidence. What you control per repository is delivery (deliver) and the comment.

A door you run yourself has these switches in its environment. On the hosted door they are set once for everyone.

variabledoes
PARALLAX_PR_REVIEW=on|offAutomatic pull-request reviews on push. Default off; explicit review requests remain available.
PARALLAX_FIRST_PASS=offNo first pass on a pull request; the deep pass alone. Default on.
PARALLAX_INVESTIGATE=offReviewers read their shard without the repository tools (no investigation phase). The phase is on by default with no round or spend cap, and the old cap variables are refused at boot.
PARALLAX_A2A=offNo contrarian pair: findings from the bugs and security lenses are not put to a seat from another lab for a counter-claim.
PARALLAX_BRIEF=on|off|abWhether sessions get the session-start brief; ab (the default) splits by session id so the brief's effect is measured.
PARALLAX_CONTINUAL=on|off|abWhether reviews get the continual store's lessons in their header; ab by default, for the same reason.
PARALLAX_SWEEP_MODE=immediate|nightly|rolling|offWhen sessions are swept: as they end (default), at PARALLAX_NIGHTLY_TIME, in staggered account batches, or never.
PARALLAX_ABANDON_MINHow many silent minutes end a session (30).
PARALLAX_JOB_MS · PARALLAX_SWEEP_JOB_MSThe wall clock of a PR review (20 min) and of a sweep (30 min). Operational: a cut step is could-not-run, never refuted.

Source: packages/server/cards/server.input.json · packages/server/cards/schedule.input.json · packages/discovery/cards/discovery.input.json · packages/continual/cards/injection-policy.json

Opting out

levelhow
Session capture in one repository, for the teamDelete parallax.yml. From the setup page, Disconnect opens the PR that removes it (DELETE /v1/github/connect); merging it stops marker-based capture. A repository you named explicitly at install must also be removed from ~/.parallax-client/config.json. Deleting the marker alone does not disable pull-request review: automatic scheduling and explicit review requests are separate.
One machineRemove the Parallax hooks, plugin and MCP entry from the editors you installed, or delete ~/.parallax-client/config.json.
One personPUT /v1/persons/preference {"recording": "incognito"} stores nothing of that person's sessions while recall and the brief still work; "off" stores nothing and surfaces nothing: the door answers as if Parallax were not installed. The account owner sets the default with ?person=*.
One requestx-parallax-capture: off on a request through the proxy. It is excluded and its messages never enter a later request's history.
A nested repositoryCapture never reads file contents across a nested git root. A nested repository without the marker (and not named at install) is recorded as an omission when the session names a path inside it, never captured.
Recorded weekly spendAccount settings report the last seven days of recorded sweep cost. A saved amount is a preference for the editor's capture guard. The door enforces no weekly capture limit, and the setting is not a payment limit or strict spend ceiling.

Reasoning text is never captured unless the account opted in. A transcript captured while a person was off or incognito is excluded by a durable, content-free byte barrier: bytes below it are never stored, and a replay cannot bring them back.

Source: packages/github/cards/github.input.json · packages/persons/cards/preference.json · packages/server/cards/native-source-collection.input.json · packages/identity/cards/account-settings.input.json · packages/session-capture/cards/session-capture.input.json

Removing the App

  1. Merge the Disconnect PR on each connected repository, or delete parallax.yml by hand, to remove the session-capture marker. The App never pushes to a default branch; every change it makes is a branch and a PR you merge.
  2. On GitHub, open Settings → Applications → Installed GitHub Apps → Parallax → Uninstall. The door receives the installation webhook and removes the installation from your account; a pull request on that installation is answered installation not registered and never reviewed.
  3. Run the machine step above on each developer’s machine.

Uninstalling erases that installation’s stored PR sessions and their derived review data. Queued PR jobs are removed and running jobs receive cancellation before they can rebuild those sessions or persist more review work. Laptop captures and other installations’ PR sessions are not erased just because they share a repository; retention and explicit deletion still apply. Erasure also removes review sessions that depended on the deleted sessions as context.

Source: packages/github/cards/github.input.json · packages/server/src/index.ts · packages/server/cards/retention.json

Data retention

whatkept
Sessions: turns, tool calls, signals, the raw transcript mirror, the source snapshot30 days from the session's end or last activity (PARALLAX_RETAIN_DAYS on a self-hosted door), then removed by the retention sweep. Fields over 256 KiB are stored truncated and marked.
Reviews, forks, lens runs, sweeps, deliveries and their outcomesIn the door's store, per account, until the session they belong to is deleted.
Lessons (recall)30 days from the last confirmation; a re-confirmation pushes the expiry out. DELETE /v1/recall/:id removes one for good.
Continual store entries (write-back lessons, suppressions)In the store with their receipts; an entry with expires_at_ms is not injected past it (the review's own tool paths 90 days, its candidates 30, for session memory).
Prepared fix PRs waiting to publishOne day in the durable outbox after the terminal result.
Content-free exclusion markers (off / incognito)Survive session deletion and retention, so excluded bytes are never re-ingested. They hold no content: an account and a path hash.

DELETE /v1/sessions/:id removes the session, its runs, the lessons whose only source it was, its corrected tool paths, its note and its snapshot in one transaction; review artifacts derived from it are erased with it. Every table carries the account id and every read filters on it; no export or training set reads another account’s rows.

Source: packages/session-capture/cards/session-capture.input.json · packages/recall/cards/recall.input.json · packages/continual/cards/store.json · packages/server/cards/pr-followup.output.json · packages/calibration/cards/calibration.input.json · packages/session-memory/cards/policy.json