Skip to content

docs: document the KEPLOY_PROVEN record, judge and CI flow - #937

Draft
slayerjain wants to merge 14 commits into
mainfrom
docs/t2-proven-flow
Draft

slayerjain wants to merge 14 commits into
mainfrom
docs/t2-proven-flow

Conversation

@slayerjain

@slayerjain slayerjain commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

What has changed?

The T2 flow (KEPLOY_PROVEN=1) had no documentation. The docs had no hits for KEPLOY_PROVEN, verdicts.yaml or "quarantine", and keploy record --help and keploy test --help never mention the switch. A customer could not find the flow, and could not follow it.

This PR adds two pages under Running Keploy, links them from the CLI reference, and points the GitHub CI page at the T2 job:

  • running-keploy/proven-flow: Record, judge and replay tests in CI.
    • What the flow is: record; auto-replay's full and confirming rounds; judging; one local run of CI's own command; then CI. It also says when to use the flow. The page names no Keploy version: it tells a reader who already has Keploy to run keploy update (see Gated on).

    • Requirements:

      • Linux amd64 with kernel 5.10+, or arm64 with 6.6+ (arm64 is unproven: see Gated on);
      • Go 1.20+;
      • sudo;
      • a Keploy account, with an API key from Settings → API Keys.

      Unix sockets are unsupported. When you record, a Unix-socket call leaves the whole test set NOT JUDGED: nothing is written for it, and keploy record exits 1.

    • Install and sign-in, and the switch's value. The commands Keploy prints for you to run carry the switch: the NEXT block's commands (except keploy mock), the QUARANTINE? paste line, and each reason's remedy.

    • Record commands with the switch:

      • native (start the app's dependencies first);
      • docker run, with how its -p, --network and --add-host reach Keploy's agent container, and how to reach a database on the Docker host;
      • docker compose.

      Also: the proxy and --low-latency capture modes, with their caveats; a warning that --delay is not a keploy record flag, and what auto-replay waits for instead; and mock.real with each kind of entry.

    • How to read what auto-replay prints:

      • the JUDGED line and every line under it, the new SET FAILED lines included;
      • the NOT JUDGED line, and where its cause is;
      • the CI would be red and CI runs none of the tests this record judged lines;
      • record's exit codes.
    • The NEXT block, as the in-flight NEXT fix prints it (see Gated on). A judging round is not the suite's verdict:

      • keploy record's block is recorded. It wires no CI, and gives CI's own command once, on its run: line.
      • A new section, Run CI's command once, has the reader run KEPLOY_PROVEN=1 keploy test where they recorded. That run's green block carries the caveats line for the quarantined tests, the commit: line and the CI recipe.
      • The field table gains ask and run.
    • Exactly what to commit: the commit: line of that green block. That is keploy.yml, keploy/.gitignore, tests/, mappings.yaml (or mappings.json), verdicts.yaml and config.yaml (or config.json), and never mocks.yaml or secret.yaml. The line names every test set on disk, judged or not, so the page says to delete a set Keploy didn't judge before running CI's command.

    • The CI recipe: a GitHub Actions job with the enterprise installer, KEPLOY_PROVEN=1 and keploy test, run as the runner's own user. It lists every line that run can print.

    • RECORDING LOST capture-loss evidence, including what Keploy really does today with a request whose recording overlaps a loss.

    • Time freezing: Keploy patches the Go binary, nothing to rebuild (links the existing Time Freezing page), and the second UNFROZEN form.

    • The flags and settings the switch refuses.

  • running-keploy/verdicts-yaml: a reference for the file.
    • When an entry skips a test.
    • Every field. rounds gains set_failed.
    • What a URL keeps of its path and query.
    • Each class and reason, with what to do. New:
      • keploy/set_failed and keploy/set_capture_incomplete: a set that failed for what no test owns is quarantined whole;
      • app-infra/real_not_reached.
    • Tests with no verdict, and the delete-then-record recovery. CI's command replays an unjudged set left on disk UNLISTED.
    • Merge conflicts.
  • running-keploy/cli-commands: a pointer to the T2 flow. It also takes -d, --delay out of keploy record's flags and example: keploy record -c "node src/app.js" -d 10 exits 8 with unknown shorthand flag: 'd' in -d.
  • ci-cd/github: a tip that points a KEPLOY_PROVEN=1 user at the T2 CI job.
  • server/{linux,macos,windows}/installation: the docker keploy record line drops --delay 10. keploy record defines no --delay, so the command exited 8 with unknown flag: --delay.

Review round 2 (on 53cc6bc), and what this round changed

Round 2 found that 53cc6bc documented t2-next-ci r4's round-4 fix, 13a1d52e9, which was in no pushed branch. The gate still named r4 at 235114959, and on 235114959 the page was wrong in three places:

  • (a) a gated run of only some sets (-t) was verified_green, with a commit: line naming a set that never ran;
  • (b) a verdicts.yaml, mappings.yaml or config.yaml written after the gated run left status verified_green, even when it quarantined the last test CI runs;
  • (c) a record that quarantined every test it judged, beside another set CI runs, gave verified_empty while record exited 0.

This round (docs/t2-proven-flow @ ea77395):

The BLOCKER: the page follows r4's round-4 fix, and that fix is now pushed and proven. The page documents what 13a1d52e9 does, because 235114959's behaviour in (a) and (b) is a false green. r4's owner has 13a1d52e9 and its e2e commit d75fffdde only in a local worktree; origin's train/fix/t2-next-ci-r4 is still 235114959. So the proof PR, keploy/enterprise#3030 (train/test/t2-docs-proof-r6-next-next at 14ab25274), is built on d75fffdde, which puts both commits on origin. Its pipeline, 12241, runs:

  • (b) as phase 9's keploy quarantine after the gated run;
  • (c) and (a) as phase 12's new step 4.

#3030 supersedes #3026, which is closed. The gate below names r4 by the behaviour the page needs, not by a SHA taken mid-flight.

SHOULD-FIX:

  • The commit: line. It names every test set on disk: gatherProvenCI walks Signals.TestSets. Step 6 and Commit the test sets now say so, and say to delete a set Keploy didn't judge before running CI's command. The reason not to git add keploy/ is that it takes whatever keploy/.gitignore doesn't keep out, which can include a set's secret.yaml. OSS replay ignores /*/secret.yaml only once it replays a set whose config names secrets.
  • --delay on record. It is gone from server/{linux,macos,windows}/installation.md too.
  • Gate SHAs. The gates are now behaviours on branches, with each head and what main already has, as of this round.
  • Capture-loss proof. The page's caution box already describes the agent's drop. The product fix and a green phase 12b are now a gate (5), and product issue 3 is marked as blocking release 1.

NITs:

  • keploy update moves into the install section, for a machine that already has Keploy.
  • The verdicts.yaml example says keploy: <version>, with a line that says so.
  • URL shaping says letters joined by - _ . ~ : are kept (hello-world), and which segments of letters are {}, as models.PathShape does.
  • After keploy mock upload, the page now says what the printed remedy says: run KEPLOY_PROVEN=1 keploy status again. On r4 that status is recorded (listsChanged: the upload writes config.yaml after the run) and gives CI's command.
  • The onboarding quarantine rate is product issue 1, now marked as blocking a release-1 "onboardable" claim.

Also from 13a1d52e9:

  • The field table's phase row lists recorded for a green -t run and for a run older than a list.
  • It says a run with the switch that stopped short is red.
  • The NEXT block section says that a record that quarantined everything it judged, beside a set CI runs, is recorded and keeps its exit code.

How every claim was checked

  • Code. I checked every message, field, reason and remedy against:

    • enterprise main at a4b49aaf8 (latest tag v3.8.79);
    • keploy v3.6.154, which E-C7a, E-C12 and r4 pin;
    • the gating branches below, at the heads named. This round, I re-read r4's d75fffdde for each claim the review named:
      • ComputePhase: partialRun and listsChanged are recorded, and stoppedShort is red;
      • listsWrittenAfter: verdicts.yaml, mappings.yaml/.json and config.yaml/.json, by mtime against the run's directory;
      • judgingPhase: verified_empty only on NoTestRunsInCI;
      • gatherProvenCI: every set in Signals.TestSets;
      • uploadFirst's printed remedy;
      • models.PathShape;
      • OSS routes/record.go massSuppressed (WARN at 25%);
      • the OSS flag table (--delay under test only, containerName an alias of container-name).
  • A CI run of the combination: keploy/enterprise#3030, test-only, at 14ab25274, pipeline 12241. It is d75fffdde (r4 with 13a1d52e9), plus:

    • E-C7a's two commits;
    • the freeze check at 0478b97b7;
    • the T2 lane;
    • round 6's test-only commits.

    Results:

    • Both T2 lanes passed all seven cycles: t2-flow-e2e (6.12.74, woodpecker-main) and t2-flow-e2e-debian11 (5.10.0-46). The cycles are native, docker run and compose, each in proxy and --low-latency mode, plus native-runner-user.
    • Each cycle walks the page's flow:
      1. record;
      2. judging;
      3. record's NEXT is recorded, with CI's command on run:;
      4. the gate, which passes exactly the K kept tests and is verified_green, with the caveat, commit: and the CI recipe;
      5. a commit of exactly the commit: line, and a fresh clone;
      6. CI's keploy test with the database down: K of K.
    • Kept per cycle (35 tests each):
      • 5.10: 16, 12, 18, 16, 16, 17 and 25;
      • 6.12: 13, 13, 16, 14, 13, 13 and 10.
    • The negative held: CI's command on the checkout with the app broken failed 13 of 16 tests (5.10) and 10 of 13 (6.12).
    • RECORDING LOST on the documented path. Both lanes' native-low-latency cycle lost reads ("capture could not read N piece(s)") on several tests, and every agent: recording complete line had tcs_suppressed_total: 0. On 5.10, 4 such tests replayed and were kept, and 5 were quarantined with the capture evidence on their entry. On 6.12 it was 4 and 6. The gate and CI then passed exactly the kept tests. So the page's per-test mechanism has a green run. The agent's drop described in the caution box is a separate path, phase 12b's (gate 5).
    • In auto-replay-e2e:
      • Phase 9 prints the page's examples byte for byte, except the app command: the JUDGED and QUARANTINED lines, record's recorded block, and the gated run's QUARANTINED, not run, SET and green blocks. Then d75fffdde's new check holds. After the gated run, keploy quarantine puts the last test CI runs on the list, and status is recorded with CI's command and no commit: line, and names keploy/test-set-0/verdicts.yaml changed after the latest run. This is review item (b).
      • Phase 12, step 4:
        • A set that fails on its own, recorded beside a set CI runs, exits 0, and record's NEXT is recorded with CI's command. CI's command then passes. This is item (c).
        • A gated -t test-set-0 run is recorded and wires nothing. This is item (a).
      • Phase 12a: a Unix-socket record is NOT JUDGED and exits 1. CI's command with the unjudged set on disk exits 1. After rm -rf, CI's command is green, with only the judged set on its commit: line.
      • Phase 12b fails at the record wrote no get-unread-1, as on every proof pipeline since 12143: the agent sent 3 tests and suppressed 2 (product issue 3, gate 5). It is the only failing step of 12241.
  • Unit tests of #3030's tree on .189 (proven, cliflow, composeapp, the pkg/service/test freeze tests, tests/ciscript T2/WallClock/KeployTestGate, wait-utils-test.sh, auto-replay-assert-test.sh, and cmd/enterprise/cli's record, judging, gate, quarantine and proven tests) pass. The one exception is TestProvenReplayWritesItsArtifacts, which compares a temp path the box resolves through a symlink. It passes on the laptop.

Gated on

Some of what these pages document is enterprise code that hasn't merged or been released yet. Do not merge this PR before a Keploy Enterprise release that contains all of the following is published at keploy.io/ent/install.sh. The page names no version. It tells a reader who already has Keploy to run keploy update, so it describes the latest release.

Each gate is a behaviour on a branch. The SHAs are each branch's head as of this round (enterprise main at a4b49aaf8, 2026-10-22), so check each gate against the head that merges, not against these SHAs.

  1. The NEXT/CI-recipe fix, train/fix/t2-next-ci-r4 (or train/fix/t2-next-ci, if it lands under that name), with its round-4 fix. The page needs:

    • record's NEXT is recorded and gives CI's command once, on run:; only the gated keploy test is green and wires CI (a8c9b3120);
    • the gate's and judging's texts carry the switch (4802e41d1);
    • 13a1d52e9:
      • a gated run that replayed only some sets is recorded, never green (partialRun);
      • a set's verdicts.yaml, mappings or config written after the gated run makes it recorded (listsChanged);
      • a run under the switch that stopped short is red;
      • a record that quarantined everything it judged, beside a set CI runs, is recorded.

    Origin's r4 is still 235114959, which has none of 13a1d52e9. The owner's local head, d75fffdde, has it, and #3030 put d75fffdde on origin and proved it. If the owner pushes a different head, re-check against it:

    • the record and gated-run blocks (phase 9);
    • the phase row;
    • Keep the suite healthy;
    • the keploy mock upload paragraph.
  2. E-C12, keploy/enterprise#3023 (train/batch-ec12 at 5a9088968).

    • main already has its two record-exit commits, as d9de81c77 and 9de0edb0f (git cherry shows E-C12's copies as applied), so #3023 needs a rebase.
    • The page still needs the rest of #3023, which main lacks:
      • the record-loss judging (77cd1234d, 177758edf);
      • the set-failure judging (8f9a44dde through f3158bae3): keploy/set_failed, keploy/set_capture_incomplete and app-infra/real_not_reached, the SET FAILED lines, the set_failed round outcome, and exit 1 when CI would be red or run no test.
  3. E-C7a, keploy/enterprise#2972 (train/batch-ec7 at b99296a87), for the two commits E-C12 lacks:

    • 6ad9e03f8: diff keys shaped as {};
    • 78a43c4a9: a --low-latency capture's losses are judged under the switch.

    Whichever of E-C7a and E-C12 lands second must drop or reconcile its copies of the record-loss commits.

  4. train/fix/freeze-check-compose-service (head 0478b97b7; 46a0ef2f6 was gated in round 6). The page tells a compose app to pass its service's name (--container-name api). Without this fix, CI's keploy test of such an app logs ERROR Time freezing could not be verified ... on a green run.

  5. The capture-loss path the page describes needs a green e2e. auto-replay-e2e phase 12b is E-C7a's own lane for 78a43c4a9. It has failed on every proof pipeline since 12143, 12234 included: the agent drops the request whose capture lost data instead of recording it as evidence (product issue 3). The page's caution box documents today's behaviour. If the agent is fixed before this PR merges, rewrite the box and the bullet list above it to match the fix.

  6. arm64 is unproven. The page says the flow runs on arm64 with kernel 6.6 or later, as release 1's scope does. But this Woodpecker has no arm64 runner, and every proof here is amd64 (5.10 and 6.12). Before merging, get the T2 lane green on an arm64 6.6 host. Otherwise, take arm64 out of the page.

The T2 lane itself, train/fix/t2-default-path-lane (CI-AR-01, head 7c58f2ae1), still reads record's NEXT for the commit: line. On r4 it needs the change #3030 makes in a test-only commit, a gate step that runs CI's command first. That is for its owner to restack.

Product issues found while checking (not fixed here)

  1. Blocks calling release 1 onboardable: Keploy quarantines most of the sample's suite on an unchanged app.
    • In pipeline 12241, samples-go's Postgres app had 35 tests per cycle. Keploy kept 10 to 25 of them, and quarantined the rest as keploy/unmocked_call (often no_schema_candidates) or keploy/unconsumed_mock: 25 of 35 in the 6.12 docker-low-latency cycle.
    • In the --low-latency cycles, many of those come with "capture could not read N piece(s)" on Postgres INSERTs.
    • This is not a false green: CI runs only the kept tests. But it is Keploy failing to mock or match its own recording, and recording again only draws another subset. A first-run customer who follows this page loses most of their suite. The page tells the reader to report such tests.
  2. One test with no verdict sinks its whole test set at record time. The set's other tests replayed, but they are neither kept nor quarantined. The NOT JUDGED line names the cause, but not the remedy: that is only in a WARN and an ERROR log line's next_step.
  3. Blocks release 1, under the no-silent-drop rule: the agent drops a recorded request whose capture had a hole, and charges the loss to another test.
    • It happens when a parser stops mid-stream and opens an orphan window. In phase 12b (12234 and 12241), the agent sent 3 tests and suppressed 2, get-unread-1 among them. The loss was charged to get-health-1, which replayed and was kept: RECORDING LOST test-set-0/get-health-1 ... it replays, so it is kept.
    • tcs_suppressed_total is logged at INFO below 25% of the session's requests (OSS routes/record.go, massSuppressed), and nothing in keploy record's output names the dropped requests.
    • The fix belongs in the OSS agent's orphan suppression, under the switch: record the request with its loss as evidence, and let auto-replay judge it.
    • Phase 12b is E-C7a's own lane for this, red since 12143. It needs an owner. The page documents today's behaviour in a caution box (gate 5).
  4. Some printed commands still lack the switch:
    • the next_step of record's incomplete-verdict log lines (record_verdict.go);
    • the --must-pass refusal's keploy quarantine <set>/<test> --reason.
  5. Under the switch, keploy test's delay messages are wrong. It still logs Delay is set to 5 seconds ... use --delay, and the --health-url help says it preserves the fixed --delay behavior. In fact it waits for readiness, then waits --delay.
  6. The keploy/capture_incomplete remedy is stale. It still names "a unix socket", though a Unix-socket call now leaves tests NOT JUDGED.
  7. Docs, outside this PR: cli-commands.md's keploy rerecord section documents a command that no longer exists. Neither enterprise nor OSS v3.6.154 registers rerecord.

Type of change

  • Documentation update (if none of the other choices apply).

How Has This Been Tested?

  • npx prettier@2.8.8 --check passes on every changed file: both pages, the CLI reference, the GitHub CI page, the three server installation pages and the sidebar.
  • All seven changed pages compile as MDX (@mdx-js/mdx 3 with GFM and directives, after Docusaurus's heading-ID and comment handling). A control file with a bare <tests> fails that check, so it does catch errors.
  • Every internal link and anchor the PR adds resolves (a script over both pages' headings), including the new #gate.
  • npm run build runs in this PR's Deploy PR Build and Check job. Every check (deploy-preview, prettier, run-lint, asset-budget, DCO) is green on ea77395.

Checklist:

  • My code follows the style guidelines of this project.
  • I have performed a self-review of my own code.

The docs had no page for the T2 flow: nothing named KEPLOY_PROVEN,
verdicts.yaml or quarantine, and keploy record/test --help never mention
the switch, so a customer could neither find the flow nor follow it.

Add two pages under Running Keploy:

- proven-flow: what the flow is and when to use it; requirements
  (Linux amd64 5.10+, arm64 6.6+, Go 1.20+, TCP dependencies only: Unix
  sockets are unsupported); install and sign-in; the record commands with
  the switch for native, docker run and docker compose apps, in proxy and
  --low-latency modes; why --delay is not a keploy record flag; mock.real;
  how to read the auto-replay's log lines, the JUDGED line and the lines
  under it, record's exit codes and the NEXT block; exactly what to commit
  (never mocks.yaml); the GitHub Actions job with the enterprise installer,
  KEPLOY_PROVEN=1 and keploy test, and what that run prints; RECORDING
  LOST capture-loss evidence; time freezing, which patches a Go binary
  with nothing to rebuild; and the flags and settings the switch refuses.
- verdicts-yaml: the file's format, when an entry skips a test, every
  field, each class and reason with what to do, and merge conflicts.

Every message, field, reason and remedy is taken from enterprise main
and keploy main. The NEXT block's commit: line and CI recipe, the
registry upload of a set with quarantined tests, and keploy test's
warning without the switch follow enterprise train/fix/t2-next-ci; the
RECORDING LOST lines, record's incomplete-verdict exit and the shaping
of diff keys follow the E-C7a vehicle (enterprise #2972).

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…eally are

The T2 flow page showed a caveats line in the NEXT block after a green
record. keploy record never prints one: its summary counts the confirming
round's tests only, and only the JUDGED line names the quarantined ones.
The page now shows the record's block as it is, and the caveat where it
comes, in a later keploy test's block.

Tests with no verdict get their own section in the verdicts.yaml
reference, with every cause keploy has: a Unix socket call leaves its
test and every later one NOT JUDGED, a call outside every test leaves the
whole set unjudged, and server-first destinations, refused connections,
unread containers and unclassified processes are causes too.

Also:
- record: start the app's dependencies before you record a native app;
- the switch: record and test refuse a value they cannot read, the other
  commands take it as off;
- readiness: auto-replay and keploy test wait for the app, then their
  delay (--auto-replay-delay on record, --delay on test);
- the record's second Ctrl+C exits 130, and its incomplete-verdict line
  names the exit code;
- --opportunistic-tls-intercept is a record flag, --mocking a test flag;
  some refusals come after sign-in;
- the NOTE line: judging counts the set red and does not upload it, and
  CI fails only when no test of the whole run runs;
- keploy mock record writes verdicts.yaml too;
- a URL's query keeps its names and writes each value as {};
- the manual quarantine example is a test that fails, which keploy test
  --judge keeps;
- the CLI reference links the page from record, test and Related.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…ture loss costs

Review round 2 of the T2 flow pages, checked against a CI run of the gating
combination (keploy/enterprise#3001, pipeline 12172):

- A test with no verdict (a Unix socket, an abandoned TLS handshake, ...)
  leaves its whole test set NOT JUDGED when you record: nothing is written
  for the set and keploy record exits 1. The pages say so, quote the real
  NOT JUDGED, RECORDING LOST and incomplete-verdict lines, and say where
  the remedy is (the next_step of the WARN and the ERROR above them).
- RECORDING LOST: the agent can leave a request that overlaps a capture
  loss out of the recording altogether (tcs_suppressed_total), and charge
  the loss to another test, which may be kept. A caution box says so, and
  how to notice it.
- mock.real container entries are container:<image repository>, with no
  tag, and match every container of that image.
- docker run: how its -p, --network and --add-host reach Keploy's agent
  container, and how to reach a database on the Docker host; keploy test
  reads -c and --container-name from the keploy.yml record created.
- UNFROZEN's pid-namespace form, which every native run prints when
  Keploy runs inside a container, and why it doesn't fail the run.
- The CI run's other lines (RAN ANYWAY, UNATTRIBUTED, NOT JUDGED, ENDED,
  NOT RUN, REAL, LIVE, MOCKED, UNFROZEN), mappings.json and config.json
  in the commit table, the API key path (Settings, API Keys), a version
  note (Keploy Enterprise v3.8.80 and later), and a pointer from the
  GitHub CI page to the T2 job.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…es are Keploy's to fix

Review round 2 of the T2 flow pages found steps a customer could not follow
to a green CI, and claims the code or the proof does not back:

- Recording again never replaces a set: keploy record writes a new
  test-set-N and leaves the unjudged one on disk, where the NEXT block's
  commit: line (gatherProvenCI, every set on disk) still lists it and do:
  can ask to upload its mocks. The NOT JUDGED, Unix-socket and NOTE steps
  now say to delete keploy/<set> first, and the upload advice is scoped to
  sets CI replays green.
- Every verdicts.yaml entry keploy record or keploy mock record writes is
  decided on the build that recorded the test (proven ModeKeployRecord and
  ModeMockRecord are same-build; ModeJudge never adds), so a keploy/*
  quarantine is Keploy failing to answer or match a call: report it. The
  printed "check the diff" remedy does not apply to it.
- The CLI reference no longer lists -d/--delay for keploy record (record has
  no such flag in keploy v3.6.154 or on main; it exits 8).
- Record's exit code: it still exits 0 when it prints "CI would be red".
- The page names no unreleased version, and no longer claims arm64 behaves
  the same without an arm64 run.
- The uninitialized phase, the NOT CHARGED (replaying every test) line, the
  BAKED and NOT BAKED lines and the "bake ... was put back" suffix.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
… commands carry it

The NEXT/CI-recipe fix (enterprise train/fix/t2-next-ci) moved to
09b8328ab, rebased onto main with four commits added. Two of them change
what a customer sees:

- 282e3c547: a keploy test run without KEPLOY_PROVEN on a judged suite (one
  whose sets hold a verdicts.yaml) ignores the file and runs the
  quarantined tests the legacy way, so status, and the NEXT block that run
  ends with, no longer take it for the suite's verdict: the phase is
  recorded, and the block asks for a run with the switch. The phase table
  and the CI recipe's KEPLOY_PROVEN bullet say so.
- 67ba7145f: every keploy command a T2 NEXT block gives carries
  KEPLOY_PROVEN=1, in every phase, and the caveat a judged suite gets
  without the switch says the suite leaves the flow only when each set's
  verdicts.yaml is deleted. The options row, the switch's paragraph and a
  new "stays in this flow" bullet say so.

8db80f77b changes do: only past the part the page quotes, and 09b8328ab
only a WARN for a mocks.yaml that is not a regular file.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
Enterprise train/fix/record-next-quarantine (32d465d83) fixes the record
NEXT block that called a partly quarantined suite green with no caveat:
the confirming round's report counts its quarantine skips, so record's
green block now carries the same caveat a later keploy test's does
("N quarantined test(s) did not run (keploy/<set>/verdicts.yaml): this
green covers the other tests only ..."). The T2 lane's judging step holds
it on every cycle (CI-AR-01 at 5ec0c3f6e).

The page documents the fixed block, and drops the caution box that said
the block had no caveat. The PR is gated on that branch.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
The NEXT block's do: tells a set whose mocks the registry lacks to run
`keploy mock upload -t <set>`, and the uninitialized block offers
`keploy mock status`: cliflow builds both without Config.keploy, so
neither carries KEPLOY_PROVEN=1 (67ba7145f leaves the mock flow's
commands as they are). The two places that say every command in the
block carries the switch now say so of every command but those.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…et-level reasons

Under the in-flight NEXT fix (enterprise train/fix/t2-next-ci-r4,
235114959) a judging round is never the suite's verdict: keploy record's
NEXT block is recorded, wires no CI and gives CI's command once on its
run: line, and only the gated keploy test's green block carries the
quarantined caveat, the commit: line and the CI recipe. The page showed a
caveat on record's block that record never prints.

- How the flow works and the NEXT section: record's real recorded block,
  a new "Run CI's command once" step (#gate) with that run's green
  block, and the field table's ask and run.
- E-C12 (enterprise#3023), which r4 is built on: record exits 1 when CI
  would be red or would run no test; the SET FAILED lines;
  keploy/set_failed, keploy/set_capture_incomplete and
  app-infra/real_not_reached; the set_failed round outcome.
- The NOTE row (a NOTE set prints no "CI would be red"), the switch on
  the QUARANTINE? paste line and CI's QUARANTINED header, the SET line's
  "N not judged", and where an unjudged set left on disk goes: CI's
  command replays it UNLISTED (pipeline 12234 phase 12a: its Unix-socket
  test left every later test of the run, the new set's too, unjudged).

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…s not the suite's verdict

Review round 2 of #937.

- How the flow works, step 6: commit exactly the paths on the commit:
  line of CI's command's green NEXT block, never a mocks.yaml or a
  secret.yaml, and not `git add keploy/`. keploy/.gitignore keeps out
  only /reports/, .verdicts-* and /*/mocks.yaml, so `git add keploy/`
  also takes secret.yaml and a set Keploy did not judge.
- Exit codes: exit 0 means judging found nothing that makes CI red as
  the lists stand. It is not the suite's verdict: CI's keploy test
  decides by its own rules and replays every set on disk, so a script
  takes only a green `KEPLOY_PROVEN=1 keploy test` without -t.
- Keep the suite healthy: run CI's command again, without -t, after a
  record, keploy quarantine, keploy test --judge, keploy mock upload or
  a git pull that changed a set's verdicts.yaml, mappings.yaml or
  config.yaml. Until then status reports the suite as recorded (r4's
  13a1d52e9: listsChanged, partialRun). After keploy mock upload, run
  CI's command again rather than only keploy status.
- --disableAutoReplay: its NEXT block is the legacy recorded one that
  asks to mark noise by hand (next.go's Recorded branch); in this flow,
  delete the set and record it again without the flag.
- The commands printed without the switch now include the --must-pass
  refusal's keploy quarantine and record's incomplete-verdict
  next_step.
- A TLS handshake hung up on, for a Go app: Go's crypto/tls sends
  bad_certificate when it rejects a certificate, which Keploy counts as
  tls_handshake_failed, not tls_handshake_abandoned; a Go client hangs
  up without a word only when it gives up (a cancelled context closes
  the connection with no alert). Keploy's Node.js and curl remedies are
  for other programs the app runs.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…-delay anywhere

Review round 2 of #937.

- How the flow works, step 6, and Commit the test sets: the commit: line
  of the green NEXT block names the files of every test set on disk
  (gatherProvenCI walks Signals.TestSets), judged or not, because CI's
  keploy test replays every set the checkout holds. So delete a set Keploy
  did not judge before running CI's command. The reason not to
  `git add keploy/` is that it takes every file keploy/.gitignore does not
  keep out, which can include a set's secret.yaml (keploy test ignores
  /*/secret.yaml only once it replays a set whose config names secrets).
- After keploy mock upload: say what the printed remedy says (run
  `KEPLOY_PROVEN=1 keploy status` again, provenci.go uploadFirst), and
  what status then does: the upload writes config.yaml after the run, so
  status is recorded and gives CI's command (t2-next-ci r4's
  listsChanged).
- The capture-loss caution: the agent logs `agent: recording complete`,
  with tcs_suppressed_total, at INFO unless a quarter or more of the
  session's requests were left out (routes/record.go massSuppressed), so
  read the count even when no warning shows.
- keploy update moves from the note above the install section to the
  install section, for a machine that already has Keploy.
- verdicts.yaml example: `keploy: <version>` instead of a release that
  does not exist, with a line that says so.
- URL shaping (models.PathShape): letters joined by - _ . ~ : are kept
  too (hello-world); a segment with a digit other than an API version is
  {}; the few letter segments that are {} read as hex, as a random token
  in both cases, or are very long.
- server/{linux,macos,windows}/installation.md: the docker record line
  drops `--delay 10`. keploy record defines no --delay (OSS registers it
  under test only, cli/provider/cmd.go), so the command exited 8 with
  `unknown flag: --delay`.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
The phase row of the NEXT block's field table said only a run "to its
end" is green or red. Under t2-next-ci r4's 13a1d52e9, status takes a
gated run that replayed only some sets (-t, Signals.partialRun), or that
a set's verdicts.yaml, mappings or config postdates (Signals.
listsChanged), for recorded, and a run under the switch that stopped
before its end (stoppedShort) for red. The row now lists those recorded
cases and says which run is green.

Commit the test sets: a set Keploy did not judge was passed once by the
green run, but never replayed in both judging rounds, so nothing found
which of its tests do not replay: say that, not that the run did not
replay it.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…ide a set CI runs

On t2-next-ci r4's 13a1d52e9, judgingRunsNothing beside another test set
that CI runs gives record's NEXT block the recorded phase, with CI's
command and a summary that none of the tests it judged is verified,
while keploy record keeps its own exit code. Only a project in which CI
would run no test at all gets verified_empty (JudgingReport.
NoTestRunsInCI). Say both.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
slayerjain added a commit that referenced this pull request Oct 22, 2026
…ed, and a NOT JUDGED set's NEXT block does not recover it

Review round 2 of #937.

- verdicts.yaml, Classes and reasons: a keploy/unmocked_call or
  keploy/unconsumed_mock entry from a record's own judging is not only
  Keploy's to act on. Record's full round replays each test 61.5 s past
  its recorded instant (record_judge.go), and Classify charges any miss
  in that round to keploy/unmocked_call, whatever the clock. So an app
  that compares its clock with a time a dependency gave it (a token's
  expiry) makes a call its recording lacks, and the test is quarantined,
  though CI reads the recorded instant. keploy test --judge replays both
  rounds at the recorded instant (no clock lead), drops the entry of a
  test that passes both, and prints RUNS AGAIN. keploy/enterprise#3037's
  phase 12c proves it end to end. A call made only on some runs and
  overlapping requests are the other causes on the customer's side; the
  rest is Keploy's to fix, and the reader reports it.
- The unmocked_call row says the same, and Freeze time links to it.
- A NOT JUDGED set: the verified_red NEXT block's run:, do: and options
  (keploy test, keploy test --judge, keploy record) get the set judged
  none of them while it is on disk (pipeline 12241, phase 12a), so the
  pages say to delete it first, whatever the block says.
- KEPLOY_PROVEN=yes: keploy record and keploy test check the sign-in in
  PreRunE, before ValidateFlags refuses the value, so without a session
  they exit 5 at the sign-in error first (checked on a build of the
  proof tree).

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…T JUDGED set first

Review round 2 of #937.

- verdicts.yaml, Classes and reasons: a keploy/unmocked_call or
  keploy/unconsumed_mock entry from a record's own judging is not only
  Keploy's to act on. Record's full round replays each test 61.5 s past
  its recorded instant (record_judge.go), and Classify charges any miss
  in that round to keploy/unmocked_call, whatever the clock. So an app
  that compares its clock with a time a dependency gave it (a token's
  expiry) makes a call its recording lacks, and the test is quarantined,
  though CI reads the recorded instant. keploy test --judge replays both
  rounds at the recorded instant (no clock lead), drops the entry of a
  test that passes both, and prints RUNS AGAIN. keploy/enterprise#3037's
  phase 12c proves it end to end. A call made only on some runs and
  overlapping requests are the other causes on the customer's side; the
  rest is Keploy's to fix, and the reader reports it.
- The unmocked_call row says the same, and Freeze time links to it.
- A NOT JUDGED set: the verified_red NEXT block's run:, do: and options
  (keploy test, keploy test --judge, keploy record) get the set judged
  none of them while it is on disk (pipeline 12241, phase 12a), so the
  pages say to delete it first, whatever the block says.
- KEPLOY_PROVEN=yes: keploy record and keploy test check the sign-in in
  PreRunE, before ValidateFlags refuses the value, so without a session
  they exit 5 at the sign-in error first (checked on a build of the
  proof tree).

Signed-off-by: slayerjain <shubhamkjain@outlook.com>
…o run is one to delete

Review round 2 of #937 named the refused-settings paragraph's
"select test sets with -t instead" among the steps that lead a reader into
a run that is not the suite's verdict. Under t2-next-ci r4 a gated run
over only some sets is recorded (partialRun), and its NEXT block says a
set CI is not to run is one to delete, not to leave out with -t
(cliflow/next.go). The paragraph now says what the warning suggests, and
that CI's keploy test replays every set on disk.

Signed-off-by: slayerjain <shubhamkjain@outlook.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant