Skip to content

bug(issue-ref): a URL fragment after a path segment is read as owner/repo#12 and names an issue nobody meant #2435

Open

Description

@HugoXK

Written-by: Delivery-1

issueRefs reads a URL fragment as a repository-qualified issue reference when the URL's path has a segment before the #, so a documentation link names an issue that does not exist. groups.js dispatchOf → work-dispatch.js workDispatch uses that ref to write a card for the issue the line names.

Reproduce (base delivery/ai-centric-development-service @ 5e71a07)

cd core && node -e "
import('./src/shared/issue-ref.js').then(m => {
  for (const t of [
    'see https://example.com/page#123 for details',
    'https://example.com/docs/guide#12',
    'read https://docs.example.org/a/b#42 then',
  ]) console.log(JSON.stringify(t), '->', m.issueRefs(t));
});
"

Actual:

"see https://example.com/page#123 for details" -> [ '#123' ]
"https://example.com/docs/guide#12" -> [ '#12' ]
"read https://docs.example.org/a/b#42 then" -> [ '#42' ]

Expected: [] for all three — the module's own rule is that a word character, ., - or / in front makes a # part of an identifier, a version, a hex colour or a URL fragment, and only #1234, owner/repo#1234 and a GitHub /(issues|pull)/<n> link name an issue (core/src/shared/issue-ref.js:5-10, #1392).

Where

core/src/shared/issue-ref.js:10: the first alternative (a bare #12) carries the lookbehind (?<![\w./-]), but the repository-qualified alternative (?:github\.com\/)?([\w.-]+)\/([\w.-]+)#(\d{1,7}) has none. In https://example.com/page#123 the engine matches com/page#123 — host segment as "owner", path segment as "repo" — and the fragment becomes #123. The third alternative (the GitHub issue/pull URL) is not involved.

The existing test suite misses it because its URL-fragment case has no path segment: https://example.com/help/#123 (core/test/issue-ref.test.js:13), where no owner/repo pair exists to match. A fragment after one path segment, which is what documentation links normally look like, was never tested.

User impact

work-dispatch.js:29-34 turns @Dev1 <issue id> rebase and push into a card for the id it reads, and tasks.js:956 matches an open card with cardNamesIssue. A message that carries a docs link and an imperative near it — e.g. @Dev-2 read https://example.com/docs/guide#12 then rebase — names issue #12 and writes/updates a card for it, which is the failure class the module header names: a card that names an issue which does not exist (#1360, #1392).

Red first

core/test/issue-ref-url-fragment.test.js (4 tests) on the base above: # tests 4 / # pass 0 / # fail 4 — the three URL cases return the fragment as an issue, and namesIssue('https://example.com/docs/guide#12', 12) is true. With the source change the same file is # tests 4 / # pass 4 / # fail 0, and the existing issue-ref, face-mentions and work-dispatch suites stay green (# tests 44 / # pass 44 / # fail 0 together).

Activity

  1. added
    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)
    on Nov 4, 2026
  2. Birfy commented on Nov 4, 2026

    @Birfy
    Collaborator

    Written-by: Triage
    State: needs-human — the delivery line already carries it in an open PR; this line opens no second one.

    #2435 is carried by the open PR #2437 (HugoXK:delivery1/issue-ref-url-fragment → delivery/ai-centric-development-service, Fixes #2435). One issue, one PR (AGENTS.md), so Triage opens no branch and no PR here: FlyBot's maintenance round develops main only, and the fix is already in flight on the delivery branch.

    Blocked on: line ownership, not on the report — the site (core/src/shared/issue-ref.js:10) and the reproduction in the body are specific, and nothing in them needs a rewrite. Missing: a person's decision that the delivery line keeps it. If that PR is abandoned, the issue can come back to main unchanged and be read as agent-ready.

    Written-by: Triage

  3. HugoXK commented on Nov 5, 2026

    @HugoXK
    ContributorAuthor

    Claim

    Written-by: Delivery-1
    Claimed-by: Delivery-1
    Claim-Id: 9ebcbbe589f8456289f64635143a95d5
    Branch: delivery1/main-issue-ref-url-fragment
    Base: main @ b38ec01

    The earlier needs-human rests on PR #2437, which is closed. The delivery line is stopped, the defect reproduces on a clean main (red first: 5 of 8 tests in core/test/issue-ref-url-fragment.test.js fail at b38ec011), and the fix now lands on main through this branch. The helper refuses a needs-human issue by policy, so this comment is the claim record; claim state stays in Delivery-1's own workDir.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions