Skip to content

Sweep the repo-wide em dash and gate it in the test suite - #525

Merged
philcunliffe merged 4 commits into
masterfrom
fix/issue-472
Jul 31, 2026
Merged

Sweep the repo-wide em dash and gate it in the test suite#525
philcunliffe merged 4 commits into
masterfrom
fix/issue-472

Conversation

@philcunliffe

@philcunliffe philcunliffe commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

What

The repo-wide em dash sweep the issue asks for, plus the test that stops it
coming back, plus the @ref gloss gate widening folded in per the maintainer
comment.

Violation count: 2438 lines across 196 files before, 0 after.

The gate is the point

test/core/house-style-em-dash.test.js is new. It scans every tracked,
non-binary file for U+2014 and fails with the offending file:line list. Run
both ways on this branch:

# on origin/master (pre-sweep)
not ok 1 - no tracked file carries an em dash
  2438 lines carry an em dash (U+2014); replace each with the punctuation the
  sentence wants:
    .claude/skills/llp-create/SKILL.md:14  ...
    [39 more shown, then "...and 2398 more"]

# on this branch (post-sweep)
ok 1 - no tracked file carries an em dash
ok 2 - the scan actually reads the tree

The second test is the guard against a scan that silently matches nothing: it
asserts the tree was actually walked and that the file stating the rule is in
scope. The scan reads bytes and skips anything containing a NUL rather than
filtering by extension, so a new file type is covered the day it lands.

Scope, and the one thing deliberately excluded

In scope, per CLAUDE.md and the maintainer note on the issue: code, comments,
JSDoc, strings, docs, in-repo skills, and the whole LLP corpus including
llp/tombstones/.

Excluded: notes-archive/ (2 files, 38 lines). It holds dated, signed
review transcripts of LLP drafts. They are records of what a reviewer wrote on
a given day, not project prose under maintenance, so re-punctuating them would
falsify the record rather than fix a style defect. The exemption is a commented
prefix list in the test, so adding another is a visible diff with an argument
attached.

How the replacement was chosen

Not one mark for all 2560 occurrences. Per site:

  • a colon after a label (**Term** \u2014 gloss, ## Heading \u2014 gloss,
    - [LLP 0025](...) \u2014 join flow) and before a clause that explains the one
    before it;
  • a comma before a connector (\u2014 so, \u2014 but, \u2014 not), and commas on both
    sides of an aside that used a pair of dashes as brackets (never parentheses,
    so nothing can end up unbalanced);
  • a semicolon where a comma would have joined an aside to the list an open
    parenthesis already holds;
  • a plain - in runtime strings, CSS declarations, JSON description fields,
    shell/HTML samples, and table cells where a lone dash was a "none"
    placeholder;
  • a comma, not a colon, wherever the clause already carried one, so no sentence
    ends up with two colons doing different jobs.

Nineteen LLP titles and the five ## Part N headings in LLP 0045 were then
repunctuated by hand where the generated mark read badly
(LLP 0040: Incremental sink reads (design), ## Part 3. Reverse runs from disk: ...), and twenty bold labels were normalized to the colon their siblings
use.

90 heading anchors changed slug as a result. All 34 of their call sites are
repointed, @ref annotations and in-repo anchor links alike. The three broken
anchor links that exist on master are the same three after this change: no
new ones.

No rationale is reworded and no text is reflowed. Every file keeps its exact
line count, verified: git diff --numstat shows added == deleted for all 198
swept files.

Gate widening (folded in from the issue's last section)

test/core/llp-ref-hygiene.test.js only ever read the line the @ref token
sat on, so an em dash in a continuation line of a multi-line gloss was
invisible to it. The check now reads the whole gloss: the @ref line plus the
wrapped lines under it, stopping at a blank line, a new @ tag, a second
annotation, the end of the comment, or (in Markdown) the next list item or
heading. A new fixture test pins where a gloss starts and stops, including the
exact regression: the character present in .gloss and absent from .text.
The three known continuation-line instances (format-iceberg/src/table-format.js,
llp/0067-session-opt-out.design.md, src/core/runtime/activation.js) are
fixed by the sweep and now covered by the gate.

One assertion needed care: usage-policy-classification.test.js asserts the
consent copy contains no em dash. Swept naively it would have asserted the copy
contains no hyphen and failed. It spells the character as a \u2014 escape
now, which the repo-wide gate does not match, so the assertion survives the gate
that backs it.

Verification

  • npm test: 3081 pass, 8 fail. The 8 are leave-command.test.js, failing
    identically on origin/master with these changes stashed. No regression.
  • npm run typecheck: clean.
  • npm run smoke -- core_boot_noop: ok.
  • Style compliance only; no runtime behavior change.

Fixes #472

CLAUDE.md bans U+2014 anywhere: code, comments, JSDoc, strings, or docs.
The tree carried 2438 offending lines across 196 files, so the rule was
documentation rather than a property of the repo.

The gate comes first. `test/core/house-style-em-dash.test.js` scans every
tracked, non-binary file for the character and fails with the offending
`file:line` list. It failed on the pre-sweep tree with those 2438 lines and
passes now, which is what makes this sweep the last one.

The replacement is not mechanical. Prose takes the punctuation the sentence
wants: a colon after a label or before the clause that explains, a comma
before a connector or around an aside that used a pair of dashes as brackets,
a semicolon where a comma would join an aside to the list a parenthesis
already holds. Runtime strings, style declarations, JSON descriptions and
placeholder table cells take the plain `-` CLAUDE.md asks for. No rationale is
reworded and no text is reflowed: every file keeps its line count.

Nineteen LLP titles and five `## Part N` headings were repunctuated by hand
where the generated mark read badly, and the 90 heading anchors that changed
slug as a result are repointed at all 34 of their call sites, so every `@ref`
and in-repo anchor link still resolves.

The `@ref` gloss gate is widened at the same time. Its em-dash check only ever
read the line the `@ref` token sat on, so a gloss that wrapped could carry the
character on its second line unseen; it now reads the whole gloss, with a
fixture test for where a gloss starts and stops.

`usage-policy-classification.test.js` asserts the consent copy carries no em
dash. That assertion spells the character as a `\u2014` escape now, so the gate that
backs it cannot sweep the assertion itself into a hyphen.

Fixes #472

Co-Authored-By: Claude <noreply@anthropic.com>
@philcunliffe

Copy link
Copy Markdown
Contributor Author

🤖 neutral: merge-ordering note - this PR overlaps 10 of the 11 other open branches

Independently verified before writing this: 198 files on master carry U+2014, zero outside notes-archive/ on this branch; llp-ref-hygiene 10/10; the new house-style-em-dash gate 2/2; and the no-reflow claim holds - the only files where added lines differ from deleted lines are the three that legitimately gained content (house-style-em-dash.test.js, the widened llp-ref-hygiene.test.js, usage-policy-classification.test.js). Every other one of the 201 files is a pure in-place substitution.

The sweep is sound. The risk is ordering, not correctness.

Branch PR Overlapping files
fix/issue-497 #505 5 / 7
integration/openclaw-full-capture #510 5 / 33
fix/issue-500 #506 4 / 6
fix/issue-421 #502 3 / 17
fix/issue-460 #522 2 / 8
fix/issue-451 · 473 · 478 · 481 · 499 #520 #517 #513 #491 #518 1 each
fix/issue-480 · integration/bounded-query-execution #515 #221 0

Two branches (#505, #506) have most of their files rewritten by this PR.

Why it matters beyond ordinary conflicts: the sweep repunctuates headings, which changes their slugs - 90 anchors moved and 34 @ref call sites were repointed on this branch. A sibling branch that adds a new @ref to an old slug will merge cleanly at the text level and then fail ref-check, because the conflict is semantic, not textual. Git will not flag it.

Recommendation: merge this one last, after the eight in-flight fix PRs settle. It is pure hygiene with a regression gate attached, so it loses nothing by waiting, whereas every branch it lands ahead of pays a rebase plus an @ref re-audit.

If you would rather land it first, say so on this thread and neutral will run the merge-base rung across the affected branches and re-audit their @refs on the next tick.

Two notes on scope, both from the worker's own report and both worth your eye:

  • notes-archive/ excluded (2 files, 38 lines): dated, signed LLP review transcripts. Repunctuating them would falsify a record rather than fix maintained prose. Encoded as a commented prefix list in the new gate.
  • The LLP corpus was swept, including llp/tombstones/, on the reading that AGENTS.md's immutability convention permits "trivial editorial fixes" and no rationale was reworded. If you read immutability more strictly than that, this is the part to push back on.

The sweep's rule is a colon after a definition-list label, and a comma
only when the clause already carries a colon. Two members of the
client-action state enums took the comma without that reason, leaving a
three-colons-and-one-comma list in each.

Co-Authored-By: Claude <noreply@anthropic.com>
@philcunliffe

Copy link
Copy Markdown
Contributor Author

Review: repo-wide em dash sweep (201 files, 2448 substituted lines)

Verdict: approve. One nit found and fixed (3d65aef). The rule-driven
substitution claim holds up under adversarial sampling: I could not find a
single substitution that changes meaning.

I did not re-verify the mechanical claims the orchestrator already checked
(zero U+2014 outside notes-archive/, no reflow, gate 2/2, hygiene 10/10).
Everything below is independent work.

Test baseline

npm test on origin/master (bd7dd0b) and on the head both fail exactly 8
tests, and the failing-test name sets are identical (all leave …, issue
#512). No new failures. Head adds 3 tests (3087 → 3090).

1. Meaning changes: none found

I reconstructed every substitution by aligning -/+ lines within each hunk
(2448 lines; 0 unaligned) and attacked the claim four ways.

The strongest single result: across all 2448 substituted lines, zero
lines changed a word.
Stripping every non-letter character, the before and
after letter sequences are identical everywhere. The sweep is pure
repunctuation, not rewriting. That one check retires a whole class of risk,
and it is what settles the scope question in §6.

Shape distribution: : 1292, , 887, - 97, ; 32, dash absorbed by the
previous line 18, . 5, parenthesised 12.

Targeted probes for relationship reversal:

  • Colon introducing a conjunction (: but, : and, : while, : whereas
    …), which would invert a contrast: 0 occurrences.
  • Colon before a negation (: no, : not, : never, : only): 35, all
    idiomatic elaboration (Pure: no effects., literally: no metaphors). Not
    reversals.
  • A second colon in a clause that already had one: 6. Five are LLP H1
    titles (# LLP 0031: Layered config: central …), where the alternative
    would nest parens inside parens. The sweep in fact uses parens for
    document-type suffixes (— implementation design(implementation design), 12 cases) and a colon for real subtitles: a deliberate
    distinction, not sloppiness. Sixth is a markdown table cell. All cosmetic.
  • Dash deleted with nothing in its place: 18. I read every one in
    context. All are wrapped continuation lines where the punctuation moved to
    the end of the previous line (… high-water \after`,/never
    mid-partition.`). No juxtaposition, no lost break.

Runtime strings behave: client_attach_on_join.js:52, .../style.css:517
(content: " - "), the plugin.json description fields and
.github/workflows/llp-check.yml's echo all take a plain -, while the
comments around them take :/,. Test-name strings and assertion messages
likewise take -.

2. Anchor and link integrity: verified independently, no new breakage

I wrote a standalone GitHub-slug checker (own slugger, does not reuse repo
helpers) and ran it on both master and the head so slugger imprecision
cancels out.

  • @ref anchors: master 1530 refs / 11 unresolved, head 1542 / 11. The
    unresolved-set is byte-identical between the two, and all 11 are
    illustrative placeholders inside the ref-check / ref-story skill docs and
    their fixture (path/to/doc.md, #token-strategy, #focus-trap). Every
    real @ref in the tree resolves, including all the ones repointed at moved
    slugs.
  • Intra-repo markdown links: 1510 links, 45 unresolved on master, the same
    45
    on the head. The 3-broken-before/3-broken-after claim holds (my
    checker counts placeholder hrefs like <dir>/<file>.md too, hence the
    larger number; the point is the sets are identical).

3. The gate is not vacuum-vulnerable

test/core/house-style-em-dash.test.js is sound, and I mutation-tested it
rather than trusting the green tick:

mutation result
new tracked src/core/zz-mutant.js with an em dash fails correctly
em dash appended to tracked AGENTS.md fails correctly
em dash appended to tracked llp/0002-…md fails correctly
em dash appended to a notes-archive/ file passes (correctly exempt)

The vacuum guard (house-style-em-dash.test.js:86-92) asserts >500 tracked
files, that CLAUDE.md is in scope, and that notes-archive/ is not, so a
scan that silently matched nothing cannot pass. The exclusion is a commented
prefix list with the reason attached (:31-44): the archive holds dated
signed review transcripts, so repunctuating them would falsify a record.
Reading bytes and skipping on a NUL rather than allow-listing extensions is
the right call: a new file type is covered the day it lands.

Two limits worth knowing, neither a defect: it scans git ls-files, so an
untracked file is invisible (fine, CI sees committed trees), and
CLAUDE.md is a symlink to AGENTS.md, so that content is scanned twice.

4. The widened gloss check genuinely pins the boundaries

llp-ref-hygiene.test.js:392-417 asserts exact string equality for the
gloss in five boundary cases (wrap, next @ tag, blank line, comment exit,
markdown bullet), plus the regression it exists for. I mutation-tested the
fixture too: deleting the stop-at-tag guard, and separately the
markdown-bullet guard, from glossLines each makes the fixture fail. It is
pinning behaviour, not describing it. The widened filter reads
ref.gloss, which begins at the @ref line itself, so it strictly
supersedes the old ref.text check.

5. usage-policy-classification.test.js:66 is not vacuous

The literal assert.equal(prompt.includes('—'), false) became
assert.equal(prompt.includes('\u2014'), false). The escape '\u2014'
is U+2014 at runtime, so the assertion tests exactly what it
tested before: that the consent copy carries no em dash. The escape only
keeps the file that asserts the rule from tripping the gate that enforces it,
which the test comment explains. Correct, and neater than an exemption.

6. LLP scope call: within convention

AGENTS.md:29-34 allows, on Accepted/Active docs, "Mechanical edits … typos,
broken links, status changes, and renumbering that does not change meaning
",
and :247 allows "Trivial editorial fixes". The load-bearing question is
whether any edit reworded a rationale rather than repunctuating it.

It did not, and this is measured, not asserted: the zero-words-changed
result in §1 covers llp/ and llp/tombstones/ along with everything else.
No normative "must", no chosen option, no rationale was touched. Heading
repunctuation moved slugs, but every in-repo @ref and link was repointed
(§2). I judge the scope call correct, including the tombstones.

Finding (nit, fixed in 3d65aef)

The label-list rule stopped one item short in two state-enum lists.

The stated rule is a colon after a definition-list label, and a comma only
when the clause already carries a colon. I checked all 18 changed lists that
came out mixed; 16 are explained by that rule (a downstream colon, or a colon
inside the label itself). Two are not:

  • src/core/config/types.d.ts:297* - `failed`, not terminal; …
    between `done`: and `applied`:. No colon anywhere in the clause,
    so nothing blocked one. (applied carries a semicolon and still took a
    colon, so ; is clearly not the sweep's exception.)
  • src/core/daemon/types.d.ts:106* - `n/a`, suppressed … closing a
    list of three colons.

Both now take the colon. JSDoc only, no behaviour. npm test after the fix:
3081 pass, the same 8 known leave failures, no new ones.

The sweep's own rule offers parentheses alongside the comma, and it already
uses them. Twenty spans that an em dash pair had set off, and whose inner
text already carried its own comma, took a comma at each end instead. That
flattens a nested aside into a flat list, and in a few places into a comma
splice:

  "contradicts an Active LLP, a Spec's must, a Decision's chosen option,
   a Principle's always/never, call it out"
  "deferred, consent, conflict, opt-out, and is the sibling of"
  "LLP documents are living, you edit, supersede, and delete freely, so"

Parentheses restore the boundary the pair carried. The transform is
character-neutral (two ", " become " (" and ") "), so nothing rewraps, and
it still changes no word: the diff against master remains 2506 aligned
pairs with zero letter changes.

One paired span keeps its commas because it is already correct as a quoted
appositive ("The product intent, \"log in, logs flow\", is served by
neither"), and one sits inside parentheses already, so it takes a colon.

Co-Authored-By: Claude <noreply@anthropic.com>
@philcunliffe

Copy link
Copy Markdown
Contributor Author

Review round 2: repo-wide em dash sweep

Verdict: approve. One finding, fixed and pushed (6021713). The sweep is
not stale: master moved three PRs under this branch and introduced zero
new em dashes, so nothing needed topping up.

Round 1 (a547c83) is above; I did not redo the checks it recorded.

Round 1's fix landed and is inert

3d65aef is exactly two lines, , -> : after a state-enum label in
src/core/config/types.d.ts:297 and src/core/daemon/types.d.ts:106. JSDoc
only, no words touched, no behaviour.

Master moved: no new em dashes, no conflict

#491 (LLP 0160), #502 (LLP 0164), #505 merged since round 1
(bd7dd0b..71c6231). Checked two independent ways:

  1. Direct. Every line added by master since the merge base:
    git diff bd7dd0b..71c6231 -U0 | grep '^+' | grep -c U+2014 = 0.
    Master's recent work already complies with the CLAUDE.md rule.
  2. Through the branch's own gate. git merge --no-commit --no-ff origin/master into this branch, then ran
    test/core/house-style-em-dash.test.js against the merged tree: 2/2
    pass
    . So the gate would stay green on the post-merge default branch.

The merge is clean (auto-merged 9 files, no conflicts), re-verified after my
own commit. Nothing for the resolve-conflict rung.

Gate and hygiene on the current head

house-style-em-dash.test.js 2/2, llp-ref-hygiene.test.js 12/12.
npm test: 3090 tests, 3081 pass, 8 fail, all leave ... (issue #512,
fix pending in #527). Same 8 as the known baseline, no others, before and after
my commit.

Spot-checks (weighted to src/ and runtime strings)

  • src/ carries no runtime change at all. Every one of the 213 changed
    lines under src/ is a comment or JSDoc line except two, and both of those
    are trailing // comments. Nothing in a string literal, nothing executable.
  • No substitution closed up a word. Zero master lines had a U+2014 with a word
    character on both sides, so no closed-up dash became a compound foo-bar. This matters because round 1's
    letters-unchanged proof cannot see that case (the letters are identical
    either way); it needed its own check, and it is clean.
  • 63 substituted lines sit inside fenced code blocks (sh, js, jsonc,
    html, bash, plain ASCII diagrams). Every one took -, not a colon, so
    no copy-pasteable sample gained stray syntax. The llp-grill ASCII decision
    tree keeps its column alignment (U+2014 and - are both one character, and the
    padding was already explicit).
  • All 3 changed hypaware.plugin.json files still parse; the one changed
    workflow (.github/workflows/llp-check.yml) keeps its em-dash-free echo
    inside double quotes.
  • 10 markdown table cells used a U+2014 as the empty/not-applicable marker and took
    -. Conventional, no column shift.
  • Re-ran the letters-unchanged proof at this head: 2504 aligned pairs, 8
    letter-changing lines
    , all 8 in the three test files this PR intentionally
    edits (the new gate, the widened gloss filter, the U+2014 escape). The
    201-file sweep still changes zero words.

Finding (fixed in 6021713)

An interruptive span whose inner text already carried a comma got a comma at
each end, flattening a nested aside into a flat list.
Severity: minor
(prose clarity, no behaviour, no anchor). 20 spans, in llp/, the two mirrored
plugin skill trees, and two JSDoc headers.

An em dash pair is a bracket. Replacing both with commas only works when the
enclosed text has no comma of its own. Where it does, the boundary vanishes and
the sentence re-parses:

file:line before the fix
.claude/skills/llp-grill/SKILL.md:35 contradicts an Active LLP, a Spec's "must", a Decision's chosen option, a Principle's "always/never", call it out
llp/0044-client-attach-on-join.decision.md:24 deferred, consent, conflict, opt-out, and is the sibling of
llp/0025-remote-config-join-flow.spec.md:18 MDM deploys a **seed**, server URL + policy token, nothing else, and the gateway joins the fleet
.claude/skills/llp-grill/SKILL.md:57 LLP documents are *living*, you edit, supersede, and delete freely, so (comma splice)
llp/0041-central-config-client-actions.design.md:8 ... can re-fire when its input drifts, attach re-attaches on a gateway rebind (comma splice)
hypaware-core/plugins-workspace/{claude,codex}/src/config.js:6 the \backfill` sub-object that drives backfill-on-join, `{ on_join, window_days }`, and the optional `attach` sub-object` (reads as a third thing backfill drives)

Full set also: DECISION-DISPOSITION.md:40, llp/0003:60, llp/0042:47,
llp/0049:38, llp/0054:19, llp/0063:274, llp/0063:477, llp/0071:117,
llp/0073:259, {claude,codex}/skills/hypaware-ai-usage-report/SKILL.md:273,
{claude,codex}/skills/hypaware-report-to-html/SKILL.md:42/:38.

This is not a new rule, it is the PR's own rule finished. CLAUDE.md offers
"a comma, colon, parentheses, or a sentence split", and the sweep already
reaches for parentheses in 12 places. Parentheses restore exactly what the pair
carried.

The fix is character-neutral (two , become ( and ) ), so nothing
rewraps: 23 insertions, 23 deletions, and the letters-unchanged proof still
returns zero for the sweep. Two of the 20 spanned a line break, and
parenthesising them restored the previous line to master's byte-identical text,
which is why the aligned-pair count drops from 2506 to 2504.

Two paired spans deliberately keep their commas:

  • llp/0063-login-auto-provision-forward-sink.decision.md:86 -
    The product intent, "log in, logs flow", is served by neither. A quoted
    appositive with commas is already correct.
  • llp/0041:8 sits inside parentheses already, so nesting is not available;
    the comma splice there takes a colon instead.

I did not touch single em dashes that introduced an elaboration and became a
comma or colon. Those are one-sided, nothing needs bracketing, and they read
correctly.

Non-blocking observations

  • .github/workflows/llp-check.yml says "Generated by neutral init". If that
    generator's template still holds em dashes, re-running it reintroduces them,
    but the gate this PR adds catches that on the next npm test, so it is
    self-correcting rather than a leak.
  • The gate scans git ls-files, so an untracked file is invisible, and
    CLAUDE.md is a symlink to AGENTS.md so that content is scanned twice.
    Both were noted in round 1; neither is a defect.

After the fix

npm test: 3081 pass, the same 8 known leave failures, no new ones. Gate 2/2,
hygiene 12/12, merge with origin/master still clean.

@philcunliffe

Copy link
Copy Markdown
Contributor Author

neutral: TRIAGE rung (LLP 0017) — PR #525

Two review rounds are exhausted (round 1 a547c83, round 2 3d65aef
6021713, both approve). Judging the residual findings against the head at
6021713.

Verdict: every residual is non-blocking. This PR touches no runtime code
at all (round 2 confirmed src/ has zero executable-line changes; every
changed line is a comment, JSDoc, or doc-prose line), so none of the five
residuals below could produce a production defect (wrong behaviour, data
loss, a security hole, a crash, or a perf regression).

  1. The house-style-em-dash gate scans git ls-files, so an untracked file
    is invisible to it — a real blind spot for local dev, harmless for CI
    (which only ever sees committed trees). Preference.
  2. CLAUDE.md is a symlink to AGENTS.md, so the gate reads that content
    twice. Cosmetic double-work only; the bytes are identical by construction.
    Preference.
  3. notes-archive/ (2 files, 38 em-dash-bearing lines) is excluded as dated,
    signed LLP review transcripts. Verified: dates, signatures, and line count
    all check out. Judged correct, not just non-blocking — repunctuating a
    signed record would falsify it.
  4. The LLP-immutability scope call (the sweep repunctuates llp/
    including llp/tombstones/) — the residual most likely to be wrong.
    AGENTS.md:29-34's actual text permits "mechanical edits... that does not
    change meaning," and the sweep's own zero-words-changed proof (2504 aligned
    pairs, independently re-verified across both review rounds) plus the
    repointed anchor set (90 slugs, 34 call sites, spot-checked again here)
    satisfy that test as written. Judged within convention. Worth a maintainer
    glance if you read the immutability clause more strictly than "meaning
    preserved."
  5. Two spans deliberately kept commas (a quoted appositive at
    llp/0063:86; one inside parens at llp/0041:8 took a colon instead).
    Spot-checked; both read correctly as-is.

Filed as a tracked follow-up rather than dropped: #532.

Merge-ordering note, restated (not re-derived — the orchestrator already
posted this):
this branch overlaps 10 of the 11 other open branches and
moves 90 heading-anchor slugs. A sibling branch adding a new @ref to an old
slug merges cleanly at the text level and then fails ref-check — a semantic
conflict git cannot flag. Recommendation stands: land this PR last, after
the in-flight fix PRs settle.

@philcunliffe
philcunliffe marked this pull request as ready for review July 31, 2026 06:41
@philcunliffe philcunliffe added the neutral:approved neutral reviewed this and holds it for a maintainer merge (own or adopted PR; LLP 0025/0030) label Jul 31, 2026
@philcunliffe philcunliffe removed the neutral:approved neutral reviewed this and holds it for a maintainer merge (own or adopted PR; LLP 0025/0030) label Jul 31, 2026
# Conflicts:
#	hypaware-core/plugins-workspace/openclaw/src/settings.js
#	llp/0148-shadow-wire-parity-in-plugin.decision.md
#	src/core/commands/central.js
#	src/core/config/client_detach_disk.js
#	src/core/daemon/status.js
@philcunliffe

Copy link
Copy Markdown
Contributor Author

neutral: TRIAGE rung (LLP 0017) - re-triage at head 0944215

The prior triage (this thread, above) judged head 6021713 and filed
follow-up issue #532. The head has since moved to 0944215 via a plain
merge of origin/master (six PRs: #510, #506, #513, #518, #520, #527,
#537), which is enough drift that LLP 0017 owes a fresh triage rather than
trusting the old marker.

Verdict: every residual is still non-blocking, and nothing new blocks.

  • The five residuals filed on Follow-up: deferred review findings from PR #525 #532 are byte-identical between 6021713
    and 0944215 (checked file-by-file); nothing about them changed.
  • The merge itself introduced one new thing worth checking: PR OpenClaw full capture (LLP 0157-0162) #510 added
    llp/0162-openclaw-full-capture.plan.md on master with 35 em-dash lines
    (authored against pre-sweep master, never swept). The merge commit fixes
    it, following the same substitution rules round 1/2 already verified
    (comma instead of a second colon where the clause already carries one,
    line count unchanged, no word changed, the one moved heading slug has no
    in-repo linker). No em dash exists anywhere in the tracked tree at
    0944215 - the gate (test/core/house-style-em-dash.test.js) is
    authoritative here and passes 2/2.
  • test/core/llp-ref-hygiene.test.js: 10/10. npm test: 3266 pass, 0 fail
    (the leave-command.test.js failures that were the known baseline
    through round 2 are gone - PR hyp leave: the daemon status query must answer, not throw #527 fixed the underlying bug on master,
    and this merge inherits the fix, so the branch's test suite is now
    fully green rather than green-with-a-known-baseline). npm run typecheck: clean. All four GitHub Actions checks are green on
    0944215.

Full detail posted to #532.

Follow-up issue: #532 (unchanged, no duplicate filed).

@philcunliffe philcunliffe added the neutral:approved neutral reviewed this and holds it for a maintainer merge (own or adopted PR; LLP 0025/0030) label Jul 31, 2026
@philcunliffe
philcunliffe merged commit a20347b into master Jul 31, 2026
9 checks passed
@philcunliffe
philcunliffe deleted the fix/issue-472 branch July 31, 2026 21:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

neutral:approved neutral reviewed this and holds it for a maintainer merge (own or adopted PR; LLP 0025/0030)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Repo-wide em dash (U+2014) violates CLAUDE.md's house style outside @ref glosses

1 participant