Skip to content

Commit 762e85f

Browse files
committed
Reorganize paper collection for post-Croydon mailing
New papers: - D4178: stdexec self-review - complement.md: complement paper - cpp26-task.md: C++26 task analysis Major revisions: - D4003 reframed from "IoAwaitable for I/O" to "A Minimal Coroutine Execution Model" - networking is one consumer, not the identity. Motivating example changed to bare co_await f(). Straw polls consolidated to one. References pruned and renumbered. - D4125 reset to R0: removed Observations section (P2300 editorialization), keeping the paper as a pure field report. Revision history trimmed to initial entry only. - D4035 expanded escape hatches - D4172 io-awaitables-design revised - D4088, D4089, D4137 updated Moved 16 older network-endeavor papers to todo/ subfolder: d2583, d4003.cpp, d4007, d4014, d4090-d4100, d4126 Updated disclosure boilerplate (tools/disclose.md).
1 parent 559b9cc commit 762e85f

33 files changed

+1192
-541
lines changed

source/awaitable-ask.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ Twenty-one years is long enough.
117117
- [P4092R0](https://isocpp.org/files/papers/P4092R0.pdf) "Consuming Senders from Coroutine-Native Code" - the sender-to-awaitable bridge, working implementation
118118
- [P4093R0](https://isocpp.org/files/papers/P4093R0.pdf) "Producing Senders from Coroutine-Native Code" - the awaitable-to-sender bridge, working implementation
119119
- [P4123R0](https://isocpp.org/files/papers/P4123R0.pdf) "The Cost of Senders for Coroutine I/O" - structural cost analysis, every concession granted
120-
- [P4088R0](https://isocpp.org/files/papers/P4088R0.pdf) "The Case for Coroutines" - five properties that make coroutines the right substrate for I/O
120+
- [P4088R0](https://isocpp.org/files/papers/P4088R0.pdf) "What C++20 Coroutines Already Buy The Standard" - five properties that make coroutines the right substrate for I/O
121121
- [P4003R0](https://isocpp.org/files/papers/P4003R0.pdf) "Coroutines for I/O" - defines the IoAwaitable protocol
122122
- [P4127R0](https://isocpp.org/files/papers/P4127R0.pdf) "The Coroutine Frame Allocator Timing Problem" - the frame allocator must arrive before the frame exists
123123

source/complement.md

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# Complement, Not Coexist
2+
3+
## The Change
4+
5+
Replace "coexist" framing with "complement" framing across all
6+
Network Endeavor papers.
7+
8+
"Coexist" implies reluctant tolerance - two things sharing space
9+
because neither could displace the other. "Complement" says each
10+
model makes the other more valuable. The papers already demonstrate
11+
complementary behavior; the word should match.
12+
13+
## The Canonical Line
14+
15+
The Disclosure section of nearly every paper contains a variation of:
16+
17+
> Coroutine-native I/O and `std::execution` address different
18+
> domains and should coexist in the C++ standard.
19+
20+
Replace with:
21+
22+
> Coroutine-native I/O and `std::execution` are complementary.
23+
> Each serves the domain where its design choices pay off.
24+
25+
## Why "Complement" Is Correct
26+
27+
The papers already make the complementary case:
28+
29+
- The design fork (P4088R0 Section 10) shows two columns of
30+
strengths where neither is a subset of the other
31+
- The bridge papers (P4092R0, P4093R0) show the two models
32+
working together, not merely alongside
33+
- P4126R0 proposes one I/O implementation consumed by both
34+
models at zero allocation cost - partnership, not tolerance
35+
- P4003R1 already uses the word "companion"
36+
- P4014R1 Section 12 interleaves sender pipelines and coroutine
37+
tasks in the same system
38+
- `std::execution::task` is itself both a coroutine and a sender
39+
40+
## Where "Complement" Applies and Where It Does Not
41+
42+
"Complement" describes the relationship between the two *models*
43+
at the domain level:
44+
45+
- Senders serve GPU dispatch, heterogeneous execution,
46+
compile-time work graphs
47+
- Coroutines serve byte-oriented I/O, type-erased streams,
48+
separate compilation, ABI stability
49+
- The bridges (P4092, P4093, P4126) connect them at the boundary
50+
- Each model makes the other more valuable
51+
52+
"Complement" does NOT mean accepting `std::execution::task` as
53+
the coroutine side of the partnership. The papers document real
54+
structural costs when the sender model tries to own coroutines:
55+
56+
- Environment parameter fragments task interoperability (P4089)
57+
- AS-EXCEPT-PTR converts routine error_code to exceptions
58+
(P4007, P4090)
59+
- No symmetric transfer under the sender protocol (P2583)
60+
- Allocator timing mismatch (P4007)
61+
- Compound I/O results do not fit the three-channel model
62+
without data loss (P4090, P4091)
63+
64+
The coroutine-native task (`task<T>`, one parameter) is ours.
65+
The sender pipeline is theirs. The bridges connect them. Be
66+
generous about the models complementing each other. Hold firm
67+
on the documented costs when the sender model absorbs coroutines
68+
through `std::execution::task`.
69+
70+
## Vocabulary
71+
72+
Preferred words, in order of frequency:
73+
74+
- **complement** / **complementary** - the default. The models
75+
complement each other
76+
- **companion(s)** - when the sentence needs a noun. "Both
77+
companions provide structured concurrency." "C++26 ships
78+
both companions." "Three companions - each contributing
79+
what the others cannot"
80+
- **contribute** - when describing what each model brings.
81+
"One contributes optimization visibility. The other
82+
contributes structural type erasure"
83+
84+
## Kill List
85+
86+
| Kill | Replace with |
87+
| :--- | :----------- |
88+
| coexist / coexistence | complement / complement each other |
89+
| domain split | complementary specializations |
90+
| domain-specific (execution models) | complementary (execution models) |
91+
| separation / the measure of the separation | (rewrite - bridges connect, they do not separate) |
92+
| each serving its domain | each contributing what the others cannot |
93+
94+
## The Task Friction Pattern
95+
96+
The models complement each other. `std::execution::task`
97+
trying to serve both models in one type does not.
98+
99+
Serving both models in one type is where friction originates -
100+
two template parameters, sixteen open issues, constraints that
101+
neither model alone requires. The companion approach accepts
102+
the design fork: each model does what it does best, and bridges
103+
connect them at ~10-14 ns with zero allocations.
104+
105+
**Narrative rule:** Do not lead with this observation. The
106+
paper goes about its business documenting coroutine strengths.
107+
The task friction surfaces when it arises naturally - typically
108+
in a Q&A or comparison section. The posture is incidental
109+
("and by the way"), not prosecutorial.
110+
111+
## Instructions
112+
113+
When editing a paper:
114+
115+
1. Find every instance of "coexist" (including "coexistence",
116+
"should coexist", "can coexist") and every instance of
117+
"domain split"
118+
2. Replace with the complementary framing. Match the surrounding
119+
tone and sentence structure. Not every replacement is the
120+
canonical line - some are mid-paragraph and need to flow
121+
naturally. Use the Vocabulary and Kill List sections above
122+
3. Do not weaken the claim. "Complement" is stronger than
123+
"coexist", not softer. The two models are partners that
124+
complete each other's capabilities
125+
4. Do not change the meaning. The papers never argue that
126+
`std::execution` should be removed or modified. That stance
127+
is unchanged. The word is changing, not the position
128+
5. Do not soften documented findings about `std::execution::task`.
129+
The complement framing is about the models, not about
130+
accepting the sender task as equivalent to a coroutine-native
131+
task
132+
6. Let the task friction observation surface naturally when
133+
`task` comes up in context. Do not lead with it
134+
7. Preserve the ASCII-only rule (no Unicode, no em-dashes)

source/d4048-call-to-action.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ Steve Gerbino, Mohammad Nejati, Mungo Gill, and Michael Vandeberg co-authored th
281281

282282
3. [P2453R0](https://wg21.link/p2453r0) - "2021 October Library Evolution Poll Outcomes" (Bryce Adelstein Lelbach, Fabio Fracassi, Ben Craig, 2022). https://wg21.link/p2453r0
283283

284-
4. [P4088R0](https://wg21.link/p4088r0) - "The Case for Coroutines" (Vinnie Falco, 2026). https://wg21.link/p4088r0
284+
4. [P4088R0](https://wg21.link/p4088r0) - "What C++20 Coroutines Already Buy The Standard" (Vinnie Falco, 2026). https://wg21.link/p4088r0
285285

286286
5. [P4099R0](https://wg21.link/p4099r0) - "Twenty-One Years: The Arc of Networking in C++" (Vinnie Falco, 2026). https://wg21.link/p4099r0
287287

source/d4050-failure-modes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ The author thanks Christopher Kohlhoff for the executor model, [N3747](https://w
411411

412412
20. [P4048R0](https://wg21.link/p4048r0) - "Networking for C++29: A Call to Action" (Vinnie Falco, 2026). https://wg21.link/p4048r0
413413

414-
21. [P4088R0](https://wg21.link/p4088r0) - "The Case for Coroutines" (Vinnie Falco, 2026). https://wg21.link/p4088r0
414+
21. [P4088R0](https://wg21.link/p4088r0) - "What C++20 Coroutines Already Buy The Standard" (Vinnie Falco, 2026). https://wg21.link/p4088r0
415415

416416
22. [P1791R0](https://wg21.link/p1791r0) - "Evolution of the P0443 Unified Executors Proposal to accommodate new requirements" (Christopher Kohlhoff, Jamie Allsop, 2019). https://wg21.link/p1791r0
417417

source/d4123-cost-of-senders.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ The author thanks Bjarne Stroustrup for [P3406R0](https://wg21.link/p3406r0) and
463463
464464
4. [cppalliance/capy](https://github.com/cppalliance/capy) - Coroutine I/O primitives library. https://github.com/cppalliance/capy
465465
466-
5. [P4088R0](https://isocpp.org/files/papers/P4088R0.pdf) - "The Case for Coroutines" (Vinnie Falco, 2026). https://isocpp.org/files/papers/P4088R0.pdf
466+
5. [P4088R0](https://isocpp.org/files/papers/P4088R0.pdf) - "What C++20 Coroutines Already Buy The Standard" (Vinnie Falco, 2026). https://isocpp.org/files/papers/P4088R0.pdf
467467
468468
6. [P3801R0](https://wg21.link/p3801r0) - "Concerns about the design of `std::execution::task`" (Jonathan M&uuml;ller, 2025). https://wg21.link/p3801r0
469469

source/d4127-timing-problem.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ struct promise_type {
384384
static void* operator new(std::size_t sz)
385385
{
386386
auto* mr =
387-
get_current_frame_allocator();
387+
get_cached_frame_allocator();
388388
if (!mr)
389389
mr = std::pmr::new_delete_resource();
390390
return allocate_frame(sz, mr);

source/d4162-plan-for-29.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ independently adopting the coroutine-native I/O stack.
382382

383383
4. [P4014R0](https://wg21.link/p4014r0) - "The Sender Sub-Language," Falco et al. https://wg21.link/p4014r0
384384

385-
5. [P4088R0](https://wg21.link/p4088r0) - "The Case for Coroutines," Falco et al. https://wg21.link/p4088r0
385+
5. [P4088R0](https://wg21.link/p4088r0) - "What C++20 Coroutines Already Buy The Standard," Falco et al. https://wg21.link/p4088r0
386386

387387
6. [P2300R10](https://wg21.link/p2300r10) - "std::execution," Niebler, Baker, Shoop et al. https://wg21.link/p2300r10
388388

0 commit comments

Comments
 (0)