Skip to content

openDox contract changelog: Status draft → standard, the dox-v1.2 tag now exists (plan 038 T060) - #21

Merged
brettheap merged 1 commit into
mainfrom
r2/t060b-dox-v1.2-standard
Oct 6, 2026
Merged

brettheap merged 1 commit into
mainfrom
r2/t060b-dox-v1.2-standard

Conversation

@brettheap

@brettheap brettheap commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)

Refs opensoft/openxFactory#656 (stays OPEN).

The dox-v1.2 counterpart of #15. This is the second PR of plan 038's T060 (opensoft/openxFactory, specs/038-opendox-document-tool-self-maintenance/tasks.md): "on it, the annotated tag dox-v1.2 goes on that commit, and a second PR moves the CHANGELOG entry to standard, the tag existing." The cut PR #20 (→ 6a9f4902285029b4fb02753e2b79be0a137302c5) landed the dox-v1.2 entry with the header kept at Status: draft, because the tag did not exist yet. The file itself says the header "promotes back to standard once the dox-v1.2 tag exists, by the same act as before — no second open question is needed, the rule already covers it."

  • Realizes: 9.5 (part).
  • Falsifier: the root's make validate and make pins, quoted below.
  • Ruled: R2Q22; Brett's cut word, recorded on #656. Decisions: CF-2 (batch Q item 10's addendum).

The tag exists now. dox-v1.2 is annotated tag object 58538ff33a953ffd5dfa9b44a7edabd75dada00b over 6a9f4902285029b4fb02753e2b79be0a137302c5. The tagger is Brett Heap <1513478+brettheap@users.noreply.github.com>, 2026-10-06T17:58:45Z. It was cut on Brett's word, "Cut dox-v1.2 now (Recommended)", recorded at #656 comment 6022291206. I read the tag object, its target and its tagger from the forge (git/ref/tags/dox-v1.2 and git/tags/58538ff3…). In this branch's clone, git rev-parse dox-v1.2^{commit} gives 6a9f4902…, which is this branch's base.

One file, the shape of #15

 contracts/CHANGELOG.md | 40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)
  1. The header changes from Status: draft to Status: standard.
  2. The paragraph that explained the draft header ("the annotated dox-v1.2 tag does not exist yet … This header promotes back to standard once …") now records how that was resolved: the cut word, the tag object, the target commit, the tagger and the date. It uses the wording of the resolved dox-v1.1 paragraph openDox contract changelog: Status draft → standard, the dox-v1.1 tag now exists #15 wrote. openDox contract changelog: Status draft → standard, the dox-v1.1 tag now exists #15 also changed "was reached once" to "was first reached" in the paragraph above it. Here the paragraphs already read in order, because dox-v1.2: T040's three health schemas (spec pin, manifest bump, CHANGELOG draft) (plan 038 T060) #20 put the dox-v1.1 paragraph in the past tense, so there is no second edit of that kind.
  3. The Unreleased line changes from "nothing pending beyond dox-v1.2 below" to "nothing pending", the form the line had after dox-v1.1 was cut. Both of its claims were re-read today. openDox-spec main is still 7db9438b. openDox-code main is 84f8ed83, past the bundle's dede32b4. git diff dede32b4 84f8ed83 -- contracts src/opendox/contracts is empty, so "independently of any contract byte" still holds.

Checked line by line: nothing left asserts the pre-tag state

line why it stays
the dox-v1.0 and dox-v1.1 window paragraphs past tense, about closed windows
"Status: draft again over dox-v1.2's own window … and standard again now" the resolution record
"openxFactory's own contract changelog still carries draft …" a different repository, and a measured fact
the dox-v1.2 entry's "the lane asks for that word once this cut PR lands" and "Not cut by this pull request" left alone on purpose. It is text inside a released entry, and it was true of the cut PR it was written in. #15 left the dox-v1.1 entry's own "The tag" section unedited in the same way. A release entry does not change after its tag.
contracts/manifest.yaml's dox-v1.2 comment ("which the lane asks for once this PR lands") left alone, as #15 left the manifest. The manifest is one of the tagged bundle's four coordinated values, and #15 touched no manifest.
"cut the tags when the drafts are green" the verbatim dox-v1.0 ruling quote

Verification

At this branch's head 9b41eb4b:

$ make validate
python3 scripts/validate-repository-naming.py --project project.yaml
  openDox                          neutral-product/assembly   also_matches project-leg/assembly
  openDox-spec                     project-leg/spec
  openDox-code                     project-leg/code
python3 scripts/validate-manifest.py
manifest ok: openDox (opendox), 3 legs
python3 scripts/validate-pins.py
  ok  spec: gitlink == contracts/spec-pin.yaml commit 7db9438b4cc4
  ok  spec: tree digest recomputes (d9f976c5b279…)
  ok  code: gitlink == contracts/code-pin.yaml commit dede32b4b6f3
  ok  code: tree digest recomputes (c2672463b4d8…)
  ok  contracts/shape-pin.yaml: 10 copied shape file(s) match their digests
pins ok
make validate rc=0
$ make pins
python3 scripts/validate-pins.py
  ok  spec: gitlink == contracts/spec-pin.yaml commit 7db9438b4cc4
  ok  spec: tree digest recomputes (d9f976c5b279…)
  ok  code: gitlink == contracts/code-pin.yaml commit dede32b4b6f3
  ok  code: tree digest recomputes (c2672463b4d8…)
  ok  contracts/shape-pin.yaml: 10 copied shape file(s) match their digests
pins ok
make pins rc=0

What does not change

This PR touches no release entry, manifest, pin, gitlink or workflow, and no tag. dox-v1.0 (608236a1 over dc7aa08f), dox-v1.1 (851a28e9 over 52005213) and dox-v1.2 (58538ff3 over 6a9f4902) stay exactly as published. There is no Arc: line, because #15 carried none: this is bookkeeping.

It opens as a draft.

🤖 Generated with Claude Code

Summary by Sourcery

Finalize the openDox v1.2 contract changelog now that its annotated release tag exists.

Enhancements:

  • Promote the openDox contract changelog status from draft to standard now that the dox-v1.2 release tag has been published.
  • Record the dox-v1.2 release window closure and update the Unreleased section to reflect that no work is pending.

… now exists (plan 038 T060)

The dox-v1.2 counterpart of #15. The cut PR #20 landed the dox-v1.2
entry with the header at Status: draft, because the tag did not exist
yet. It exists now: annotated tag object 58538ff over 6a9f490 (#20's
squash merge), tagger Brett Heap, 2026-10-06T17:58:45Z, cut on Brett's
word "Cut dox-v1.2 now (Recommended)" (#656 comment 6022291206).

One file, contracts/CHANGELOG.md, in #15's three edits: the header
reads standard; the draft paragraph records how the window closed (tag
object, target commit, tagger, date); the Unreleased line reads
"nothing pending" again. No release entry, manifest, pin, gitlink,
workflow or tag changes.

Lane: openxfactory-4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@brettheap
brettheap requested a balanced review from Copilot October 6, 2026 18:56
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Reviewer's Guide

This bookkeeping-only PR updates contracts/CHANGELOG.md to record the existing dox-v1.2 annotated tag and promote the changelog status from draft to standard. It does not alter release entries, manifests, pins, gitlinks, workflows, or tags; repository validation and pin checks pass.

Sequence diagram for promoting the dox-v1.2 changelog status

sequenceDiagram
    participant CutPR as Cut PR #20
    participant Brett as Brett Heap
    participant Forge as Git forge
    participant Changelog as contracts/CHANGELOG.md
    participant Validation as Repository validation

    CutPR->>Changelog: Record dox-v1.2 with Status: draft
    Brett->>Forge: Cut dox-v1.2 now
    Forge-->>Forge: Create annotated tag 58538ff3 over 6a9f4902
    Changelog->>Changelog: Record tag, target, tagger, and date
    Changelog->>Changelog: Change Status: draft to Status: standard
    Changelog->>Changelog: Change Unreleased line to nothing pending
    Validation->>Validation: make validate
    Validation->>Validation: make pins
    Validation-->>Changelog: Validation passes
Loading

File-Level Changes

Change Details Files
Promote the contract changelog from draft to standard now that the dox-v1.2 annotated tag has been cut.
  • Update the top-level status.
  • Replace the pre-tag explanation with a record of the cut word, tag object, target commit, tagger, and timestamp.
  • Preserve the historical wording and prior release records while documenting that the dox-v1.2 window is closed.
contracts/CHANGELOG.md
Refresh the Unreleased metadata to reflect the completed dox-v1.2 cut and current pin verification.
  • Change the entry from pending beyond dox-v1.2 to nothing pending.
  • Clarify that the spec commit is the commit pinned by dox-v1.2.
  • Retain the code pin and independent-main assertions.
contracts/CHANGELOG.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sonarqubecloud

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The documented tag object, target commit, tagger, and lifecycle transition match the published annotated tag.

Review effort: Balanced
Findings: None

What changed in this PR

Finalizes the dox-v1.2 release record after publication of its annotated tag.

Changes:

  • Promotes changelog status from draft to standard.
  • Records the tag provenance and closes the release window.
  • Marks the Unreleased section as having nothing pending.
File Description
contracts/​CHANGELOG.md Finalizes the dox-v1.2 release status and provenance.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@brettheap
brettheap marked this pull request as ready for review October 6, 2026 18:58
@sourcery-ai

sourcery-ai Bot commented Oct 6, 2026

Copy link
Copy Markdown

Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 22 hours and 21 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@brettheap

Copy link
Copy Markdown
Contributor Author

READY at 9b41eb4

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)

Holder, at READY: T060's second PR, the dox-v1.2 CHANGELOG entry moving from draft to standard, in openDox#15's form. With it, T060 is complete.

@brettheap
brettheap merged commit c7f7584 into main Oct 6, 2026
4 checks passed
@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)

LANDED — lane openxfactory-4, 2026-10-06T19:02:51Z, PR #21 → c7f7584 (opensoft/openDox main; plain gate)

Brett: plan 038 RULED incl. lane openxfactory-4 lands every PR (#656 6013547504); Start release 2 (#656 6001702967)

brettheap added a commit to opensoft/openxFactory that referenced this pull request Oct 7, 2026
…e identity response shape and the single-writer chains (plan 038) (#1257)

Lane: openxfactory-4 (openXfactory-4-openDox_extraction)

**T002, second bookkeeping batch, plan 038: T094 and the slice entries T095 to T104, the identity response shape, the single-writer chains, and the ticks.** Bookkeeping, so this PR carries no `Arc:` line. It touches no `openspec/changes/` path, so no Rule 6 window applies. It began stacked on #1251's head; #1251 has landed (`1837ea75`) and `main` is merged in (`543f6ce1`), so the diff against `main` is this batch alone.

## From plan 038's `tasks.md`, T002

- **Task**: T002, "Release-2 base, and the re-measure at the ruling" (landed in #1251; this is its second batch of bookkeeping, the brief of the holder's `T002b`).
- **Realizes**: none (bookkeeping; FR-025). **Falsifier**: T002 names none. Its gates are the brief's, quoted under "Review and gates".
- **Ruled / Decisions**: none of its own. Every item is a ruling already posted on `#656`, or a landing already merged, encoded as worded and cited by comment id or merge commit.

## The items

| # | Where | What changed | Record |
|---|---|---|---|
| 1 | tasks.md: T094, T095 to T104, T073 | T094 ticked, with its result quoted: 436 composed reds over 51 files, outside 12.5's set (Base 2; 533 at Base 1). The `T095+` placeholder becomes ten entries, T095 to T104, each with its slice name, Files, After and Falsifier from R2-INV-R9's outline and the holder's rulings, `Lane: 3 (openXfactory-3)`. T073's After and Files name them. The map's means, the rulings (R9-R1 (a), R9-R2 (a), W1 to W7) and the OQ defaults are recorded once, above the entries | map `R2-INV-R9.md`; `6021830607`; claim `6021862323`; rulings `6021830531` |
| 2 | T095, T101, T104, T097 | T095: the two confirmed departures from OQ-R9-1 (`plane_host_for` untouched, an autouse fixture registers the declared host; `DECLARED_HOST_SUITES` guarded structurally). T101: `tests/declared_exclusion.yaml` for ONE entry (reasons `[doc_health]`, note dropped, the `only` list loses the file, count stays 66). T104: `tests/test_binding_stylesheets.py`, the pin 572 to 574. T097: its served-display respelling is R9-R1 (a) applied | `6022291206`; the T097 line is `6023517122` (the holder confirmed the citation, `6026622117`) |
| 3 | plan.md: the single-writer table; tasks.md Files and After lines | W7's chains: `tests/conftest.py` T020, then T021 and T026 in landing order, then T095, T073, T074; `tests/test_host_plane.py` T020, T026, T095; `declared_exclusion.yaml` T101, T073, T074; the four T074 test files T103 then T074; the census T025, T104, T015, T016, T057 (the row splits, so `test_web_boundary.py` keeps its own chain). T015's and T074's After gain T104 and T103 | `6021830531`, `6022291206` |
| 4 | tasks.md: T072, T074, T075 falsifiers | The four folds of #1253, in the arc change's own wording: T072 asserts that ONLY CR, LF and CRLF split rows; T074's seam tests assert that an empty-seam read names the seam AND its registrar; T075's host-wiring test shows a leg declaring only SOME of the four seams refused, and a leg declaring the six and none of the four accepted; T074's protected-suite oracle computes 12.5's set as 12.5 does (`git grep -l -e 'open-pr' -e 'open_pr' -e 'FakePullRequests'`), from the pre-arc and the final tree, the floor of 16 on each, and takes the union | openxFactory#1253 to `fc4fa0ff`; Copilot `5427373153` |
| 5 | spec.md FR-011; tasks.md T041 | FR-011's JSON shape gains `identity`, emitted and bounded as openDox-spec's finding schema bounds it (no `excerpt`, `text`, `content` or `quote` key, no number, strings of at most 200 characters, `{category, entry}` for a pathless finding, `{collided_id}` for a collision). T041's falsifier gains a response-shape test asserting exactly that bound. The coverage row for FR-011 names T041. The serialized-size cap was already T041's at the base (T041's text says so, and T042 "stores what T041 bounds"), so nothing moved | holder `6018624750` |
| 6 | tasks.md ticks | T011, T014, T021, T023, T025, T026 and T060 ticked, T070's tick gains #1253, and T002's own landing is recorded. Each merge commit was verified with `gh pr view <n> -R <repo> --json mergeCommit` (listed below) | the landings |
| 7 | tasks.md: T072 | A Files line (`src/opendox/lines.py`, `tests/test_lines.py`); the Ruled line gains `6023517122`: `head_sha` (a), its own public `head_sha` parity-tested against `serve._head_of`, `serve.py` untouched; the line split (a), `doxbench_defaults.py` untouched. Folding either private helper is recorded as unscheduled and optional, and is not scheduled | holder `6023517122` |
| 8 | contracts/health-finding.md:91 | The sentence reads: a stored `identity` makes a cross-run collision between STORED findings detectable; an exception-only finding is never stored; whether the engine reports it remains T046's concern. Nothing else on the line changed | holder `6018624750`; Copilot `5433292692` |
| 9 | plan.md; tasks.md | Copilot's three items at #1251's head `1eb8e9eb`, accepted by the holder at its landing: (a) the pin and landing-order row for T073 names T005 and T095 to T104 as prerequisites, and `T095+` reads T095 to T104 at the critical path, the lane table and the revision note; (b) the combined `conftest.py` and `test_host_plane.py` row splits, and the cross-lane summary gains T026 (and the other chains of item 3); (c) the same split in T020's, T021's and T026's Files lines | holder replies `4201056969`, `4201057311`, `4201057577`; READY note `6026651962` |

### The ticks, verified

| task | pull request | merge commit | merged |
|---|---|---|---|
| T011 | opensoft/openDox-code#92 | `09b8d44a` | 2026-10-06T19:15:55Z |
| T014 | opensoft/openDox-code#93 | `a7a1c4d3` | 2026-10-06T22:23:06Z |
| T021 | opensoft/openXdox-code#40 | `f70bc9c3` | 2026-10-06T19:07:10Z |
| T023 | opensoft/openXdox-code#42 | `d45a0939` | 2026-10-06T17:45:33Z |
| T025 | opensoft/openDox-code#91 | `84f8ed83` | 2026-10-06T17:33:31Z |
| T026 | opensoft/openXdox-code#43 | `36bbef79` | 2026-10-06T22:35:40Z |
| T060 | opensoft/openDox#20, the tag `dox-v1.2` (tag object `58538ff3`, on `6a9f4902`), opensoft/openDox#21 | `6a9f4902`, `c7f75845` | 17:46:59Z, tag 17:58:45Z, 19:02:39Z |
| T070 | openxFactory#1253 (T070b, added to its tick) | `fc4fa0ff` | 2026-10-06T18:56:42Z |
| T002 | openxFactory#1251 (its own landing) | `1837ea75` | 2026-10-06T22:31:42Z |

- **T021** landed with Copilot r4199337845 an ACCEPTED LIMIT (holder READY note `6023492215`); T021's entry records it.
- **T025's** entry says its 34 nodes are "quoted at T029"; that stays T029's, and the entry says so.
- **T011's** server node is T014's, as its own Falsifier says.

**Skipped, because already present at the base:** T020's and T024's ticks (#1251 item 13) and T004's tick (#1245, `260234b5`), all confirmed with `git show <commit>:<tasks.md> | grep`.

**T071 is NOT ticked.** Brett's word, "Ratify it (Recommended)" (`#656` `6023375303`), is recorded on T071's entry, but the change's ratification-record PR has not landed (no such PR is open or merged on `opensoft/openxFactory` at this writing). The box stays open.

## Readings the holder accepted (`6026622117`), disclosed as the brief requires

- **W7 omits T026 from the openXdox-code chains.** The single-writer table keeps T026 where its own ruling (`6016648451`) puts it, and lane 3's claim (`6021862323`) says T026's PR lands before T095. So the conftest chain reads T020, then T021 and T026 in landing order, then T095, T073, T074; and `test_host_plane.py` reads T020, T026, T095, as W7 gives it with T026 added.
- **R9-R2's last sentence** ("If the re-scoped test runs alone, it leaves the declaration, and the count moves with it, as the declaration's own rules require") is recorded in T100 as worded. `declared_exclusion.yaml` is NOT added to T100's Files: the holder's file list at `6022291206` names it for T101 only.
- **Edits outside tasks.md**, ruled in scope as each item names its place: plan.md (items 3, 9), spec.md FR-011 (item 5) and `contracts/health-finding.md:91` (item 8).

## Other notes on where an item needed a reading

- **Counting.** The task count reads 90 rows: the placeholder `T095+` is replaced by T095 to T104 (81 - 1 + 10).
- **Plan 034's task numbers.** The entries cite plan 034's T103 (#80, in T099's `Host` header) and plan 034's T086 (W2, in the rulings) as "plan 034's", because plan 038 now has its own T103.
- **OQ-R9-3.** The map did not measure the respelled gate-console and wheel-model skips; T097 and T103 say so, and the map's 127 passed and 5 skipped is quoted as the measurement.
- **Counts of slices** are copied in the map's own form (for example "16 nodes, and +5 on R9-R1 (a)"), not summed.
- **T095's chain after T026.** T095's After names T021 and T026, both landed.
- **Not mirrored from the arc's 4.1:** T075's falsifier gains the some-of-four refusal and the six-and-none acceptance, which #1253 folded. The arc's two older refusals (part-way through the seams; at the column call) are not in T075, since #1253 did not add them.
- **T046 and T057** carry no response-shape falsifier for `identity`: item 5 names T041's.

## Review and gates

- **`python3 scripts/validate-openspec-cli-pin.py --all`**, in the clone named `openxFactory`, at `691648c6`: exit 0, `Totals: 113 passed, 1 failed (114 items)`, `0 UNDISPOSITIONED failures`. The one failure is the dispositioned `add-chain-attestation` finding, the same on `main`.
- **openxFactory pytest.** The full local run was stopped at about 44% at a coordinator drain, so it is NOT a result and is not claimed. The repository's own gate, `pytest-suite` in CI at `691648c6`, completed `SUCCESS` (2026-10-06T23:32:38Z to 23:58:56Z).
- **Doc-health**, `scripts/doc-health.py --single-repo . --as-of 2026-10-07`, branch `691648c6` against `origin/main` `0992369a` in the same clone: the two reports are byte-identical (sha256 `ce17aadd6d96e484170e2ec4784e44972e33c7d1a6c65830ea14a1035f2ae976`; `Findings: 31 critical, 26 error, 69 warning, 20 info. New regressions vs previous report: 0.`). So no new error.
- **CI at `691648c6`**: all 14 check runs are `SUCCESS` (rollup `SUCCESS`): `pytest-suite`, `merge-master-approval` (the red inherited from `main` since #1252 was cleared by #1138), `openspec-cli-pin`, `doc-health-py314`, `openxdox-consumer-gate`, `wallet-validation`, `clearing-dispatch-gate`, `signed-execution-chain-gate`, `former-id-arrival-gate`, `release-tag-gate`, `openreposhape-pin`, the two `lane-line` runs and SonarCloud.
- **`main`** has moved to `0992369a` since the last merge (`543f6ce1`). GitHub reports this PR `MERGEABLE`, and the ruleset is not strict, so `main` is not merged in again (a merge would restart the 27-minute gate).

| Copilot at | verdict | findings | answered |
|---|---|---|---|
| `691648c6` (final; review `5435686665`) | Changes recommended | 1 (thread `4201443690`): T041's falsifier cannot verify what T046's `health list --json` and T057's HTTP route emit; the review summary adds that the new T095 to T104 collide with plan 034's task numbers cited unqualified at `spec.md:662`, `spec.md:1222` and `clarify-questions.md:437` | accepted limit (#656 `5988818366`): plan-record accuracy, not a bypass, and the T041 placement is the holder's own instruction (item 5). Answered (`4201487553`) and resolved |

1 thread, 0 unresolved. The holder ruled both points YES at `6027706377` and has them encoded in a THIRD batch, not here: the `identity` falsifier split across T041, T046 and T057, and the plan 034 references qualified. This PR therefore carries T041's wording as the brief gave it.

## Files changed

- `specs/038-opendox-document-tool-self-maintenance/tasks.md`, `plan.md`, `spec.md`
- `specs/038-opendox-document-tool-self-maintenance/contracts/health-finding.md`

## What is NOT done

- T071 stays open (its ratification record has not landed). No box of #1144 is ticked, and no task other than those listed is ticked.
- No scenario or spec delta beyond FR-011's JSON-shape bullet is touched, and nothing is under `openspec/changes/`. `README.md` is untouched.
- The T095 to T104 entries record the slices; none of their work is done here.

🤖 Generated with [Claude Code](https://claude.com/claude-code)


Lane: openxfactory-4 (openXfactory-4-openDox_extraction)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants