Proving parallel execution from timestamps
parallel: 3—but that's intent, not proofA config flag declares what should run concurrently. It never shows what actually ran. This deck closes that gap: from the declaration, to the engine, to the telemetry that proves it.
Start with the declaration itself—and prove it's real.
parallel: 3 on a foreach stepdocument-generation.yaml v8.1.0 runs a foreach step, run-content-checks, over 3 content checks—accuracy, completeness, instructions—with parallel: 3 and agent foundation:zen-architect.
So the intent is on the record. But intent is all it is.
Nothing in the config rules out the executor silently serializing the checks. A flag could be mis-wired, ignored, or queued one-behind-the-next—and the YAML would look identical either way.
To trust it, stop reading the config and start measuring the execution.
asyncio.gather + Semaphore(N) turns the flag into concurrencyThe executor's _execute_loop_parallel runs iterations through asyncio.gather, bounded by asyncio.Semaphore(N): parallel: true is unbounded, parallel: N caps at N concurrent.
The bound is real—so how do we watch it happen from outside?
session:fork event you can readEach iteration's spawn records a session:fork event carrying an ISO-8601 millisecond ts and a parallel_group_id the executor stamps across the whole batch.
One shared group id, many timestamps—now you can correlate them.
parallel_group_idGroup forks by their shared id and read the timestamps: launched together means concurrent; one-behind-the-next means queued. The bound shows itself as waves.
5 quality checks at parallel: 3 run as 2 waves—3, then 2.
5 quality checks · parallel: 3 · Semaphore(3) → 2 waves (3 + 2)
The declaration is git-verifiable. The proof of concurrency lives only in runtime fork timestamps—which is exactly the honest catch.
Because timestamps aren't git-verifiable, the reproducible method is the deliverable.
The load-bearing caveat. Timestamps are runtime artifacts, not stored in the repo. Any exact values vary between executions—the method is what reproduces, not the numbers.
For any declared behavior, a declaration is a claim. Execution must be measured. Find the events the runtime already emits, correlate them, and let the data render the verdict.
Declaration is intent. Correlated telemetry is proof.
Feature status: SHIPPED / REAL for the mechanism and the recipe declaration.
Verification commands run:
sed -n '1736,1742p' recipes/document-generation.yaml — confirms run-content-checks: parallel: 3, agent foundation:zen-architect.grep -n '"type": "accuracy|completeness|instructions"' + sed -n '1690,1725p' … — 3 content checks launch in one wave.grep -n 'depth|coherence|crossrefs|consistency|tone'; sed -n '2142,2145p' … — 5 quality checks at parallel: 3 → 2 waves.grep -n 'Semaphore|asyncio.gather' + sed -n '2320,2440p' executor.py — _execute_loop_parallel uses asyncio.gather + asyncio.Semaphore(N).python3 parse of ~/.amplifier/projects/**/events.jsonl — real session:fork events carry ms-precision ts + shared parallel_group_id.grep -rn 'parallel: 3' amplifier-bundle-recipes/examples/; git show -s dfe6875 — example recipes + the cap of unbounded parallel: true to parallel: 3.git show -s 0cf1d50 375aaed (microsoft/amplifier, author Mollie Munoz) — v8.0.0 parallel-validation merge and v8.1.0 follow-up.Primary contributors: Mollie Munoz (document-generation v8.0.0 parallel-validation merge + v8.1.0); Amplifier bot (capped unbounded parallel: true → parallel: 3, microsoft/amplifier-bundle-recipes).
Gaps / honest limits: Specific measured timestamps, start spreads, and speedup percentages are runtime artifacts and are not git-verifiable; exact values vary between executions. The executor source lives in the installed Amplifier bundle cache, not a checked-out git tree; the primary recipe copy inspected is under an Inactive/ path.