@@ -87,6 +87,7 @@ func (r *MCPReader) Search(ctx context.Context, in mcpcontract.SearchInput) (mcp
8787 Limit : in .Limit ,
8888 Cursor : in .Cursor ,
8989 Sort : in .Sort , MatchMode : in .MatchMode ,
90+ CorpusRevision : in .CorpusRevision ,
9091 })
9192 if err != nil {
9293 return mcpcontract.SearchOutput {}, err
@@ -116,6 +117,7 @@ func (r *MCPReader) Search(ctx context.Context, in mcpcontract.SearchInput) (mcp
116117 MatchSource : m .MatchSource ,
117118 MatchExcerpt : m .MatchExcerpt ,
118119 MatchTruncated : m .MatchTruncated ,
120+ CorpusRevision : res .CorpusRevision ,
119121 }
120122 if in .View == "full" {
121123 matches [i ].Body = m .Body
@@ -132,6 +134,7 @@ func (r *MCPReader) Search(ctx context.Context, in mcpcontract.SearchInput) (mcp
132134 Query : in .Query , QueryInterpretation : strings .Join (strings .Fields (in .Query ), separator ),
133135 MatchMode : in .MatchMode , View : in .View , Total : res .Total , Matches : matches , NextCursor : res .NextCursor ,
134136 UnknownMergeCount : res .UnknownMergeCount ,
137+ CorpusRevision : res .CorpusRevision ,
135138 }
136139 if out .UnknownMergeCount > 0 {
137140 out .Suggestion = "Some otherwise-matching pull requests have unknown merge state. Repeat without the merged filter to identify finalists, then hydrate pr_details before inferring absence."
@@ -175,6 +178,10 @@ func (r *MCPReader) Thread(ctx context.Context, in mcpcontract.ThreadInput) (mcp
175178 if err != nil {
176179 return mcpcontract.ThreadOutput {}, err
177180 }
181+ revision , err := beginCorpusRead (ctx , c , nil )
182+ if err != nil {
183+ return mcpcontract.ThreadOutput {}, err
184+ }
178185 repo , err := c .GetRepository (ctx , in .Owner , in .Repo )
179186 if err != nil {
180187 return mcpcontract.ThreadOutput {}, fmt .Errorf ("get repository: %w" , err )
@@ -192,6 +199,10 @@ func (r *MCPReader) Thread(ctx context.Context, in mcpcontract.ThreadInput) (mcp
192199 out := corpusThreadToMCPOutput (thread )
193200 out .Owner = in .Owner
194201 out .Repo = in .Repo
202+ out .CorpusRevision = revision
203+ if err := finishCorpusRead (ctx , c , revision ); err != nil {
204+ return mcpcontract.ThreadOutput {}, err
205+ }
195206 return out , nil
196207}
197208
@@ -603,7 +614,11 @@ func (r *MCPReader) GetCoverage(ctx context.Context, in mcpcontract.GetCoverageI
603614 if err != nil {
604615 return mcpcontract.GetCoverageOutput {}, err
605616 }
606- out := mcpcontract.GetCoverageOutput {Status : "complete" , Items : make ([]mcpcontract.BatchItem [mcpcontract.CoverageOutput ], len (in .Targets ))}
617+ revision , err := beginCorpusRead (ctx , c , in .CorpusRevision )
618+ if err != nil {
619+ return mcpcontract.GetCoverageOutput {}, err
620+ }
621+ out := mcpcontract.GetCoverageOutput {Status : "complete" , Items : make ([]mcpcontract.BatchItem [mcpcontract.CoverageOutput ], len (in .Targets )), CorpusRevision : revision }
607622 for i , target := range in .Targets {
608623 if err := ctx .Err (); err != nil {
609624 return out , err
@@ -635,6 +650,9 @@ func (r *MCPReader) GetCoverage(ctx context.Context, in mcpcontract.GetCoverageI
635650 }
636651 out .Items [i ] = item
637652 }
653+ if err := finishCorpusRead (ctx , c , revision ); err != nil {
654+ return mcpcontract.GetCoverageOutput {}, err
655+ }
638656 return out , nil
639657}
640658
@@ -653,8 +671,14 @@ func readCoverageTarget(ctx context.Context, c *corpus.Corpus, target mcpcontrac
653671 if err := ref .Validate (); err != nil {
654672 return mcpcontract.CoverageOutput {}, "invalid_reference" , fmt .Errorf ("%w: %w" , errInvalidCoverageTarget , err )
655673 }
656- isThread := target .Kind != "" || target .Number != 0
657- if isThread && ((target .Kind != "issue" && target .Kind != "pull_request" ) || target .Number < 1 ) {
674+ isThread , valid := (target .Kind != "" || target .Number != 0 ), false
675+ switch {
676+ case target .Kind == "" && target .Number == 0 :
677+ valid = true
678+ case target .Kind == "issue" || target .Kind == "pull_request" :
679+ valid = target .Number > 0
680+ }
681+ if ! valid {
658682 return mcpcontract.CoverageOutput {}, "invalid_reference" , errInvalidCoverageTarget
659683 }
660684 repo , err := c .GetRepository (ctx , ref .Owner , ref .Repo )
0 commit comments