# Revision-bound prose evidence

Issue [#15670](https://github.com/pingdotgg/t3code/issues/15670), GitHub [#23199](https://github.com/pingdotgg/t3code/pull/23199), GitCafe [#23206](https://git.cafe/pingdotgg/t3code/pulls/23206).

Base: [defb7e6](https://git.cafe/pingdotgg/t3code/commit/defb7e6e6b87d03259745367214db13060fb322b). Head: [551f891](https://git.cafe/pingdotgg/t3code/commit/551f891efbb4d5a8ca1ee57560f6b4eac800676d).

Proof audit pass 1: render-path matrix `[]`. The only changed file is `docs/orchestration-v2/orchestrator-mcp-server.md`; a prose comparison is appropriate. This is static documentation evidence, not a claim of runtime scheduler verification.

## Before / after

Before: “The server exposes eleven orchestration tools.” The authoritative `OrchestratorToolkit` actually registers 17 at both revisions. None of the four scheduler tool names appears in the base document.

After: the fixed count is removed in favor of the authoritative toolkit source link. The scheduling section documents all four registered tools: `schedule_task`, `list_scheduled_tasks`, `update_scheduled_task`, and `delete_scheduled_task`. The registered count remains 17; this PR changes no registration or runtime code. The prose also identifies `t3_thread_launch` as belonging to the project toolkit, verified against its registration.

Both new relative source links resolve to files in the exact head commit using `git cat-file -e`. The script below uses Git objects rather than uncommitted working-tree contents, asserts the exact checked-out head and sole changed file, counts registered toolkit members rather than every definition, and checks all four names and the project-toolkit boundary.

Verified binding statement: `bindToCurrentThread` defaults to `true` only when the caller has a thread in the target project, and defaults to `false` otherwise. Explicit `true` without a caller thread, or with a caller thread in another project, returns `invalid_request`. This matches the unchanged service implementation at [OrchestratorMcpService.ts:1814](https://git.cafe/pingdotgg/t3code/src/commit/551f891efbb4d5a8ca1ee57560f6b4eac800676d/apps/server/src/mcp/OrchestratorMcpService.ts#L1814). These are static source assertions, not a runtime scheduling test. Render-path matrix remains `[]`; no app paths are affected.

## Repeatable script

Save as `/tmp/issue15670-evidence.py` and run `python3 /tmp/issue15670-evidence.py`. Requires Python 3, Git, and both revisions in the supplied checkout.

```python
import subprocess, re, posixpath
from pathlib import Path
R='/home/ubuntu/wt/issue-15670'
BASE='defb7e6e6b87d03259745367214db13060fb322b'
HEAD='551f891efbb4d5a8ca1ee57560f6b4eac800676d'
DOC='docs/orchestration-v2/orchestrator-mcp-server.md'
TOOLS='apps/server/src/mcp/toolkits/orchestrator/tools.ts'
def git(*args):
    return subprocess.check_output(['git','-C',R,*args],text=True)
def show(rev,path): return git('show',f'{rev}:{path}')
print(f'BASE {BASE}\nHEAD {HEAD}')
assert git('rev-parse','HEAD').strip()==HEAD
changed=git('diff','--name-only',BASE,HEAD).splitlines()
assert changed==[DOC], changed
print('Changed files: '+', '.join(changed))
for rev,label in [(BASE,'BEFORE'),(HEAD,'AFTER')]:
    doc=show(rev,DOC); source=show(rev,TOOLS)
    definitions=dict(re.findall(r'const (\w+) = Tool\.make\("([^"]+)"',source))
    members=re.search(r'export const OrchestratorToolkit = Toolkit\.make\((.*?)\);',source,re.S).group(1)
    names=[definitions[x.strip()] for x in members.split(',') if x.strip()]
    print(f'{label}: registered OrchestratorToolkit count = {len(names)}')
    assert len(names)==17
    if label=='BEFORE':
        assert 'The server exposes eleven orchestration tools.' in doc
        print('BEFORE prose: The server exposes eleven orchestration tools.')
    else:
        assert 'The server exposes eleven orchestration tools.' not in doc
        assert 'is the authoritative list of orchestration tools.' in doc
        print('AFTER prose: OrchestratorToolkit is the authoritative list; fixed count removed.')
    for name in ['schedule_task','list_scheduled_tasks','update_scheduled_task','delete_scheduled_task']:
        assert name in names
        if label=='AFTER': assert f'`{name}`' in doc
        print(f'{label}: {name}: registered; documented={f"`{name}`" in doc}')
    if label=='AFTER':
        links=re.findall(r'\]\(([^)]+)\)',doc)
        source_links=[x for x in links if x.startswith('../../apps/')]
        for link in source_links:
            target=posixpath.normpath(posixpath.join(posixpath.dirname(DOC),link.split('#')[0]))
            git('cat-file','-e',f'{rev}:{target}')
            print(f'AFTER local source link: {link} -> {target}: PASS')
        assert '../../apps/server/src/mcp/toolkits/orchestrator/tools.ts' in source_links
        project='apps/server/src/mcp/toolkits/project/tools.ts'
        assert '../../'+project in source_links
        p=show(rev,project)
        launch=re.search(r'const (\w+) = Tool\.make\("t3_thread_launch"',p).group(1)
        registration=re.search(r'export const ProjectToolkit = Toolkit\.make\((.*?)\);',p,re.S).group(1)
        assert launch in registration
        assert 't3_thread_launch' not in names
        print('AFTER t3_thread_launch: registered in ProjectToolkit, absent from OrchestratorToolkit: PASS')
assert show(BASE,TOOLS)==show(HEAD,TOOLS)
print('Authoritative toolkit source unchanged across revisions: PASS')
SERVICE='apps/server/src/mcp/OrchestratorMcpService.ts'
service=show(HEAD,SERVICE)
block=service[service.index('    scheduleTask: Effect.fn('):service.index('      const modelSelection =',service.index('    scheduleTask: Effect.fn('))]
assert re.search(r'const bindToCurrentThread =\s*input\.bindToCurrentThread \?\?\s*\(parent !== undefined && parent\.thread\.projectId === projectId\);',block)
assert 'if (bindToCurrentThread && (parent === undefined || parent.thread.projectId !== projectId))' in block
assert '"invalid_request"' in block
assert 'bindToCurrentThread needs an agent running inside a T3 thread.' in block
assert 'bindToCurrentThread binds to this thread, which belongs to a different project.' in block
assert service.splitlines()[1813].strip()=='const bindToCurrentThread ='
assert show(BASE,SERVICE)==service
for phrase in [
    '`bindToCurrentThread` defaults to `true` only when the caller has a thread in',
    "the task's project; otherwise it defaults to `false`.",
    'Explicit `bindToCurrentThread: true` without a caller thread in that project',
    'is rejected.'
]:
    assert phrase in show(HEAD,DOC)
print('AFTER binding default: caller thread in target project => true; otherwise false: PASS')
print('AFTER explicit true without caller thread or with different project => invalid_request: PASS')
print('Binding source: OrchestratorMcpService.ts:1814; unchanged from base: PASS')
print('Render-path matrix: []; no app paths affected: PASS')
print('PASS: revision-bound prose comparison; no render paths, screenshots or runtime scheduling required.')
```

## Observed transcript

Command: `python3 /tmp/issue15670-evidence.py` (exit 0).

```text
BASE defb7e6e6b87d03259745367214db13060fb322b
HEAD 551f891efbb4d5a8ca1ee57560f6b4eac800676d
Changed files: docs/orchestration-v2/orchestrator-mcp-server.md
BEFORE: registered OrchestratorToolkit count = 17
BEFORE prose: The server exposes eleven orchestration tools.
BEFORE: schedule_task: registered; documented=False
BEFORE: list_scheduled_tasks: registered; documented=False
BEFORE: update_scheduled_task: registered; documented=False
BEFORE: delete_scheduled_task: registered; documented=False
AFTER: registered OrchestratorToolkit count = 17
AFTER prose: OrchestratorToolkit is the authoritative list; fixed count removed.
AFTER: schedule_task: registered; documented=True
AFTER: list_scheduled_tasks: registered; documented=True
AFTER: update_scheduled_task: registered; documented=True
AFTER: delete_scheduled_task: registered; documented=True
AFTER local source link: ../../apps/server/src/mcp/toolkits/orchestrator/tools.ts -> apps/server/src/mcp/toolkits/orchestrator/tools.ts: PASS
AFTER local source link: ../../apps/server/src/mcp/toolkits/project/tools.ts -> apps/server/src/mcp/toolkits/project/tools.ts: PASS
AFTER t3_thread_launch: registered in ProjectToolkit, absent from OrchestratorToolkit: PASS
Authoritative toolkit source unchanged across revisions: PASS
AFTER binding default: caller thread in target project => true; otherwise false: PASS
AFTER explicit true without caller thread or with different project => invalid_request: PASS
Binding source: OrchestratorMcpService.ts:1814; unchanged from base: PASS
Render-path matrix: []; no app paths affected: PASS
PASS: revision-bound prose comparison; no render paths, screenshots or runtime scheduling required.
```

FRICTION: none. No worktree edits, pushes, public comments, browser use, screenshots, app launch, or runtime scheduling were performed.
