# Changelog 2026-07-09 -- DC-DC repo-rename sweep + repo-lint L1 Windows fix

Delivered on the freshly-seeded `openstack-caracal-dc-dc` repo (seeded from
`openstack-caracal-ipv4` at 8813efc). Executed under blanket approval; no live
cloud mutation -- repo content only. Validation at packaging: repo-lint 0 fail
/ 1 documented WARN; `tests/repo-lint` harness 29/29 (was 28/28; one case
added); full `run-tests-all.sh` gauntlet shows pre-existing Windows-session
environment gaps (missing `jq`, tty/exit-code quirks) unrelated to these
changes -- `repo-lint`, the only touched suite, is ALL PASS standalone and in
the gauntlet.

## Items

### 1. DOCFIX-139 -- stale `openstack-caracal-ipv4` references repaired to `openstack-caracal-dc-dc`
FILES:
- `.claude/skills/openstack-cloud-ops/SKILL.md` (repo name x2, clone path, clone
  URL, session-bootstrap command)
- `.claude/skills/openstack-cloud-ops/references/environment.md` (repo web +
  clone URL)
- `scripts/repo_lint.py` (module docstring only, cosmetic)
- `runbooks/ops-update-procedure.md`, `runbooks/d011-batch3-window-DRAFT.md`,
  `runbooks/phase-01-bundle-deploy.md`, `runbooks/tenant-onboarding-v2-DRAFT.md`
  (hardcoded `~/openstack-caracal-ipv4` jumphost clone paths inside RUN blocks)
- `clientdocs/sweep-receipt.txt` (L7 re-record; reviewed clientdocs/ for
  drift from the tenant-onboarding-v2-DRAFT.md path edit -- no client-facing
  file mirrors those internal jumphost lines, so no content change needed
  there, only the pinned hash)

WHY: repo was seeded under a new name for the DC-DC (VR1) phase
(`docs/design-decisions.md` D-110); operational path/URL references still
pointed at the old `openstack-caracal-ipv4` clone, which would 404 clones and
break `source`/`cp`/`BUNDLE=` defaults in runbook RUN blocks on first live use.

ASSUMPTION FLAGGED: the jumphost clone directory is assumed to be
`~/openstack-caracal-dc-dc` (dir-name-equals-repo-name, matching the existing
convention for the sibling repo). Not measured this session (no jumphost shell
in this Windows working session) -- confirm on first live jumphost session.

LEFT UNCHANGED (correct as historical/lineage record, not stale):
- `docs/design-decisions.md` legacy D-014 entries + the new D-110 lineage note
  ("seeded from openstack-caracal-ipv4")
- `docs/dc-dc-buildout-design.md` lineage note (same commit-seed record)
- `docs/v1-pre-deploy-fixes.md` (historical record of the *sibling* repo's own
  2026-05-27 GitBucket-group move)
- `runbooks/phase-08-workload-cluster-acceptance.md:340` (correctly refers to
  flipping the *sibling* ipv4 repo private at ITS v1 close, SEC-004)
- `scripts/repo_lint.py` STALE-token regex for `jesse\.austin/openstack-caracal-ipv4`
  (an unrelated dead-path class from the pre-05-27 org move, still a live check)

NOT actioned (flagged to operator, larger scope): `README.md` and
`references/environment.md`'s body content still describe VR0 DC0/v1 single-DC
scope wholesale (title, six-plane table, phase list) -- a content rewrite tied
to the VR1 DC-DC design, not a name-swap. Awaiting direction.

REVERT: `git checkout HEAD~ -- <file>` per file above (dropping
`clientdocs/sweep-receipt.txt` back requires re-running
`bash scripts/repo-lint.sh --record-clientdocs-sweep` afterward against the
reverted tree, or L7 will FAIL on the mismatch).

### 2. DOCFIX-140 -- repo_lint.py L1 Windows path-separator bug (WARN carve-out silently became FAIL)
FILE: `scripts/repo_lint.py` (3 sites: L1 encoding check, L2 stale-token check,
L3/L4/L6 runbook check -- all used `str(p.relative_to(R))`)

WHY: found during session bootstrap -- `bash scripts/repo-lint.sh` reported
`[FAIL] L1 docs\design-decisions.md: 239 non-ASCII byte(s)` where CLAUDE.md's
documented bootstrap expectation is "0 fail (1 legacy WARN)". Root cause: the
L1 carve-out compares `rel == "docs/design-decisions.md"` (forward slash
literal) against `rel = str(p.relative_to(R))`, which yields backslashes on
Windows (`docs\design-decisions.md`). The comparison never matched on this
platform, so the documented legacy WARN silently escalated to FAIL. Confirmed
this was NOT caused by the DC-DC design-doc commits (diffed: the 200 lines
`docs/dc-dc-buildout-design.md`/2b2fa3f added contain zero non-ASCII bytes;
the flagged 239 bytes are the pre-existing legacy D-001..018 content, unchanged
today). Fixed by switching all three sites to `p.relative_to(R).as_posix()`,
matching the convention already used elsewhere in the same file (L7/L8 checks).
Also fixes cosmetic backslash-vs-forward-slash inconsistency in L2/L3/L4/L6
message output on Windows.

HARNESS: added T3b to `tests/repo-lint/run-tests.sh` -- plants an em-dash in a
fixture's `docs/design-decisions.md` and asserts rc=2 (WARN) with the
carve-out message, not rc=1 (FAIL). This exact carve-out path had no direct
test before (only the non-carved-out FAIL case, T2, was covered), which is how
the platform bug went unnoticed. 29/29 green after the change.

REVERT: `git checkout HEAD~ -- scripts/repo_lint.py tests/repo-lint/run-tests.sh`
(re-arms the Windows false-FAIL; not recommended for any Windows-based
session).
