From 984f863ebd43afcd02f9078ec1067edaf1628256 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 22:47:09 +0000 Subject: [PATCH 01/11] test(shared): reproduce #22181 slashed extensionless inline code with a line suffix becoming a file chip Co-Authored-By: Claude Opus 5.5 --- packages/shared/src/markdownLinks.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/shared/src/markdownLinks.test.ts b/packages/shared/src/markdownLinks.test.ts index 01d9192e17e5c..29657bc2b5ad2 100644 --- a/packages/shared/src/markdownLinks.test.ts +++ b/packages/shared/src/markdownLinks.test.ts @@ -28,6 +28,9 @@ describe("inlineCodeFilePathCandidate", () => { ["share/man/ls.1", "share/man/ls.1"], ["src/main.ts/", null], ["./patches/", "./patches/"], + // regression: #22181 a `:line` suffix does not make an extensionless basename a file + ["I/W217:220", null], + ["foo/TODO:12", null], ])("distinguishes file paths from code and hostnames in %s", (source, candidate) => { expect(inlineCodeFilePathCandidate(source)).toBe(candidate); }); From 73e47aa935e95be78f7c964f6dd69947ad00bd0f Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 22:48:42 +0000 Subject: [PATCH 02/11] fix(shared): slashed extensionless inline code with a line suffix stays plain code `I/W217:220` and `foo/TODO:12` no longer become file chips. A relative slashed inline-code path with a position now needs a file extension or a conventional extensionless name (Makefile, Dockerfile, ...); explicit ./, ../, ~/ and absolute paths are unchanged. Fixes #22181 Co-Authored-By: Claude Opus 5.5 --- packages/shared/src/markdownLinks.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/markdownLinks.ts b/packages/shared/src/markdownLinks.ts index 6e985ccdb0fee..17f89df7aab26 100644 --- a/packages/shared/src/markdownLinks.ts +++ b/packages/shared/src/markdownLinks.ts @@ -189,7 +189,11 @@ export function inlineCodeFilePathCandidate(codeText: string): string | null { .split(/[\\/]/) .at(-1) ?? ""; if (VERSION_SUFFIX_PATTERN.test(basename)) return null; - if (!hasPosition && !FILE_EXTENSION_PATTERN.test(basename)) return null; + if (!FILE_EXTENSION_PATTERN.test(basename)) { + if (!hasPosition) return null; + // A `:line` suffix alone does not make `I/W217:220` a file reference. + if (withoutPosition.includes("/") && !EXTENSIONLESS_FILE_NAMES.has(basename)) return null; + } } return candidate; } From fabd3341d8d27068e86e2b80854031a880e7a727 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 22:52:03 +0000 Subject: [PATCH 03/11] test(shared): record the #22181 boundary for extensionless paths with a line suffix Co-Authored-By: Claude Opus 5.5 --- packages/shared/src/markdownLinks.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/shared/src/markdownLinks.test.ts b/packages/shared/src/markdownLinks.test.ts index 29657bc2b5ad2..c59c4541bcc0c 100644 --- a/packages/shared/src/markdownLinks.test.ts +++ b/packages/shared/src/markdownLinks.test.ts @@ -31,6 +31,9 @@ describe("inlineCodeFilePathCandidate", () => { // regression: #22181 a `:line` suffix does not make an extensionless basename a file ["I/W217:220", null], ["foo/TODO:12", null], + ["bin/run:12", null], + ["docs/README:12", "docs/README:12"], + ["./bin/run:12", "./bin/run:12"], ])("distinguishes file paths from code and hostnames in %s", (source, candidate) => { expect(inlineCodeFilePathCandidate(source)).toBe(candidate); }); From 1f1e8c635ad8a840bc366b031579473811ff2cad Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 23:04:02 +0000 Subject: [PATCH 04/11] test: add deterministic markdown link evidence fixture --- scripts/fixtures/issue-22181/attachment.md | 3 ++ scripts/fixtures/issue-22181/payload.md | 19 +++++++ scripts/fixtures/issue-22181/seed.py | 52 +++++++++++++++++++ scripts/fixtures/issue-22181/workspace/TODO | 20 +++++++ .../fixtures/issue-22181/workspace/bin/run | 20 +++++++ .../issue-22181/workspace/docs/README | 20 +++++++ .../issue-22181/workspace/docs/bin/run | 20 +++++++ .../issue-22181/workspace/docs/proof.md | 19 +++++++ .../fixtures/issue-22181/workspace/other/TODO | 20 +++++++ .../packages/shared/src/markdownLinks.ts | 20 +++++++ 10 files changed, 213 insertions(+) create mode 100644 scripts/fixtures/issue-22181/attachment.md create mode 100644 scripts/fixtures/issue-22181/payload.md create mode 100644 scripts/fixtures/issue-22181/seed.py create mode 100644 scripts/fixtures/issue-22181/workspace/TODO create mode 100644 scripts/fixtures/issue-22181/workspace/bin/run create mode 100644 scripts/fixtures/issue-22181/workspace/docs/README create mode 100644 scripts/fixtures/issue-22181/workspace/docs/bin/run create mode 100644 scripts/fixtures/issue-22181/workspace/docs/proof.md create mode 100644 scripts/fixtures/issue-22181/workspace/other/TODO create mode 100644 scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts diff --git a/scripts/fixtures/issue-22181/attachment.md b/scripts/fixtures/issue-22181/attachment.md new file mode 100644 index 0000000000000..16a5b6b953ac7 --- /dev/null +++ b/scripts/fixtures/issue-22181/attachment.md @@ -0,0 +1,3 @@ +No workspace context. `I/W217:220` `foo/TODO:12` `docs/README:12` `./bin/run:12` + +Absolute options control: `/tmp/proof.ts:12` diff --git a/scripts/fixtures/issue-22181/payload.md b/scripts/fixtures/issue-22181/payload.md new file mode 100644 index 0000000000000..4e82ec0e62cd3 --- /dev/null +++ b/scripts/fixtures/issue-22181/payload.md @@ -0,0 +1,19 @@ +The V5 file includes the `I/W217:220` fix (columns I and W, rows 217–220). + +Rejected: `A/B12:40`, `foo/TODO:12`, `bin/run:12`, `foo/TODO:12:3`, `foo\TODO:12`. + +Retained: `packages/shared/src/markdownLinks.ts:12`, `docs/README:12`, `./bin/run:12`, `TODO:12`, `../bin/run:12`. + +Plain: `W217:W220`, `E29:E31`, `foo/TODO`, `src/main.ts/`. + +Authored: [I/W217:220](I/W217:220), [friendly label](foo/TODO:12), [`foo/TODO:12`](foo/TODO:12). + +Collision: `foo/TODO:12` and [TODO](other/TODO:12). + +Wrap near the right edge: `I/W217:220` and `foo/TODO:12`, then `docs/README:12`. + +```text +I/W217:220 foo/TODO:12 bin/run:12 +``` + +Absolute controls: `/tmp/proof.ts:12`, `C:\proof\main.ts:12`, `.\bin\run:12`. diff --git a/scripts/fixtures/issue-22181/seed.py b/scripts/fixtures/issue-22181/seed.py new file mode 100644 index 0000000000000..e93587c79dd5d --- /dev/null +++ b/scripts/fixtures/issue-22181/seed.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""Seed only a stopped, migrated evidence home; never reads live T3 data. + +Usage: python3 scripts/fixtures/issue-22181/seed.py +Direct projections prove client presentation, not orchestration business behavior. +""" +import json, sqlite3, sys +from pathlib import Path +p=Path(__file__).resolve().parent +home=Path(sys.argv[1]).resolve() +if '.t3/evidence' not in str(home): + raise SystemExit('Expected isolated worktree .t3/evidence home') +c=sqlite3.connect(home/'userdata/statev2.sqlite') +def insert(table, **values): + c.execute(f"INSERT OR REPLACE INTO {table} ({','.join(values)}) VALUES ({','.join('?' for _ in values)})",list(values.values())) +def dump(v): return json.dumps(v,ensure_ascii=False) +t='2026-10-01T12:00:00.000Z';tid='proof-22181';pid='proof-project-22181';rid='proof-run-22181' +root='/tmp/issue-22181-workspace'; +import shutil +shutil.copytree(p/'workspace',root,dirs_exist_ok=True) +model={'instanceId':'codex','model':'gpt-5.4'} +c.execute('DELETE FROM projection_projects') +for table in ['orchestration_v2_projection_threads','orchestration_v2_projection_runs','orchestration_v2_projection_messages','orchestration_v2_projection_turn_items']: + c.execute('DELETE FROM '+table) +insert('projection_projects',project_id=pid,title='Markdown proof',workspace_root=root,scripts_json='[]',created_at=t,updated_at=t) +thread=dict(createdBy='user',creationSource='web',id=tid,projectId=pid,title='Markdown literal proof',providerInstanceId='codex',modelSelection=model,runtimeMode='full-access',interactionMode='default',branch=None,worktreePath=None,activeProviderThreadId=None,lineage={'parentThreadId':None,'relationshipToParent':None,'rootThreadId':tid},forkedFrom=None,createdAt=t,updatedAt=t,archivedAt=None,settledOverride=None,settledAt=None,deletedAt=None) +insert('orchestration_v2_projection_threads',thread_id=tid,project_id=pid,title=thread['title'],default_provider='codex',runtime_mode='full-access',interaction_mode='default',created_at=t,updated_at=t,payload_json=dump(thread),provider_instance_id='codex') +run=dict(id=rid,threadId=tid,ordinal=1,providerInstanceId='codex',modelSelection=model,providerThreadId=None,userMessageId='proof-user',rootNodeId=None,activeAttemptId=None,status='completed',requestedAt=t,startedAt=t,completedAt=t,checkpointId=None,contextHandoffId=None) +insert('orchestration_v2_projection_runs',run_id=rid,thread_id=tid,ordinal=1,provider='codex',status='completed',requested_at=t,completed_at=t,payload_json=dump(run),provider_instance_id='codex') +text=(p/'payload.md').read_text() +attachment=dict(type='file',id='proof-22181-00000000-0000-4000-8000-000000000001-md',name='attachment.md',mimeType='text/markdown',sizeBytes=(p/'attachment.md').stat().st_size) +for n,role in enumerate(['user','assistant']): + mid='proof-'+role;stamp=f'2026-10-01T12:00:0{n}.000Z' + msg=dict(createdBy='user' if n==0 else 'agent',creationSource='web' if n==0 else 'provider',id=mid,threadId=tid,runId=rid,nodeId=None,role=role,text=text,attachments=[attachment] if n==0 else [],streaming=False,createdAt=stamp,updatedAt=stamp) + insert('orchestration_v2_projection_messages',message_id=mid,thread_id=tid,run_id=rid,role=role,streaming=0,created_at=stamp,updated_at=stamp,payload_json=dump(msg)) + item=dict(id='item-'+mid,threadId=tid,runId=rid,nodeId=None,providerThreadId=None,providerTurnId=None,nativeItemRef=None,parentItemId=None,ordinal=n+1,status='completed',title=None,startedAt=stamp,completedAt=stamp,updatedAt=stamp,type=role+'_message',messageId=mid,text=text,attachments=msg['attachments']) + if n==0: item.update(createdBy='user',creationSource='web',inputIntent='turn_start') + else: item['streaming']=False + insert('orchestration_v2_projection_turn_items',turn_item_id=item['id'],thread_id=tid,run_id=rid,ordinal=n+1,type=item['type'],status='completed',updated_at=stamp,payload_json=dump(item)) +plan='# Deterministic plan\n\n'+''.join(f'{i}. Inspect the visible Markdown controls and preserve wrapping.\n\n' for i in range(1,15))+'15. Verify `I/W217:220`, `foo/TODO:12` and `docs/README:12`.\n' +item.update(id='proof-plan-item',type='proposed_plan',ordinal=3,planId='proof-plan',markdown=plan,streaming=False) +insert('orchestration_v2_projection_turn_items',turn_item_id=item['id'],thread_id=tid,run_id=rid,ordinal=3,type='proposed_plan',status='completed',updated_at=t,payload_json=dump(item)) +collision='Collision only: `foo/TODO:12` and [TODO](other/TODO:12).' +item.update(id='proof-collision-item',runId=None,type='assistant_message',ordinal=4,messageId='proof-collision',text=collision,streaming=False) +insert('orchestration_v2_projection_turn_items',turn_item_id=item['id'],thread_id=tid,run_id=None,ordinal=4,type='assistant_message',status='completed',updated_at=t,payload_json=dump(item)) +msg.update(id='proof-collision',runId=None,text=collision,role='assistant',attachments=[]) +insert('orchestration_v2_projection_messages',message_id=msg['id'],thread_id=tid,run_id=None,role='assistant',streaming=0,created_at=t,updated_at=t,payload_json=dump(msg)) +c.commit();c.close() +# Attachment storage is intentionally separate from workspace Markdown (no cwd). +assets=home/'userdata/attachments';assets.mkdir(parents=True,exist_ok=True) +(assets/'proof-22181-00000000-0000-4000-8000-000000000001-md.md').write_bytes((p/'attachment.md').read_bytes()) +print('Seeded',tid,'at',home,'workspace',root) diff --git a/scripts/fixtures/issue-22181/workspace/TODO b/scripts/fixtures/issue-22181/workspace/TODO new file mode 100644 index 0000000000000..d7b5156222af4 --- /dev/null +++ b/scripts/fixtures/issue-22181/workspace/TODO @@ -0,0 +1,20 @@ +TODO — fixture line 1 +TODO — fixture line 2 +TODO — fixture line 3 +TODO — fixture line 4 +TODO — fixture line 5 +TODO — fixture line 6 +TODO — fixture line 7 +TODO — fixture line 8 +TODO — fixture line 9 +TODO — fixture line 10 +TODO — fixture line 11 +TODO — fixture line 12 +TODO — fixture line 13 +TODO — fixture line 14 +TODO — fixture line 15 +TODO — fixture line 16 +TODO — fixture line 17 +TODO — fixture line 18 +TODO — fixture line 19 +TODO — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/bin/run b/scripts/fixtures/issue-22181/workspace/bin/run new file mode 100644 index 0000000000000..240d2d38fc60b --- /dev/null +++ b/scripts/fixtures/issue-22181/workspace/bin/run @@ -0,0 +1,20 @@ +bin/run — fixture line 1 +bin/run — fixture line 2 +bin/run — fixture line 3 +bin/run — fixture line 4 +bin/run — fixture line 5 +bin/run — fixture line 6 +bin/run — fixture line 7 +bin/run — fixture line 8 +bin/run — fixture line 9 +bin/run — fixture line 10 +bin/run — fixture line 11 +bin/run — fixture line 12 +bin/run — fixture line 13 +bin/run — fixture line 14 +bin/run — fixture line 15 +bin/run — fixture line 16 +bin/run — fixture line 17 +bin/run — fixture line 18 +bin/run — fixture line 19 +bin/run — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/docs/README b/scripts/fixtures/issue-22181/workspace/docs/README new file mode 100644 index 0000000000000..09c59a06a988e --- /dev/null +++ b/scripts/fixtures/issue-22181/workspace/docs/README @@ -0,0 +1,20 @@ +docs/README — fixture line 1 +docs/README — fixture line 2 +docs/README — fixture line 3 +docs/README — fixture line 4 +docs/README — fixture line 5 +docs/README — fixture line 6 +docs/README — fixture line 7 +docs/README — fixture line 8 +docs/README — fixture line 9 +docs/README — fixture line 10 +docs/README — fixture line 11 +docs/README — fixture line 12 +docs/README — fixture line 13 +docs/README — fixture line 14 +docs/README — fixture line 15 +docs/README — fixture line 16 +docs/README — fixture line 17 +docs/README — fixture line 18 +docs/README — fixture line 19 +docs/README — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/docs/bin/run b/scripts/fixtures/issue-22181/workspace/docs/bin/run new file mode 100644 index 0000000000000..f2da030d7c304 --- /dev/null +++ b/scripts/fixtures/issue-22181/workspace/docs/bin/run @@ -0,0 +1,20 @@ +docs/bin/run — fixture line 1 +docs/bin/run — fixture line 2 +docs/bin/run — fixture line 3 +docs/bin/run — fixture line 4 +docs/bin/run — fixture line 5 +docs/bin/run — fixture line 6 +docs/bin/run — fixture line 7 +docs/bin/run — fixture line 8 +docs/bin/run — fixture line 9 +docs/bin/run — fixture line 10 +docs/bin/run — fixture line 11 +docs/bin/run — fixture line 12 +docs/bin/run — fixture line 13 +docs/bin/run — fixture line 14 +docs/bin/run — fixture line 15 +docs/bin/run — fixture line 16 +docs/bin/run — fixture line 17 +docs/bin/run — fixture line 18 +docs/bin/run — fixture line 19 +docs/bin/run — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/docs/proof.md b/scripts/fixtures/issue-22181/workspace/docs/proof.md new file mode 100644 index 0000000000000..4e82ec0e62cd3 --- /dev/null +++ b/scripts/fixtures/issue-22181/workspace/docs/proof.md @@ -0,0 +1,19 @@ +The V5 file includes the `I/W217:220` fix (columns I and W, rows 217–220). + +Rejected: `A/B12:40`, `foo/TODO:12`, `bin/run:12`, `foo/TODO:12:3`, `foo\TODO:12`. + +Retained: `packages/shared/src/markdownLinks.ts:12`, `docs/README:12`, `./bin/run:12`, `TODO:12`, `../bin/run:12`. + +Plain: `W217:W220`, `E29:E31`, `foo/TODO`, `src/main.ts/`. + +Authored: [I/W217:220](I/W217:220), [friendly label](foo/TODO:12), [`foo/TODO:12`](foo/TODO:12). + +Collision: `foo/TODO:12` and [TODO](other/TODO:12). + +Wrap near the right edge: `I/W217:220` and `foo/TODO:12`, then `docs/README:12`. + +```text +I/W217:220 foo/TODO:12 bin/run:12 +``` + +Absolute controls: `/tmp/proof.ts:12`, `C:\proof\main.ts:12`, `.\bin\run:12`. diff --git a/scripts/fixtures/issue-22181/workspace/other/TODO b/scripts/fixtures/issue-22181/workspace/other/TODO new file mode 100644 index 0000000000000..113af0be41c3e --- /dev/null +++ b/scripts/fixtures/issue-22181/workspace/other/TODO @@ -0,0 +1,20 @@ +other/TODO — fixture line 1 +other/TODO — fixture line 2 +other/TODO — fixture line 3 +other/TODO — fixture line 4 +other/TODO — fixture line 5 +other/TODO — fixture line 6 +other/TODO — fixture line 7 +other/TODO — fixture line 8 +other/TODO — fixture line 9 +other/TODO — fixture line 10 +other/TODO — fixture line 11 +other/TODO — fixture line 12 +other/TODO — fixture line 13 +other/TODO — fixture line 14 +other/TODO — fixture line 15 +other/TODO — fixture line 16 +other/TODO — fixture line 17 +other/TODO — fixture line 18 +other/TODO — fixture line 19 +other/TODO — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts b/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts new file mode 100644 index 0000000000000..0830cba34e25b --- /dev/null +++ b/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts @@ -0,0 +1,20 @@ +// packages/shared/src/markdownLinks.ts — fixture line 1 +// packages/shared/src/markdownLinks.ts — fixture line 2 +// packages/shared/src/markdownLinks.ts — fixture line 3 +// packages/shared/src/markdownLinks.ts — fixture line 4 +// packages/shared/src/markdownLinks.ts — fixture line 5 +// packages/shared/src/markdownLinks.ts — fixture line 6 +// packages/shared/src/markdownLinks.ts — fixture line 7 +// packages/shared/src/markdownLinks.ts — fixture line 8 +// packages/shared/src/markdownLinks.ts — fixture line 9 +// packages/shared/src/markdownLinks.ts — fixture line 10 +// packages/shared/src/markdownLinks.ts — fixture line 11 +// packages/shared/src/markdownLinks.ts — fixture line 12 +// packages/shared/src/markdownLinks.ts — fixture line 13 +// packages/shared/src/markdownLinks.ts — fixture line 14 +// packages/shared/src/markdownLinks.ts — fixture line 15 +// packages/shared/src/markdownLinks.ts — fixture line 16 +// packages/shared/src/markdownLinks.ts — fixture line 17 +// packages/shared/src/markdownLinks.ts — fixture line 18 +// packages/shared/src/markdownLinks.ts — fixture line 19 +// packages/shared/src/markdownLinks.ts — fixture line 20 From c7a89c4d15aa32f073a6116097bd16e68ee5d13b Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 23:46:06 +0000 Subject: [PATCH 05/11] test: store the #22181 placeholder source as .txt so knip ignores it seed.py renames it back to markdownLinks.ts in the runtime workspace, so the seeded bytes and paths are unchanged. Co-Authored-By: Claude Opus 5.5 --- scripts/fixtures/issue-22181/seed.py | 3 +++ .../shared/src/{markdownLinks.ts => markdownLinks.ts.txt} | 0 2 files changed, 3 insertions(+) rename scripts/fixtures/issue-22181/workspace/packages/shared/src/{markdownLinks.ts => markdownLinks.ts.txt} (100%) diff --git a/scripts/fixtures/issue-22181/seed.py b/scripts/fixtures/issue-22181/seed.py index e93587c79dd5d..a582e3dfafa94 100644 --- a/scripts/fixtures/issue-22181/seed.py +++ b/scripts/fixtures/issue-22181/seed.py @@ -18,6 +18,9 @@ def dump(v): return json.dumps(v,ensure_ascii=False) root='/tmp/issue-22181-workspace'; import shutil shutil.copytree(p/'workspace',root,dirs_exist_ok=True) +# Stored as .txt so the repo's TS tooling (knip) never sees a fake source file. +src=Path(root)/'packages/shared/src/markdownLinks.ts' +src.with_name(src.name+'.txt').replace(src) model={'instanceId':'codex','model':'gpt-5.4'} c.execute('DELETE FROM projection_projects') for table in ['orchestration_v2_projection_threads','orchestration_v2_projection_runs','orchestration_v2_projection_messages','orchestration_v2_projection_turn_items']: diff --git a/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts b/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts.txt similarity index 100% rename from scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts rename to scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts.txt From 9a16abb2843cad650af8b92f458bc88743a68064 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 22 Oct 2026 01:33:03 +0000 Subject: [PATCH 06/11] test: derive the #22181 fixture workspace from its evidence home Two isolated evidence homes shared /tmp/issue-22181-workspace, so seeding one could change the files the other renders. Co-Authored-By: Claude Opus 5.5 --- scripts/fixtures/issue-22181/seed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/fixtures/issue-22181/seed.py b/scripts/fixtures/issue-22181/seed.py index a582e3dfafa94..0e3476e35e3a2 100644 --- a/scripts/fixtures/issue-22181/seed.py +++ b/scripts/fixtures/issue-22181/seed.py @@ -15,7 +15,7 @@ def insert(table, **values): c.execute(f"INSERT OR REPLACE INTO {table} ({','.join(values)}) VALUES ({','.join('?' for _ in values)})",list(values.values())) def dump(v): return json.dumps(v,ensure_ascii=False) t='2026-10-01T12:00:00.000Z';tid='proof-22181';pid='proof-project-22181';rid='proof-run-22181' -root='/tmp/issue-22181-workspace'; +root=str(home/'workspace') import shutil shutil.copytree(p/'workspace',root,dirs_exist_ok=True) # Stored as .txt so the repo's TS tooling (knip) never sees a fake source file. From 8ca4a90f479960794eb8359c15bf7a48d0050799 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 22 Oct 2026 06:37:50 +0000 Subject: [PATCH 07/11] test: require complete evidence home path components --- scripts/fixtures/issue-22181/seed.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/fixtures/issue-22181/seed.py b/scripts/fixtures/issue-22181/seed.py index 0e3476e35e3a2..e6a8a3cb011cf 100644 --- a/scripts/fixtures/issue-22181/seed.py +++ b/scripts/fixtures/issue-22181/seed.py @@ -8,7 +8,8 @@ from pathlib import Path p=Path(__file__).resolve().parent home=Path(sys.argv[1]).resolve() -if '.t3/evidence' not in str(home): +# Whole components after symlink resolution: rejects `.t3/evidence-existing` and aliases. +if ('.t3','evidence') not in zip(home.parts,home.parts[1:]): raise SystemExit('Expected isolated worktree .t3/evidence home') c=sqlite3.connect(home/'userdata/statev2.sqlite') def insert(table, **values): From f49e4f518900f576461c2b0837bb0c5ac3656f6d Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 11 Nov 2026 03:08:06 +0000 Subject: [PATCH 08/11] chore: drop issue-22181 evidence fixtures AI-assisted; verified with the tests and tools listed above. --- scripts/fixtures/issue-22181/attachment.md | 3 - scripts/fixtures/issue-22181/payload.md | 19 ------- scripts/fixtures/issue-22181/seed.py | 56 ------------------- scripts/fixtures/issue-22181/workspace/TODO | 20 ------- .../fixtures/issue-22181/workspace/bin/run | 20 ------- .../issue-22181/workspace/docs/README | 20 ------- .../issue-22181/workspace/docs/bin/run | 20 ------- .../issue-22181/workspace/docs/proof.md | 19 ------- .../fixtures/issue-22181/workspace/other/TODO | 20 ------- .../packages/shared/src/markdownLinks.ts.txt | 20 ------- 10 files changed, 217 deletions(-) delete mode 100644 scripts/fixtures/issue-22181/attachment.md delete mode 100644 scripts/fixtures/issue-22181/payload.md delete mode 100644 scripts/fixtures/issue-22181/seed.py delete mode 100644 scripts/fixtures/issue-22181/workspace/TODO delete mode 100644 scripts/fixtures/issue-22181/workspace/bin/run delete mode 100644 scripts/fixtures/issue-22181/workspace/docs/README delete mode 100644 scripts/fixtures/issue-22181/workspace/docs/bin/run delete mode 100644 scripts/fixtures/issue-22181/workspace/docs/proof.md delete mode 100644 scripts/fixtures/issue-22181/workspace/other/TODO delete mode 100644 scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts.txt diff --git a/scripts/fixtures/issue-22181/attachment.md b/scripts/fixtures/issue-22181/attachment.md deleted file mode 100644 index 16a5b6b953ac7..0000000000000 --- a/scripts/fixtures/issue-22181/attachment.md +++ /dev/null @@ -1,3 +0,0 @@ -No workspace context. `I/W217:220` `foo/TODO:12` `docs/README:12` `./bin/run:12` - -Absolute options control: `/tmp/proof.ts:12` diff --git a/scripts/fixtures/issue-22181/payload.md b/scripts/fixtures/issue-22181/payload.md deleted file mode 100644 index 4e82ec0e62cd3..0000000000000 --- a/scripts/fixtures/issue-22181/payload.md +++ /dev/null @@ -1,19 +0,0 @@ -The V5 file includes the `I/W217:220` fix (columns I and W, rows 217–220). - -Rejected: `A/B12:40`, `foo/TODO:12`, `bin/run:12`, `foo/TODO:12:3`, `foo\TODO:12`. - -Retained: `packages/shared/src/markdownLinks.ts:12`, `docs/README:12`, `./bin/run:12`, `TODO:12`, `../bin/run:12`. - -Plain: `W217:W220`, `E29:E31`, `foo/TODO`, `src/main.ts/`. - -Authored: [I/W217:220](I/W217:220), [friendly label](foo/TODO:12), [`foo/TODO:12`](foo/TODO:12). - -Collision: `foo/TODO:12` and [TODO](other/TODO:12). - -Wrap near the right edge: `I/W217:220` and `foo/TODO:12`, then `docs/README:12`. - -```text -I/W217:220 foo/TODO:12 bin/run:12 -``` - -Absolute controls: `/tmp/proof.ts:12`, `C:\proof\main.ts:12`, `.\bin\run:12`. diff --git a/scripts/fixtures/issue-22181/seed.py b/scripts/fixtures/issue-22181/seed.py deleted file mode 100644 index e6a8a3cb011cf..0000000000000 --- a/scripts/fixtures/issue-22181/seed.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -"""Seed only a stopped, migrated evidence home; never reads live T3 data. - -Usage: python3 scripts/fixtures/issue-22181/seed.py -Direct projections prove client presentation, not orchestration business behavior. -""" -import json, sqlite3, sys -from pathlib import Path -p=Path(__file__).resolve().parent -home=Path(sys.argv[1]).resolve() -# Whole components after symlink resolution: rejects `.t3/evidence-existing` and aliases. -if ('.t3','evidence') not in zip(home.parts,home.parts[1:]): - raise SystemExit('Expected isolated worktree .t3/evidence home') -c=sqlite3.connect(home/'userdata/statev2.sqlite') -def insert(table, **values): - c.execute(f"INSERT OR REPLACE INTO {table} ({','.join(values)}) VALUES ({','.join('?' for _ in values)})",list(values.values())) -def dump(v): return json.dumps(v,ensure_ascii=False) -t='2026-10-01T12:00:00.000Z';tid='proof-22181';pid='proof-project-22181';rid='proof-run-22181' -root=str(home/'workspace') -import shutil -shutil.copytree(p/'workspace',root,dirs_exist_ok=True) -# Stored as .txt so the repo's TS tooling (knip) never sees a fake source file. -src=Path(root)/'packages/shared/src/markdownLinks.ts' -src.with_name(src.name+'.txt').replace(src) -model={'instanceId':'codex','model':'gpt-5.4'} -c.execute('DELETE FROM projection_projects') -for table in ['orchestration_v2_projection_threads','orchestration_v2_projection_runs','orchestration_v2_projection_messages','orchestration_v2_projection_turn_items']: - c.execute('DELETE FROM '+table) -insert('projection_projects',project_id=pid,title='Markdown proof',workspace_root=root,scripts_json='[]',created_at=t,updated_at=t) -thread=dict(createdBy='user',creationSource='web',id=tid,projectId=pid,title='Markdown literal proof',providerInstanceId='codex',modelSelection=model,runtimeMode='full-access',interactionMode='default',branch=None,worktreePath=None,activeProviderThreadId=None,lineage={'parentThreadId':None,'relationshipToParent':None,'rootThreadId':tid},forkedFrom=None,createdAt=t,updatedAt=t,archivedAt=None,settledOverride=None,settledAt=None,deletedAt=None) -insert('orchestration_v2_projection_threads',thread_id=tid,project_id=pid,title=thread['title'],default_provider='codex',runtime_mode='full-access',interaction_mode='default',created_at=t,updated_at=t,payload_json=dump(thread),provider_instance_id='codex') -run=dict(id=rid,threadId=tid,ordinal=1,providerInstanceId='codex',modelSelection=model,providerThreadId=None,userMessageId='proof-user',rootNodeId=None,activeAttemptId=None,status='completed',requestedAt=t,startedAt=t,completedAt=t,checkpointId=None,contextHandoffId=None) -insert('orchestration_v2_projection_runs',run_id=rid,thread_id=tid,ordinal=1,provider='codex',status='completed',requested_at=t,completed_at=t,payload_json=dump(run),provider_instance_id='codex') -text=(p/'payload.md').read_text() -attachment=dict(type='file',id='proof-22181-00000000-0000-4000-8000-000000000001-md',name='attachment.md',mimeType='text/markdown',sizeBytes=(p/'attachment.md').stat().st_size) -for n,role in enumerate(['user','assistant']): - mid='proof-'+role;stamp=f'2026-10-01T12:00:0{n}.000Z' - msg=dict(createdBy='user' if n==0 else 'agent',creationSource='web' if n==0 else 'provider',id=mid,threadId=tid,runId=rid,nodeId=None,role=role,text=text,attachments=[attachment] if n==0 else [],streaming=False,createdAt=stamp,updatedAt=stamp) - insert('orchestration_v2_projection_messages',message_id=mid,thread_id=tid,run_id=rid,role=role,streaming=0,created_at=stamp,updated_at=stamp,payload_json=dump(msg)) - item=dict(id='item-'+mid,threadId=tid,runId=rid,nodeId=None,providerThreadId=None,providerTurnId=None,nativeItemRef=None,parentItemId=None,ordinal=n+1,status='completed',title=None,startedAt=stamp,completedAt=stamp,updatedAt=stamp,type=role+'_message',messageId=mid,text=text,attachments=msg['attachments']) - if n==0: item.update(createdBy='user',creationSource='web',inputIntent='turn_start') - else: item['streaming']=False - insert('orchestration_v2_projection_turn_items',turn_item_id=item['id'],thread_id=tid,run_id=rid,ordinal=n+1,type=item['type'],status='completed',updated_at=stamp,payload_json=dump(item)) -plan='# Deterministic plan\n\n'+''.join(f'{i}. Inspect the visible Markdown controls and preserve wrapping.\n\n' for i in range(1,15))+'15. Verify `I/W217:220`, `foo/TODO:12` and `docs/README:12`.\n' -item.update(id='proof-plan-item',type='proposed_plan',ordinal=3,planId='proof-plan',markdown=plan,streaming=False) -insert('orchestration_v2_projection_turn_items',turn_item_id=item['id'],thread_id=tid,run_id=rid,ordinal=3,type='proposed_plan',status='completed',updated_at=t,payload_json=dump(item)) -collision='Collision only: `foo/TODO:12` and [TODO](other/TODO:12).' -item.update(id='proof-collision-item',runId=None,type='assistant_message',ordinal=4,messageId='proof-collision',text=collision,streaming=False) -insert('orchestration_v2_projection_turn_items',turn_item_id=item['id'],thread_id=tid,run_id=None,ordinal=4,type='assistant_message',status='completed',updated_at=t,payload_json=dump(item)) -msg.update(id='proof-collision',runId=None,text=collision,role='assistant',attachments=[]) -insert('orchestration_v2_projection_messages',message_id=msg['id'],thread_id=tid,run_id=None,role='assistant',streaming=0,created_at=t,updated_at=t,payload_json=dump(msg)) -c.commit();c.close() -# Attachment storage is intentionally separate from workspace Markdown (no cwd). -assets=home/'userdata/attachments';assets.mkdir(parents=True,exist_ok=True) -(assets/'proof-22181-00000000-0000-4000-8000-000000000001-md.md').write_bytes((p/'attachment.md').read_bytes()) -print('Seeded',tid,'at',home,'workspace',root) diff --git a/scripts/fixtures/issue-22181/workspace/TODO b/scripts/fixtures/issue-22181/workspace/TODO deleted file mode 100644 index d7b5156222af4..0000000000000 --- a/scripts/fixtures/issue-22181/workspace/TODO +++ /dev/null @@ -1,20 +0,0 @@ -TODO — fixture line 1 -TODO — fixture line 2 -TODO — fixture line 3 -TODO — fixture line 4 -TODO — fixture line 5 -TODO — fixture line 6 -TODO — fixture line 7 -TODO — fixture line 8 -TODO — fixture line 9 -TODO — fixture line 10 -TODO — fixture line 11 -TODO — fixture line 12 -TODO — fixture line 13 -TODO — fixture line 14 -TODO — fixture line 15 -TODO — fixture line 16 -TODO — fixture line 17 -TODO — fixture line 18 -TODO — fixture line 19 -TODO — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/bin/run b/scripts/fixtures/issue-22181/workspace/bin/run deleted file mode 100644 index 240d2d38fc60b..0000000000000 --- a/scripts/fixtures/issue-22181/workspace/bin/run +++ /dev/null @@ -1,20 +0,0 @@ -bin/run — fixture line 1 -bin/run — fixture line 2 -bin/run — fixture line 3 -bin/run — fixture line 4 -bin/run — fixture line 5 -bin/run — fixture line 6 -bin/run — fixture line 7 -bin/run — fixture line 8 -bin/run — fixture line 9 -bin/run — fixture line 10 -bin/run — fixture line 11 -bin/run — fixture line 12 -bin/run — fixture line 13 -bin/run — fixture line 14 -bin/run — fixture line 15 -bin/run — fixture line 16 -bin/run — fixture line 17 -bin/run — fixture line 18 -bin/run — fixture line 19 -bin/run — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/docs/README b/scripts/fixtures/issue-22181/workspace/docs/README deleted file mode 100644 index 09c59a06a988e..0000000000000 --- a/scripts/fixtures/issue-22181/workspace/docs/README +++ /dev/null @@ -1,20 +0,0 @@ -docs/README — fixture line 1 -docs/README — fixture line 2 -docs/README — fixture line 3 -docs/README — fixture line 4 -docs/README — fixture line 5 -docs/README — fixture line 6 -docs/README — fixture line 7 -docs/README — fixture line 8 -docs/README — fixture line 9 -docs/README — fixture line 10 -docs/README — fixture line 11 -docs/README — fixture line 12 -docs/README — fixture line 13 -docs/README — fixture line 14 -docs/README — fixture line 15 -docs/README — fixture line 16 -docs/README — fixture line 17 -docs/README — fixture line 18 -docs/README — fixture line 19 -docs/README — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/docs/bin/run b/scripts/fixtures/issue-22181/workspace/docs/bin/run deleted file mode 100644 index f2da030d7c304..0000000000000 --- a/scripts/fixtures/issue-22181/workspace/docs/bin/run +++ /dev/null @@ -1,20 +0,0 @@ -docs/bin/run — fixture line 1 -docs/bin/run — fixture line 2 -docs/bin/run — fixture line 3 -docs/bin/run — fixture line 4 -docs/bin/run — fixture line 5 -docs/bin/run — fixture line 6 -docs/bin/run — fixture line 7 -docs/bin/run — fixture line 8 -docs/bin/run — fixture line 9 -docs/bin/run — fixture line 10 -docs/bin/run — fixture line 11 -docs/bin/run — fixture line 12 -docs/bin/run — fixture line 13 -docs/bin/run — fixture line 14 -docs/bin/run — fixture line 15 -docs/bin/run — fixture line 16 -docs/bin/run — fixture line 17 -docs/bin/run — fixture line 18 -docs/bin/run — fixture line 19 -docs/bin/run — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/docs/proof.md b/scripts/fixtures/issue-22181/workspace/docs/proof.md deleted file mode 100644 index 4e82ec0e62cd3..0000000000000 --- a/scripts/fixtures/issue-22181/workspace/docs/proof.md +++ /dev/null @@ -1,19 +0,0 @@ -The V5 file includes the `I/W217:220` fix (columns I and W, rows 217–220). - -Rejected: `A/B12:40`, `foo/TODO:12`, `bin/run:12`, `foo/TODO:12:3`, `foo\TODO:12`. - -Retained: `packages/shared/src/markdownLinks.ts:12`, `docs/README:12`, `./bin/run:12`, `TODO:12`, `../bin/run:12`. - -Plain: `W217:W220`, `E29:E31`, `foo/TODO`, `src/main.ts/`. - -Authored: [I/W217:220](I/W217:220), [friendly label](foo/TODO:12), [`foo/TODO:12`](foo/TODO:12). - -Collision: `foo/TODO:12` and [TODO](other/TODO:12). - -Wrap near the right edge: `I/W217:220` and `foo/TODO:12`, then `docs/README:12`. - -```text -I/W217:220 foo/TODO:12 bin/run:12 -``` - -Absolute controls: `/tmp/proof.ts:12`, `C:\proof\main.ts:12`, `.\bin\run:12`. diff --git a/scripts/fixtures/issue-22181/workspace/other/TODO b/scripts/fixtures/issue-22181/workspace/other/TODO deleted file mode 100644 index 113af0be41c3e..0000000000000 --- a/scripts/fixtures/issue-22181/workspace/other/TODO +++ /dev/null @@ -1,20 +0,0 @@ -other/TODO — fixture line 1 -other/TODO — fixture line 2 -other/TODO — fixture line 3 -other/TODO — fixture line 4 -other/TODO — fixture line 5 -other/TODO — fixture line 6 -other/TODO — fixture line 7 -other/TODO — fixture line 8 -other/TODO — fixture line 9 -other/TODO — fixture line 10 -other/TODO — fixture line 11 -other/TODO — fixture line 12 -other/TODO — fixture line 13 -other/TODO — fixture line 14 -other/TODO — fixture line 15 -other/TODO — fixture line 16 -other/TODO — fixture line 17 -other/TODO — fixture line 18 -other/TODO — fixture line 19 -other/TODO — fixture line 20 diff --git a/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts.txt b/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts.txt deleted file mode 100644 index 0830cba34e25b..0000000000000 --- a/scripts/fixtures/issue-22181/workspace/packages/shared/src/markdownLinks.ts.txt +++ /dev/null @@ -1,20 +0,0 @@ -// packages/shared/src/markdownLinks.ts — fixture line 1 -// packages/shared/src/markdownLinks.ts — fixture line 2 -// packages/shared/src/markdownLinks.ts — fixture line 3 -// packages/shared/src/markdownLinks.ts — fixture line 4 -// packages/shared/src/markdownLinks.ts — fixture line 5 -// packages/shared/src/markdownLinks.ts — fixture line 6 -// packages/shared/src/markdownLinks.ts — fixture line 7 -// packages/shared/src/markdownLinks.ts — fixture line 8 -// packages/shared/src/markdownLinks.ts — fixture line 9 -// packages/shared/src/markdownLinks.ts — fixture line 10 -// packages/shared/src/markdownLinks.ts — fixture line 11 -// packages/shared/src/markdownLinks.ts — fixture line 12 -// packages/shared/src/markdownLinks.ts — fixture line 13 -// packages/shared/src/markdownLinks.ts — fixture line 14 -// packages/shared/src/markdownLinks.ts — fixture line 15 -// packages/shared/src/markdownLinks.ts — fixture line 16 -// packages/shared/src/markdownLinks.ts — fixture line 17 -// packages/shared/src/markdownLinks.ts — fixture line 18 -// packages/shared/src/markdownLinks.ts — fixture line 19 -// packages/shared/src/markdownLinks.ts — fixture line 20 From aab1acaa0fbed7c3d83446d936f3786fac10afb2 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 11 Nov 2026 03:22:51 +0000 Subject: [PATCH 09/11] fix(shared): keep Unicode-extension paths with a line suffix linkable AI-assisted; verified with the tests and tools listed above. --- packages/shared/src/markdownLinks.test.ts | 2 ++ packages/shared/src/markdownLinks.ts | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/markdownLinks.test.ts b/packages/shared/src/markdownLinks.test.ts index ca2460b74f9ce..495be09d01dfc 100644 --- a/packages/shared/src/markdownLinks.test.ts +++ b/packages/shared/src/markdownLinks.test.ts @@ -46,6 +46,8 @@ describe("inlineCodeFilePathCandidate", () => { ["bin/run:12", null], ["docs/README:12", "docs/README:12"], ["./bin/run:12", "./bin/run:12"], + ["src/資料.備份:12", "src/資料.備份:12"], + ["docs/notes.é:12", "docs/notes.é:12"], ])("distinguishes file paths from code and hostnames in %s", (source, candidate) => { expect(inlineCodeFilePathCandidate(source)).toBe(candidate); }); diff --git a/packages/shared/src/markdownLinks.ts b/packages/shared/src/markdownLinks.ts index d28b3a8bba620..a79b89e634b14 100644 --- a/packages/shared/src/markdownLinks.ts +++ b/packages/shared/src/markdownLinks.ts @@ -37,6 +37,7 @@ const PATH_SEPARATOR_PATTERN = /[\\/]/; const ELIDED_PATH_SEGMENT_PATTERN = /(?:^|[\\/])(?:\.{3,}|…)(?:[\\/]|$)/; const FILE_EXTENSION_PATTERN = /\.[A-Za-z0-9_-]+$/; +const UNICODE_FILE_EXTENSION_PATTERN = /\.[\p{L}\p{N}_-]+$/u; const VERSION_SUFFIX_PATTERN = /\d\.\d[^.]*$/; const NUMERIC_DOTTED_PATTERN = /^\d+(?:\.\d+)+$/; @@ -203,7 +204,13 @@ export function inlineCodeFilePathCandidate(codeText: string): string | null { if (!FILE_EXTENSION_PATTERN.test(basename)) { if (!hasPosition) return null; // A `:line` suffix alone does not make `I/W217:220` a file reference. - if (withoutPosition.includes("/") && !EXTENSIONLESS_FILE_NAMES.has(basename)) return null; + if ( + withoutPosition.includes("/") && + !UNICODE_FILE_EXTENSION_PATTERN.test(basename) && + !EXTENSIONLESS_FILE_NAMES.has(basename) + ) { + return null; + } } } return candidate; From 954a4ad15a92aab1a7134e0d77c5096a19a60052 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 11 Nov 2026 03:40:57 +0000 Subject: [PATCH 10/11] fix(shared): accept any extension on positioned inline-code paths AI-assisted; verified with the tests and tools listed above. --- packages/shared/src/markdownLinks.test.ts | 3 +++ packages/shared/src/markdownLinks.ts | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/shared/src/markdownLinks.test.ts b/packages/shared/src/markdownLinks.test.ts index 495be09d01dfc..4d6ad19205b10 100644 --- a/packages/shared/src/markdownLinks.test.ts +++ b/packages/shared/src/markdownLinks.test.ts @@ -48,6 +48,9 @@ describe("inlineCodeFilePathCandidate", () => { ["./bin/run:12", "./bin/run:12"], ["src/資料.備份:12", "src/資料.備份:12"], ["docs/notes.é:12", "docs/notes.é:12"], + ["docs/notes.e\u0301:12", "docs/notes.e\u0301:12"], + ["docs/notes.हिन्दी:12", "docs/notes.हिन्दी:12"], + ["src/foo.c++:12", "src/foo.c++:12"], ])("distinguishes file paths from code and hostnames in %s", (source, candidate) => { expect(inlineCodeFilePathCandidate(source)).toBe(candidate); }); diff --git a/packages/shared/src/markdownLinks.ts b/packages/shared/src/markdownLinks.ts index a79b89e634b14..b0408486c8f04 100644 --- a/packages/shared/src/markdownLinks.ts +++ b/packages/shared/src/markdownLinks.ts @@ -37,7 +37,7 @@ const PATH_SEPARATOR_PATTERN = /[\\/]/; const ELIDED_PATH_SEGMENT_PATTERN = /(?:^|[\\/])(?:\.{3,}|…)(?:[\\/]|$)/; const FILE_EXTENSION_PATTERN = /\.[A-Za-z0-9_-]+$/; -const UNICODE_FILE_EXTENSION_PATTERN = /\.[\p{L}\p{N}_-]+$/u; +const ANY_FILE_EXTENSION_PATTERN = /\.[^./\\]+$/; const VERSION_SUFFIX_PATTERN = /\d\.\d[^.]*$/; const NUMERIC_DOTTED_PATTERN = /^\d+(?:\.\d+)+$/; @@ -206,7 +206,7 @@ export function inlineCodeFilePathCandidate(codeText: string): string | null { // A `:line` suffix alone does not make `I/W217:220` a file reference. if ( withoutPosition.includes("/") && - !UNICODE_FILE_EXTENSION_PATTERN.test(basename) && + !ANY_FILE_EXTENSION_PATTERN.test(basename) && !EXTENSIONLESS_FILE_NAMES.has(basename) ) { return null; From 9a8634533487068b4b13d1ae3990eb97f2742022 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 11 Nov 2026 06:27:14 +0000 Subject: [PATCH 11/11] test(shared): trim redundant #22181 inline-code rows AI-assisted; verified with the tests and tools listed above. Co-Authored-By: Claude Opus 5.5 --- packages/shared/src/markdownLinks.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/shared/src/markdownLinks.test.ts b/packages/shared/src/markdownLinks.test.ts index 4d6ad19205b10..788424168bbe7 100644 --- a/packages/shared/src/markdownLinks.test.ts +++ b/packages/shared/src/markdownLinks.test.ts @@ -42,14 +42,10 @@ describe("inlineCodeFilePathCandidate", () => { ["src/.../main.ts", null], // regression: #22181 a `:line` suffix does not make an extensionless basename a file ["I/W217:220", null], - ["foo/TODO:12", null], ["bin/run:12", null], ["docs/README:12", "docs/README:12"], ["./bin/run:12", "./bin/run:12"], ["src/資料.備份:12", "src/資料.備份:12"], - ["docs/notes.é:12", "docs/notes.é:12"], - ["docs/notes.e\u0301:12", "docs/notes.e\u0301:12"], - ["docs/notes.हिन्दी:12", "docs/notes.हिन्दी:12"], ["src/foo.c++:12", "src/foo.c++:12"], ])("distinguishes file paths from code and hostnames in %s", (source, candidate) => { expect(inlineCodeFilePathCandidate(source)).toBe(candidate);