Repository navigation
test(net): cover draft 20 joins with the supported version matrix - #7553
Conversation
Quest-Claim: 66c5a919dfd234e8
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
|
No actionable comments were generated in the recent review.
|
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 4e39364
No actionable bugs found. The supported-version matrix is a proportionate extension of the existing harness: draft 20 is passed through subscription and data encoding, its fill/stitching/early-arrival/stream-count cases are exercised alongside draft 22, and draft 18 retains its distinct joining FETCH and explicit no-fill assertion. Reusing these cases is simpler than introducing a separate draft-20 harness. The late-subscriber case also exercises negotiated draft-20 connections. No public API or production wire changes.
Verification limits: static inspection of the changed tests and relevant version, filter, subscription, and receive paths only. I did not run tests or independently reproduce the reported gate results.
(Written by OpenAI)
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Version matrix.
join.test.tsgains theVERSIONSlist and an exhaustiveALPNS: Record<IetfVersion, string>map, replacing the hard-codedDRAFT_18 : DRAFT_22ternary insubscribed()andpublishing(). This mirrors thefetch.test.tsconvention, and theRecordtype makes a future draft a compile error rather than a silent gap. - Draft-20/22 fill cases. The fill join, stitching, early-fill, and stream-count cases now loop over
VERSIONS, skippingVERSION(draft 18, whose joining-FETCH cases stay separate). I verified the premise against the code:joinFilter()returns a fill for everyisDraft20(version)(draft 20 and 22), and#runJoiningFetchruns only when!isDraft20(version), so draft 20 uses a fill, not draft 18's joining FETCH. - Late-subscriber case. The JS-to-JS
publishingcase now runs on all three drafts, with the fetch-count assertion correctly keyed onversion === VERSION. - Draft-18 assertion. The joining-FETCH test now asserts
subscribe.fillis undefined, pinning that draft 18 sends no fill. - Quest removal.
quest/m1/join-tests-draft20.mdand itsREADME.mdentry are removed cleanly, with no dangling references.
Verification. bun test src/ietf/join.test.ts passes 32/32 and bunx tsc --noEmit is clean on @moq/net. Test-only change; no public API or wire impact.
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏
|
codex / Codex land fixer note:
(written by codex / Codex) |
|
codex / Codex land fixer: const published = new Map<string, string>();
for (const dir of manifest(root).workspaces ?? []) {
const pkg = manifest(join(root, dir));
if (pkg.name.startsWith("@moq/") && pkg.scripts?.release) published.set(pkg.name, join(root, dir));
}
const declared = Object.keys(manifest(here).devDependencies ?? {}).filter((name) => name.startsWith("@moq/"));
const missing = [...published.keys()].filter((name) => !declared.includes(name));
const extra = declared.filter((name) => !published.has(name));
if (missing.length || extra.length) {
throw new Error(
`${here}/package.json must declare exactly the published packages: missing [${missing}], extra [${extra}]`,
);
}
const out = join(here, "../../lib/js/api");
// `--cached` reuses the last reference while no input has changed since, unless
// MOQ_API_REFERENCE=regenerate; the dev server passes it, a build never does.
const stamp = join(out, ".inputs");
const inputs = newest([...published.values(), here]);
const cached = process.argv.includes("--cached") && process.env.MOQ_API_REFERENCE !== "regenerate";
if (cached && existsSync(stamp) && Number(readFileSync(stamp, "utf8")) >= inputs) {
console.log("API reference: unchanged, reusing it; MOQ_API_REFERENCE=regenerate forces it");
} else {
const started = performance.now();
await generate({ root, packages: [...published.values()], out, docs: join(here, "../..") });
writeFileSync(stamp, String(inputs));
console.log(
`API reference: ${published.size} packages in ${((performance.now() - started) / 1000).toFixed(1)}s`,
);
}
}
// The newest modification time of any file or directory under `dirs`, which a deleted file
// changes too, skipping installs and build output.
function newest(dirs: string[]): number {
let found = 0;
const walk = (path: string) => {
const stat = statSync(path);
found = Math.max(found, stat.mtimeMs);
if (!stat.isDirectory()) return;
for (const entry of readdirSync(path)) {
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
llmstxt » vitepress-plugin-llms initialized (SSR build) with workDir: /tmp/quest-land-7530/doc
llmstxt » Build started, file collection cleared
llmstxt » Skipping LLMs docs generation in SSR build
�[32m✓�[0m building client + server bundles...
- rendering pages...
�[32m✓�[0m rendering pages...
build complete in 184.13s.
ELAPSED %CPU RSS COMMAND
codex
All checks passed, including #7530’s documentation build and 438 relay tests with io_uring enabled. I’ll requeue all three PRs unchanged, name the intermittent peer-close tests in the result, and leave blame unset because the evidence does not identify a responsible PR.
exec
/bin/bash -lc "python3 - <<'PY'
import json
from pathlib import Path
flake = 'intermittent landing tests: a peer close drains the overtaken group over moq-lite-02, moq-lite-03, and moq-lite-04'
results = [
{
'number': 7553,
'action': 'requeue',
'reason': 'Healthy with base; passed bun run --cwd js/net build, bun run --cwd js/net check, and bun run --cwd js/net test (2694 passed); ' + flake,
'comment': 'The landing log reports peer-close drain failures in the existing MoQ Lite tests. This PR changes only IETF join tests and quest documents. The failing tests passed on base, the full base net suite passed (2689 tests), and the full net suite with this PR and base passed (2694 tests). Requeueing unchanged; please follow up on the intermittent peer-close tests for moq-lite-02, moq-lite-03, and moq-lite-04.'
},
{
'number': 7509,
'action': 'requeue',
'reason': 'Healthy with base; passed cargo build --locked -p moq-net --features fuzz --bench frame --bench group and cargo nextest run --locked -p moq-net --tests --test-threads 4 (3232 passed); unchanged JS passed bun test --cwd js/net --only-failures on base; ' + flake,
'comment': 'The Rust changes and both modified benchmarks build successfully. All 3232 moq-net tests passed with Nextest. An initial cargo test --locked -p moq-net --all-targets run encountered the existing setup::tests::credentials_stay_out_of_traces global tracing-subscriber conflict; the repository uses Nextest to isolate tests in separate processes. No source changes were needed. The original landing failure was in unchanged JavaScript peer-close tests, which passed in the full base net suite.'
},
{
'number': 7530,
'action': 'requeue',
'reason': 'Healthy with base; passed cargo build --locked -p kio -p moq-uring -p moq-relay, cargo test --locked -p kio -p moq-uring -p moq-relay, cargo nextest run --locked -p moq-relay --features io-uring --tests --test-threads 4 (438 passed), and bun run --cwd doc check; unchanged JS passed bun test --cwd js/net --only-failures on base; ' + flake
}
]
Path('quest-land-result.json').write_text(json.dumps(results, indent=2) + '\\n')
assert len(results) == 3 and {r['number'] for r in results} == {7553, 7509, 7530}
pinned = {7553: '378a07b7d0c390b6044c0802e57e1c80e7f56e56', 7509: '94a1d2be089a2738e8f7c412921d1833a87cf334', 7530: 'cbe4a2bc680f0dc568ebdc6e015cd7828d1e2c1b'}
import subprocess
for number, head in pinned.items():
assert subprocess.check_output(['git', 'rev-parse', f'pr-{number}'], text=True).strip() == head
print('Result validated; all PR branch tips unchanged.')
PY
git status --short && git -C /tmp/quest-land-7509 status --short --untracked-files=no && git -C /tmp/quest-land-7530 status --short --untracked-files=no && git -C /tmp/quest-land-7553 status --short --untracked-files=no" in /work
succeeded in 9759ms:
Result validated; all PR branch tips unchanged.
?? quest-land-result.json
codex
Wrote [quest-land-result.json](/work/quest-land-result.json), requeueing all three PRs unchanged.
Builds and tests passed. The result names the intermittent MoQ Lite peer-close tests. No PR was blamed; all branch tips remain unchanged.
tokens used
85,072
Wrote [quest-land-result.json](/work/quest-land-result.json), requeueing all three PRs unchanged.
Builds and tests passed. The result names the intermittent MoQ Lite peer-close tests. No PR was blamed; all branch tips remain unchanged.
fixer result written
(written by codex / Codex) |
Collect incoming streams independently of the connection accept budget so the mock cannot discard finished groups before the fixture buffers them. Exercise every drain case with yielding accepts. Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
Incremental pass over the commits since the prior Pullfrog review (4e39364): a merge of origin/main and one authored fixture fix.
- Eager peer-close fixture buffering.
deliverWholeinconnection.test.tsnow drainsincomingUnidirectionalStreamsin the wrapper's ownstart, buffering each stream's bytes independently of the connection's accept budget, instead ofpipeThrough, whose transform only ran once the connection pulled. The eager drain is the correct model of QMux retaining a finished stream's unread bytes across a close. - Accept budget forced to yield. The overtaken drain cases spy
acceptBudget.pollto yield on every poll, exercising a close that overtakes acceptance regardless of host CPU, and restore the spy infinally. - Main merge. Brought no authored test changes to the join matrix;
join.test.tsis byte-identical to the prior-reviewed revision.
Verification. bun test src/lite/connection.test.ts passes 57/57, and the 11 drains the overtaken cases pass across 8 repeated runs. Test-only; no public API or wire impact.
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

Problem
JS join tests omitted supported moq-transport draft 20. Landing also repeatedly failed in the existing lite peer-close drain fixture.
Approach
pipeThroughonly started copying when the connection pulled a stream; an accept-budget yield could leave the raw stream unread when mock session close discarded it. Force accepts to yield in the existing cases, keeping all frame and clean-end assertions.Impact
Alternatives
No production close-handshake change is needed. moq-dev/moq#7296 addresses lite-05/06 subscriber FIN and explicitly preserves ACK-only close on lite-01..04. This failure is the fixture losing bytes before they reach its external buffer. Retrying tests, increasing deadlines, or removing frame assertions would leave that race intact.
Validation
frame 0on lite-02..04 with the old fixture and forced accept yields; six of eleven drain cases failed in that run. The eager-buffer fixture passes all eleven under the same forced scheduling.338fa80916488de716c7663c51939dd383fb4544, both affected files pass: 90 tests, 627 assertions.quest check --base origin/main --branch quest/m1/join-tests-draft20: 604 documents pass.git diff --check: pass.quest gate nix develop --ignore-environment --keep HOME --keep USER --keep PATH --command python3 .tmp/run-ci.py: passes every selected module on the committed head (196 s). The local launcher deduplicates PATH and executes unfilteredjust ci origin/main; this avoids the existing nested-shell mbxE2BIGtracked by moq-dev/moq#7594. The initial gate hit that environment failure after JavaScript passed. No repository environment or CI changes are included.Review
Head
338fa80916488de716c7663c51939dd383fb4544: GPT-6.1 Sol (Codex, high effort) inspected the committed diff againstorigin/main(f8c608a24bbad5c51b1ffa2ad7a4996e9405ac0c) and the mock, accept-budget, connection teardown, and subscription drain paths. No findings. Checked eager collection is independent of downstream pulls, original frame assertions remain intact, and the budget spy is restored infinally.An additional independent model round is skipped under the quest guide's trivial-change exemption for the small test-only fixture refactor; the implementation brief prohibits subagents. The join matrix retains the prior clean local Codex
gpt-6.1-solmedium review of378a07b7d0c390b6044c0802e57e1c80e7f56e56; the subsequent merge from main was conflict-free. Posted reviews contained no actionable findings or unresolved threads.Follow-ups
No new code follow-ups. The close-drain quest proposed in moq-dev/moq#7590 should be reconciled with this fix. Native-publisher interop remains with moq-dev/moq#7551.
(Written by GPT-6.1 Sol)