You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Plan 034: the Speckit plan for release 1 (standalone operation) of add-neutral-product-standalone-operability - #1155
This PR is the Speckit plan for release 1, "standalone operation"
(phases 1–3), of the ratified OpenSpec change add-neutral-product-standalone-operability (#1144). It encodes Brett Heap's
answers to the eleven questions that blocked phase 1.
It adds planning only: no code, no pin, and no OpenSpec change. It edits no
file of #1144. Besides the feature directory, it changes one line: an entry in
the README's Documentation index that links the feature's seven documents.
The answers, comment 5817152735 (2026-09-24T15:31:46Z): "(a) on all
eleven, (d) on R1Q6".
The ratification record landed as #1151 → cd494e4c. This branch is cut from
it, and it merges main in at 1d14fee6.
The feature is specs/034-opendox-standalone-operation/:
file
what it holds
spec.md
User stories US1 (it runs), US2 (useful alone), US3 (installs) and US4 (the governed host unchanged). FR-001–FR-012, each mapped to a #1144 requirement and its boxes. § Clarifications, with the eleven answers as Q: … → A: …. The term-by-term definition of the AT-R1 acceptance test.
plan.md
Technical context. Constitution Check I–VII, where the one recorded deviation is now resolved for phase 1. The five target repositories. Where each box closes. The dependency graph and the single-writer surfaces. The pin and landing order (9.5). The trailer and Rule 6 rules. § Ruled answers and § Ruling needed (RN-1). In-flight overlaps.
research.md
Every measurement, with the command that reproduces it (W=$(mktemp -d); no host paths). Eight non-normative corrections to #1144 (R16).
tasks.md
87 tasks, T001–T098. Each task carries its repository, the boxes it realizes, its falsifier, and its Blocked by:, Ruled: and After: lines. T007 records the ruled amendments in #1144, and T008 raises the doc_health direction arc. T009 and T069 open phases 2 and 3. § Ruled amendments. Box accounting (69 of 124). The phase-1 writer slices, in parallel groups G1–G6.
quickstart.md
The AT-R1 procedure: the HTTP half (T095) and the browser half (T096).
clarify-questions.md
R1Q1–R1Q23: 11 ANSWERED, 12 OPEN
checklists/requirements.md
The spec-quality checklist. Its two open items are the constitution's own gates.
every carved-file task; T038 corrects runtime/cli.py:17-19
an 11.1 addendum (batch A)
R1Q1
(a) handler-contribution facet
T010, T011, T045; T084 and T086 in phase 3
2.2 and design.md § D4 addenda (A)
R1Q2
(a) named composition tests join 11.1's surfaces
T045, T094 (test_extension_point_parity.py)
11.1 and F11.1 widened (A)
R1Q3
(a), with (i) and (ii)
T016, T022
F3.1 line 2 and 3.2 (A); (ii) is RN-1
R1Q4
(a) openDox's own verbs; the host asserts
T015, T038, T046
none
R1Q5
(a) RuntimeSubcommand via SUBCOMMAND_EXTENSIONS, with the opendox-runtime alias
T038, T042
a 10.1 addendum (A)
R1Q6
(d) a declared exclusion with its count and its reason
T041, T043, T044; T008 (the direction arc)
F9.1 for openXdox-code, and 9.4 (B)
R1Q7
(a) a reviewed respelling-only allow-list
T043, T059, T086
F5.2 and 12.5's falsifier (C)
R1Q8
(a) tests_runtime/ included, with a DB service in the required job
T036
none (F9.1 unchanged)
R1Q9
(a) list_documents in phase 1
T025, T046
4.3's "four" (A)
R1Q20
(a) bookkeeping carries no trailer
T091, and this PR
an 11.0 addendum (A)
Each T007 batch is its own bookkeeping PR. Each lands under a Rule 6 window,
with no Arc: trailer, before the checkpoint that runs the amended falsifier.
RULING NEEDED
RN-1: requirement 3's fourth scenario, against R1Q3 (ii). The scenario
reads "the registered profile replaces the default for that process",
unconditionally. As ruled, (ii) refuses a host registration made after a parser
or server was built from the default. The recommendation is (a): the scenario's
WHEN gains "before the product's parser or server has been built from the
default", plus a scenario for the refusal. RN-1 holds no task, because the
after-build refusal is today's AlreadyRegistered (plan.md § "Ruling needed").
Still open (phases 2–3, and process)
R1Q10–R1Q19 and R1Q21. Until they are answered, phases 2 and 3 are
PROVISIONAL, and they authorize no implementation.
R1Q23 is new, raised by R1Q6 (d). Four of 5.4a's six generator suites
need doc_health, and F5.2 does not provide it. R1Q23 asks how F5.2 runs.
It blocks T059 and T063, not phase 1.
A watch item for the archive: under R1Q6 (d), requirement 9 stays an OPEN
EXTRACTION for openXdox-code until the direction arc lands.
Before any slice runs, the holder runs T003 (ARC_BASE) and T005 (the
re-measure), then T006 (round 1a's analyze), and claims the slice (T002). The
groups then run in order:
G2: P1-D (authoring, default adapter) and P1-H (console script).
G3: P1-F (sweep and nine-file repair), then P1-G (whole suite in CI).
G4: P1-R (the openDox root pin).
G5: P1-I (the openXdox pin and residue), then P1-J (openXdox green
alone).
G6: P1-K (the consumer pins and host wiring), then P1-L (T017, T018),
then the T049 checkpoint. T049 also waits on T007's batches A and B, and on
RN-1.
A slice is one writer and one claim in one repository. Its tasks land in
their After: order, one PR each unless a Lands with: line joins them.
Each slice's repository, files, dependencies, falsifier and model (Opus or
Sonnet) are in the table in tasks.md.
Copilot, round 1 (review 5306611493 at 437ca764)
All five threads were answered and resolved at 85d6de45:
T031/T036 cycle. T031 is now After: T035, and it co-lands in T036's
PR.
T040/T047 cycle, and the same in phases 2 and 3. Each phase's pin
advance is split into a root-pin task (T039, T062, T087) and a
consumer-pin task (T047, T064, T094).
SC-006. It now reads 65 of 69 at release-1 close.
T003. It is no longer blocked, because R1Q20 is ruled.
The checklist. Its repository item is narrowed to realization tasks.
Copilot, round 2 (review 5306959435 at 85d6de45)
All five threads were answered and resolved at d3a33165:
T084 after T073. This is serve.py's single-writer order. The same
audit also put T016 after T012 and T038 after T022. All six single-writer
chains in plan.md are now ordered in the After: graph.
The phase-2 graph shows T050 → T051. T025 and T051 lose [P].
The quickstart's prerequisites name R1Q12, and so does T095's Blocked by: line.
The quickstart's step 1 now asserts that there is no identity broker and
that no database listens. Step 2 asserts that neither repository holds a
model binding.
R0 checks out all seven repositories at the commits its table names.
Copilot, round 3 (review 5307043972 at d3a33165)
Both inline threads were answered and resolved at 701a4a1a, and the three
"previously missed" items were answered in a PR comment:
The constitution's workflow gate. Phases 2 and 3 are now PROVISIONAL.
They authorize no implementation until each is re-planned on its answers
and re-analyzed; since round 5 that is done by their round tasks, T009 and
T069. Phase 1, the only phase the plan authorizes, has every material
ambiguity resolved.
spec.md's catalog edge case now separates the behaviour before T085
from the behaviour after it.
The acceptance graph is serial: T095 → T096 → T097.
T017 and T093 run after each phase's openxFactory landing.
T081 runs after T085, whose validators serve its catalog route.
Copilot, round 4 (review 5307117274 at 701a4a1a)
Both inline threads were answered and resolved at 0a5acd7c, and the three
"previously missed" items were answered in a PR comment:
RN-1 against phase 1's close. RN-1 now holds T049. Requirement 3 is not
reported as realized until RN-1 is ruled and T016 matches the ruling.
T076 after T087. The README documents the command the root pins.
T034 after T032, T047 after T007's batch A, and T059 after T007's batch
C. The same audit ordered every arrow in the plan's graph against the After: graph.
Copilot, round 5 (review 5307230690 at 0a5acd7c)
Both inline threads were answered and resolved at 0ad046ba, and the two
"previously missed" items were answered in a PR comment:
T006 waited on the open-ended T004. T004 is now round 1a, and it is DONE.
T006 is round 1a's analyze, after T003, T004 and T005. Phases 2 and 3 open
with their own round tasks, T009 and T069.
The quickstart's readiness probe. It first checks that the port is free,
and on every poll it checks that the launched PID is alive.
Constitution row V. It records main's baseline and the accepted add-chain-attestation disposition, and notes that the enforced openspec-cli-pin gate exits 0.
T053's trailer policy. openDox-spec is a sixth repository of the arc
only if T053 applies, and T091 then covers it.
The same audit:
co-landings now use a Lands with: line;
T026 loses [P];
serve.py's single-writer chain starts at T010.
Copilot, round 6 (review 5307694574 at 0ad046ba)
Its one thread was answered and resolved at 2a57501c:
FR-006 now carries requirement 9's own clause for a check that runs
less than the whole suite. openXdox-code declares its doc_health
exclusion with a count and a reason, and reports it as an open extraction.
Every other whole-suite claim carries the same qualifier.
9.2's close moves to phase 3, where T086 takes the ratchet to (0, 0).
Copilot, round 7 (review 5307775377 at 2a57501c: Findings: None)
Its three "previously missed" items were answered in a PR comment and are
addressed at abb2344e:
T003 records openDox-spec's ARC_BASE unconditionally.
T093 is the interim F11.1 procedure. Each phase runs it as its own
task (T018, T065 and T098), and each checkpoint depends on its run.
Constitution row IV records the README-index reading that every
earlier Speckit feature follows.
Copilot, round 8 (review 5307865432 at abb2344e)
Its one thread was answered and resolved at 0a859498:
The README document index (Principle IV). The README's Documentation
section now carries an entry for feature 034, beside the openDox carve
documents, and it links all seven documents. The entry sits outside the
OpenSpec Records block, and Constitution row IV records it.
Copilot, round 9 (review 5307941798 at 0a859498: Findings: None)
Its two "previously missed" items were answered in a PR comment and are
addressed at 1522c4c7:
T095 against T036's PostgreSQL service. AT-R1's HTTP half is now a
harness, acceptance/at_r1_http.py, run by its own acceptance job with no
database service. It is not a pytest module, so it changes neither
openDox-code's testpaths (which T036 sets in phase 1) nor F9.1, and
FR-006's "no exclusion" still holds.
T072's falsifier no longer names the procfs path, and the quickstart's
null-device redirects are gone. The host-path scan now covers the system
roots as well.
2e4f3315 then merges main in at 1d14fee6.
Copilot, round 10 (review 5308148911 at 2e4f3315)
Its two threads were answered and resolved at 34b7b2ca:
The harness and T036. The plan and T095 now say the harness changes
neither testpaths, which T036 sets in phase 1, nor F9.1.
T073 after T055. T073 reached T055 only through phase 2's checkpoint,
and it now names T055 directly. The seven other single-writer pairs that
relied on a transitive path are direct edges as well, so all 19 consecutive
pairs of the six chains are direct.
Copilot, round 11 (review 5308305662 at 34b7b2ca: Findings: None)
Its one "previously missed" item was answered in a PR comment and is addressed
at bc1bd20b:
T095 after T076. AT-R1 runs the root README's documented command, so
T095 now waits for T076, the task that writes that README. So does T089,
which leaves no phase-3 task outside phase 3's checkpoint.
The same check on every phase. T049 now names T017, as the P1-L row
already said. T017's After: line no longer lists its phase-2 and phase-3
re-runs.
Copilot, round 12 (review 5308403738 at bc1bd20b: Findings: None)
Its one "previously missed" item was answered in a PR comment and is addressed
at a86ced35:
T096 had no repository tag and no falsifier. It now carries [oxF],
where its evidence lands, and names the oracle's verdict. The same check over
every task found eight more gaps (T074, T077, T083, T090–T093), and each now
names its repository and its falsifier. The checklist item names these
classes.
Copilot, round 13 (review 5308511992 at a86ced35)
Its one thread was answered and resolved at 49eb53ee:
macOS could not run F13.1. The plan's Target Platform now names Linux
alone. 13.1 checks the "no TCP port" invariant in the Linux kernel's socket
table, and no ratified falsifier covers macOS. Adding macOS would need a
Darwin leg for 13.1's check and F13.1, which is an amendment to File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #1144 and so
needs a ruling.
From the same pass: T036 now comes after T038, because both edit
openDox-code's pyproject.toml, and T046's range skips two undefined ids.
Copilot, round 14 (review 5308583172 at 49eb53ee)
Its one thread was answered and resolved at e927069e:
T092's note versus "no field changes". T092 and its falsifier now state
F11.1's own rule. With every edits[].note removed, the manifest is
unchanged, and an existing note may only be extended.
From the same pass: three checklist claims are now exact (FR-011 and FR-012,
SC-006 and SC-007, and the edge cases).
Copilot, round 15 (review 5308662086 at e927069e: Findings: None)
Its one "previously missed" item was answered in a PR comment and is addressed
at 9b86b920:
R4 and R10 ran ci_coverage.py with the host's python3. They now use
the od and ox venvs, and so do R5's, R6's and R9's runs. From the same
pass, T096 now also records T095's acceptance job for SC-004, and spec.md's Status header reads Draft, as the sibling features' headers do.
Copilot, round 16 (review 5308754464 at 9b86b920)
Its one thread and its one "previously missed" item were answered and are
addressed at 4d3c605b:
US4's note condition now admits a note added where an entry had none,
as T092 and F11.1 do.
T053's condition is now "R1Q11 (a) or R1Q12 (b)" in the plan's graph,
its phase-2 lanes and Constitution row VI, as T053 itself says.
Copilot, round 17 (review 5308830806 at 4d3c605b)
Findings: None, and nothing listed as previously missed. All 23 inline
threads are resolved.
The adversarial sweep (at 4d3c605b), folded in at 1cb01e4c
Round 17 was clean, and every check was green at 4d3c605b. Each earlier round
had still found one or two new cross-document gaps, so a read-only Opus
reviewer swept all seven files, #1144 and the measured code. It reported 28
MUST and 23 NICE findings. Every MUST was verified against the text, the packet
or the code, and fixed; the exact NICEs were fixed too. The PR comment at 1cb01e4c lists them. The phase-1 ones were:
T036 gives validate the .[runtime,test] install as well as its PostgreSQL
service. Without it, tests_runtime/conftest.py fails every runtime case
under CI.
T043 waits for C3's PR 2, because tests/test_snapshot.py fails on the
validator lookup, not on doc_health.
openxFactory's test_serve_column_split.py is the second named composition
test.
A slice's tasks land in After: order, and T032 is the join of every lane.
Batch D would carry RN-1's scenario text, only on Brett's ruling.
Copilot, rounds 18–24
round
review
head
result
addressed at
18
5309539162
9f799f20
1 thread: show T026 → T025 in the graph
902da25b: the single-writer table lists every phase-1 shared file (workbench.py, openDox-code pyproject.toml, tests/test_authoring_seam.py)
19
5309640972
902da25b
1 thread (how T035's six modules move) and 1 previously missed (Status: headers)
224046c5: each module is rewritten or re-landed by T042, and all seven files carry Status: draft
20
5309742955
224046c5
1 thread: T049 must accept the openxFactory destination
Totals: 110 passed, 1 failed (111 items) at the head, and the same on main itself at 138a4722, which the branch merges. The one failure is add-chain-attestation's ratified disposition.
exit 0; every target validated --strict with 0 UNDISPOSITIONED failures
the After: graph in tasks.md, checked by DFS
no cycle; the same check reports the three pin-advance cycles at 437ca764
plan.md's nine single-writer chains, each consecutive pair checked against the After: graph
0 gaps; all 22 pairs are direct After: edges
the 50 arrows in plan.md's graph and tasks.md's Dependencies, each checked against the After: graph
0 mismatches (6 at d3a33165)
every realization task outside Phase 0 names its repository and its falsifier; no Lands with: pair names each other on After:
0 gaps
every task of each phase before its checkpoint (T049, T063, T089), a Lands with: pair counting as one landing
0 gaps; T048, the holder's F4 re-measure, follows T049 by design
phase gates: every phase-1 task after T006, every phase-2 task after T009, every phase-3 task after T069
0 missing
root pins T039, T062, T087: every openDox-code task of their phase an ancestor (a Lands with: pair counts as one landing)
0 missing
checkpoints T049, T063, T089 after their interim F11.1 runs T018, T065, T098
all three
question headers against the tasks' Blocked by:/Ruled: lines
23 headers, 0 mismatches
box table
69 release-1 boxes, each naming defined tasks
host-absolute path scan (home, scratch and system roots) and closing-keyword scan (files and commit messages)
0 hits
Process
No Rule 6 window is needed. This PR touches no openspec/changes/
directory and not the README's OpenSpec Records block: its one README line
is in the Documentation index. T007's batches and T097's ticks will each
need a window.
No Arc: trailer. This PR is bookkeeping, and R1Q20 (a) is now ruled.
Persisted tools. Everything is in opensoft/brett-wip, under handoffs/xFactory/attachments/lane-opendox/r1plan/tools/:
the four measurement scripts and the shim, at 011b1586;
the plan-consistency checks (qmap.py, qcheck.py, depcheck.py, chaincheck.py, chaindirect.py, arrowcheck.py, phasecover.py and sharedfiles.py), to re-run after every re-plan.
…alone-operability
The Speckit planning artifacts for release 1 ("standalone operation", phases
1-3) of the ratified OpenSpec change #1144 (ratified on #656 comment
5815412869; record #1151). They are spec, plan, research, tasks, quickstart
and a checklist, plus 22 clarify questions (R1Q1-R1Q22) that await Brett Heap.
This is planning only. It adds no code, moves no pin, and touches no OpenSpec
change. Every release-1 box (69 of the packet's 124) maps to a task, a
repository and the packet's own falsifier. Every measurement can be re-run
from research.md.
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…the pin advances
Brett Heap answered the eleven clarify questions that blocked phase 1
("(a) on all eleven, (d) on R1Q6", #656 comment 5817152735). This revision
encodes them in spec.md's Clarifications, clarify-questions.md and tasks.md,
where each answered question becomes a Ruled line. The other eleven
(R1Q10-R1Q19, R1Q21) stay open for phases 2-3. The answer to R1Q6 raises
R1Q23 for phase 2.
- T007 records the ruled amendments to #1144's falsifiers and task lines in
three bookkeeping batches, each under Rule 6 and with no Arc trailer. This
commit edits no file of #1144.
- T008 raises the doc_health direction arc that R1Q6 (d) calls for.
- RN-1: R1Q3 (ii) touches the text of requirement 3's fourth scenario, so it
goes back to Brett as RULING NEEDED. It holds no task.
- Copilot review 5306611493: each phase's pin advance splits into a root-pin
task (T039, T062, T087) and a consumer-pin task (T047, T064, T094), which
removes the three dependency cycles. T031 co-lands with T036 without waiting
on it. SC-006 counts 65 of 69 at release-1 close. The checklist's
repository item is narrowed to realization tasks. T003 is no longer blocked.
- The phase-1 writer slices are grouped into parallel groups G1-G6.
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Copilot review 5306959435 at 85d6de4 raised five findings. Each is fixed:
- T084 now runs after T073, which is serve.py's single-writer order. The same
audit found two more gaps: T016 now runs after T012, the last serve.py edit
in Lane A, and T038 after T022 for cli.py. Every single-writer chain in
plan.md is now ordered in the After graph.
- plan.md's phase-2 graph shows T050 -> T051. T025 and T051 lose the [P]
marker, because each depends on an earlier task.
- quickstart.md: the prerequisites name R1Q12, and T095 is blocked by it.
Step 1 now asserts that no identity broker is installed and no database
listens, and step 2 asserts that neither repository holds a model binding.
- research.md R0 checks out all seven repositories at the commits its table
names.
The in-flight table is also brought up to date. C1 landed as #1152, C3's first
PR as #1153, C3's second PR is openXdox-code#28, and C4 is #1154. A stale
"T004's amendments" is corrected to T007.
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The phase graph says T095 and T096 run in parallel, but tasks.md makes T096 explicitly After: T095. The plan and the executable task schedule therefore disagree about the acceptance order; if the task dependency is intentional, the graph should show the same serial chain.
The phase-1 slice table says P1-L runs after P1-K, but this task's After: — allows it to be scheduled before the T047 pin/host landing whose F11.1 output it is meant to record. Add the phase-1 landing dependency so the task-level DAG matches the slice ordering.
T081 says the served catalog route is part of this task but requires T085, whose validators are also blocked by R1Q12; its After: T063 lets the task land before that prerequisite. Add T085 to the dependency, remove the [P] marker, and update the phase-3 graph/slice so the no-model route is not accepted before its validator default exists.
Copilot review 5307043972 at d3a3316 raised two findings and three items it
had missed earlier. Each is addressed:
- The constitution's workflow gate. Phases 2 and 3 are now PROVISIONAL: an
outline that authorizes no implementation until T004 has encoded that
phase's answers, the phase is re-planned, and T006 re-runs analyze. Phase 1
is the only phase the plan authorizes, and every material ambiguity in it
is resolved (#656 5817152735). The Constitution Check and Complexity
Tracking rows say so, and so do the phase headers in tasks.md.
- spec.md's catalog edge case now separates the behaviour before T085 from
the behaviour after it.
- plan.md's acceptance graph is serial, T095 -> T096 -> T097, as tasks.md
declares.
- T017 now runs after T047, and T093 after each phase's openxFactory landing
(T047, T064, T094). T017 loses [P].
- T081 now runs after T085, whose validators serve its catalog route. It
names R1Q12 and loses [P]. The phase-3 graph and the parallel summary
follow, and T084 is shown after T073.
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Answering the three "Previously missed" items in Copilot review 5307043972 (at d3a33165). They carry no inline thread, so the answers are here. All three are fixed in 701a4a1a.
The phase graph conflicts with T096's dependency on T095 (plan.md:195). The acceptance line now reads T095 (HTTP, CI) → T096 (browser) → T097, which matches tasks.md's After: T095.
P1-L lacks a dependency on P1-K (tasks.md:219). T017 now runs After: T047, and it is re-run after T064 and T094. T093 now runs after each phase's openxFactory landing: T047, T064 and T094. T017 loses [P], and the phase-1 parallel summary puts T017 and T093 after T047.
T081 can land before the T085 validator (tasks.md:756). T081 now runs After: T063, T085. Its Blocked by: line names R1Q12 for the served route, and it loses [P]. The phase-3 graph shows T085 → T081, and shows T084 after T073. The Dependencies section and the parallel summary say the same.
The two inline findings are answered in their threads, and both threads are resolved.
The execution graph explicitly orders T032 → T034, and this task re-derives the consumer-reach and boundary censuses that T032's sweep establishes. With only After: T011, T034 can be started before that sweep and can produce a result inconsistent with the planned import inventory. Add T032 to this dependency.
T047 carries T045's parity-test edit, but the task can currently land before T007 batch A widens F11.1 to admit that named composition test. The resulting Arc landing would be rejected by the guard even though the writer-slice table declares batch A as a prerequisite; add that batch to T047's dependency.
T059 lacks dependency on the reviewed R1Q7 allow-list
T059 edits the protected generator suites while its own falsifier requires the R1Q7 allow-list recorded by T007 batch C, but it does not wait for that batch. Since T059 runs before T063 (the task that currently waits on batch C), the protected-suite edit can land without the required reviewed entry; add batch C to T059's prerequisites.
Copilot review 5307117274 at 701a4a1 raised two findings and three items it
had missed earlier. Each is addressed:
- RN-1 now holds phase 1's CLOSE. T049 does not report requirement 3 as
realized until RN-1 is ruled and T016 matches the ruling. T016 still lands
on the ruled (ii), because the refusal after a build is today's
AlreadyRegistered. FR-002 and SC-001 say the same.
- T076 runs after T087, so the README documents the command that the root
pins.
- T034 runs after T032, T047 after T007's batch A, and T059 after T007's
batch C. T007 now states which tasks wait on each batch.
The same audit ordered the rest of the plan's arrows in the After graph:
T021 -> T022 and T041 -> T042. T053 and T061 now open after T049, and T075
and T085 after T063. A check of the 46 arrows in plan.md's graph and in the
Dependencies section against the After graph reports 0 mismatches. At
d3a3316 the same check reported 6.
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Answering the three "Previously missed" items in Copilot review 5307117274 (at 701a4a1a). All three are fixed in 0a5acd7c.
T034 lacks a dependency on T032's sweep (tasks.md:335). T034 now runs After: T032.
T047 lacks a dependency on T007's batch A (tasks.md:498). T047 now runs After: T039, T044, T007 (batch A). T007 now names the tasks that wait on each batch: batch A before T047 (and so before T049), batch B before T049, and batch C before the first respelling edit and before T059.
T059 lacks a dependency on the R1Q7 allow-list (tasks.md:625). T059 now runs After: T052, T055, T062, T007 (batch C).
The same audit ordered every arrow the plan draws. T022 runs after T021, T042 after T041, T053 and T061 after T049, and T075 and T085 after T063. A check of the 46 arrows in plan.md's graph and in tasks.md's Dependencies section against the After: graph reports 0 mismatches at 0a5acd7c. At d3a33165 the same check reported 6.
The two inline findings are answered in their threads, and both threads are resolved.
The Constitution Check marks Principle V as PASS for this PR, but the validation result supplied for this branch is 110 passed, 1 failed; Principle V requires openspec validate --all --strict to pass (.specify/memory/constitution.md:77-80). If the pre-existing add-chain-attestation failure is intentionally tolerated, record that baseline disposition and why it is unaffected here; otherwise this row cannot be marked PASS.
T053 makes openDox-spec a possible realization repository, but this policy says every realization landing exists in only five repositories. If that conditional path is selected, the schema commit needs the same Arc/Lane trailer and landing rules, or the task must explicitly be classified outside this policy; otherwise the release cannot satisfy its own trailer contract.
Copilot review 5307230690 at 0a5acd7 raised two findings and two items it
had missed earlier. Each is addressed:
- T006 no longer waits on an open-ended task. T004 is now round 1a, and it is
DONE. T006 is round 1a's analyze, after T003, T004 and T005, so research's
"T005 re-measures before implementation starts" holds. Each provisional
phase opens with its own round task: T009 for phase 2 and T069 for phase 3.
Each encodes that phase's answers, re-plans it and re-runs analyze, and
every task of that phase comes after it. The open questions' headers name
T009 and T069.
- quickstart.md's readiness probe first checks that the port is free, then
checks on every poll that the launched PID is still alive, and uses $PORT
throughout. Each repository's pass starts and stops its own server.
- plan.md's Constitution row V records main's baseline: 110 passed, 1
failed. The one failure is add-chain-attestation, an accepted disposition
("take exit 2", Brett Heap, 2026-09-05), which this PR cannot move. The
enforced openspec-cli-pin gate exits 0.
- T053: openDox-spec becomes a sixth repository of the arc when T053
applies. T091's trailer policy, T003's ARC_BASE, the merge-method note and
the repository counts now say so. openDox-spec allows squash and merge and
requires validate.
The same audit found three more gaps. T030 and T031 now name T011 and T036
on a Lands-with line, not an After line, so no co-landing pair names each
other. T026 loses [P], because it shares workbench.py with T025. serve.py's
single-writer chain now starts at T010, which edits build_server.
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Answering the two "Previously missed" items in Copilot review 5307230690 (at 0a5acd7c). Both are fixed in 0ad046ba.
Constitution row V was marked PASS while the strict validation reports a failure (plan.md:87). The row now reads "PASS for this PR, against main's recorded baseline", and it records that baseline:
This PR touches no openspec/ path.
openspec validate --all --strict gives 110 passed, 1 failed here, exactly as on main at cd494e4c.
The one failure is add-chain-attestation. It is an accepted disposition in contracts/openspec-cli-pin.yaml (ratified_by: 'Brett Heap, 2026-09-05, "take exit 2"'), and it retires when that change archives.
The gate the repository enforces, scripts/validate-openspec-cli-pin.py --all (the openspec-cli-pin check), exits 0 with 0 UNDISPOSITIONED failures.
The trailer policy for a conditional repository (tasks.md:890). T091 now covers every repository the arc touches: the five, and openDox-spec when T053 applies, which is 11.0's own "in EVERY repository it touches". T053 states that its landings carry the Arc: and Lane: trailers and land by squash or merge. openDox-spec allows squash and merge and requires validate, and T003 records its ARC_BASE. plan.md and spec.md count openDox-spec as a sixth repository only if T053 applies.
The two inline findings are answered in their threads, and both threads are resolved.
…xth review
Copilot review 5307694574 at 0ad046b found that FR-006 required each leg's
whole suite green, while the plan declares openXdox-code's doc_health
exclusion (R1Q6 (d)). FR-006 now carries requirement 9's own clause. A check
that runs less than the whole suite declares the exclusion, with its count
and its reason, and reports it as an open extraction:
- openDox-code runs its whole suite, tests_runtime/ included, and declares no
exclusion (R1Q8 (a)).
- openXdox-code runs the whole suite less the doc_health exclusion. The
exclusion stays open until the direction arc (T008) lands, including at the
archive.
Every other whole-suite claim now carries the same qualifier: US1, SC-001,
plan.md's summary and testing line, and the phase-1 section and slice
titles. The same audit made three more changes:
- plan.md's closure table moves 9.2 to phase 3, where T086 takes the ratchet
to (0, 0).
- US2's test and SC-002 run F5.2 as T007's batch C amends it and as R1Q23
decides.
- SC-005 runs the guard as batch A widens it.
Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d 20)
Copilot's thread 4098062479 noted a conflict. T035 lets
`test_session_harness.py` move to openxFactory as a named composition
test, but T049's check accepted only openXdox-code destinations.
- T035's list now names all three destinations: openXdox-code's
`tests/integration/` (T042), its declared exclusion (T041), and
openxFactory (T047). Each destination task lands its part of the list.
- The session-harness move is explicit. A T007 batch first adds the
test's path to F11.1's named set, and T047's openxFactory PR then
carries the file. The P1-K slice row names it.
- T049 checks each removed module at the destination the list gives,
including openxFactory with its path in F11.1's named set.
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This validation claim uses main at 138a4722, but research R0 records the measured openxFactory baseline as dd2466ad, while this plan itself identifies 138a4722 as the C4 landing before that later main baseline. Reconcile the branch/measurement commit and rerun or quote the gate against the actual base; otherwise the PASS statement is not reproducible and may omit subsequent changes.
Copilot's round-21 review (5310503144) raised one thread and one item it
had missed before.
- Thread 4098716441: `.specify/feature.json` is gitignored, so a fresh
clone has no feature pointer, and the prerequisite resolver refuses
without one. T006 now exports
`SPECIFY_FEATURE_DIRECTORY=specs/034-opendox-standalone-operation`.
It first runs `check-prerequisites.sh --json --require-tasks
--include-tasks`, which must print this feature's `FEATURE_DIR`, and
it records that output with analyze's verdict. T009 and T069 reuse
that context.
- The earlier item: Constitution row V said "exactly as on `main` at
`138a4722`" without having run the gate there. It has now been run on
`main` itself at `138a4722`, in a temporary worktree of this lane's
clone: 110 passed and 1 failed, and the pin gate exits 0. The row says
so, and notes that `main`'s later commits touch no `openspec/` path.
It also separates research's `dd2466ad`, the measurement baseline,
from this PR's gate.
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Round 21: answer to review 5310503144's previously missed item. The item has no inline thread. It is fixed in 09e81dc3.
Constitution row V cited a base it had not measured. Two commits were being run together in that row:
research.md's dd2466ad is the baseline the plan's measurements were taken at;
this PR's validation gate runs on the branch.
The gate has now been run on main itself at 138a4722, the commit the branch last merged. It ran in a temporary detached worktree of this lane's own clone, which was removed afterwards:
OPENSPEC_TELEMETRY=0 openspec validate --all --strict printed Totals: 110 passed, 1 failed (111 items), and the failure is add-chain-attestation.
The branch head gives the same result. main has moved on to 57af6927, but its newer commits touch no openspec/, specs/, README.md or .specify/ path, so the gate is unchanged there.
Row V now says all of this, and it keeps dd2466ad apart as the measurement baseline.
The feature-context thread on T006 is answered and resolved. No thread remains unresolved.
The second permitted resolution for test_outline_model.py makes it an openxFactory composition test, but T034 is an openDox-code task and T047's relocation/checkpoint accounting only covers modules removed by T035 (not this file). If that branch is chosen, no task owns moving and landing the test or adding its named-set entry before the pin, so coverage is either dropped or F11.1 fails. Assign this alternative to T047 with the required ordering, or remove the alternative.
Account for openXdox-spec in conditional schema work
R1Q12(b) explicitly re-homes the snapshot schemas from openXdox-spec, so this conditional path touches both spec repositories. T053 assigns only openDox-spec and openDox, while the plan and T091 account for only openDox-spec; no task owns removing/updating/validating openXdox-spec or its landing metadata. Add an openXdox-spec slice and update the repository/landing accounting, or make T053 conditional only on the new-schema path.
…pec routes (round 22)
Copilot's round-22 review (5310581314) raised one thread and two items
it had missed before.
- Thread 4098781548: T043's contingency deadlocked. It said phase 1
waits on T061, but T061 comes after T049, and T049 is phase 1's
checkpoint. T005's re-measure now finds the case before phase 1
starts. If `test_snapshot.py` is still red, T005's re-plan, before
T006, moves T061 into phase 1, after T040 and before T043, and drops
its `After: T049, T009`. T061 is blocked by R1Q14, so T043 then waits
for that answer.
- `test_outline_model.py`'s composition-test route now has an owner.
T034 removes the case and lists it, a T007 batch names its path, T047
lands it, and T049 checks that it arrived. T049's check covers both
T034's and T035's lists.
- R1Q12 (b) re-homes the snapshot schemas FROM openXdox-spec. So
openXdox-spec (`[oXs]`) is now a conditional seventh repository. T053
says what changes there, and T091's trailer, the plan's repository
list, spec.md and R1Q12's option (b) all count it.
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Round 22: answers to review 5310581314's two previously missed items. Neither has an inline thread, and both are fixed in 02b1aa30.
test_outline_model.py's composition-test route had no owner. It now follows the same route as test_session_harness.py:
T034's PR removes the case and lists it, with its destination, in its body.
A T007 batch adds its openxFactory path to F11.1's named set.
T047's openxFactory PR lands it; T047 now names both possible composition tests.
T049 checks that it arrived. Its check now covers every module or case that T034 or T035 removed, at the destination its PR's list gives.
The P1-K slice row names both files.
R1Q12 (b) also touches openXdox-spec. (b) re-homes ideation-dashboard-snapshot and -indexfrom openXdox-spec, so openXdox-spec is now a conditional seventh repository, with a new tag, [oXs].
T053 says what changes there: openXdox-spec retires its own copies in favour of openDox-spec's, and the openXdox root's spec pin moves.
Its landings carry the trailers (T091), T003 records its base, and T009 plans the slice once the answer is known.
The Format's repository list, the plan's source-code listing and heading, spec.md's repository count and R1Q12's option (b) all count it.
The deadlock thread on T043 and T061 is answered and resolved. No thread remains unresolved.
Copilot's round-23 review (5310647715) reported no finding and listed no
previously missed item. A self-check of every either/or branch in
tasks.md, run in the same pass, found one branch still open. Under T044,
a skip's file may join T041's declared exclusion. That lowers the
collected counts under the floors T043 pinned, so "restore the margin
over the floors T043 re-pinned" could not hold. T044 now re-pins those
floors over the new whole suite less the exclusion, and then restores
the margin.
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Head243e460f20d0f3e1732fb2e9c48cdb94dd1132ef, basemain. The branch last merged main at 138a4722. Today's main, 57af6927, merges cleanly (git merge-tree), and its newer commits touch no openspec/, specs/, README.md or .specify/ path. The PR is MERGEABLE and no longer a draft.
Checks at the head: every check run is green. pytest-suite passed (21:52:23Z to 22:12:08Z), as did openxdox-consumer-gate, openspec-cli-pin, merge-master-approval, lane-line (re-run after the body edit), SonarCloud, clearing-dispatch-gate, former-id-arrival-gate, openreposhape-pin, release-tag-gate, signed-execution-chain-gate and wallet-validation. Sourcery skipped its review because the diff is over its 150,000-character limit.
Copilot at the exact head: review 5310714316 at 243e460f (2026-09-24T21:57:35Z) reports Findings: None, with nothing listed as previously missed. Round 23 at 02b1aa30 read the same.
Threads: all 28 have a reply and are resolved. Every "previously missed" item from every round is answered in a PR comment.
Process:
No Rule 6 window is needed. The PR touches no openspec/changes/ path and not the OpenSpec Records block; its one README line is in the Documentation index.
It carries no Arc: trailer, because it is bookkeeping (R1Q20 (a)).
It is not an archive, and no commit message or PR body carries a closing keyword.
Landing and fan-out: it lands through the holder's lander; this actor merges nothing. The phase-1 slice list (P1-A to P1-L, groups G1 to G6) is in tasks.md § "Phase 1 writer slices", and it is copied at this head into brett-wip handoffs/xFactory/attachments/lane-opendox/r1plan/PROGRESS.md.
…1a (T003, T005, T006) (#1167)
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
## What this is
Phase 1's gate for plan 034 (#1155 → `c415c3d1`): **T003, T005 and T006**, as
one bookkeeping PR. Their evidence is under
`specs/034-opendox-standalone-operation/evidence/`, and the re-plans they
cause are in the feature's own files.
- It adds no code, moves no pin, and touches no `openspec/` path: `git diff
--stat c415c3d -- openspec/` is empty. No file of #1144 changes.
- Besides the feature directory, it changes one line: the feature's entry in
the README's Documentation index, which now links the three evidence notes.
That entry sits outside the OpenSpec Records block, so the PR needs no Rule 6
window.
- It is bookkeeping, so none of its five commits carries an `Arc:` trailer
(R1Q20 (a), `5817152735`).
The holder lands it, on Brett Heap's word as the holder relays it: *"land
#1155 when green and fan out phase 1"*.
## T003: ARC_BASE (`evidence/arc-base.md`)
No repository holds an arc landing yet, so each base is that repository's
`main` at 13:34:54Z. All seven were read again at 14:02:10Z, with the same
answers.
| repository | ARC_BASE |
|---|---|
| openDox-code | `1e4a57fb3c550339e25bb2fcc8da8e3a7817650f` |
| openXdox-code | `e28930bf052febff0c7bdd0463a72ce3c4f5e8fe` |
| openDox | `36ded1cd97ca8f23b0eb9ea03d1d9def79a40d3c` |
| openXdox | `069fe471f2ef5d23ea4461c0e0abd9f2768b6a31` |
| openxFactory | `c415c3d16663a8b17da5ae4f5e599f0971bf552f` |
| openDox-spec | `8fe8c4c71c4da8d363394441ad9e2c9547e540a3` |
| openXdox-spec | `f088b09732e236279898b53ab9fb0f5ebc89509a` |
The trailer count is 0 in every repository, on the first-parent line and over
all history. `PACKET_MERGE` is `94b6f7f13b45c351b9142345738965c974b7dd37`
(#1144), which lies on openxFactory `main`'s first-parent line.
## T005: the re-measure (`evidence/remeasure-2026-09-25.md`)
Research R1–R15 were re-run at the then-current `main`s, and openXdox-code's
WHOLE suite was run for the first time. openDox-code, the openDox root and both
spec legs are unchanged, and so is every figure the openDox-code slices use.
R10, R11, R12 and R13 moved.
- **`tests/test_snapshot.py` after C3.** One of research R11's three failures
cleared. The other two still fail, because C3's validator reaches its
schemas only through `CONTRACTS_DIR`. So T061's contingency applies, and 7.3
moves into phase 1.
- **5.4a's glob now selects seven suites.** C3's
`test_snapshot_validator_home.py` is one of them, which R1Q14's answer has to
take into account.
- **The whole suite** (Group 2 simulated, `rfc3339-validator` installed) has
292 red results. A classifier puts each in one of eleven classes. Six are
carve residue, which T040 clears (four of them new to it). Two reach
openxFactory without `doc_health`, and they became **R1Q24**.
- **T019** is a new holder round that applies those answers before T061 or
T043 starts.
## T006: analyze round 1a (`evidence/analyze-round-1a.md`)
The prerequisite check ran in a fresh clone. Without `SPECIFY_FEATURE_DIRECTORY`
it refuses (exit 1). With it, it prints this feature's `FEATURE_DIR` (exit 0).
`/speckit-analyze` ran twice: once by the author, and once by an independent
read-only verifier over a copy of the same commit. A second verifier then
re-ran it over `5192201c`, the commit that carried the first dispositions, and
checked that each was carried.
**CRITICAL: 0, in both passes.**
- The first pass found 7 HIGH, 20 MEDIUM and 8 LOW findings. The second
commit carries their fixes.
- The second pass found 2 HIGH, 1 MEDIUM and 12 LOW (V1–V15). Copilot's first
review found 1 MEDIUM (CP1), and the author 1 LOW (U5). The third commit
carries their fixes, and the fourth corrects V2's third caller against a
measurement (below).
- Copilot's review of `88a43004` found 2 MEDIUM. The fifth commit carries
their fixes.
- CP2: the plan checks read `T007 (batches C and F)` as all of T007, so a
batch-level cycle could hide in prose. T007's `After` is now given by
batch, and the checks read each batch as its own node.
- CP3: the spec's acceptance lines now carry R1Q25's possible exclusion of
`tests/test_snapshot.py`, without answering it.
Each finding is dispositioned in the note. The ones that change the phase-1
fan-out:
- **Four falsifiers could not pass at their own task's landing**: T015's
F3.1, T020's F4.1 block and named test, T035's F9.1, and T041's F9.1. Each
moves to the task that makes it reachable, and each of the four gets a
falsifier it can pass.
- **Until T011 lands, `opendox.serve` and `opendox.cli` do not import** in a
lone checkout, and any run with the root conftest in play fails.
- Tests that can land earlier import neither module, and their PRs quote a
`--noconftest` run.
- T010's test drives the facet in `src/route_extension.py`, and T011 adds a
`build_server` case.
- No slice edits openDox-code's `validate.yml` before T036.
- **T015 carries `RuntimeSubcommand`** from its first landing, so main never
builds an empty default between T016 and T038.
- **T025 lists the scope the host registers.** At `c415c3d1`, the host's
adapter lists 794 documents under `all`, and exactly the session notebook's
398 under `documents`. Listing `all` would have changed the hosted set.
- **T011's PR moves `opendox.cli` and `opendox.serve` into
`tests/test_consumer_reach.py`'s `NEUTRAL_MODULES`** (V1). openDox-code's
required `validate` job runs that file by name, and the file fails as soon
as the two modules import. T034 re-derives the rest of it.
- **T021 waits on T011** (V7), because its named test runs with the root
conftest in play.
The ones that change phase 1's openXdox-code tail and its close:
- **R1Q25 (new).** 7.3's move into phase 1 departs from #1144's RULED release
map, which puts Group 7 in phase 2. So R1Q25 puts the move to Brett.
- It recommends (b): 7.3 stays in phase 2 (V2). Narrowing the consumer's
validator to its three schemas reaches phase-1 callers that validate
other kinds through it. Two do today: openxFactory's
`doxbench_contracts.delegated_semantic_validation`, and the conftest
helper `test_lens.py` uses. The third, openDox-code's `workbench.py:442`,
gets no validator today, because `find_validator` answers `None` from a
start outside the product (measured at openXdox-code `e28930bf`). It
would get the narrowed one once T061's lookup resolves the installed
distribution. openDox's own validator arrives in phase 2.
- R1Q25 blocks T043 as well as T019 and T061 (U5), since under (b) T043's
exclusion declares `tests/test_snapshot.py`.
- Under (b), T019 restores T061 to phase 2 and F7.1 to T063 (CP1).
- **R1Q12 no longer holds T061.** T061 packages the three schemas where they
stand. R1Q24 now holds T061, because F7.1's second named test goes into a
contract-family file.
- **openxFactory's nightly and refresh lanes read the lookup T061 changes.**
None of their files is an 11.1 surface. R1Q14's text and T019 now weigh
that.
- **T007 gains two batches.** Batch E adds composition tests before T047, and
batch F carries T019's amendments before T061 and T043. Batch B amends 9.2
too.
## Files
| file | change |
|---|---|
| `evidence/arc-base.md` | new (T003) |
| `evidence/remeasure-2026-09-25.md` | new (T005), with the classifier in full |
| `evidence/analyze-round-1a.md` | new (T006), with both passes |
| `tasks.md` | T003, T005 and T006 ticked; T019; T061 in phase 1; the dispositions |
| `plan.md`, `spec.md`, `clarify-questions.md`, `research.md`, `checklists/requirements.md` | the re-plan and the dispositions; R1Q24 and R1Q25 |
| `README.md` | the feature's index entry links the evidence |
## Checks run on the head
- `OPENSPEC_TELEMETRY=0 openspec validate --all --strict`: `111 passed, 1
failed (112 items)`. The failure is `add-chain-attestation`, an accepted
disposition, and `scripts/validate-openspec-cli-pin.py --all` prints
`0 UNDISPOSITIONED failures`.
- `scripts/validate-document-catalog.py` and
`scripts/validate-pin-registrations.py` pass.
- The plan-consistency tools pass:
- 0 question-header mismatches;
- no cycle in the `After:` graph, and none with the Lands-with groups
merged (88 tasks; 94 nodes, since T007's six batches are nodes of their
own; 186 edges);
- 0 arrow mismatches of 54, now including the two that break across a
line;
- every task comes before its phase's checkpoint;
- 0 single-writer chain gaps (25 pairs DIRECT, 2 transitive).
- The added lines hold no host-absolute path and no closing keyword.
- `main` has gained only #1163 since `c415c3d1`. It touches none of this PR's
paths, and the branch merges cleanly.
## Persisted tools
T005's classifier, `classify_whole_suite.py`, and the updated plan-consistency
checks (`qmap.py` to R1Q25, and the widened chains in `chaincheck.py` and
`chaindirect.py`) are persisted to the lane's workspace repository,
`opensoft/brett-wip`, in its lane-4 tool directory. They landed at `c3c69e9c`.
`2ed71007` widened `qmap.py` to R1Q25, and `805c6688` added
`tests/test_consumer_reach.py`'s chain (T011 → T034) for the second pass.
`8874a361` gave the six checks one batch-aware parser, `aftergraph.py` (CP2).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Lane: openxfactory-4
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
What this is
This PR is the Speckit plan for release 1, "standalone operation"
(phases 1–3), of the ratified OpenSpec change
add-neutral-product-standalone-operability(#1144). It encodes Brett Heap'sanswers to the eleven questions that blocked phase 1.
It adds planning only: no code, no pin, and no OpenSpec change. It edits no
file of #1144. Besides the feature directory, it changes one line: an entry in
the README's Documentation index that links the feature's seven documents.
Its authority comes from two comments on #656:
5815412869: "ratify File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #1144, land thefollow-ons, (a) on C1–C5".
5817152735(2026-09-24T15:31:46Z): "(a) on alleleven, (d) on R1Q6".
The ratification record landed as #1151 →
cd494e4c. This branch is cut fromit, and it merges
mainin at1d14fee6.The feature is
specs/034-opendox-standalone-operation/:spec.mdQ: … → A: …. The term-by-term definition of the AT-R1 acceptance test.plan.mdresearch.mdW=$(mktemp -d); no host paths). Eight non-normative corrections to #1144 (R16).tasks.mdBlocked by:,Ruled:andAfter:lines. T007 records the ruled amendments in #1144, and T008 raises thedoc_healthdirection arc. T009 and T069 open phases 2 and 3. § Ruled amendments. Box accounting (69 of 124). The phase-1 writer slices, in parallel groups G1–G6.quickstart.mdclarify-questions.mdchecklists/requirements.mdThe answers (
#6565817152735), and where they goruntime/cli.py:17-19test_extension_point_parity.py)RuntimeSubcommandviaSUBCOMMAND_EXTENSIONS, with theopendox-runtimealiastests_runtime/included, with a DB service in the required joblist_documentsin phase 1Each T007 batch is its own bookkeeping PR. Each lands under a Rule 6 window,
with no
Arc:trailer, before the checkpoint that runs the amended falsifier.RULING NEEDED
RN-1: requirement 3's fourth scenario, against R1Q3 (ii). The scenario
reads "the registered profile replaces the default for that process",
unconditionally. As ruled, (ii) refuses a host registration made after a parser
or server was built from the default. The recommendation is (a): the scenario's
WHEN gains "before the product's parser or server has been built from the
default", plus a scenario for the refusal. RN-1 holds no task, because the
after-build refusal is today's
AlreadyRegistered(plan.md § "Ruling needed").Still open (phases 2–3, and process)
PROVISIONAL, and they authorize no implementation.
need
doc_health, and F5.2 does not provide it. R1Q23 asks how F5.2 runs.It blocks T059 and T063, not phase 1.
EXTRACTION for openXdox-code until the direction arc lands.
Phase-1 fan-out (tasks.md § "Phase 1 writer slices")
Before any slice runs, the holder runs T003 (ARC_BASE) and T005 (the
re-measure), then T006 (round 1a's analyze), and claims the slice (T002). The
groups then run in order:
and P1-E (openxFactory reaches).
alone).
then the T049 checkpoint. T049 also waits on T007's batches A and B, and on
RN-1.
A slice is one writer and one claim in one repository. Its tasks land in
their
After:order, one PR each unless aLands with:line joins them.Each slice's repository, files, dependencies, falsifier and model (Opus or
Sonnet) are in the table in tasks.md.
Copilot, round 1 (review
5306611493at437ca764)All five threads were answered and resolved at
85d6de45:After: T035, and it co-lands in T036'sPR.
advance is split into a root-pin task (T039, T062, T087) and a
consumer-pin task (T047, T064, T094).
Copilot, round 2 (review
5306959435at85d6de45)All five threads were answered and resolved at
d3a33165:serve.py's single-writer order. The sameaudit also put T016 after T012 and T038 after T022. All six single-writer
chains in plan.md are now ordered in the
After:graph.[P].Blocked by:line.that no database listens. Step 2 asserts that neither repository holds a
model binding.
Copilot, round 3 (review
5307043972atd3a33165)Both inline threads were answered and resolved at
701a4a1a, and the three"previously missed" items were answered in a PR comment:
They authorize no implementation until each is re-planned on its answers
and re-analyzed; since round 5 that is done by their round tasks, T009 and
T069. Phase 1, the only phase the plan authorizes, has every material
ambiguity resolved.
from the behaviour after it.
Copilot, round 4 (review
5307117274at701a4a1a)Both inline threads were answered and resolved at
0a5acd7c, and the three"previously missed" items were answered in a PR comment:
reported as realized until RN-1 is ruled and T016 matches the ruling.
C. The same audit ordered every arrow in the plan's graph against the
After:graph.Copilot, round 5 (review
5307230690at0a5acd7c)Both inline threads were answered and resolved at
0ad046ba, and the two"previously missed" items were answered in a PR comment:
T006 is round 1a's analyze, after T003, T004 and T005. Phases 2 and 3 open
with their own round tasks, T009 and T069.
and on every poll it checks that the launched PID is alive.
main's baseline and the acceptedadd-chain-attestationdisposition, and notes that the enforcedopenspec-cli-pingate exits 0.only if T053 applies, and T091 then covers it.
Lands with:line;[P];serve.py's single-writer chain starts at T010.Copilot, round 6 (review
5307694574at0ad046ba)Its one thread was answered and resolved at
2a57501c:less than the whole suite. openXdox-code declares its
doc_healthexclusion with a count and a reason, and reports it as an open extraction.
(0, 0).Copilot, round 7 (review
5307775377at2a57501c: Findings: None)Its three "previously missed" items were answered in a PR comment and are
addressed at
abb2344e:task (T018, T065 and T098), and each checkpoint depends on its run.
earlier Speckit feature follows.
Copilot, round 8 (review
5307865432atabb2344e)Its one thread was answered and resolved at
0a859498:section now carries an entry for feature 034, beside the openDox carve
documents, and it links all seven documents. The entry sits outside the
OpenSpec Records block, and Constitution row IV records it.
Copilot, round 9 (review
5307941798at0a859498: Findings: None)Its two "previously missed" items were answered in a PR comment and are
addressed at
1522c4c7:harness,
acceptance/at_r1_http.py, run by its ownacceptancejob with nodatabase service. It is not a pytest module, so it changes neither
openDox-code's
testpaths(which T036 sets in phase 1) nor F9.1, andFR-006's "no exclusion" still holds.
null-device redirects are gone. The host-path scan now covers the system
roots as well.
2e4f3315then mergesmainin at1d14fee6.Copilot, round 10 (review
5308148911at2e4f3315)Its two threads were answered and resolved at
34b7b2ca:neither
testpaths, which T036 sets in phase 1, nor F9.1.and it now names T055 directly. The seven other single-writer pairs that
relied on a transitive path are direct edges as well, so all 19 consecutive
pairs of the six chains are direct.
Copilot, round 11 (review
5308305662at34b7b2ca: Findings: None)Its one "previously missed" item was answered in a PR comment and is addressed
at
bc1bd20b:T095 now waits for T076, the task that writes that README. So does T089,
which leaves no phase-3 task outside phase 3's checkpoint.
already said. T017's
After:line no longer lists its phase-2 and phase-3re-runs.
Copilot, round 12 (review
5308403738atbc1bd20b: Findings: None)Its one "previously missed" item was answered in a PR comment and is addressed
at
a86ced35:[oxF],where its evidence lands, and names the oracle's verdict. The same check over
every task found eight more gaps (T074, T077, T083, T090–T093), and each now
names its repository and its falsifier. The checklist item names these
classes.
Copilot, round 13 (review
5308511992ata86ced35)Its one thread was answered and resolved at
49eb53ee:alone. 13.1 checks the "no TCP port" invariant in the Linux kernel's socket
table, and no ratified falsifier covers macOS. Adding macOS would need a
Darwin leg for 13.1's check and F13.1, which is an amendment to File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #1144 and so
needs a ruling.
openDox-code's
pyproject.toml, and T046's range skips two undefined ids.Copilot, round 14 (review
5308583172at49eb53ee)Its one thread was answered and resolved at
e927069e:F11.1's own rule. With every
edits[].noteremoved, the manifest isunchanged, and an existing note may only be extended.
SC-006 and SC-007, and the edge cases).
Copilot, round 15 (review
5308662086ate927069e: Findings: None)Its one "previously missed" item was answered in a PR comment and is addressed
at
9b86b920:ci_coverage.pywith the host'spython3. They now usethe
odandoxvenvs, and so do R5's, R6's and R9's runs. From the samepass, T096 now also records T095's
acceptancejob for SC-004, and spec.md'sStatusheader readsDraft, as the sibling features' headers do.Copilot, round 16 (review
5308754464at9b86b920)Its one thread and its one "previously missed" item were answered and are
addressed at
4d3c605b:as T092 and F11.1 do.
its phase-2 lanes and Constitution row VI, as T053 itself says.
Copilot, round 17 (review
5308830806at4d3c605b)Findings: None, and nothing listed as previously missed. All 23 inline
threads are resolved.
The adversarial sweep (at
4d3c605b), folded in at1cb01e4cRound 17 was clean, and every check was green at
4d3c605b. Each earlier roundhad still found one or two new cross-document gaps, so a read-only Opus
reviewer swept all seven files, #1144 and the measured code. It reported 28
MUST and 23 NICE findings. Every MUST was verified against the text, the packet
or the code, and fixed; the exact NICEs were fixed too. The PR comment at
1cb01e4clists them. The phase-1 ones were:validatethe.[runtime,test]install as well as its PostgreSQLservice. Without it,
tests_runtime/conftest.pyfails every runtime caseunder
CI.tests/test_snapshot.pyfails on thevalidator lookup, not on
doc_health.test_serve_column_split.pyis the second named compositiontest.
After:order, and T032 is the join of every lane.Copilot, rounds 18–24
53095391629f799f20902da25b: the single-writer table lists every phase-1 shared file (workbench.py, openDox-codepyproject.toml,tests/test_authoring_seam.py)5309640972902da25bStatus:headers)224046c5: each module is rewritten or re-landed by T042, and all seven files carryStatus: draft5309742955224046c553a85ed9531050314453a85ed909e81dc3:SPECIFY_FEATURE_DIRECTORYand the prerequisite check; the gate is re-run onmainat138a4722531058131409e81dc302b1aa30: the contingency is caught by T005 before phase 1; openXdox-spec is a conditional seventh repository531064771502b1aa30243e460f: a self-check found that T044 must re-pin openXdox's floors when a file joins the exclusion5310714316243e460fValidation (head
243e460f)OPENSPEC_TELEMETRY=0 openspec validate --all --strictTotals: 110 passed, 1 failed (111 items)at the head, and the same onmainitself at138a4722, which the branch merges. The one failure isadd-chain-attestation's ratified disposition.python3 scripts/validate-openspec-cli-pin.py --allevery target validated --strict with 0 UNDISPOSITIONED failuresAfter:graph in tasks.md, checked by DFS437ca764After:graphAfter:edgesAfter:graphd3a33165)Lands with:pair names each other onAfter:Lands with:pair counting as one landingLands with:pair counts as one landing)Blocked by:/Ruled:linesProcess
openspec/changes/directory and not the README's OpenSpec Records block: its one README line
is in the Documentation index. T007's batches and T097's ticks will each
need a window.
Arc:trailer. This PR is bookkeeping, and R1Q20 (a) is now ruled.gh pr list -R opensoft/openxFactory --state all --search 034-opendox:only File add-neutral-product-standalone-operability: open the BUILD arc, recording ten rulings #1144.
specs/034-*: absent onmain.9afea8d7.1d14fee6, and its PR 2 as openXdox-code#28 →e28930bf. C3 overlaps 7.3 (T061) and the openXdox pin (T047). T061'sAfter:condition on PR 2 is now met.1edbb3dd, and C4'srunbook as Write the openXdox pin resync runbook the pin said was owed (D-16, RULED 5815412869 C4) #1154 →
138a4722. T090 follows the runbook.opensoft/brett-wip, underhandoffs/xFactory/attachments/lane-opendox/r1plan/tools/:011b1586;qmap.py,qcheck.py,depcheck.py,chaincheck.py,chaindirect.py,arrowcheck.py,phasecover.pyandsharedfiles.py), to re-run after every re-plan.🤖 Generated with Claude Code