Skip to content

Commit 1ee23bc

Browse files
Drop bare cross-tracker issue references in v2 architecture docs
The seven `docs/architecture/` contract docs (worker-compatibility, task-matching, control-plane-split, scheduler-correctness, rollout-safety, operational-liveness, routing-precedence) carried bare `#NNN` tokens that GitHub auto-resolves against the public workflow repo, producing broken links and exposing private-tracker numbering. Replace each `(#NNN)` parenthetical with the existing Phase name that already identifies the contract, drop the bare `#72` / `#78` / `#83` / `#578` references in routing-precedence narrative, and update the seven matching `*DocumentationTest` pinning tests to assert on Phase names and contract paths instead of bare issue numbers. Extend `scripts/check-public-boundary.sh` so the regression cannot land again: any `#NNN` in tracked content under `docs/` or in `tests/Unit/V2/*DocumentationTest.php` now fails the public-boundary scan.
1 parent 0654f47 commit 1ee23bc

15 files changed

Lines changed: 108 additions & 100 deletions

docs/architecture/control-plane-split.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ This contract builds on the semantics frozen in
1818
`docs/architecture/execution-guarantees.md` (Phase 1), the routing
1919
guarantees frozen in `docs/architecture/worker-compatibility.md`
2020
(Phase 2), and the matching and dispatch guarantees frozen by the
21-
Phase 3 roadmap (#581). Duplicate execution, retries, redelivery,
21+
Phase 3 roadmap. Duplicate execution, retries, redelivery,
2222
compatibility, and task matching keep the language they have there;
2323
this document adds the language for which role owns which durable
2424
responsibility and how those roles combine into deployment topologies.
@@ -45,10 +45,10 @@ The contract covers:
4545

4646
It does not cover:
4747

48-
- the scheduler cache independence work described by Phase 5 (#583).
48+
- the scheduler cache independence work described by Phase 5.
4949
Phase 5 will replace the shared-cache wake backend with a stronger
5050
primitive but must preserve the role boundaries named here.
51-
- the rollout safety enforcement work described by Phase 6 (#584).
51+
- the rollout safety enforcement work described by Phase 6.
5252
- host-level infrastructure choices such as reverse proxy selection,
5353
service mesh, TLS termination, Kubernetes vs Nomad vs bare Docker,
5454
or database placement. Those are deployment concerns that consume
@@ -249,7 +249,7 @@ Guarantees:
249249
policies, compatibility pinning, or namespace checks.
250250
- Schedule evaluation is deduplicated per trigger so a restart or
251251
split-leader scenario does not produce duplicate starts. Phase 6
252-
(#584) will harden this with explicit coordination health; this
252+
will harden this with explicit coordination health; this
253253
contract requires that the scheduler-role surface NOT create a
254254
new race the Phase 6 work must paper over.
255255

@@ -368,7 +368,7 @@ to load without adding identical uniform nodes.
368368
serialise on the run id they are projecting.
369369
- **Scheduler role** scales with active schedule count. It is
370370
horizontally scalable with per-schedule leader election; Phase 6
371-
(#584) will freeze the leader-election contract, and topologies
371+
will freeze the leader-election contract, and topologies
372372
before that should run a single scheduler replica.
373373
- **Execution plane** scales with workflow-task and activity-task
374374
rate. It is horizontally scalable and is the primary surface
@@ -602,16 +602,16 @@ must not be assumed:
602602
routing primitive, not a role boundary.
603603
- Multi-region active/active topology. Cross-region coordination
604604
is a future roadmap topic and is not covered.
605-
- Replacement of the shared wake backend. That is Phase 5 (#583).
605+
- Replacement of the shared wake backend. That is Phase 5.
606606
- Rollout-safety enforcement and scheduler leader election. That
607-
is Phase 6 (#584).
607+
is Phase 6.
608608

609609
## Changing this contract
610610

611611
A change to any named guarantee in this document is a protocol-level
612612
change for the purposes of `docs/api-stability.md` and downstream
613613
SDKs. Reviewers should treat unmotivated changes to the language
614614
above as breaking changes and require explicit cross-SDK
615-
coordination before merge. The Phase 4 roadmap (#582) owns updates
616-
to this contract; Phase 5 (#583) and Phase 6 (#584) must extend the
615+
coordination before merge. The Phase 4 roadmap owns updates
616+
to this contract; Phase 5 and Phase 6 must extend the
617617
contract rather than silently redefine it.

docs/architecture/operational-liveness.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -897,10 +897,10 @@ A change to any guarantee named here MUST ship alongside:
897897
5. An entry in the repository's public release notes that calls
898898
out the protocol impact.
899899

900-
This contract builds on Phase 1 (#579) execution guarantees,
901-
Phase 2 (#580) worker compatibility, Phase 3 (#581) task matching,
902-
Phase 4 (#582) control-plane split, Phase 5 (#583) scheduler
903-
correctness, and Phase 6 (#584) rollout safety. Removing a
900+
This contract builds on Phase 1 execution guarantees,
901+
Phase 2 worker compatibility, Phase 3 task matching,
902+
Phase 4 control-plane split, Phase 5 scheduler
903+
correctness, and Phase 6 rollout safety. Removing a
904904
citation from that lineage without adding the explicit
905905
re-derivation is a contract violation. Any future extension
906906
(stuck-detector strategy changes, sweeper replacement, heartbeat

docs/architecture/rollout-safety.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ The contract covers:
6464

6565
It does not cover:
6666

67-
- the Phase 4 role split itself; Phase 4 (#582) froze the roles, and
67+
- the Phase 4 role split itself; Phase 4 froze the roles, and
6868
Phase 6 names the health and rollout surfaces that apply across
6969
them.
70-
- the Phase 5 cache independence substrate; Phase 5 (#583) froze
70+
- the Phase 5 cache independence substrate; Phase 5 froze
7171
which layer is correctness and which is acceleration, and Phase 6
7272
inherits that split. Rollout safety MUST NOT reintroduce cache as
7373
a correctness dependency.
@@ -185,7 +185,7 @@ Guarantees:
185185

186186
### Mixed-build safety
187187

188-
Phase 2 (#580) already freezes the worker-compatibility marker
188+
Phase 2 already freezes the worker-compatibility marker
189189
contract (`DW_V2_CURRENT_COMPATIBILITY`, `DW_V2_SUPPORTED_COMPATIBILITIES`),
190190
the single-step compatibility rule across the fleet, and
191191
`Workflow\V2\Support\TaskCompatibility` / `WorkerCompatibility`. Phase 6
@@ -228,7 +228,7 @@ Guarantees:
228228

229229
### Protocol version coordination
230230

231-
Phase 4 (#582) names three protocol-version surfaces (worker
231+
Phase 4 names three protocol-version surfaces (worker
232232
protocol, control-plane protocol, internal role-to-role). Phase 6
233233
adds the rollout-safety enforcement:
234234

@@ -649,7 +649,7 @@ MUST NOT be assumed:
649649
splitters, Helm chart overlays). Those are deployment tooling
650650
concerns that consume this contract.
651651
- Replacement of the shared cache acceleration layer with a
652-
stronger primitive. That seam is part of Phase 5 (#583).
652+
stronger primitive. That seam is part of Phase 5.
653653
- Any change to the Phase 4 role split. Phase 6 must be
654654
implementable inside each role as defined; it does not move
655655
authority between roles.
@@ -660,9 +660,9 @@ A change to any named guarantee in this document is a
660660
protocol-level change for the purposes of `docs/api-stability.md`
661661
and downstream SDKs. Reviewers should treat unmotivated changes to
662662
the language above as breaking changes and require explicit
663-
cross-SDK coordination before merge. The Phase 6 roadmap (#584)
663+
cross-SDK coordination before merge. The Phase 6 roadmap
664664
owns updates to this contract; any follow-on architecture phase
665665
must extend the contract rather than silently redefine it. The
666-
Phase 1 (#579), Phase 2 (#580), Phase 3 (#581), Phase 4 (#582),
667-
and Phase 5 (#583) contracts remain the foundation this document
666+
Phase 1, Phase 2, Phase 3, Phase 4,
667+
and Phase 5 contracts remain the foundation this document
668668
builds on.

docs/architecture/routing-precedence.md

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ The contract covers:
5050

5151
It does not cover:
5252

53-
- the dedicated task-matching service described by the Phase 3 roadmap
54-
(#581). That surface consumes the snapped `connection` and `queue`
55-
values frozen here; it does not re-resolve them.
56-
- the control-plane/data-plane role split described by Phase 4 (#582).
53+
- the dedicated task-matching service described by the Phase 3
54+
roadmap. That surface consumes the snapped `connection` and
55+
`queue` values frozen here; it does not re-resolve them.
56+
- the control-plane/data-plane role split described by Phase 4.
5757
The split moves which role writes the snapshots but does not change
5858
the precedence rules named here.
59-
- cache-backed wake propagation described by Phase 5 (#583). Wake
59+
- cache-backed wake propagation described by Phase 5. Wake
6060
signals are eligibility announcements, not routing decisions.
6161
- host-level queue topology (priorities, sharding schemes, managed
6262
lanes). Those are operator choices that consume the snapshot; they
@@ -487,13 +487,13 @@ follow-on phase:
487487
semantics for degraded queues; adding one is a protocol change.
488488
- **Cross-namespace routing.** Namespaces partition the poll surface
489489
and are not part of the routing decision. Cross-namespace calls are
490-
tracked separately in #72.
490+
out of scope for this contract.
491491
- **Webhook and command-ingress routing.** Command-plane ingress
492492
routing is tracked in `docs/architecture/control-plane-split.md`
493-
(Phase 4) and in the webhook/command taxonomy (#83). Ingress
493+
(Phase 4) and in the webhook/command taxonomy. Ingress
494494
routing is not the same as task routing and does not share
495495
resolution rules.
496-
- **Dedicated matching service partitioning.** Phase 3 (#581) may
496+
- **Dedicated matching service partitioning.** Phase 3 may
497497
introduce additional partition metadata on the matching side. When
498498
it does, the matching service will consume `(connection, queue,
499499
compatibility, namespace)` exactly as frozen in
@@ -549,11 +549,10 @@ roadmap issues rather than redefining them here:
549549
`docs/architecture/task-matching.md`.
550550
- retry-time rerouting and degraded-queue drainage, which require a
551551
new contract extension.
552-
- cross-namespace routing, tracked in #72.
552+
- cross-namespace routing, which is out of scope for this contract.
553553

554554
See `docs/architecture/execution-guarantees.md`,
555555
`docs/architecture/worker-compatibility.md`,
556556
`docs/architecture/task-matching.md`, and
557557
`docs/architecture/rollout-safety.md` for the adjacent frozen
558-
contracts this document builds on. Roadmap context is in
559-
#78 and #578.
558+
contracts this document builds on.

docs/architecture/scheduler-correctness.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ retries, redelivery, compatibility, and the `snapshot()`/`changed()`
2525
wake primitives keep the language they have there; this document
2626
adds the language for what those primitives are allowed to be
2727
responsible for and what remains the job of durable dispatch state.
28-
The Phase 4 control-plane and execution-plane role split (#582)
28+
The Phase 4 control-plane and execution-plane role split
2929
preserves every guarantee here unchanged; the split is a topology
3030
change, not a correctness change.
3131

@@ -59,7 +59,7 @@ The contract covers:
5959

6060
It does not cover:
6161

62-
- the rollout safety enforcement work described by Phase 6 (#584).
62+
- the rollout safety enforcement work described by Phase 6.
6363
Phase 6 owns scheduler leader election and coordinated rollout
6464
across role replicas; this contract names what each node is
6565
allowed to observe but does not arbitrate which replica is
@@ -262,7 +262,7 @@ acceleration-layer cooperation.
262262
- When the scheduler role is deployed as multiple replicas, the
263263
per-schedule row lock taken by `ScheduleManager::triggerDetailed()`
264264
is the correctness seam, not a cache-held leader key. Phase 6
265-
(#584) will harden leader coordination with explicit health;
265+
will harden leader coordination with explicit health;
266266
this contract requires that the scheduler-role surface NOT
267267
depend on cache coherence for deduplicated firing.
268268

@@ -489,12 +489,12 @@ Guarantees:
489489
The following are explicitly deferred to later roadmap phases and
490490
must not be assumed:
491491

492-
- **Scheduler leader election across replicas** — Phase 6 (#584)
492+
- **Scheduler leader election across replicas** — Phase 6
493493
owns the leader coordination contract. Pre-Phase-6 deployments
494494
that run multiple scheduler replicas MUST rely on the
495495
per-schedule row lock as the only correctness seam.
496496
- **Rollout-safety enforcement across protocol-version steps**
497-
Phase 6 (#584) owns the rollout-safety seam. This contract does
497+
Phase 6 owns the rollout-safety seam. This contract does
498498
not freeze how a mixed-version cluster coordinates schedule
499499
leadership during a rollout.
500500
- **A notifier-backed implementation of `LongPollWakeStore`
@@ -516,6 +516,6 @@ A change to any named guarantee in this document is a
516516
protocol-level change for the purposes of `docs/api-stability.md`
517517
and downstream SDKs. Reviewers should treat unmotivated changes
518518
to the language above as breaking changes and require explicit
519-
cross-SDK coordination before merge. The Phase 5 roadmap (#583)
520-
owns updates to this contract; Phase 6 (#584) must extend the
519+
cross-SDK coordination before merge. The Phase 5 roadmap
520+
owns updates to this contract; Phase 6 must extend the
521521
contract rather than silently redefine it.

docs/architecture/task-matching.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@ The contract covers:
5555

5656
It does not cover:
5757

58-
- the control-plane/data-plane role split described by Phase 4 (#582).
58+
- the control-plane/data-plane role split described by Phase 4.
5959
The split will move matching onto a dedicated control-plane role,
6060
but must preserve the discovery, claim, and wake guarantees below.
61-
- the scheduler cache independence work described by Phase 5 (#583).
61+
- the scheduler cache independence work described by Phase 5.
6262
Cache independence will replace the shared-cache wake backend with
6363
a stronger primitive but must preserve the snapshot/changed contract
6464
named here.
65-
- the rollout safety enforcement work described by Phase 6 (#584).
65+
- the rollout safety enforcement work described by Phase 6.
6666
- host-level queue infrastructure choices such as which Laravel queue
6767
driver to deploy, how to size queue workers, or whether to run a
6868
dedicated supervisor process. Those are deployment concerns that
@@ -327,7 +327,7 @@ Guarantees:
327327
Redis, a database cache, or another backend reachable from every
328328
server node. File or in-memory backends do not coordinate
329329
signals across nodes and break the multi-node guarantee. This
330-
is the explicit Phase 5 (#583) seam.
330+
is the explicit Phase 5 seam.
331331

332332
Wake notification is observability of new work, not an assignment.
333333
A signalled channel does not promise a specific task to the
@@ -370,7 +370,7 @@ What the contract intentionally does not partition on:
370370
- The matching role does not implement queue-level priorities. A
371371
host that needs priority traffic must run priority queues.
372372

373-
These intentional non-guarantees are how Phase 4 (#582) and later
373+
These intentional non-guarantees are how Phase 4 and later
374374
phases keep room to introduce a real matching service without
375375
re-litigating the partition primitives.
376376

@@ -386,7 +386,7 @@ an explicit per-worker quota:
386386
`max_concurrent_activity_tasks` at registration time so operator
387387
surfaces can show the planned capacity. The matching role does
388388
not enforce these limits at claim time today; that enforcement
389-
is explicitly part of the Phase 6 (#584) rollout-safety work.
389+
is explicitly part of the Phase 6 rollout-safety work.
390390
- Long lease expiry (5 minutes for workflow tasks) is the
391391
fail-stop boundary for an unresponsive worker. Operators sizing
392392
rollout windows MUST treat this as the upper bound on how long
@@ -453,7 +453,7 @@ the claim transaction:
453453

454454
These couplings are correct as semantics — every claim must be
455455
immediately visible to operators and immediately reflected in
456-
history. They are the seam where Phase 4 (#582) will split the
456+
history. They are the seam where Phase 4 will split the
457457
control-plane and execution-plane roles. The contract guarantees:
458458

459459
- Visibility (`RunSummaryProjector`) and lifecycle dispatch
@@ -499,16 +499,16 @@ The following are explicitly deferred to later roadmap phases and
499499
must not be assumed:
500500

501501
- Per-worker concurrency caps are advertised but not enforced at
502-
claim time. Enforcement belongs to Phase 6 (#584) rollout
502+
claim time. Enforcement belongs to Phase 6 rollout
503503
safety, where it can land alongside the broader coordination
504504
health story.
505505
- A dedicated out-of-process matching service is not provided. The
506506
in-worker library shape and the in-server HTTP shape are the
507507
two supported deployment shapes today; a future Phase 4 service
508508
shape will preserve the contract above without breaking either.
509-
- Cache independence for wake notification is deferred to Phase 5
510-
(#583). The current cache-backed wake store is the explicit
511-
seam Phase 5 will replace.
509+
- Cache independence for wake notification is deferred to Phase 5.
510+
The current cache-backed wake store is the explicit seam Phase 5
511+
will replace.
512512
- Priority queues, weighted fair scheduling, and per-tenant
513513
isolation primitives are intentionally not part of this
514514
contract. They are policy choices a host implements through
@@ -523,6 +523,6 @@ A change to any named guarantee in this document is a protocol-level
523523
change for the purposes of `docs/api-stability.md` and downstream
524524
SDKs. Reviewers should treat unmotivated changes to the language
525525
above as breaking changes and require explicit cross-SDK
526-
coordination before merge. The Phase 3 roadmap (#581) owns updates
527-
to this contract; Phase 4 (#582), Phase 5 (#583), and Phase 6
528-
(#584) must extend the contract rather than silently redefine it.
526+
coordination before merge. The Phase 3 roadmap owns updates to
527+
this contract; Phase 4, Phase 5, and Phase 6 must extend the
528+
contract rather than silently redefine it.

docs/architecture/worker-compatibility.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ The contract covers:
3939

4040
It does not cover:
4141

42-
- the dedicated task-matching service described by the Phase 3 roadmap
43-
(#581). The Phase 3 surface will replace broad database polling with
44-
explicit match/dispatch, but must preserve the compatibility
42+
- the dedicated task-matching service described by the Phase 3
43+
roadmap. The Phase 3 surface will replace broad database polling
44+
with explicit match/dispatch, but must preserve the compatibility
4545
guarantees below.
46-
- the control-plane/data-plane role split described by Phase 4 (#582).
46+
- the control-plane/data-plane role split described by Phase 4.
4747
The split will move compatibility heartbeating onto the control plane
4848
but must preserve the observable state named here.
49-
- the scheduler independence work described by Phase 5 (#583).
49+
- the scheduler independence work described by Phase 5.
5050
- host-level deployment orchestration such as container image selection
5151
or rolling-restart choreography. Those are deployment concerns that
5252
consume this contract; they do not define it.
@@ -309,7 +309,7 @@ not be assumed:
309309
frozen separately in `Workflow\V2\Support\WorkerProtocolVersion` and
310310
is independent of the compatibility marker.
311311
- Managed-mode or hosted-mode topology (control-plane / data-plane
312-
split) is outside this contract. See Phase 4 (#582).
312+
split) is outside this contract. See Phase 4.
313313

314314
## Test strategy alignment
315315

@@ -333,5 +333,5 @@ A change to any named guarantee in this document is a protocol-level
333333
change for the purposes of `docs/api-stability.md` and downstream
334334
SDKs. Reviewers should treat unmotivated changes to the language above
335335
as breaking changes and require explicit cross-SDK coordination before
336-
merge. The Phase 2 roadmap (#580) owns updates to this contract;
336+
merge. The Phase 2 roadmap owns updates to this contract;
337337
Phases 3–5 must extend the contract rather than silently redefine it.

scripts/check-public-boundary.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,24 @@ for pattern in "${file_patterns[@]}"; do
5656
done < <(git grep -n -I -e "$pattern" -- "${pathspec[@]}" || true)
5757
done
5858

59+
# Bare cross-tracker issue references like "#NNN" in customer-facing
60+
# architecture docs and their pinning tests will auto-link to the public
61+
# workflow repo on github.com, exposing internal roadmap numbering and
62+
# producing broken cross-links. Architecture contracts must reason in
63+
# product-facing names (Phase numbers, contract titles) rather than
64+
# private tracker numbers.
65+
issue_link_pathspec=(
66+
'docs/'
67+
'tests/Unit/V2/*DocumentationTest.php'
68+
':!.git'
69+
)
70+
71+
while IFS=: read -r file line _; do
72+
[[ -n "${file:-}" ]] || continue
73+
printf 'public-boundary: forbidden cross-tracker issue reference at %s:%s\n' "$file" "$line" >&2
74+
status=1
75+
done < <(git grep -n -I -E '#[0-9]{2,4}([^0-9]|$)' -- "${issue_link_pathspec[@]}" || true)
76+
5977
if [[ -n "${PUBLIC_BOUNDARY_GIT_RANGE:-}" ]]; then
6078
read -r -a rev_args <<< "$PUBLIC_BOUNDARY_GIT_RANGE"
6179
else

0 commit comments

Comments
 (0)