Skip to content

Commit 3988653

Browse files
committed
Retrospective suite
1 parent ec7743e commit 3988653

10 files changed

+1626
-188
lines changed

.cursor/commands/redteam.md

Lines changed: 0 additions & 46 deletions
This file was deleted.

CLAUDE.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,16 @@ Rules for all work on WG21 papers in this repository.
231231
structurally precise. If the structures being compared are
232232
fundamentally different, the analogy will be perceived as
233233
political
234+
235+
## Abstract
236+
237+
41. Every abstract opens with a single sentence on its own line -
238+
the brutal summary. No citations, no paper numbers, no
239+
hedging. The sentence must be true, complete, and
240+
unsentimental. It is the sentence a reader remembers after
241+
forgetting everything else. Examples:
242+
- "Three deployed executor models were replaced by one that
243+
was never deployed."
244+
- "The committee voted that sender/receiver covers
245+
networking. No sender-based networking has shipped."
246+
The rest of the abstract follows after a blank line
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: "PAVE: Profile Analysis and Verification Evidence"
3-
document: D4063R0
3+
document: D0000R0
44
date: 2026-03-15
55
reply-to:
66
- "Vinnie Falco <vinnie.falco@gmail.com>"

source/d4058-case-for-coros.md

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,59 @@ A: Section 7 concedes this. The cost is real. The paper does not argue the cost
396396
397397
---
398398
399-
## 9. Conclusion
399+
## 9. The Design Fork
400+
401+
```cpp
402+
// Awaitable // Sender
403+
void await_suspend( template<class Receiver>
404+
coroutine_handle<> h); struct read_operation {
405+
// caller erased Receiver rcvr_;
406+
// caller stamped in
407+
};
408+
```
409+
410+
`coroutine_handle<>` erases the caller. `connect(sender, receiver)` stamps the caller into the operation state. Every row below is a downstream consequence of this choice.
411+
412+
| Property | Senders | Coroutines | Need |
413+
| ----------------------------------------------- | ------- | ---------- | ---- |
414+
| **Optimization** | | | |
415+
| Full pipeline visibility to optimizer | Yes | | |
416+
| Zero-allocation composition (no frame) | Yes | | |
417+
| Compile-time work graphs | Yes | | |
418+
| Static completion signature checking | Yes | | |
419+
| Heterogeneous child composition (GPU+net+timer) | Yes | | |
420+
| **Type erasure and compilation** | | | |
421+
| Structural type erasure of the caller | | Yes | |
422+
| Operation state is not a template | | Yes | |
423+
| Operation state can live in the I/O object | | Yes | |
424+
| Stream can be type-erased (zero per-op alloc) | | Yes | |
425+
| I/O library compiles once (separate compilation)| | Yes | |
426+
| ABI stability across transport changes | | Yes | |
427+
| **Error handling** | | | |
428+
| Non-exception error channel | Yes | Yes | |
429+
| Compound I/O result preservation (ec + n) | | Yes | |
430+
| Composition algebra for infrastructure errors | Yes | | |
431+
| Composition algebra for compound I/O results | | | |
432+
| **Structured concurrency** | | | |
433+
| when_all with child lifetime guarantee | Yes | Yes | |
434+
| when_any / race with cancellation propagation | Yes | Yes | |
435+
| Async scope (spawn + join) | Yes | | |
436+
| Stop token propagation | Yes | Yes | |
437+
| **Ecosystem** | | | |
438+
| Single-parameter task type (no fragmentation) | | Yes | |
439+
| Cross-library interop without bridges | | Yes | |
440+
| Production deployment at scale | Yes | Yes | |
441+
| **Costs** | | | |
442+
| Heap allocation per coroutine frame | | Yes | |
443+
| Opaque resume (optimization barrier) | | Yes | |
444+
| Reference lifetime hazard in coroutine frames | | Yes | |
445+
| Complexity at the I/O call site | Yes | | |
446+
447+
The two property sets are mutually exclusive consequences of the design fork. The first five rows follow from stamping the receiver into the operation state. The next six rows follow from erasing the caller behind `coroutine_handle<>`. Neither model can acquire the other's properties without surrendering its own. The Need column is left for the reader.
448+
449+
---
450+
451+
## 10. Conclusion
400452

401453
The sender model makes design choices that give the optimizer full pipeline visibility, enable zero-allocation composition, and provide type-level completion contracts. These choices are correct for GPU dispatch, heterogeneous execution, and compile-time work graphs - the domains where `std::execution` is deployed at scale.
402454

0 commit comments

Comments
 (0)