Skip to content

feat(xtest): read benchmark arms and provenance from the installation manifest - #670

Draft
dmihalcik-virtru wants to merge 1 commit into
DSPX-4372-s3-multi-armfrom
DSPX-4372-s3-read-manifest
Draft

dmihalcik-virtru wants to merge 1 commit into
DSPX-4372-s3-multi-armfrom
DSPX-4372-s3-read-manifest

Conversation

@dmihalcik-virtru

@dmihalcik-virtru dmihalcik-virtru commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

Part 3c of the DSPX-4372-t1 plan, split out of #658. Stacked on #658. It completes stage 2's item 7: nobody assembles arms or provenance by hand for a prepared run.

What it does

When BENCH_INSTALLATION_MANIFEST names a manifest (otdf-local env exports it after otdf-sdk-mgr install benchmark: #642, #626), pytest --bench measures exactly the arms preparation installed, in request order. Explicit --bench-refs or --bench-baseline/--bench-candidate still win.

  • perf/installation.py reads the manifest contract (feat(xtest): otdf-sdk-mgr benchmark installation manifest contract #668) without importing otdf-sdk-mgr. It checks the schema version and refuses a manifest it cannot fully read. An unknown commit stays None, not "None".
  • Set but unreadable is a usage error at configure time, not a quiet fallback to whatever is in dist/.
  • Neutral preparation: every requested ref was one commit, so that SDK's cells skip with the reason, the summary says NEUTRAL rather than NOTHING MEASURED, and the run passes. A failed or partial preparation also skips, and the run fails as having measured nothing.
  • Provenance: the JSON artifact carries metadata.installation (each arm's alias, commit and dist tag) and metadata.preparation.
  • No platform for a neutral run. test_sdk_performance requests the payload, ciphertext, attribute and scratch fixtures only once a cell is known to be measurable.

The README's local-run sequence, which #642 adds, still names the arms explicitly. Making it rely on the manifest needs both #642 and this PR, so that edit happens where the tracks meet in stage 5.

Validation

  • uv run pytest test_bench_*.py: 300 passed. ruff, ruff format and pyright are clean.
  • Tests cover manifest parsing and refusal, a null commit, manifest-driven arms and budget, explicit options winning, neutral and failed preparations, another SDK's manifest being ignored, and the NEUTRAL summary.
  • Real pytest --bench --sdks go sessions with no platform: a neutral manifest exits 0 with the NEUTRAL headline and 7 cells skipped with the reason; a failed one exits 1 as NOTHING MEASURED.

Stack (DSPX-4372-t1 plan)

Two parallel tracks from main; they share no imports and meet in stage 5.

Part PR Base
2a: bare-repo and js install fixes #667 main
2b: manifest contract #668 2a
2c: install benchmark #626 2b
2d: otdf-local env exports #642 2c
3a: arms as a tuple #669 main
3b: two to four arms #658 3a
3c: pytest reads the manifest #670 (this PR) 3b
4: candidate-to-candidate conclusions #659 3c
5, 6: CI and report #660, #661 not yet moved onto these stacks

… manifest

When $BENCH_INSTALLATION_MANIFEST names a manifest (`otdf-local env`
exports it after `otdf-sdk-mgr install benchmark`), pytest --bench
measures exactly the arms preparation installed, in request order, without
anyone restating them. Explicit --bench-refs or --bench-baseline/
--bench-candidate still win.

- perf/installation.py reads the manifest contract (schema v1alpha1)
  without importing otdf-sdk-mgr: the arms, the pins, the status and
  metadata.sdk. It checks the schema version and refuses a manifest it
  cannot fully read. An unknown commit stays None rather than "None".
- Set but unreadable is a usage error at configure time, not a quiet
  fallback to whatever is in dist/.
- A neutral preparation skips that SDK's cells with its reason; the run
  reports NEUTRAL instead of NOTHING MEASURED and does not fail. A failed
  or partial preparation also skips, and the run fails as having measured
  nothing.
- The JSON artifact carries metadata.installation (each arm's alias,
  commit and dist tag) and metadata.preparation.
- test_sdk_performance requests the payload, ciphertext, attribute and
  scratch fixtures only once a cell is known to be measurable, so a
  neutral preparation needs no running platform.

Part 3c of the DSPX-4372-t1 plan; completes stage 2's item 7.

Signed-off-by: Dave Mihalcik <dmihalcik@virtru.com>
@coderabbitai

coderabbitai Bot commented Oct 21, 2026

Copy link
Copy Markdown

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@sonarqubecloud

Copy link
Copy Markdown

dmihalcik-virtru added a commit that referenced this pull request Oct 23, 2026
…pted js installs (#667)

Part 2a of the [DSPX-4372-t1
plan](#657), split out of #626:
fixes the benchmark needs, which every `otdf-sdk-mgr` install benefits
from. **Based on `main`.**

### What it does
- **Bare repos refresh their branches.** `git clone --bare` records no
fetch refspec, so the `fetch --all --tags` before every checkout
refreshed tags only. Every branch stayed where the first clone found it,
and `install tip main` or `--platform main` built that stale commit.
`checkout.BARE_REFRESH` now fetches origin's branches into
`refs/remotes/origin/*` with `--prune`, for the SDK and platform bare
repos alike, and `checkout.upstream_ref` maps a branch name onto them.
Fetching into the bare repo's own `refs/heads/*` instead would move
branches that other worktrees have checked out, leaving their HEAD ahead
of their files, and would fail for good once upstream replaced a branch
`foo` with `foo/bar`.
- **Worktrees are detached** and reset to the refreshed ref. A branch
origin no longer has is refused rather than built from the clone's stale
copy, and `HEAD` means origin's default branch as of the clone; a
platform `HEAD` worktree used to reset to itself.
- **Go source rebuilds work a second time.** `checkout_go_from_platform`
reset an existing worktree to a `FETCH_HEAD` fetched into the bare repo,
which no worktree can see, so every rebuild after the first failed with
`pathspec 'FETCH_HEAD' did not match`. It now resets to the refreshed
ref, like the SDK and platform paths.
- **`install tip` reports checkout failures as errors.** A refused
branch, or a failed git command with git's stderr, now prints `Error: …`
and exits 1 for go, js and java, as the platform path already did,
instead of a traceback.
- **An interrupted js install leaves nothing behind.** #663 already
removes a partial `dist/` when npm fails. A Ctrl-C mid-install still
left a directory holding only `cli.sh`, which `install_release` then
skipped as installed from then on. Both js install paths now remove it
unless the install finished.
- `AGENTS.md` claimed the bare clone mapped `refs/heads/*`, which is
what hid the first bug. It and the code comments also said `git pull`
fails in a worktree; it merges origin's default branch into whatever is
checked out.

### Validation
- `uv run pytest` in `otdf-sdk-mgr`: 207 passed, and 321 at the top of
this track (#642). ruff, ruff format and pyright are clean.
- `test_checkout.py` runs real git against a local origin. Every shared
behaviour is parametrized over the SDK, go and platform entry points:
new and existing worktrees follow their branch, `HEAD` (including beside
a tag named `main`), a deleted branch is refused, tags and SHAs are
checked out and then reused, and a force-pushed `refs/pull/N/head` is
followed. This replaces the stubbed command-string test for platform PR
refs. SDK-only tests guard other worktrees, force pushes and `x` → `x/y`
renames; platform-only tests cover the helper-scripts worktree. A
`CliRunner` test covers the `install tip` error path.
- Mutation-checked: `symbolic-ref --short`, treating every non-origin
name as a deleted branch, dropping go's explicit PR-ref fetch or its
`+`, swallowing go's refusal, and dropping the `install tip` catch each
fail a test.
- Two new tests interrupt each js install path.
- `isolated_git` keeps those tests off the developer's git config, any
inherited `GIT_DIR`, and the network (`GIT_ALLOW_PROTOCOL=file`).

### Follow-ups
Older problems found while reviewing this PR are fixed in a stack of
drafts based on it: #673 (don't reset a directory that isn't a worktree)
→ #674 (branch names vs versions) → #675 (tags moved upstream) → #676
(`checkout go` / `--all`).

### Stack ([DSPX-4372-t1
plan](#657))

Two parallel tracks from `main`; they share no imports and meet in stage
5.

| Part | PR | Base |
|---|---|---|
| 2a: bare-repo and js install fixes | **#667 (this PR)** | `main` |
| 2b: manifest contract | #668 | 2a |
| 2c: `install benchmark` | #626 | 2b |
| 2d: `otdf-local env` exports | #642 | 2c |
| 3a: arms as a tuple | #669 | `main` |
| 3b: two to four arms | #658 | 3a |
| 3c: pytest reads the manifest | #670 | 3b |
| 4: candidate-to-candidate conclusions | #659 | 3c |
| 5, 6: CI and report | #660, #661 | not yet moved onto these stacks |



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **Bug Fixes**
* SDK and platform worktrees now follow updated branches and pull
request refs, including after force-pushes. Missing branches produce a
clear error instead of a traceback.
* Interrupted JavaScript installations no longer leave partial
distribution files behind.

* **Documentation**
* Updated platform installation guidance for branch refreshes, detached
worktrees, and pull request refs.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Dave Mihalcik <dmihalcik@virtru.com>
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