Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
0b429ea
docs(ioring): queue the epoch-log review findings as M21 through M23
Sep 20, 2026
702715a
docs: record the M20.1 / M20.3 coupling to SH-4.12 in both checklists
Sep 20, 2026
14d5e4d
docs(ioring): correct the file-handle NUMA mechanism in "What is not …
Sep 20, 2026
44e36ef
docs(ioring): record the ARM no-L3 measurement as D-48
Sep 20, 2026
338b6ff
docs(ioring): remove the status claim from the notes and the rustdoc
Sep 20, 2026
38d0527
docs: add CONTRACT INTEGRITY rule 6 -- never store a fact another art…
Sep 20, 2026
fa5e9a7
docs(ioring): justify the epoch-order assertion by the half of D-24 t…
Sep 21, 2026
c6703f3
feat(ioring): add a bounded pop, generic over the wait the caller sup…
Sep 21, 2026
48be30c
refactor(ioring): make the epoch trigger a value each match arm must …
Sep 21, 2026
7cde484
test(ioring): bind what a failed commit means for durable_through
Sep 21, 2026
53ae977
docs(ioring): record what remediating the epoch-log review has taught…
Sep 21, 2026
665edab
fix(ioring): bound every wait that could hang, not the two that were …
Sep 21, 2026
9c9c5ff
fix(ioring): an expired wait is a result, not an error
Sep 22, 2026
0cda73b
chore: teach the borrow-surface check the two shapes it could not see
Sep 22, 2026
6dfcbcc
docs(ioring): record an unreproduced bounded_pop failure and queue it…
Sep 22, 2026
8f079ca
fix(ioring): make bounded_pop wait on a pipe, not on a fast enough de…
Sep 22, 2026
badfe57
test(ioring): assert the mechanism, not the clock
Sep 22, 2026
621a022
docs(ioring): write up hermetic unit tests without losing unit-level …
Sep 22, 2026
6fe586c
docs(ioring): record the non-hermetic unit suite as a defect, and sch…
Sep 22, 2026
ef87310
docs(ioring): correct M24's sequencing rationale -- waiting does not …
Sep 22, 2026
1d01997
docs: extend CONTRACT INTEGRITY rule 6 to characterisations of siblin…
Sep 22, 2026
40beb1b
docs: park the principles-vs-triggers coverage idea, with the objecti…
Sep 22, 2026
6cba288
docs: record the feasibility point as a concern, not an objection
Sep 22, 2026
7c12708
perf(ioring): batch an epoch's appends into one submission, and measu…
Sep 22, 2026
834c7af
fix(ioring): derive the epoch-log sample's free slots instead of trac…
Sep 22, 2026
896252e
feat(ioring): provide NumaBuffer, and place the epoch-log arena delib…
Sep 22, 2026
7bda668
docs(ioring): re-plan M22+.2 as M23.3, because it justified itself wi…
Sep 22, 2026
4600a64
docs(ioring): investigate M20.6 -- the benchmark measures deferral, n…
Sep 22, 2026
8b8afaf
test(ioring): cover ring_copy's degraded-fallback path, both directions
Sep 23, 2026
3433fe0
fix(ioring)!: ask which cache level partitions the machine, never fil…
Sep 23, 2026
2f597d4
docs(ioring): answer M24.1 -- the fake was the wrong instrument; queu…
Sep 23, 2026
785211d
refactor(ioring): split the ring's bookkeeping out of the ring
Sep 23, 2026
9bc0350
test(ioring): mint tokens from the ledger, so token's tests open no ring
Sep 23, 2026
e15ab83
test(ioring): relocate the ring-opening lib tests that use only publi…
Sep 23, 2026
a4f2f25
ci(ioring): inventory the lib tests that open a ring, so the count ca…
Sep 23, 2026
a76fb63
docs(ioring): sweep what M24 made false -- and what it did not
Sep 23, 2026
740e40d
docs(ioring): stop the epoch-log sample claiming to measure a commit
Sep 23, 2026
26fad15
docs(ioring): keep options open; foreclose only on analytic grounds
Sep 23, 2026
0ba7167
docs: record the adoption thesis behind the ring, queue and locality …
Sep 23, 2026
d3c84ea
docs(topology-planner): settle the goal as a dataflow description; tw…
Sep 23, 2026
169195f
docs: record the resolution gradient, and correct a deferral written …
Sep 23, 2026
cbd5ce6
docs(ioring): say why placement.rs calls DeviceIoControl directly
Sep 23, 2026
d845bb2
feat(ioring): state that the ring, not the log, is the durability unit
Sep 23, 2026
4adea67
fix(ioring): separate the barrier's scope from the flush's in the con…
Sep 23, 2026
48dc99d
docs(ioring): right-size the device question in the epoch-log contract
Sep 23, 2026
b20d1e0
docs: record the co-flush musing, and question whether M23.2(b) is at…
Sep 23, 2026
4319688
feat(ioring): D-54 -- this crate owns one flush, not durability groups
Sep 23, 2026
0c245de
docs: keep the concept as flush equivalence, not device identity
Sep 23, 2026
29ea07e
docs(ioring): archive M23.1 with a stub, per the move-with-link rule
Sep 23, 2026
6101ca6
docs: new crates take the win- prefix; queue the migration at the hor…
Sep 23, 2026
947b252
feat!: create win-numa-sys and move NumaBuffer into it
Sep 23, 2026
740d786
docs(numa): record N-D-1 -- both ways to a node, and no shortcut betw…
Sep 23, 2026
bc856bd
feat(ioring): spike Pending<T, X> for M23.3, and report what it canno…
Sep 24, 2026
448709b
test(ioring): reach the failed-write path, and make the M22.2 regress…
Sep 24, 2026
783a94c
docs(ioring): correct the type-erasure claim, and record the M23.3 ex…
Sep 24, 2026
b4d17f7
docs(ioring): reframe M23.3 on its mechanism rather than its duplicat…
Sep 24, 2026
fdc3f7f
feat(ioring)!: D-55 -- the ring owns the pending inventory
Sep 24, 2026
74022a3
fix(ioring): keep Drop guards silent while already panicking
Sep 24, 2026
75b3ef7
test(ioring): cover both of IoRing::drop's asserts without a seam
Sep 24, 2026
a8a2a3e
feat(ioring): give epoch-log records a sector stride, both ends
Sep 24, 2026
e75a9d7
feat(ioring): open the epoch log NO_BUFFERING | OVERLAPPED over a wri…
Sep 24, 2026
e44fa97
docs(ioring): call the pre-allocation step a zero-fill, and say it is…
Sep 24, 2026
54cf1c6
docs(ioring): measure what set_len costs instead of asserting it
Sep 24, 2026
7bb7cc1
docs(ioring): measure the deliberate-forcing trick, and bound the fil…
Sep 24, 2026
e9b086a
docs(ioring): measure what the pre-allocation costs at this sample's …
Sep 24, 2026
c7bf651
perf(ioring): size the zero-fill chunk from measurement, not habit
Sep 24, 2026
bc86ea6
docs(ioring): record why the zero buffer is allocated and not a static
Sep 24, 2026
e1c65cc
test(ioring): run the epoch-log sample's own verification, and main u…
Sep 24, 2026
2b2e75c
feat(ioring): measure a commit as submit / blocking / deferral
Sep 24, 2026
6c012e6
fix(ioring): count a strategy's preparation as part of its commit, an…
Sep 24, 2026
d8c90f6
docs(ioring): sweep what M25 made false, and record D-56 and D-57
Sep 24, 2026
fc9f48e
docs(ioring): report the comparison, not the verdict, in the M25 capt…
Sep 24, 2026
2d62cbe
refactor(ioring): keep replay's slice for a stated reason, digest the…
Sep 24, 2026
c200174
docs(ioring): specify the permitted kernel response space as D-59
Sep 24, 2026
73b60c9
feat(ioring): route the submission-path kernel calls through a seam
Sep 25, 2026
6e53bbe
feat(ioring): build the seeded resolver over the kernel response space
Sep 25, 2026
ac177da
test(ioring): state the properties that must hold under every resolution
Sep 25, 2026
ce747ce
test(ioring): calibrate the resolver against two defects that really …
Sep 25, 2026
b518a94
test(ioring): raise the standard seeded-sweep size to 2048
Sep 25, 2026
b0fd225
test(ioring): give the kernel tests their conformance job and enforce it
Sep 25, 2026
d4ecf8d
test(ioring): restate 31 frozen observations as this crate's contract
Sep 25, 2026
2585180
feat(ioring): hand rundown's retry policy to the caller, and fix an e…
Sep 25, 2026
382efe6
test(ioring): make the event-delivery stall report a diagnosis, not a…
Sep 25, 2026
0444768
docs(ioring): narrow the event-delivery flake to a minimal reproducer
Sep 25, 2026
2522bbf
feat(threadpool): add a trace for defects that only appear under conc…
Sep 25, 2026
ef3ada4
feat(ioring): trace the delivery path, and prove the pool is alive wh…
Sep 25, 2026
dedbc19
docs(threadpool): state the arm-before-signal rule on arm and rearm
Sep 25, 2026
6d6956d
fix(ioring): arm the delivery wait before signalling the completion e…
Sep 25, 2026
f4d4f0e
feat(ioring): decide RS-P-8, a completion may report fewer bytes than…
Sep 25, 2026
9c01eb9
docs(ioring): record how M26.11 will determine a handle type
Sep 25, 2026
1275443
docs(ioring): withdraw an unsupported claim in M26.11 and reframe the…
Sep 25, 2026
eb2f15b
docs(ioring): decide against a handle pre-check for the epoch log (D-70)
Sep 25, 2026
1b975af
feat(ioring): state the epoch log's handle requirements and enforce t…
Sep 25, 2026
29a6ebd
chore: bootstrap win-numa-sys in the release-please manifest
Sep 25, 2026
3fbb0a5
chore: register win-numa-sys in the publish workflow
Sep 25, 2026
02bb88f
fix(ioring): resolve the intra-doc links this branch broke
Sep 25, 2026
04c329b
fix(ioring): address PR #108 review, and record what one finding unco…
Sep 25, 2026
95fc3e3
fix(ioring): address the two findings Copilot raised without a thread
Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 158 additions & 2 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,52 @@ baseline truly unaffordable, that is a **decision for the engineer driving the w
raised explicitly per the PRIME DIRECTIVE's blocker protocol — never a shortcut an
assistant takes unilaterally in the name of efficiency.

## OPTION INTEGRITY — enable choices; foreclose only on analytic grounds

**Our job is to enable options.** Unless an option can be shown to have *no possible
value*, expose it, and give clients the tools to choose it when it applies and to gather
the data that makes the choice well-founded. The default posture toward a design
alternative is to keep it and instrument it, not to rank it.

**The reason this repository needs the rule more than most is recorded separately**, in
[DESIGN-NOTES.md](../DESIGN-NOTES.md) → [The adoption thesis](../DESIGN-NOTES.md#the-adoption-thesis):
the hardware that would make these tradeoffs measurable is not available here, and the
people best placed to judge the options are application authors we have not met. Read it
before arguing that a particular option is safe to drop — the two conditions it names are
temporary in principle and are not temporary in practice.

**A measurement that failed to realise an option's value is not a finding against the
option.** It may mean the hardware, the workload, the software configuration, or the
apparatus could not reach the conditions where the value appears. Saying "we measured it
and it did not help" is a statement about the *measurement*; converting it into "it does
not help" is a category error, and it is the one this rule exists to stop.

**This binds hardest where there is literature or prior art suggesting conditional
applicability.** Queue and ring topologies, cache and NUMA placement, batching strategies,
and scheduling disciplines all have regimes where each choice wins. An in-repo measurement
on one machine cannot settle a question the field treats as workload-dependent, and this
repository's own decisions (for example that one ring per thread is userspace's proxy for
one ring per CPU, with NVMe queue pairs as the hardware reason) frequently *are* that prior
art. Contradicting a recorded decision on the strength of one sample's configuration is a
defect, not a finding.

**What does justify removing or narrowing an option** is a clear analytic result, of the
kind that can be argued from the code rather than from a run:

- fewer instructions, fewer allocations, fewer I/Os issued;
- better locality of reference, argued structurally;
- a smaller support burden or a clearer programming model;
- a demonstrated *wrong answer* — an option that binds to incidental behaviour, produces
overlapping domains, or silently reports success while doing the wrong thing.

The last is the honest ground for most removals here: not "it measured slower" but "it
computes the wrong thing."

**When an option stays but cannot be shown to pay, say exactly that**, and say what would
change the answer: which conditions the apparatus could not reach, and what a consumer
would need to measure on their own hardware. Foreclosing costs a client a choice they may
have needed; keeping an unproven option costs a paragraph.

## Line endings in tool parameters

All text content passed to tpu tools (`content`, `replacement`, `data` in edit ops) is
Expand Down Expand Up @@ -661,7 +707,7 @@ When executing checklist items (CHECKLIST.md files):
- **If items must be done together, say so and do it; don't tease apart.** Once you have decided (and recorded in the checklist if the structure is wrong) that two items must land together, commit them together in one commit citing both IDs. Do **not** try to "unthread" a coupled implementation into per-item commits after the fact — that is fiction, not history.
- **Commit immediately after each item.** In mode b (implementing forward), the commit must happen before moving to the next item. In mode a (recording already-finished work), a single commit citing all the item IDs satisfies this.
- **Commit message format: a Conventional Commits subject line, with the checklist trailer in the body.**
`release-please` (see "Release process" in [DEVELOPMENT.md](DEVELOPMENT.md)) drives every crate's version
`release-please` (see "Release process" in [DEVELOPMENT.md](../DEVELOPMENT.md)) drives every crate's version
bump and CHANGELOG **only** from Conventional Commits subject lines (`type(scope)!: summary`); a subject
that doesn't match that grammar is invisible to it, no matter how much checklist work the commit records.
The mandatory `Completed item:` provenance is therefore never the subject line — it moves to the body, and
Expand Down Expand Up @@ -1142,6 +1188,65 @@ If a plan exceeds roughly 10 work items or 3 levels of grouping/nesting, checkpo
into a CHECKLIST.md file in the repository before continuing. The goal is that the plan
survives a lost session — if the plan only exists in the chat, it will be lost.

## RESOLUTION GRADIENT — sharp at the front, deliberately coarse behind, and never manufacture certainty

**A plan is written at decreasing resolution with distance from the present.** The current
milestone has great resolution. Later milestones are progressively coarser, and that
coarseness is **correct** — it is not an omission to be closed, and an audit or review pass
must not treat it as one.

**Why it cannot be otherwise here.** Some work has the shape *build the blocks → build the
measurement tools → experiment with those tools to infer things*. On such a project the
later milestones are not merely unwritten, they are **unwritable**: the experiments that
would resolve them have not happened. The clarity is an **output** of the work, not an
input being withheld from it. A project small enough to plan end-to-end before
implementing is a different case, and the distinction is worth making explicitly before
planning begins.

**The failure mode this exists to stop.** An assistant asks a *very specific* question of
someone who holds a *general sense* of the direction. The specificity of the question
implies an answer of matching precision is available, so one is produced — at low
confidence. It is then recorded as a decision, and it lands in the wrong milestone, or in
the wrong order, and later work binds to it. **A low-confidence answer recorded as a
decision is worse than no answer**, because the uncertainty that surrounded it is now
invisible to everyone downstream.

Four rules follow:

1. **Calibrate the question to the resolution actually available.** Ask whether the general
direction is right before asking which of five options to take. If a question would only
be answerable *after* work that has not been done, it is not yet a question — it is a
description of that work.
2. **Make "too early to say" a first-class, explicitly offered answer.** When presenting
options, say plainly that leaving it coarse is among them. A question posed without that
option is a question that forces a choice, and the person answering may not notice they
have been forced.
3. **When an answer arrives hedged, record the hedge.** A direction that is not settled is a
**working position, not a decision**: it gets no decision ID, it lives in Tier 2 or Tier 3
or a heading that says so, and nothing binds to it. The worked example already in the tree
is "Working position on domain counts (not a decision)" in
[DESIGN-SESSION-2026-08-30-numa-sharded-io-execution-domains.md](../design-sessions/DESIGN-SESSION-2026-08-30-numa-sharded-io-execution-domains.md).
4. **Prefer questions that unblock the current milestone.** If the answer would not change
what happens next, asking now mostly converts uncertainty into a record of false
precision.

**A deferral is productive, not merely protective.** Naming a deferral is usually read as
"we avoided building on a guess", which is true and is the smaller half. The larger half is
that it **buys the interval in which the answer becomes derivable** — the blocks get built,
the instruments get written, the experiments get run, and the answer that was unavailable
becomes obvious. So when a deferral discharges, do **not** write it up as though the answer
existed all along and was waiting to be stated. Say what in the interval produced it. The
difference matters because the first framing quietly teaches that asking earlier and harder
would have worked, which is exactly the behaviour rule 1 forbids.

**This does not soften the PRIME DIRECTIVE, and the two must not be confused.** They govern
different objects. The PRIME DIRECTIVE forbids deferring **work** because no consumer for it
is currently visible; this rule forbids manufacturing **decisions** the work has not yet made
available. Building a capability nothing calls yet is required; inventing a specific answer to
a question the experiments have not reached is not. When they appear to collide, the test is
whether the thing being deferred is *work you could do now* — if it is, do it, and the
gradient has nothing to say about it.

## Design notes are not a work queue

Design notes (DESIGN-NOTES.md, DESIGN-RATIONALE.md, and related files) record *decisions*
Expand Down Expand Up @@ -1304,7 +1409,7 @@ sites in three wordings.

**This is the data-side twin of rule 1.** Rule 1 says define a fact once in code and have everything
ask. This says the same of measurements: hold the number once, and have prose point rather than
paraphrase.
paraphrase. Rule 6 extends it once more, to facts that are *derived* rather than measured.

### 5. Present what was observed; never write the conclusion

Expand Down Expand Up @@ -1351,6 +1456,57 @@ crate that happens to publish measurements. Every instance found so far has been
existing decision rather than a gap in it. Apply it while writing: no checker can find these,
because nothing is inconsistent.

### 6. Never store a fact another artifact already owns

Rule 4 governs *measured* numbers. This governs every **derived** fact -- anything a reader could get
from an artifact that is already authoritative for it. Release or publication status, version numbers,
which milestones are done, whether a branch has landed, how many crates or tests or files there are.
Writing one into prose creates a second copy whose only maintenance mechanism is somebody remembering,
and remembering is what fails.

The tell is that **the copy cannot be wrong at the moment it is written.** It is accurate -- that is why
it gets written -- and nothing will ever say when it stopped being. A wrong decision gets argued with; a
stale derived fact is simply believed.

- **Delete rather than update.** When you find a stale derived fact, correcting it is almost never the
fix: it re-arms the identical hazard with a fresh date on it. Remove the claim and link the artifact
that owns the answer.
- **Removing the digits is not enough.** "Published at 0.3.1" and "is published" are both copies of the
release state; only the first is obviously one. Rule 4's "write the claim, not the digits" shrinks the
drift surface of a *measurement whose claim is itself the finding*. It does not license storing a
derived fact in words.
- **An absence may be worth one sentence, once.** Where a reader would expect a status section and find
none, say the omission is deliberate and name the artifact that answers it -- otherwise somebody
helpfully adds it back.
- **A characterisation of a sibling item is a derived fact too, and this is the clause that was
missing.** "`M22` is a testing-heavy milestone", "`M23.1` touches the crate's contract surface",
"those tests only use public API" -- each summarises an artifact that already says what it is, and
each is wrong the moment that artifact changes or was misread in the first place. **Link the item;
do not describe it.** Measured cost of the omission: both examples above are real, both were
written into a milestone's rationale in one session, and both were false when checked -- `M22` is
example-only and `M23.1` names the *sample's* `contract.rs`, not the crate's.
This is the harder half of the rule to apply, because such a claim arrives as a *subordinate
clause supporting an argument* rather than as a statement of fact. "X, because Y is Z" reads as
connective tissue; `Y is Z` is nonetheless an assertion about the tree, and the reflex that fires
on "I am about to write a version number" does not fire on it. Treat the word **because**,
followed by anything about another file, item or milestone, as the tell.
- **This does not reach the primary record.** Decisions, measurements, rationale, design intent, and a
checklist's own contents are owned here and belong here. The test is simply whether some other
artifact is already authoritative: if yes, point at it; if no, this *is* the artifact.

**FAIL FAST rule 6 is the sibling, not a contradiction.** That rule says a claim that counts or
enumerates repository artifacts must come from a command rather than from recollection. This is the
prior question -- prefer not to state it at all. Bind it to a command only when the claim must exist
anyway, such as a test asserting a property of the tree.

Worked example, and the reason this is written down: `windows-ioring-sys`' design notes opened with
"This crate does not exist yet as compiled code", and its published rustdoc said "Under construction",
several releases after the first one shipped. The first attempt at a fix replaced both with a carefully
drift-minimised status paragraph -- no version number, linking `CHANGELOG.md` and the checklists -- and
that was still wrong, because "is published" is itself a copy of the release state. What the crate's
status is, is a question `CHANGELOG.md` and the git tags answer. The notes now record that they
deliberately do not answer it.

## FAIL FAST — push every rule to the earliest rung that can enforce it

CONTRACT INTEGRITY above tells you to keep restatements in step. This tells you where to put the
Expand Down
46 changes: 46 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,23 @@ jobs:
shell: pwsh
run: ./tools/check-borrow-surface.ps1

# The same mechanism, for a different population that also grew unnoticed:
# lib tests that open a real kernel ring. D-49 found 63 of them, which made
# `cargo test --lib` an integration suite wearing a unit suite's name. M24 took
# it to 41 and none of those is movable without M26.2, so a zero-check would
# fail on day one -- hence an inventory, which fails when the SET changes. An
# addition obliges the question "does this need the kernel, or only a
# ring-shaped thing?"; a removal is progress and needs only regeneration.
# Needs no toolchain -- it only reads files.
ring-test-population:
name: ioring ring-opening lib tests
runs-on: windows-latest
steps:
- uses: actions/checkout@v7
- name: Run check-ring-tests.ps1
shell: pwsh
run: ./tools/check-ring-tests.ps1

build-test:
name: build + test
runs-on: windows-latest
Expand Down Expand Up @@ -512,6 +529,35 @@ jobs:
RUST_BACKTRACE: 1
RUST_LIB_BACKTRACE: 1
run: cargo test -p windows-ioring-sys --locked --no-fail-fast
# `kernel-seam` (M26.2) is orthogonal to `threadpool`, so the two gates
# multiply: `--all-features` above builds the seam only alongside the
# threadpool, and every step in this job so far builds the no-threadpool
# path only with the seam off. The combination is a published
# configuration nothing else selects, which is the same argument that
# bought this job -- paid here rather than assumed.
- name: cargo clippy (kernel-seam, no threadpool)
run: cargo clippy -p windows-ioring-sys --all-targets --no-default-features --features kernel-seam --locked -- -D warnings
- name: cargo test (kernel-seam, no threadpool)
env:
RUST_BACKTRACE: 1
RUST_LIB_BACKTRACE: 1
run: cargo test -p windows-ioring-sys --no-default-features --features kernel-seam --locked --no-fail-fast
# `cargo test` compiles the epoch-log sample as a test harness and never
# calls `main`, so until M25.1b nothing ran the program itself. That was
# not theoretical: M25.1 converted the log's writer to a strided layout
# without the reader, which left the log unreadable while every one of
# the example's tests passed.
#
# M25.1b put the contract checks in tests, which is the rung that runs on
# every developer's machine. What a test cannot reach is `main` itself --
# its path setup, its error plumbing, and its exit code -- and that is a
# published example a consumer runs, so a panic on startup is exactly the
# failure worth catching. Release, because the sample takes about a second
# there against several in debug.
- name: cargo run (epoch-log sample, end to end)
env:
RUST_BACKTRACE: 1
run: cargo run -p windows-ioring-sys --example epoch_log --release --locked

placement-probe-no-serde:
name: windows-placement-probe (no serde feature)
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/publish-crate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ name: publish-crate
on:
push:
tags:
- 'win-numa-sys-v*'
Comment thread
Copilot marked this conversation as resolved.
- 'windows-file-enumeration-sys-v*'
- 'windows-file-watcher-v*'
- 'windows-file-watcher-example-test-harness-v*'
Expand All @@ -29,6 +30,7 @@ on:
required: true
type: choice
options:
- win-numa-sys
- windows-file-enumeration-sys
- windows-file-watcher
- windows-file-watcher-example-test-harness
Expand Down Expand Up @@ -109,7 +111,7 @@ jobs:
- name: Wait for workspace-sibling dependencies on crates.io
shell: bash
run: |
workspace_crates="windows-file-enumeration-sys windows-file-watcher windows-file-watcher-example-test-harness windows-impersonation-token-sys windows-ioring-sys windows-namespace-request-sys windows-overlapped-io-sys windows-thread-ambient-sys windows-threadpool-sys windows-topology-sys windows-waitable-queues wtf-string"
workspace_crates="win-numa-sys windows-file-enumeration-sys windows-file-watcher windows-file-watcher-example-test-harness windows-impersonation-token-sys windows-ioring-sys windows-namespace-request-sys windows-overlapped-io-sys windows-thread-ambient-sys windows-threadpool-sys windows-topology-sys windows-waitable-queues wtf-string"
metadata="$(cargo metadata --no-deps --format-version 1)"
# `tr -d '\r'` is load-bearing on the Windows runner: jq.exe writes
# CRLF, and `read` splits on LF alone, so without this the last field
Expand Down
1 change: 1 addition & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"crates/windows-file-watcher-example-test-harness": "0.1.3",
"crates/windows-impersonation-token-sys": "0.1.1",
"crates/windows-ioring-sys": "0.3.1",
"crates/win-numa-sys": "0.0.0",
"crates/windows-overlapped-io-sys": "0.1.3",
"crates/windows-namespace-request-sys": "0.2.1",
"crates/windows-thread-ambient-sys": "0.2.0",
Expand Down
Loading
Loading