Skip to content

feat: add minimum-reasoning Sonnet 5.5 campaign profile - #44

Merged
khanukov merged 4 commits into
mainfrom
feat/november-model-expansion
Nov 5, 2026
Merged

khanukov merged 4 commits into
mainfrom
feat/november-model-expansion

Conversation

@khanukov

@khanukov khanukov commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Add the finite claude-sonnet-5-5 profile to the existing three-flow runner, admission, accounting and exports.

  • Use between_tools, low effort, and automatic tool selection with parallel tool calls disabled.
  • Send the complete canonical current Core snapshot and current request digest on each fresh stateless request. No native thinking replay, prompt trimming or compaction.
  • Preserve earlier rosters, evidence readers, grades, Core, evaluator and cases. No dependency changes.
  • Reject unsupported November pacing during admission instead of silently changing transport policy.
  • Initialize the November mode flag in the existing legacy HTTP test fixture; preserve every prior assertion and production byte.

Verification and execution

  • Current candidate: 3e85af7be28c6869ef9b87eecd0b8adcc87ca2eb.
  • Final test-only delta: one added fixture initialization; production runtime is byte-identical to 213d672ddaa8ec296c6b0bbe7b9c8e01785e020e.
  • Clean-source focused HTTP, November and selected-six regressions: 118 passed, no skips.
  • Earlier whole-feature focused qualification: 136 passed, 2 skipped; Ruff, formatting, mypy and publication scans passed at the evaluated production revision.
  • Two actual Sonnet observations of the same 44 cases completed at evaluated revision 213d672ddaa8ec296c6b0bbe7b9c8e01785e020e: all 88 case observations audited with offline replay, complete usage and no technical exclusions or aborts. Historical grades remain unchanged.
  • Separate synthetic SDK qualification and standalone live diagnostics are not model-quality observations and are not included in the public aggregates.
  • Real aggregates are prepared in a separate website change; no raw traces or private evidence are published by this PR.

Remaining gates

  • Required full hosted CI/build and completed current-head Qodo review before merge.
  • Separate website review, CI, deployment and live artifact verification.

Only Sonnet is added. Other proposed models remain blocked on confirmed account-route access and are not silently substituted.

Signed-off-by: Dmitry Khanukov <dmitry@dwelly.group>
Signed-off-by: Dmitry Khanukov <dmitry@dwelly.group>
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Add minimum-reasoning Sonnet 5.5 campaign profile

✨ Enhancement 🧪 Tests 🕐 40+ Minutes

Grey Divider

AI Description

• Add a finite Sonnet 5.5 roster for the existing 44-case three-flow campaign.
• Reuse source-bound admission and optional-limit accounting without changing earlier rosters or
 results.
• Test stateless requests, SDK responses, failure handling, replay, and one-shot safeguards with
 synthetic transport.
Diagram

graph TD
  P["Sonnet roster"] --> A["Source-bound admission"] --> R["Three-flow runner"] --> T["HTTP transport"] --> S["Anthropic SDK"]
  T --> B[("Budget journal")]
  R --> E["Evidence replay"]
Loading
High-Level Assessment

Reusing the existing runner, published-profile validation, and accounting is appropriate for one additional model. A separate campaign pipeline would duplicate established safeguards without providing a meaningful benefit.

Files changed (8) +374 / -26

Enhancement (6) +97 / -23
three_flow_admission.pyAdmit the November roster through existing safeguards +11/-5

Admit the November roster through existing safeguards

• Recognizes the November roster under the minimum-mode admission contract, permits its uncapped proposal, and applies closed published-profile validation. Preserves the registry schema used by earlier rosters.

tools/three_flow_admission.py

three_flow_campaign.pySet November preflight to optional-limit accounting +3/-1

Set November preflight to optional-limit accounting

• Reports no global monetary cap for the November roster, consistent with its owner-authorized optional-limit policy.

tools/three_flow_campaign.py

three_flow_http.pyApply Sonnet request and response transport settings +25/-5

Apply Sonnet request and response transport settings

• Adds the November stateless mapping, disables parallel tool use, and applies recorded connection and pool timeouts. Routes Anthropic responses through the existing raw-wire checks and usage projection.

tools/three_flow_http.py

three_flow_live.pyExpose the November roster in the live CLI +1/-0

Expose the November roster in the live CLI

• Adds the November campaign profile to the CLI's accepted roster choices.

tools/three_flow_live.py

three_flow_profiles.pyDeclare the finite Sonnet roster and minimum-thinking mode +32/-1

Declare the finite Sonnet roster and minimum-thinking mode

• Registers only 'claude-sonnet-5-5' for the November profile, with 'between_tools' thinking and low effort. Declares its Anthropic Messages mapping and stateless request settings.

tools/three_flow_profiles.py

three_flow_selected.pyExtend closed published-profile checks to Sonnet +25/-11

Extend closed published-profile checks to Sonnet

• Reuses the selected-six validator while selecting November-specific membership, pricing policy, optional-limit execution policy, published bounds, and tariff rates.

tools/three_flow_selected.py

Tests (2) +277 / -3
test_selected_six_http.pyMake the HTTP test fixture accept a roster +11/-3

Make the HTTP test fixture accept a roster

• Allows the existing synthetic HTTP fixture to create budgets and assignments for the November roster while retaining the selected-six default.

tests/test_selected_six_http.py

test_three_flow_november.pyCover Sonnet roster, transport, and admission contracts +266/-0

Cover Sonnet roster, transport, and admission contracts

• Adds synthetic SDK tests for the 44-case roster, stateless request projection, reasoning controls, timeout settings, accounting, replay, and failure behavior. Also checks published-profile constraints, source-bound admission, and one-shot execution.

tests/test_three_flow_november.py

@qodo-code-review

qodo-code-review Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. November requests lose requested pacing ✓ Resolved

Resolving commit: 213d672

Resolution reason
The commit changes the November branch of registry() so it only accepts transport_policy ==
"legacy-v1" and raises "November requires legacy-v1 transport policy" for any other value, including
paced-safe-errors-v1. Admissions requesting pacing are now rejected during validation instead of
silently running unpaced. Tests were added to confirm legacy-v1 is accepted and paced policy is
rejected, both at registry level and at the admission/CLI level.
Description
The November branch of registry() accepts paced-safe-errors-v1, but the live transport factory
passes legacy-v1 for Anthropic. An admission requesting pacing therefore validates and runs, while
the transport installs no pacer and records no paced-policy setting.

Grey Divider

Context sources
Review mode: Auto: 🚀 Fast: One-line test fixture attribute addition; localized, low risk.

Grey Divider

Tip of the day
💡 Did you know, you can turn these tips off under Display > Comment parts

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Previous reviews

Review updated until commit 3e85af7 🚀 Fast

Results up to commit 5d5cb32 ⚖️ Balanced


🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Remediation recommended
1. Cleanup can delete replacement 🐞 Bug ☼ Reliability
Description
_cleanup_created_inode checks the basename's inode and then unlinks that mutable name in a
separate operation, so a concurrent rename between the check and os.unlink causes cleanup to
delete a replacement inode. This can destroy another process's completed file while handling an
unrelated write or identity failure.
Code

src/operatebench/_write_once.py[R170-173]

+    if named is None or not _same_inode(named, created):
+        return
+    try:
+        os.unlink(name, dir_fd=dirfd)
Relevance

●●● Strong

Specific concurrent replacement race undermines the PR’s stated cleanup safety guarantee; no
rejection precedent found.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The helper first obtains and compares the currently named inode, then separately unlinks by
basename. Cleanup is called from multiple failure paths, while the existing replacement test only
swaps the name before cleanup begins and therefore does not cover the check/unlink seam.

src/operatebench/_write_once.py[163-177]
src/operatebench/_write_once.py[246-269]
tests/test_write_once.py[323-352]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Cleanup performs a check-then-unlink on a mutable directory entry, allowing a replacement inode to be deleted after identity verification.

## Issue Context
The held parent descriptor prevents directory redirection but does not make `stat` plus `unlink` conditional or atomic. Prefer leaving owned residue over deleting an inode whose identity cannot be guaranteed at the removal operation.

## Fix Focus Areas
- src/operatebench/_write_once.py[163-177]
- tests/test_write_once.py[323-352]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


2. Close failures report success 🐞 Bug ☼ Reliability
Description
The final file descriptor is closed under suppress(OSError), so a close-time I/O error is
discarded and _write_once_bytes returns success. That violates the primitive's durable-write
contract and regresses the prior context-manager implementation, which propagated close errors
through its except OSError path.
Code

src/operatebench/_write_once.py[R271-273]

+        if descriptor_to_close is not None:
+            with suppress(OSError):
+                os.close(descriptor_to_close)
Relevance

●●● Strong

Close-time I/O errors violate the stated durable-write contract and prior error-propagation
behavior; no rejection precedent found.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new helper promises durable creation, but its only final-file close is wrapped in
suppress(OSError) immediately before returning. The replaced implementation used `with
os.fdopen(...) inside an except OSError` block, so errors raised while exiting and closing the
handle were translated rather than ignored.

src/operatebench/_write_once.py[193-199]
src/operatebench/_write_once.py[270-275]
src/operatebench/artifact.py[1496-1508]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The writer suppresses final-file close errors and can return success despite an I/O failure.

## Issue Context
Close the final descriptor explicitly on the success path, translate a close failure as a write failure, and run inode-safe cleanup. Ensure the `finally` block does not attempt a second close.

## Fix Focus Areas
- src/operatebench/_write_once.py[236-275]
- tests/test_write_once.py[92-113]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


Results up to commit 2e1f019 ⚖️ Balanced


🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Remediation recommended
1. Malformed paths leak descriptors 🐞 Bug ☼ Reliability
Description
When a parent component contains an embedded NUL, os.open raises ValueError, but
_open_parent_chain catches only OSError and exits without closing the descriptors already
accumulated. Repeated malformed writes can exhaust the process descriptor table, and the error also
bypasses the intended domain-error translation.
Code

src/operatebench/_write_once.py[R73-74]

+            childfd = os.open(component, directory_flags, dir_fd=parentfd)
+        except OSError as exc:
Relevance

●●● Strong

Exception cleanup gap is a deterministic reliability bug with a straightforward local fix.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The writer opens the anchor before walking components, accumulates each successful descriptor, and
only invokes _close_all from its OSError branches. An embedded-NUL component causes the standard
os.open API to raise ValueError, so control bypasses those branches before _open_parent_chain
returns to the outer cleanup; write_artifact publicly accepts caller-provided paths and relies
entirely on this primitive.

src/operatebench/_write_once.py[61-74]
src/operatebench/_write_once.py[103-128]
src/operatebench/_write_once.py[192-250]
src/operatebench/artifact.py[1496-1508]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
A malformed parent component can raise `ValueError` during `os.open`, leaking every descriptor already opened by `_open_parent_chain` and bypassing domain-error translation.

## Issue Context
Validate malformed components, including embedded NULs, before opening the anchor, or ensure every exception path closes accumulated descriptors and maps the failure through the adapter. Add a regression that repeatedly supplies a malformed parent path and verifies descriptor cleanup and an `invalid` domain failure.

## Fix Focus Areas
- src/operatebench/_write_once.py[61-120]
- src/operatebench/_write_once.py[183-190]
- tests/test_write_once.py[30-68]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


2. Ancestor walk exhausts descriptors 🐞 Bug ☼ Reliability
Description
_open_parent_chain retains one open descriptor for every ancestor until the complete write
finishes, so sufficiently deep valid output paths or concurrent writes can hit the process
descriptor limit and fail despite the filesystem path being writable. This also makes descriptor
consumption scale as path depth multiplied by concurrent writers.
Code

src/operatebench/_write_once.py[R70-73]

+    for component in absolute.parent.parts[1:]:
+        parentfd = descriptors[-1]
+        try:
+            childfd = os.open(component, directory_flags, dir_fd=parentfd)
Relevance

●● Moderate

No close historical precedent; resource-scaling concern is plausible but remediation design is
subjective.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The implementation starts with an anchor descriptor, appends a new descriptor for every parent
component without closing any prior one, and closes the list only after creation, writing, both
fsyncs, and namespace verification. The public CLI accepts an arbitrary output path, so path depth
directly controls transient descriptor consumption.

src/operatebench/_write_once.py[61-73]
src/operatebench/_write_once.py[121-128]
src/operatebench/_write_once.py[142-160]
src/operatebench/_write_once.py[192-250]
src/operatebench/cli.py[90-101]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The parent walk keeps every ancestor descriptor open, making valid writes fail with descriptor exhaustion on deep paths or under concurrency.

## Issue Context
Preserve the security properties without retaining the full descriptor chain: record each opened directory's `(st_dev, st_ino)` identity, close ancestors once the next child is securely open, retain only the final parent needed for creation, and make the namespace rewalk compare against recorded identities. Add a deep-path regression under a reduced descriptor limit where supported.

## Fix Focus Areas
- src/operatebench/_write_once.py[61-128]
- src/operatebench/_write_once.py[131-160]
- src/operatebench/_write_once.py[192-250]
- tests/test_write_once.py[266-325]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


Results up to commit 7ea1788 ⚖️ Balanced


🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Remediation recommended
1. Tests require Linux procfs 🐞 Bug ⚙ Maintainability
Description
The new descriptor-leak assertions directly enumerate /proc/self/fd, which does not exist on
supported non-Linux systems such as macOS and causes the tests to fail before exercising the writer.
This conflicts with the package's OS-independent support declaration and affects every new test
using this pattern.
Code

tests/test_write_once.py[80]

+    descriptors_before = len(os.listdir("/proc/self/fd"))
Relevance

●●● Strong

Linux-only procfs assertions break advertised OS-independent test support; add platform guards or
portable descriptor tracking.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new tests directly access Linux's procfs descriptor directory in several cases, while the
project metadata advertises OS-independent operation; no availability guard or skip protects these
accesses.

tests/test_write_once.py[80-87]
tests/test_write_once.py[129-136]
tests/test_maintenance_trust_boundaries.py[1012-1024]
pyproject.toml[36-50]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new write-once tests assume Linux procfs is mounted by directly listing `/proc/self/fd`. On supported non-Linux environments, the path is absent and the tests fail for reasons unrelated to the writer.

## Issue Context
The project declares itself OS independent, while the new suite repeats the procfs-only descriptor-counting mechanism in both focused and maintenance tests. Introduce a shared portable descriptor-count helper or conditionally skip only leak-count assertions when no supported descriptor-inspection mechanism is available.

## Fix Focus Areas
- tests/test_write_once.py[80-87]
- tests/test_write_once.py[129-136]
- tests/test_write_once.py[160-166]
- tests/test_write_once.py[198-204]
- tests/test_write_once.py[252-258]
- tests/test_write_once.py[505-512]
- tests/test_maintenance_trust_boundaries.py[1012-1024]
- pyproject.toml[36-50]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


Results up to commit 6d952ae ⚖️ Balanced


🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Action required
1. Ancestor symlink passes final check 🐞 Bug ⛨ Security
Description
After the no-follow namespace rewalk finishes, the final os.stat(..., follow_symlinks=False) still
follows symlinks in ancestor components. An attacker can rename an ancestor and symlink its old name
to the renamed original tree, making the stat observe the same created inode and return success even
though the artifact path now violates the real-directory-only contract.
Code

src/operatebench/_write_once.py[R325-328]

+                final_named = os.stat(
+                    chain.absolute_target,
+                    follow_symlinks=False,
+                )
Relevance

●●● Strong

Recent reviews accept explicit fail-closed security hardening and adversarial race coverage; no
matching rejection precedent found.

PR-#20
PR-#23

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The no-follow helper validates and then closes the parent chain before the changed full-path stat
runs. That stat only checks the final component and the subsequent comparison checks type and inode,
so a symlink to the relocated validated tree preserves both; this contradicts the artifact adapter's
explicit real-directory-only contract, while the current adversarial test uses a different attacker
inode and misses this same-inode variant.

src/operatebench/_write_once.py[197-238]
src/operatebench/_write_once.py[317-334]
src/operatebench/artifact.py[1467-1474]
tests/test_write_once.py[481-527]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The final full-path stat follows ancestor symlinks, so an ancestor replaced with a symlink to the renamed original directory can pass the inode check and make the write return success.

## Issue Context
The namespace validation must establish, at one linearization point, both that every parent was opened with `O_NOFOLLOW` and that the final basename in that verified parent refers to the created inode. A separate full-path stat cannot provide that guarantee because `follow_symlinks=False` protects only the basename.

## Fix Focus Areas
- src/operatebench/_write_once.py[187-238]
- src/operatebench/_write_once.py[317-334]
- tests/test_write_once.py[481-527]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗



Remediation recommended
2. Writer tests fail unsupported platforms 🐞 Bug ☼ Reliability
Description
The new success-path tests call _write_once_bytes unconditionally, although the primitive
deliberately raises unsupported when descriptor-relative no-follow APIs are unavailable. Running
the suite on any such platform fails these tests instead of skipping them or asserting the
documented fail-closed behavior.
Code

tests/test_write_once.py[R31-34]

+def test_nested_parents_are_created_and_exact_bytes_are_private(tmp_path: Path) -> None:
+    target = tmp_path / "one" / "two" / "record.bin"
+
+    assert write_bytes(b"\x00exact\xff", target) == target
Relevance

●●● Strong

Recent reviews accept portability and fail-closed boundary tests; production explicitly exposes
unsupported-platform behavior.

PR-#17
PR-#20

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Production calls the capability guard before any write and maps missing primitives to an expected
domain failure, while the added success test immediately expects file creation without checking that
guard. The project metadata declares OS-independent support, so these newly added tests must handle
the explicitly supported failure mode rather than fail collection/execution on such environments.

src/operatebench/_write_once.py[39-63]
src/operatebench/_write_once.py[260-264]
src/operatebench/artifact.py[1488-1492]
tests/test_write_once.py[31-38]
pyproject.toml[36-50]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new writer success tests assume the descriptor-anchored primitives exist, but production explicitly rejects platforms without them, causing platform-dependent suite failures.

## Issue Context
Keep the dedicated unsupported-platform behavior test, but gate POSIX-specific success and fault-injection tests on the same capability predicate used by production. This is especially important because the package metadata declares the distribution OS independent.

## Fix Focus Areas
- tests/test_write_once.py[31-721]
- src/operatebench/_write_once.py[39-63]
- pyproject.toml[36-50]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


Results up to commit b67eeec ⚖️ Balanced


🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Remediation recommended
1. Search-only directories are rejected ✗ Dismissed
Description
The parent walk opens every directory with O_RDONLY, so a directory that grants write/search
permission but intentionally denies listing cannot be used even though creating the requested
artifact there is permitted. write_artifact now reports parent_open for these valid output
locations, regressing the previous path-based exclusive creation behavior.

2. Artifact writing becomes Linux-only 🐞 Bug ≡ Correctness
Description
write_artifact now unconditionally delegates to a primitive that refuses writes unless Linux
openat2 is available through libc or the x86-64 syscall fallback, so the maintenance command
cannot persist runs on other platforms. This conflicts with the package's unchanged OS-independent
support declaration and leaves no alternate artifact-writing path.
Code

src/operatebench/artifact.py[1508]

+    return _write_once_bytes(rendered, target, error_adapter=_artifact_write_error)
Relevance

●● Moderate

Portability concern is plausible, but fail-closed Linux capability appears intentional and
historical evidence is inconclusive.

PR-#28

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The syscall fallback table contains only x86-64 aliases, missing capability is converted into an
unconditional pre-mutation unsupported failure, and write_artifact has no fallback. The
maintenance CLI always invokes write_artifact, while project metadata still declares the
distribution OS independent.

src/operatebench/_write_once.py[48-52]
src/operatebench/_write_once.py[112-120]
src/operatebench/_write_once.py[410-425]
src/operatebench/artifact.py[1488-1492]
src/operatebench/cli.py[173-177]
pyproject.toml[36-47]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The public artifact writer now requires Linux `openat2`, while the package remains advertised as OS independent.

## Issue Context
Either provide an equivalently safe implementation for supported non-Linux platforms, or explicitly narrow package/runtime support and command documentation so users cannot install a nominally supported package whose run command cannot write its result.

## Fix Focus Areas
- src/operatebench/artifact.py[1496-1508]
- src/operatebench/_write_once.py[48-52]
- src/operatebench/_write_once.py[410-425]
- pyproject.toml[36-47]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


Results up to commit 2dcf0a4 ⚖️ Balanced


🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Remediation recommended
1. Capability probe omits primitives 🐞 Bug ☼ Reliability
Description
_openat2_capable() can return true without checking descriptor-relative open/mkdir/stat and
no-follow stat, even though _write_once_bytes() rejects production writes when either capability
is absent. This makes the require_openat2 fixture run success-path tests on an unsupported runtime
instead of skipping them, contradicting the helper's exact-capability contract.
Code

src/operatebench/_write_once.py[R131-132]

+    if not all(hasattr(os, name) for name in _REQUIRED_FLAGS) or _OPENAT2 is None:
+        return False
Relevance

●●● Strong

Accepted history favors enforcing exact fail-closed contracts and adding boundary tests; this
deterministic probe mismatch directly affects fixture reliability.

PR-#28

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The capability helper checks only flag attributes and _OPENAT2, while the production preflight
separately requires _DIR_FD_AVAILABLE and _NOFOLLOW_STAT_AVAILABLE; the test fixture uses the
incomplete helper to decide whether success tests should run.

src/operatebench/_write_once.py[129-144]
src/operatebench/_write_once.py[161-164]
src/operatebench/_write_once.py[406-410]
tests/conftest.py[58-67]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`_openat2_capable()` does not test all capabilities required by `_write_once_bytes()`, so it may report support while production immediately fails as unsupported.

## Issue Context
The production gate checks `_DIR_FD_AVAILABLE` and `_NOFOLLOW_STAT_AVAILABLE` in addition to the required flags and openat2 binding. Test fixtures rely on `_openat2_capable()` as the exact production capability predicate.

## Fix Focus Areas
- src/operatebench/_write_once.py[129-164]
- tests/conftest.py[58-67]
- tests/test_fd_count.py[44-63]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Dismiss ↗ | View ↗


Results up to commit cb0c5f0 ⚖️ Balanced


No changes from previous review

Results up to commit 185aac7 ⚖️ Balanced


🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Remediation recommended
1. November requests lose requested pacing ✓ Resolved

Resolving commit: 213d672

Resolution reason
The commit changes the November branch of registry() so it only accepts transport_policy ==
"legacy-v1" and raises "November requires legacy-v1 transport policy" for any other value, including
paced-safe-errors-v1. Admissions requesting pacing are now rejected during validation instead of
silently running unpaced. Tests were added to confirm legacy-v1 is accepted and paced policy is
rejected, both at registry level and at the admission/CLI level.
Description
The November branch of registry() accepts paced-safe-errors-v1, but the live transport factory
passes legacy-v1 for Anthropic. An admission requesting pacing therefore validates and runs, while
the transport installs no pacer and records no paced-policy setting.

Results up to commit 213d672 🚀 Fast


No changes from previous review

Grey Divider

Qodo Logo

Comment thread tools/three_flow_profiles.py Resolved
Signed-off-by: Dmitry Khanukov <dmitry@dwelly.group>
@khanukov

khanukov commented Nov 5, 2026

Copy link
Copy Markdown
Contributor Author

/agentic_review

@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 213d672

Signed-off-by: Dmitry Khanukov <dmitry@dwelly.group>
@khanukov

khanukov commented Nov 5, 2026

Copy link
Copy Markdown
Contributor Author

/agentic_review

@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 3e85af7

@khanukov
khanukov merged commit 2b85fc9 into main Nov 5, 2026
9 checks passed
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