Skip to content

test(python): verify the two engine facts the spec depends on (#1384) - #1414

Draft
yujiyokoo wants to merge 2 commits into
feat/python-sdk-cifrom
feat/python-sdk-gate-facts
Draft

yujiyokoo wants to merge 2 commits into
feat/python-sdk-cifrom
feat/python-sdk-gate-facts

Conversation

@yujiyokoo

Copy link
Copy Markdown
Contributor

Summary

The Python SDK spec (#1341) depends on two facts about the engine that nobody had checked. This PR checks both, with a probe for each, and records the results in languages/python/docs/gate-facts/. Both facts hold. No SDK code changes, and the normal wheel build is unchanged.

The engine is the Rust crate stack-encrypt. The engine encrypts and decrypts. The extension is the Rust code compiled into the Python package. Python calls the extension, and the extension calls the engine.

  • Fact 1: the extension can read the record the engine returns after decrypting, and find each field's type. The extension needs only the engine's public API.
  • Fact 2: a Ctrl-C (KeyboardInterrupt) during an engine call is raised only after the call finishes. Also, a request object (Pending) that is dropped early wipes the plaintext it contains.

Changes

  • crates/core/tests/gate_frame_reader.rs: the probe for fact 1. A reader written outside the engine walks a record and records each field's type.
  • crates/engine/src/lib.rs and crates/engine/Cargo.toml: the probe for fact 2. A function that blocks with Python's global interpreter lock (GIL) released, behind a new cargo feature, gate-probe. The feature is off by default, so the function is not in a normal wheel.
  • tests/test_gate_keyboard_interrupt.py: sends Ctrl-C during that call. The tests skip themselves when the feature is not built.
  • docs/gate-facts/frame-reader.md and docs/gate-facts/keyboard-interrupt.md: the findings, how to run each probe again, and what was not tested.
  • Cargo.lock: one line, for tokio as an optional dependency of the probe feature.

Verification

All of this was run on macOS 14 (arm64) with Python 3.14.7:

  • cargo test --locked -p stackencrypt-core --test gate_frame_reader: 2 passed.
  • The Ctrl-C probe, built with --features gate-probe: 2 passed. Ctrl-C was sent 0.2 seconds into a 1-second call. The interrupt was raised after 1.01 seconds. As a control, the same signal interrupted a plain Python time.sleep(1.0) after 0.21 seconds.
  • mise run test: 4 passed and 2 skipped. The 2 skipped tests are the probe tests, in a normal build.
  • mise run test:cargo and cargo fmt --check: both pass.
  • cargo clippy -D warnings, with and without the probe feature: passes.
  • pnpm run test:scripts on Node 22: 83 of 83 test files pass.

Not tested:

  • Linux and Windows were not run for the Ctrl-C probe.
  • The Ctrl-C probe blocks on a tokio sleep, not on a real engine call.
  • The wipe in fact 2 comes from reading the source. Nothing was run for it.
  • CI has not run on this branch yet.

Related

Closes #1384. Refs #1341 (the spec). Stacked on #1406.

Review notes

Start with the two files in docs/gate-facts/. Each one says what was checked, how, and what was not.

🤖 Generated with Claude Code

The spec in #1341 depends on two facts that had not been checked. The
first is that the extension can read the engine's decrypted record
frame with the public stack-encrypt API. The second is the sync
contract: an interrupt waits for a GIL-released call, and a dropped
Pending wipes its plaintext.

Both facts hold. A Sink written outside the engine reads the frame. A
probe function behind an off-by-default cargo feature is sent SIGINT
during the call. The interrupt arrives after the call returns. The wipe
is from source reading only.

The issue's wording of the first fact is corrected: a sealed value's
kind is inside its encryption, so the kind is read after decrypting.

The findings, how to run each probe again, and what was not tested are
in languages/python/docs/.

Refs #1384

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@changeset-bot

changeset-bot Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: eeab4bd

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai

coderabbitai Bot commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

)

The codes follow the amendment on #1341.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

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