How Lockstep works.
Lockstep sits beside the tools your team already uses, notices when a decision has been made, gets it approved by the person who owns it, and delivers it to every engineer and every agent who touches the affected code — then keeps watching, so the decision stays true after it's made. This page walks the pipeline end to end.
Capture, per source.
What counts as a decision differs by tool. Each connector has its own trigger.
Slack threads
A thread where an owner lands on a call — "let's do signed cookies, 24h" — is a decision. Casual chatter isn't.
on: thread resolved in allowlisted channelJira
Acceptance criteria and scope calls made in ticket descriptions and closing comments.
on: status → Done · description changeNotion
Normative sentences in PRDs and specs — "must", "never", "always" statements with an owner.
on: status → In reviewGoogle Docs
Same as Notion: requirement language in shared docs you point Lockstep at.
on: doc shared to allowlisted folderConfluence
Architecture pages and runbooks — the rules teams already write down but never re-read.
on: page published in allowlisted spacePull requests
A PR description that changes behavior — "switch refunds to async batch" — is a decision about a surface.
on: PR mergedAgent sessions (MCP)
Choices your coding agents make mid-session — captured through the same MCP connection that briefs them.
on: session decision recordedExtraction & approval.
Captured candidates land in a review queue as drafts. Nothing binds without a human — a draft has no effect on briefings or checks until its owner approves it.
Owners can edit before approving: tighten the wording, correct the scope, narrow the surface. The approved text is what gets enforced, not the raw capture.
Every decision keeps its source anchor — the Slack thread, the PRD paragraph, the PR — one click away, forever.
The guest flow must not ask for OTP before payment.
extracted from Guest Checkout — PRD · waiting for a human
Briefing — humans and agents.
When an engineer or an agent starts work on a capability, Lockstep delivers the approved decisions that govern it — ranked by how directly they apply, truncated to what matters. Agents get this over MCP: the same get_product_context tool your Claude Code, Cursor, or any MCP-speaking agent can call mid-session when it needs more than the opening brief.
We flag collisions. Humans judge.
Lockstep detects when two rules govern the same surface — the same endpoint, the same capability, the same flow. When that happens, both sides get the same message: “may conflict — review both”. It does not claim to semantically understand your product, and it will not silently pick a winner.
That's a feature, not a hedge. Tools that pretend to adjudicate meaning get one call wrong and lose the team forever. Lockstep's job is to make sure the collision is seen by both owners, before it ships — the judgment stays where it belongs.
The PR check.
Every PR is checked against the approved decisions that govern the surfaces it touches. It warns by default — block when you're ready. Literally one line of config.
# .lockstep.yml
block-on-conflict: true
Trust, expanded.
Read-only connections
Every connector authenticates with read scopes. Lockstep never writes to your tools' data or statuses — the only things it ever produces are a Slack DM and a PR comment, and both are labeled.
Allowlisted sources only
Lockstep reads exactly the channels, spaces, folders, and repos you point it at — nothing is discovered or crawled. Remove a source and its future content never enters the pipeline.
Secrets redacted
Tokens, keys, and credential-shaped strings are stripped before anything is stored or sent to a model. Redaction happens at ingestion, not at display time.
Full audit trail
Every capture, approval, edit, rejection, and alert is logged with actor and timestamp. If a rule is in force, you can trace exactly who made it so, and when.
Per-project access walls
Walled projects are visible to their members only — briefings, digests, and drift alerts respect the wall. Other teams' agents never see inside.