Repository navigation
docs: document the KEPLOY_PROVEN record, judge and CI flow - #937
Draft
slayerjain wants to merge 14 commits into
Draft
slayerjain wants to merge 14 commits into
slayerjain wants to merge 14 commits into
Conversation
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>
slayerjain
force-pushed
the
docs/t2-proven-flow
branch
from
October 21, 2026 11:54
db9f64b to
43ae47e
Compare
…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>
slayerjain
force-pushed
the
docs/t2-proven-flow
branch
from
October 22, 2026 07:42
cceb122 to
c75a876
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What has changed?
The T2 flow (
KEPLOY_PROVEN=1) had no documentation. The docs had no hits forKEPLOY_PROVEN,verdicts.yamlor "quarantine", andkeploy record --helpandkeploy test --helpnever 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:
Unix sockets are unsupported. When you record, a Unix-socket call leaves the whole test set
NOT JUDGED: nothing is written for it, andkeploy recordexits 1.Install and sign-in, and the switch's value. The commands Keploy prints for you to run carry the switch: the
NEXTblock's commands (exceptkeploy mock), theQUARANTINE?paste line, and each reason's remedy.Record commands with the switch:
docker run, with how its-p,--networkand--add-hostreach Keploy's agent container, and how to reach a database on the Docker host;docker compose.Also: the proxy and
--low-latencycapture modes, with their caveats; a warning that--delayis not akeploy recordflag, and what auto-replay waits for instead; andmock.realwith each kind of entry.How to read what auto-replay prints:
JUDGEDline and every line under it, the newSET FAILEDlines included;NOT JUDGEDline, and where its cause is;CI would be redandCI runs none of the tests this record judgedlines;The
NEXTblock, as the in-flight NEXT fix prints it (see Gated on). A judging round is not the suite's verdict:keploy record's block isrecorded. It wires no CI, and gives CI's own command once, on itsrun:line.KEPLOY_PROVEN=1 keploy testwhere they recorded. That run's green block carries thecaveatsline for the quarantined tests, thecommit:line and the CI recipe.askandrun.Exactly what to commit: the
commit:line of that green block. That iskeploy.yml,keploy/.gitignore,tests/,mappings.yaml(ormappings.json),verdicts.yamlandconfig.yaml(orconfig.json), and nevermocks.yamlorsecret.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=1andkeploy test, run as the runner's own user. It lists every line that run can print.RECORDING LOSTcapture-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
UNFROZENform.The flags and settings the switch refuses.
running-keploy/verdicts-yaml: a reference for the file.roundsgainsset_failed.keploy/set_failedandkeploy/set_capture_incomplete: a set that failed for what no test owns is quarantined whole;app-infra/real_not_reached.UNLISTED.running-keploy/cli-commands: a pointer to the T2 flow. It also takes-d, --delayout ofkeploy record's flags and example:keploy record -c "node src/app.js" -d 10exits 8 withunknown shorthand flag: 'd' in -d.ci-cd/github: a tip that points aKEPLOY_PROVEN=1user at the T2 CI job.server/{linux,macos,windows}/installation: the dockerkeploy recordline drops--delay 10.keploy recorddefines no--delay, so the command exited 8 withunknown 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:
-t) wasverified_green, with acommit:line naming a set that never ran;verdicts.yaml,mappings.yamlorconfig.yamlwritten after the gated run left statusverified_green, even when it quarantined the last test CI runs;verified_emptywhile 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-r4is still 235114959. So the proof PR, keploy/enterprise#3030 (train/test/t2-docs-proof-r6-next-nextat 14ab25274), is built on d75fffdde, which puts both commits on origin. Its pipeline, 12241, runs:keploy quarantineafter the gated run;#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:
commit:line. It names every test set on disk:gatherProvenCIwalksSignals.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 togit add keploy/is that it takes whateverkeploy/.gitignoredoesn't keep out, which can include a set'ssecret.yaml. OSS replay ignores/*/secret.yamlonly once it replays a set whose config names secrets.--delayon record. It is gone fromserver/{linux,macos,windows}/installation.mdtoo.mainalready has, as of this round.NITs:
keploy updatemoves into the install section, for a machine that already has Keploy.verdicts.yamlexample sayskeploy: <version>, with a line that says so.- _ . ~ :are kept (hello-world), and which segments of letters are{}, asmodels.PathShapedoes.keploy mock upload, the page now says what the printed remedy says: runKEPLOY_PROVEN=1 keploy statusagain. On r4 that status isrecorded(listsChanged: the upload writesconfig.yamlafter the run) and gives CI's command.Also from 13a1d52e9:
phaserow listsrecordedfor a green-trun and for a run older than a list.recordedand keeps its exit code.How every claim was checked
Code. I checked every message, field, reason and remedy against:
mainat a4b49aaf8 (latest tag v3.8.79);ComputePhase:partialRunandlistsChangedarerecorded, andstoppedShortis red;listsWrittenAfter:verdicts.yaml,mappings.yaml/.jsonandconfig.yaml/.json, by mtime against the run's directory;judgingPhase:verified_emptyonly onNoTestRunsInCI;gatherProvenCI: every set inSignals.TestSets;uploadFirst's printed remedy;models.PathShape;routes/record.gomassSuppressed(WARN at 25%);--delayundertestonly,containerNamean alias ofcontainer-name).A CI run of the combination: keploy/enterprise#3030, test-only, at 14ab25274, pipeline 12241. It is d75fffdde (r4 with 13a1d52e9), plus:
Results:
t2-flow-e2e(6.12.74, woodpecker-main) andt2-flow-e2e-debian11(5.10.0-46). The cycles are native,docker runand compose, each in proxy and--low-latencymode, plusnative-runner-user.NEXTisrecorded, with CI's command onrun:;verified_green, with the caveat,commit:and the CI recipe;commit:line, and a fresh clone;keploy testwith the database down: K of K.RECORDING LOSTon the documented path. Both lanes'native-low-latencycycle lost reads ("capture could not read N piece(s)") on several tests, and everyagent: recording completeline hadtcs_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).auto-replay-e2e:JUDGEDandQUARANTINEDlines, record'srecordedblock, and the gated run'sQUARANTINED, not run,SETand green blocks. Then d75fffdde's new check holds. After the gated run,keploy quarantineputs the last test CI runs on the list, and status isrecordedwith CI's command and nocommit:line, and nameskeploy/test-set-0/verdicts.yaml changed after the latest run. This is review item (b).NEXTisrecordedwith CI's command. CI's command then passes. This is item (c).-t test-set-0run isrecordedand wires nothing. This is item (a).NOT JUDGEDand exits 1. CI's command with the unjudged set on disk exits 1. Afterrm -rf, CI's command is green, with only the judged set on itscommit:line.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, thepkg/service/testfreeze tests,tests/ciscriptT2/WallClock/KeployTestGate,wait-utils-test.sh,auto-replay-assert-test.sh, andcmd/enterprise/cli's record, judging, gate, quarantine and proven tests) pass. The one exception isTestProvenReplayWritesItsArtifacts, 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 runkeploy 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
mainat a4b49aaf8, 2026-10-22), so check each gate against the head that merges, not against these SHAs.The NEXT/CI-recipe fix,
train/fix/t2-next-ci-r4(ortrain/fix/t2-next-ci, if it lands under that name), with its round-4 fix. The page needs:NEXTisrecordedand gives CI's command once, onrun:; only the gatedkeploy testis green and wires CI (a8c9b3120);recorded, never green (partialRun);verdicts.yaml,mappingsorconfigwritten after the gated run makes itrecorded(listsChanged);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:
phaserow;keploy mock uploadparagraph.E-C12, keploy/enterprise#3023 (
train/batch-ec12at 5a9088968).mainalready has its two record-exit commits, as d9de81c77 and 9de0edb0f (git cherryshows E-C12's copies as applied), so #3023 needs a rebase.mainlacks:keploy/set_failed,keploy/set_capture_incompleteandapp-infra/real_not_reached, theSET FAILEDlines, theset_failedround outcome, and exit 1 when CI would be red or run no test.E-C7a, keploy/enterprise#2972 (
train/batch-ec7at b99296a87), for the two commits E-C12 lacks:diffkeys shaped as{};--low-latencycapture'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.
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'skeploy testof such an app logsERROR Time freezing could not be verified ...on a green run.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.
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'sNEXTfor thecommit:line. On r4 it needs the change #3030 makes in a test-only commit, agatestep that runs CI's command first. That is for its owner to restack.Product issues found while checking (not fixed here)
keploy/unmocked_call(oftenno_schema_candidates) orkeploy/unconsumed_mock: 25 of 35 in the 6.12docker-low-latencycycle.--low-latencycycles, many of those come with "capture could not read N piece(s)" on Postgres INSERTs.NOT JUDGEDline names the cause, but not the remedy: that is only in aWARNand anERRORlog line'snext_step.get-unread-1among them. The loss was charged toget-health-1, which replayed and was kept:RECORDING LOST test-set-0/get-health-1 ... it replays, so it is kept.tcs_suppressed_totalis logged atINFObelow 25% of the session's requests (OSSroutes/record.go,massSuppressed), and nothing inkeploy record's output names the dropped requests.next_stepof record's incomplete-verdict log lines (record_verdict.go);--must-passrefusal'skeploy quarantine <set>/<test> --reason.keploy test's delay messages are wrong. It still logsDelay is set to 5 seconds ... use --delay, and the--health-urlhelp says itpreserves the fixed --delay behavior. In fact it waits for readiness, then waits--delay.keploy/capture_incompleteremedy is stale. It still names "a unix socket", though a Unix-socket call now leaves testsNOT JUDGED.cli-commands.md'skeploy rerecordsection documents a command that no longer exists. Neither enterprise nor OSS v3.6.154 registersrerecord.Type of change
How Has This Been Tested?
npx prettier@2.8.8 --checkpasses on every changed file: both pages, the CLI reference, the GitHub CI page, the three server installation pages and the sidebar.@mdx-js/mdx3 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.#gate.npm run buildruns 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: