Skip to content

Land leftover Address from #2272 post-merge child review - #2340

Merged
d-morrison merged 5 commits into
mainfrom
cursor/cloud-pairing-unfollowable-32a3
Aug 27, 2026
Merged

Land leftover Address from #2272 post-merge child review#2340
d-morrison merged 5 commits into
mainfrom
cursor/cloud-pairing-unfollowable-32a3

Conversation

@dem-extra1

Copy link
Copy Markdown
Collaborator

Closes #2339.

Leftover Address from the Cursor Task child of #2272 HEAD cb6ac0a7 (bc-37882a1b). That PR squash-merged as ff43c6c6 before the Address could push (the feature branch was deleted). GitHub Claude on the merged HEAD was Ready for merge; the Task child was Needs more work.

Landed here

  1. Address: Cloud pairing is unfollowable because the VM image already writes ~/.claude/settings.json; do not treat both-present as a Cloud defect to clear by deleting settings.
  2. Address: ALLOW_UNREVIEWED_PUSH=1 is inert for the adapter only (shared/workflow/adversarial-self-review.md now matches skills/push/SKILL.md).
  3. Address: Refusal checklist item 6 consumes the dry-run output item 5 produces.
  4. Address: A last assistant message that restates the brief's required shape passes the heading check; parse_report's fingerprint regex is what refuses a placeholder.

Not in this PR

  1. Rebut: Compact copies of the recipe stay until #2241. Collapsing them is out of scope here, as on Cursor Cloud: dispatch adversarial-reviewer via Task; prefer Claude #2272.

Do not merge until a clean review verdict lands on the latest commit. GitHub CLEAN is conflicts-only.

Open in Web Open in Cursor 

…estatement

State that the VM image writes settings.json so desktop leave-one-path
is unfollowable on Cloud. Qualify the adapter-skip prefix as inert for
the adapter only. Record that checklist item 6 consumes item 5. Name
that a last-message shape restatement is closed by the fingerprint regex.

Co-authored-by: dem-extra1 <dem-extra1@users.noreply.github.com>
@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Driving this PR to clean --- please hold off until done.

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

GitHub Claude on #2340 found the new causal claim contradicted the
adjacent unmeasured-origin sentence in the same paragraph. Soften both
copies: this VM's copy predates the session and its origin is
unmeasured; keep the instruction not to delete settings to clear pairing.

Co-authored-by: dem-extra1 <dem-extra1@users.noreply.github.com>
@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Addressed GitHub Claude finding 1 on HEAD d20516b9 (Needs more work).

# Tag Disposition
1 Causal claim "VM image already writes settings.json" contradicts adjacent unmeasured-origin sentence Address Dropped the unverified cause. Both copies now say this VM's copy of ~/.claude/settings.json predates the session and its origin is unmeasured; kept the instruction not to delete settings to clear pairing. Pushed 373b7905.
Verified-as-correct notes (regex, item-6 dry-run, adapter-only prefix, ASCII) Acknowledge No change requested.

Do not merge. Blocked on review of 373b7905.

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Review complete. The diff passes every mechanical gate (pinned semantic-line-break check, markdownlint, links, skills, ASCII), but three of its prose claims do not survive checking against the tree.

Summary of Changes

Three files, two commits, 30 insertions / 8 deletions.

memories/cursor.md and docs/cursor-hook-mapping.md both replace the statement "On Cursor Cloud both can be present" with "On Cursor Cloud that instruction is unfollowable", grounded on a new sentence saying this VM's ~/.claude/settings.json "predates this session and its origin is unmeasured (see the measurement above)", plus an instruction not to treat both-present as a Cloud defect to clear by deleting settings. memories/cursor.md additionally adds a paragraph (and a matching gate-2 sentence) asserting that a last assistant message restating the brief's four required headings passes the heading check and that parse_report's fingerprint regex is what closes that case, and swaps the Read-Do justification line "Reordering 5 with 6 does not change the answer" for "Item 6 consumes the dry-run output item 5 produces". shared/workflow/adversarial-self-review.md rewords one clause from "inert on that adapter path" to "inert for the adapter only".

Verified clean: the pinned check-new-line-breaks action at fdaeccc4 reports no findings on the added lines (negative control against an older base reported 171, so the detector was live), markdownlint-cli2@0.22.1 reports 0 errors, validate-skills.py, check-links.py, and check-context-closure.py all exit 0, and no added line carries non-ASCII. REVIEWED_COMMIT at hooks/no-push-without-self-review.py:116-119 does require [0-9a-fA-F]{7,40}, so that half of the fingerprint claim is accurate. Item 6 does read the source ref out of the dry-run output item 5 runs, so the replaced Read-Do justification is accurate.

Findings

  1. [Factual Error] memories/cursor.md:401-403 and docs/cursor-hook-mapping.md:89-91 — "this VM's copy of ~/.claude/settings.json / predates this session and its origin is unmeasured / (see the measurement above)". The cited measurement contains no timing observation. memories/cursor.md:388-396 records only that /home/ubuntu/.claude/settings.json exists and binds the guard under PreToolUse, and then says explicitly "That measurement does not say how this VM's copy got there"; docs/cursor-hook-mapping.md:76-81 says the same. No timing measurement of that path exists anywhere in the tree (predates, mtime, stat -c return no such site). shared/writing/citations.md:342-352, in this same tree, names this exact failure: "Reaching for a stronger word ('predates', 'originally', 'since') than the evidence supports is the same overclaiming failure as a fabricated citation." AGENTS.md's temporal-limitations section additionally requires explicit provenance, and "this session" carries no date, session id, or command. Concrete failure: a later reader takes the file's pre-session existence as measured and skips the measurement the very next sentence makes a precondition for acting. (An independent read on a Cursor Cloud VM of this repo gives mtime 2026-08-26 04:25:45 against a boot of 2026-08-26 00:50:35, i.e. written after boot — which does not settle the author's claim either way, and is the point: the sentence asserts a fact nothing in the diff or the tree measured.)

  2. [Defect] memories/cursor.md:400-406, memories/cursor.md:597, and docs/cursor-hook-mapping.md:88-94 — "that instruction is unfollowable" is left with no grounds that support it. Commit 373b7905 removed the clause that did support it ("and this session cannot disable that image-level file / without writing outside the checkout") and kept the conclusion, so the colon now introduces a justification that establishes something else: an unmeasured origin is a reason not to delete the file, which the following sentence already states independently, not a reason the desktop instruction cannot be followed. The instruction is about enablement — memories/cursor.md:398-399, "leave one path enabled" — and memories/cursor.md:394-395 states that whether Claude Code's native runner fires on Cloud "is unmeasured as of 2026-08-26 PDT", so whether both paths are enabled on Cloud is itself unknown; the diff asserts an impossibility over that unknown. The compact copy at line 597 forwards the bare conclusion with no grounds at all. Concrete failure: a reader who accepts "unfollowable" stops asking the native-runner question the same paragraph makes a precondition, and a reader who checks the grounds finds a non sequitur where a measured permissive statement used to be.

  3. [Edge Case] memories/cursor.md:183-185 (parse_report's fingerprint regex is what closes that case) and memories/cursor.md:479-481 (A last assistant message that restates the brief's required shape still passes this heading check; gate 3's fingerprint regex is what refuses a placeholder). The closure holds only when the restatement's Reviewed-Commit line carries no 7-40 hex run. REVIEWED_COMMIT at hooks/no-push-without-self-review.py:116-119 accepts any such run after the label, and gate 3 at memories/cursor.md:484-485 accepts a fingerprint that prefix-matches HEAD. The reachable case is the one this same paragraph names two lines earlier at memories/cursor.md:177-178: a child that "errored after quoting the shape" — a plan or draft that had already run git rev-parse HEAD, wrote the real sha on a Reviewed-Commit line and Ready for merge above it. .claude/agents/adversarial-reviewer.md:55 ("Read that sha yourself rather than taking it from the brief") confirms a real sha in such a body is expected, not exotic. That body passes gate 2 — which the diff now explicitly instructs the reader not to refuse — then gate 3, gate 4 (HEAD unchanged), and gates 5-6 (which read only the push argv). Concrete failure: the added sentence directs the reader past the only gate that inspects whether the body is a review at all, on the strength of a refusal the regex does not provide, so a non-report authorizes a push.

  4. [Convention] shared/workflow/adversarial-self-review.md:148-149 — so ALLOW_UNREVIEWED_PUSH=1 is inert for the adapter only / under any reviewer. The inserted "only" now sits adjacent to "under any reviewer", so its scope is ambiguous between "inert for the adapter only" (the reading lines 185-187 support) and "inert for the adapter, only under any reviewer". The replaced wording, "inert on that adapter path under any reviewer", carried no such ambiguity, and the sibling site skills/push/SKILL.md:78 states the same fact without stacking the two modifiers. This is the misplaced-modifier case shared/writing/plain-prose.md and shared/writing/ambiguous-reference.md govern. Concrete failure: a reader can take the sentence as qualifying the reviewer condition rather than restricting the inertness to the adapter, which inverts the operative guidance about the native guard's escape.

Verdict: Needs more work

Reviewed-Commit: 373b790

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

Address Task child bc-a66c522f of 373b790: drop predates/unfollowable
on settings.json; state the decoder regex refuses a placeholder only
(ai-config#2343); disambiguate adapter inertness from the native guard.

Co-authored-by: dem-extra1 <dem-extra1@users.noreply.github.com>
@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Addressed Task child bc-a66c522f of 373b7905 (Needs more work; parse_report needs_work, fingerprint prefix-matched HEAD). Pushed ffd5fc96.

# Tag Disposition
1 "predates this session" overclaims the existence measurement Address Dropped the timing claim. Both copies now say the file can already exist (see the measurement above) and that whether the native runner fires is unmeasured as of 2026-08-26 PDT.
2 "unfollowable" had no remaining grounds Address Dropped that word. Kept the instruction not to delete settings to clear pairing. Compact copy at the Don't list now matches.
3 Fingerprint regex does not close a restatement that already carries a real HEAD sha Address (overclaim) / Defer (decoder fix) Recipe now says the regex refuses a placeholder and does not refuse a restatement with a real HEAD-matching sha. Decoder fix tracked as #2343.
4 "inert for the adapter only / under any reviewer" misplaced modifier Address Split: inert for the adapter under any reviewer, and not inert for a native guard.

Do not merge. Blocked on review of ffd5fc96.

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

I have verified the substantive claims empirically and run the repo's gates. Emitting the review.

Summary of Changes

Three files, three commits, 36 insertions / 9 deletions on cursor/cloud-pairing-unfollowable-32a3.

  • docs/cursor-hook-mapping.md (lines 88--95) replaces the assertion "On Cursor Cloud both can be present" with a statement that ~/.claude/settings.json can already exist on Cloud, that whether the native runner also fires is unmeasured as of 2026-08-26 PDT, and an instruction not to treat both-present as a Cloud defect to clear by deleting settings.
  • memories/cursor.md makes four edits: a decoder note (lines 179--188) recording that a last assistant message restating the brief's four headings passes the heading check, that parse_report's REVIEWED_COMMIT regex refuses a placeholder but not a restatement carrying a real HEAD-matching sha, citing #2343; the same pairing rewrite as the docs file (lines 403--411); a Read-Do rationale change at line 442 from "Reordering 5 with 6 does not change the answer" to "Item 6 consumes the dry-run output item 5 produces"; a gate-2 checklist note (lines 481--486); and the Do/Don't compact copy at lines 602--603.
  • shared/workflow/adversarial-self-review.md (line 149) changes "ALLOW_UNREVIEWED_PUSH=1 is inert on that adapter path under any reviewer" to "is inert for the adapter under any reviewer, and is not inert for a native guard".

What I verified rather than accepted. I loaded parse_report() from the branch's own hooks/no-push-without-self-review.py and ran it on both bodies: the persona's literal placeholder yields ('clean', None), and the same body with a real sha yields ('clean', 'ffd5fc96...') so both halves of the lines 183--188 claim hold, and gate 3 does refuse the first. REVIEWED_COMMIT is [0-9a-fA-F]{7,40} with only whitespace, asterisks and a backtick permitted between the label and the hex, confirming the "7-40 hex characters" statement. Issue #2343 exists, is OPEN, and its body matches what the diff attributes to it. The item 5 / item 6 dependency is real: lines 349--366 derive the source-ref check from the dry-run's -> lines, so item 6 has no input until item 5 runs. The override claim is real: main() at lines 1199--1201 does if has_allow_override(env): continue. I ran the pinned CI gate (Morrison-Lab/gha/check-new-line-breaks@fdaeccc4, fetched at that SHA) with the workflow's own inputs --- clean --- and proved the detector was not vacuous with a negative control in a throwaway repo, which it flagged at exit 1. validate-skills.py, check-links.py, check-context-closure.py, check-memory-file-size.py, check-stale-records.py and markdownlint-cli2@0.22.1 all exit 0 (statuses taken before the pipe). No non-ASCII in added lines. Deleted lines drop no load-bearing logic, and no other site in the tree still carries the retired "both can be present" or "Reordering 5 with 6" wording, so the sweep is consistent.

Findings

  1. [Convention] docs/cursor-hook-mapping.md:88-91 restates, ten lines later in the same section, both facts already stated at lines 76-81: that Cursor Cloud can have ~/.claude/settings.json (76-78, with the measurement) and that whether Claude Code's native hook runner also fires on Cloud is unmeasured as of 2026-08-26 PDT (79-81). The added block's only new content is lines 92-95. Consolidating to those lines loses nothing, which is the litmus test shared/workflow/challenge-redundant-content.md sets for flagging duplication. Concrete failure: two dated copies of one measurement in one section, so a later session that re-measures the native runner must find and update both, and a stale copy contradicts the fresh one with no check able to see it.

  2. [Convention] memories/cursor.md:403-406 and 409-411 are the same duplication inside the procedure prose, at closer range. Line 403-404 restates lines 391-393; lines 405-406 restate lines 397-398 nearly word for word; line 409 restates lines 385-386 and 400; lines 410-411 restate lines 387-390. Of the nine changed lines only 407-408 is new. This is not the file's designed compact copy --- that lives at lines 596-604 and is separately updated by this same diff --- so the duplication is within one prose passage. Same concrete failure as finding 1, three to twenty lines apart instead of ten.

  3. [Convention] memories/cursor.md:403 --- "On Cursor Cloud, that file can already exist". The nearest noun phrases before the demonstrative are "the project adapter" and "native Claude hooks" (lines 401-402); the intended referent, /home/ubuntu/.claude/settings.json, is eleven lines back at line 392. "That file" therefore reads smoothly as the project adapter file, which is the failure mode shared/writing/ambiguous-reference.md names as the dangerous one --- a wrong referent that sits closer and reads perfectly well, so the reader takes away the wrong fact without pausing. The remedy that fragment specifies is to name the noun, not to gesture at it with "(see the measurement above)". Note that the parallel sentence at docs/cursor-hook-mapping.md:88 does not have this problem: "Claude settings" sits immediately before it on line 87, so the nearest antecedent there is the intended one.

  4. [Convention] memories/cursor.md:407 and docs/cursor-hook-mapping.md:92 --- "Until both are measured". The referring expression has two readings, and under either one member of the pair is already measured by the immediately preceding clause. Read as (file exists, native runner fires), the first is measured --- the same sentence says so via "see the measurement above". Read as (adapter path, native path), the adapter path is measured at memories/cursor.md:385-386 (2026-08-25 PDT). Both readings reduce to the same actionable condition, so the cost is a pause rather than a wrong action, but this sentence is the stated retirement condition for a standing instruction, in a file whose value is precise measurement bookkeeping. Concrete failure: a later session sweeping for what is still unmeasured cannot tell from the sentence which measurement lifts the instruction, so the caveat outlives its cause. One word fixes it: "Until the native runner's firing is measured".

  5. [Edge Case] shared/workflow/adversarial-self-review.md:149 --- "and is not inert for a native guard" adds a capability claim with neither the default nor the observable that licenses acting on it. memories/cursor.md:384-390 carries both: the default is "do not prefix ALLOW_UNREVIEWED_PUSH=1" on an adapter-path session, and the trigger is "only after a native PreToolUse deny of the unprefixed push". The fragment carries neither, while its own line 135 already instructs prefixing in the adjacent CLI-fallback case, and memories/cursor.md:397-398 says whether a native runner fires on Cloud is unmeasured. Concrete failure: a reader on Cursor Cloud, holding only this fragment, prefixes preemptively because a native guard "might" be running; since the prefix is honored unconditionally (has_allow_override(env)continue, hooks/no-push-without-self-review.py:1200-1201), that ships a push whose verdict was never checked by any guard --- the exact property the guard exists to hold. The (see memories/cursor.md) parenthetical points at the missing half but does not state it, and the fragment is transcluded by a second consumer that has no memories/ tree to follow the link into.

  6. [Convention] memories/cursor.md:483 --- "gate 3's fingerprint regex" misattributes REVIEWED_COMMIT. That regex belongs to parse_report(), which gate 2 invokes (line 475); gate 3 only consumes the tuple, as line 441 states and as this diff's own lines 183-185 state correctly ("parse_report's fingerprint regex ... and gate 3 refuses"). Gate 3's own text at lines 489-492 contains no regex. Concrete failure: an internal contradiction between two passages added by the same diff, in a file whose gate-by-gate attribution is load-bearing (compare lines 167-168, "The decoder decides that; parse_report() does not"), so a reader implementing the decoder from the checklist alone can place the fingerprint refusal after the point where the recipe requires parse_report to have already run.

Verdict: Needs more work

Reviewed-Commit: ffd5fc9

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

Address Task child bc-4e9a147c of ffd5fc9: keep only the new
instruction (do not delete settings until native-runner firing is
measured); drop "that file" / "until both"; attribute the fingerprint
regex to parse_report; drop the fragment's native-guard capability claim.

Co-authored-by: dem-extra1 <dem-extra1@users.noreply.github.com>
@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Addressed Task child bc-4e9a147c of ffd5fc96 (Needs more work; parse_report needs_work, fingerprint prefix-matched HEAD). Pushed 134fd1de.

# Tag Disposition
1 Docs restated the existence/unmeasured-native facts Address Cloud block is now only the new instruction: do not delete settings until the native runner's firing is measured.
2 Same duplication in memories/cursor.md procedure Address Dropped the restatement, including the adapter-skip / native-deny recap that already sits in the surrounding paragraphs.
3 "that file" had the wrong nearer antecedent Address Sentence no longer uses "that file".
4 "Until both are measured" was ambiguous Address Now "until the native runner's firing is measured".
5 Fragment claimed native-guard non-inertness without the default or the deny observable Address Dropped that clause. Prefix license stays in memories/cursor.md.
6 "gate 3's fingerprint regex" misattributed REVIEWED_COMMIT Address Checklist now says parse_report's fingerprint regex (gate 2 invokes it; gate 3 consumes the tuple).

Do not merge. Blocked on review of 134fd1de.

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

I have everything I need. Verified the diff against the hook's actual regex, ran the pinned CI gates, and checked the cited issue.

Summary of Changes

Four commits on cursor/cloud-pairing-unfollowable-32a3 edit three prose files and no code.

memories/cursor.md gains two copies of a caveat about the Cursor Cloud transcript decoder: a last assistant message that merely restates the brief's four required headings passes the decoder's heading check, parse_report's REVIEWED_COMMIT regex yields no fingerprint for a placeholder (so gate 3 refuses), and a restatement carrying a real HEAD-matching sha is not refused by that regex, with #2343 cited. The same file replaces the Read-Do preamble's "Reordering 5 with 6 does not change the answer" with "Item 6 consumes the dry-run output item 5 produces", and replaces the Cursor Cloud adapter/native-hooks pairing statement ("both can be present") with an instruction not to treat both-present as a Cloud defect to clear by deleting settings, in the procedure and again in the Do/Don't list.

docs/cursor-hook-mapping.md makes the same pairing substitution and keeps the native-deny observable. shared/workflow/adversarial-self-review.md narrows "ALLOW_UNREVIEWED_PUSH=1 is inert on that adapter path" to "inert for the adapter".

Checks I ran on the branch: the pinned Morrison-Lab/gha/check-new-line-breaks@fdaeccc4 action (clean at NLB_BASE_REF=ff43c6c6, and still clean at NLB_CLAUSE_MIN_LENGTH=1; negative control against origin/main~60 produced 11 findings, so the detector was live), scripts/check-links.py, scripts/validate-skills.py, scripts/check-context-closure.py, scripts/check-stale-records.py, markdownlint-cli2@0.22.1, and a non-ASCII scan of added lines. All clean. I also loaded parse_report from the branch's own hook and confirmed the three regex claims empirically: the persona's literal placeholder returns ('clean', None), and a plan-shaped body with a real HEAD sha returns ('clean', '134fd1de...'). #2343 exists, is open, and matches what the diff attributes to it.

Findings

  1. [Defect] memories/cursor.md:596-598 --- the compact Do/Don't copy of the pairing instruction drops the release condition that both other copies written in the same commit carry. The procedure copy (memories/cursor.md:403-405) and the docs copy (docs/cursor-hook-mapping.md:88-90) both end "until the native runner's firing is measured"; the bullet ends "(see the pairing rule in the procedure above)". A reader working the Do/Don't list takes the hold as unconditional and will not delete ~/.claude/settings.json even after a native deny has measured the runner firing. The bullet is also where both nouns go unnamed: neither "both" nor which "settings" file is named inside it.

  2. [Edge Case] memories/cursor.md:475-480, and its procedure twin at memories/cursor.md:179-188 --- inside a checklist introduced as "Refusal gates, in order", every other clause of gate 2 names something that fails the gate. The added clause is the only one that names something which passes, and it prescribes nothing. Measured on the branch's own hook, a restatement with a real HEAD sha returns ('clean', '134fd1de...'), so an operator following the Read-Do list pushes a branch whose only "review" was the child's plan. #2343 tracks the mechanical fix. The wording available without touching the decoder is the negative form: a plan or apology that reproduces the four headings is not a report; refuse it.

  3. [Convention] docs/cursor-hook-mapping.md:91-92 --- "the unprefixed push" has no antecedent in this document. The only "prefix" the file defines is the MCP: matcher prefix at line 25, which is the nearer and wrong antecedent.

Verdict: Needs more work

Reviewed-Commit: 134fd1d

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

Address Task child bc-1fe50da0 of 134fd1d: Do/Don't names
settings.json and "until the native runner's firing is measured";
a restatement of the brief is not a report (refuse it); mapping doc
drops "unprefixed push".

Co-authored-by: dem-extra1 <dem-extra1@users.noreply.github.com>
@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Addressed Task child bc-1fe50da0 of 134fd1de (Needs more work; parse_report needs_work, fingerprint prefix-matched HEAD). Pushed f9f6fab9.

# Tag Disposition
1 Compact pairing bullet dropped the release condition and unnamed both nouns Address Do/Don't now names adapter plus ~/.claude/settings.json and "until the native runner's firing is measured".
2 Gate 2 named a restatement as something that still passes Address Procedure and checklist: a restatement of the brief is not a report; refuse it. Decoder hole remains #2343.
3 "unprefixed push" had no antecedent in the mapping doc Address Now "A native PreToolUse deny of a git push".

Do not merge. Blocked on review of f9f6fab9.

Posted by Cursor Grok 4.6 (AI agent) --- not written by a human.

@github-actions

Copy link
Copy Markdown
Contributor

👀 Claude Review Dispatchedrun reviewing PR #2340 at f9f6fab.

@d-morrison

Copy link
Copy Markdown
Collaborator

Driving this PR to clean --- all three findings from the last Cursor round and the round-1 Claude finding are already addressed at head f9f6fab; the head's automatic review skipped (bot-sender gate), so a workflow_dispatch review was issued for it. Please hold off on pushing to this branch until I'm done.

Posted by Claude Code (AI agent) --- not written by a human.

@github-actions

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


Review Summary

This PR (#2340) lands leftover Address items from a prior post-merge child review of #2272. It's a small, 3-file, prose-only documentation PR (no executable code) touching docs/cursor-hook-mapping.md, memories/cursor.md, and shared/workflow/adversarial-self-review.md.

Context: This PR went through extensive self-review by the Cursor Grok agent driving it — six rounds total, addressing findings from both the round-1 GitHub Claude review (posted 2026-08-26T20:21:43Z) and several internal Task-child reviews. The round-1 finding I would independently have raised — a new "the VM image already writes ~/.claude/settings.json" causal claim contradicting the adjacent, unmodified "does not say how this VM's copy got there" / "in-tree writer is scripts/install-hooks.py" sentences — was fully addressed by commit 373b7905 and further refined through ffd5fc96, 134fd1de, and f9f6fab9 (current HEAD). I re-verified the current HEAD content directly (not just the diff) and confirmed the paragraph no longer asserts an unverified mechanism; it now correctly states only that the file "can already exist" (measured) and that whether the native runner also fires is "unmeasured," with no unsupported causal claim.

I independently re-checked the other substantive claims against the actual code/repo state rather than trusting the PR's own claims:

  • memories/cursor.md:184-185REVIEWED_COMMIT regex claim ("requires 7-40 hex characters") verified against hooks/no-push-without-self-review.py:116-119: exact match ([0-9a-fA-F]{7,40}).
  • memories/cursor.md:187, 481-484 — Citation to #2343 verified: issue exists, is open, and its title ("Decoder: restatement with a real HEAD sha still passes parse_report") matches the context it's cited in.
  • memories/cursor.md:442 — "Item 6 consumes the dry-run output item 5 produces" verified against checklist items 5-6: item 5 runs the dry-run and item 6 reads the source ref from that same dry-run output — accurate.
  • memories/cursor.md:186-188 — "gate 3 refuses" (fingerprint check) correctly attributed to gate 3 (verdict/fingerprint check), distinct from gate 2 (which invokes parse_report) — consistent with the round-6 correction.
  • Cross-file phrase consistency — "inert for the adapter" now used consistently in memories/cursor.md, shared/workflow/adversarial-self-review.md, and skills/push/SKILL.md (unchanged in this PR but cited as the target of consistency).
  • No non-ASCII punctuation introduced in any added line (checked programmatically against the diff).
  • No dangling/ambiguous "the unprefixed push" reference remains in docs/cursor-hook-mapping.md (replaced with "a git push"); the phrase's continued use in memories/cursor.md is fine since that file separately establishes the ALLOW_UNREVIEWED_PUSH prefix context.

I found no new, unresolved defects. The one substantive issue this PR ever had was already caught and fixed across its own review lifecycle before this round.

Verdict

Ready for merge — the round-1 finding (unverified "VM image" causal claim) and every finding raised in Cursor's own internal review rounds have been addressed at HEAD f9f6fab9. I independently re-verified the corrected claims against the actual file contents and found no surviving or new issues.

Reviewed commit: f9f6fab

@github-actions

Copy link
Copy Markdown
Contributor

💰 Cost: $1.5932 (review) — run

@d-morrison
d-morrison merged commit 6c72f33 into main Aug 27, 2026
10 checks passed
@d-morrison
d-morrison deleted the cursor/cloud-pairing-unfollowable-32a3 branch August 27, 2026 16:39
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.

Land leftover Address from #2272 post-merge child review

3 participants