@cassiomc1/forgeloop 1.10.2 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.cursor/rules/project-loop.mdc +2 -2
  2. package/.forgeloop/forgeloop.gitignore +1 -0
  3. package/.github/copilot-instructions.md +2 -2
  4. package/AGENTS.md +1 -0
  5. package/AGENT_COMPATIBILITY.md +7 -0
  6. package/CLAUDE.md +1 -0
  7. package/DOCS_INDEX.md +10 -0
  8. package/LOOP_SYSTEM_DESIGN.md +12 -0
  9. package/ORCHESTRATOR_INTEGRATION.md +9 -0
  10. package/PROTOCOL_INTEGRATION.md +17 -0
  11. package/README.md +12 -10
  12. package/THIRD_PARTY_NOTICES.md +11 -0
  13. package/THREAT_MODEL.md +21 -0
  14. package/benchmarks/repository-index/README.md +73 -0
  15. package/benchmarks/repository-index/queries.json +12 -0
  16. package/benchmarks/repository-index/run-hot-path.mjs +142 -0
  17. package/benchmarks/repository-index/run-persistent-transport.mjs +169 -0
  18. package/completions/_forgeloop +7 -1
  19. package/completions/forgeloop.bash +13 -1
  20. package/completions/forgeloop.fish +40 -1
  21. package/docs/AGENT_PROTOCOL_SUMMARY.md +8 -1
  22. package/docs/CLI_REFERENCE.md +114 -2
  23. package/docs/DOCUMENTATION_GUIDE.md +10 -5
  24. package/docs/GETTING_STARTED.md +17 -0
  25. package/docs/MCP.md +16 -1
  26. package/docs/PACKAGE_CONTENTS.md +7 -1
  27. package/docs/PERSISTENT_SEARCH_TRANSPORT.md +289 -0
  28. package/docs/RECIPES.md +30 -0
  29. package/docs/RELEASE_CHECKLIST.md +34 -0
  30. package/docs/REPOSITORY_INDEX.md +553 -0
  31. package/docs/TROUBLESHOOTING.md +147 -0
  32. package/docs/UNIVERSAL_INTEGRATION.md +30 -0
  33. package/docs/diagrams/README.md +10 -0
  34. package/package.json +11 -2
  35. package/scripts/update-tgrep-manifest.mjs +86 -0
  36. package/scripts/verify-tgrep-manifest.mjs +17 -0
  37. package/src/cli.js +35 -0
  38. package/src/commands/doctor.js +76 -1
  39. package/src/commands/index-rebuild.js +1 -0
  40. package/src/commands/index-setup.js +1 -0
  41. package/src/commands/index-start.js +1 -0
  42. package/src/commands/index-status.js +1 -0
  43. package/src/commands/index-stop.js +1 -0
  44. package/src/commands/init.js +39 -1
  45. package/src/commands/repository-index.js +111 -0
  46. package/src/commands/search.js +1 -0
  47. package/src/commands/update.js +32 -4
  48. package/src/core/cli-command-definitions.js +97 -3
  49. package/src/core/command-executors.js +35 -2
  50. package/src/core/command-input.js +23 -0
  51. package/src/core/error-codes.js +195 -0
  52. package/src/core/filesystem.js +10 -1
  53. package/src/core/integration-invocation-policy.js +27 -0
  54. package/src/core/integration-resources.js +16 -1
  55. package/src/core/protocol-info.js +23 -0
  56. package/src/integration.d.ts +90 -0
  57. package/src/integration.js +21 -0
  58. package/src/persistent-transport/client.js +293 -0
  59. package/src/persistent-transport/constants.js +24 -0
  60. package/src/persistent-transport/errors.js +38 -0
  61. package/src/persistent-transport/framing.js +61 -0
  62. package/src/persistent-transport/lifecycle.js +116 -0
  63. package/src/persistent-transport/ownership.js +184 -0
  64. package/src/persistent-transport/paths.js +31 -0
  65. package/src/persistent-transport/protocol.js +95 -0
  66. package/src/persistent-transport/server.js +256 -0
  67. package/src/persistent-transport/state.js +49 -0
  68. package/src/repository-index/args.js +59 -0
  69. package/src/repository-index/binary-manager.js +413 -0
  70. package/src/repository-index/constants.js +45 -0
  71. package/src/repository-index/errors.js +38 -0
  72. package/src/repository-index/lifecycle.js +17 -0
  73. package/src/repository-index/lock.js +113 -0
  74. package/src/repository-index/manifest.js +132 -0
  75. package/src/repository-index/metrics.js +30 -0
  76. package/src/repository-index/normalize-json.js +187 -0
  77. package/src/repository-index/paths.js +39 -0
  78. package/src/repository-index/platform.js +20 -0
  79. package/src/repository-index/process.js +140 -0
  80. package/src/repository-index/readiness.js +62 -0
  81. package/src/repository-index/search.js +262 -0
  82. package/src/repository-index/server.js +432 -0
  83. package/src/repository-index/status.js +397 -0
  84. package/src/repository-index/tgrep-manifest.json +38 -0
@@ -24,6 +24,9 @@ The published tarball includes the following consumer-facing groups:
24
24
  repository for historical context and are explicitly excluded:
25
25
  `src/core/cli-metadata.js`, `src/core/decision-classification.js`,
26
26
  `src/core/gates.js`, and `src/core/workflow-compatibility.js`.
27
+ This includes the provider-neutral Repository Index runtime and its pinned
28
+ `src/repository-index/tgrep-manifest.json`; native engine binaries are
29
+ provisioned outside the npm tarball.
27
30
  - **Initialization material:** the root protocol and integration documents,
28
31
  legal notices, the target profile template, and every path listed by
29
32
  `src/core/templates.js`. These files are read by `init` and `update`, so
@@ -32,8 +35,11 @@ The published tarball includes the following consumer-facing groups:
32
35
  - **Benchmark inputs:** execution-profile scenario definitions and their
33
36
  README. They make new measurements reproducible; historical measurements
34
37
  and generated results are repository evidence and are excluded.
38
+ Repository Index query inputs and benchmark instructions are also shipped;
39
+ generated local repositories and measurements are not.
35
40
  - **User documentation:** the getting-started, integration, CLI, artifact,
36
- troubleshooting, release, package-boundary, and related reference pages.
41
+ Repository Index, Persistent Search Transport, troubleshooting, release,
42
+ package-boundary, and related reference pages.
37
43
  The advisory-context and Ripwire adapter guides ship with the corresponding
38
44
  public integration surface.
39
45
  The typed diagram sources, generated HTML/SVG/receipt artifacts, and
@@ -0,0 +1,289 @@
1
+ # Persistent Search Transport
2
+
3
+ ForgeLoop's persistent search transport is a local optimization for the CLI
4
+ `search` command. It keeps one ForgeLoop-owned search host available between
5
+ CLI invocations and sends bounded requests over local IPC. It does not create a
6
+ second search implementation, replace the Repository Index, or change the
7
+ protocol lifecycle and evidence authority.
8
+
9
+ The public Repository Index contract, managed tgrep policy, search result
10
+ shape, and index maintenance commands are documented in
11
+ [`REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md). This document explains the
12
+ transport boundary and its operational behavior.
13
+
14
+ ## Architecture and boundaries
15
+
16
+ The runtime has one canonical search service and two access paths:
17
+
18
+ ```text
19
+ CLI `search` only
20
+ -> Persistent Search Client
21
+ -> local IPC
22
+ -> Persistent ForgeLoop Host
23
+ -> canonical `searchRepository()` service
24
+ -> Repository Index
25
+ -> ForgeLoop-managed tgrep 1.0.3
26
+
27
+ Integration API `repositorySearch()` --------------------┐
28
+ MCP `forgeloop_search` -----------------------------------┘
29
+ -> canonical `searchRepository()` service
30
+ -> Repository Index
31
+ -> ForgeLoop-managed tgrep 1.0.3
32
+
33
+ Lifecycle, claims, verification, receipts, evidence, and completion
34
+ -> remain separate ForgeLoop protocol state and authority
35
+ ```
36
+
37
+ Only the shell-facing CLI search path uses the persistent host. The
38
+ Integration API and MCP adapter call the canonical search service directly;
39
+ they do not route through the persistent host. The host also does not read or
40
+ write task claims, receipts, ledgers, or completion state.
41
+
42
+ The persistent host is an optimization layer, not a public protocol authority:
43
+
44
+ - Repository Index readiness remains mandatory for supported Git repositories.
45
+ - The managed tgrep engine remains the only runtime search backend; there is no
46
+ silent `rg`, `grep`, or arbitrary-`PATH` fallback.
47
+ - Search output remains normalized by the canonical service and uses project-
48
+ relative paths.
49
+ - Derived index files and host state are cache/coordination data, not evidence.
50
+ - A fresh CLI invocation still pays Node.js and module startup cost. The
51
+ persistent path removes repeated host startup and keeps subsequent requests
52
+ local; it does not promise a universal latency improvement.
53
+
54
+ Implementation sources are [`client.js`](../src/persistent-transport/client.js),
55
+ [`server.js`](../src/persistent-transport/server.js),
56
+ [`lifecycle.js`](../src/persistent-transport/lifecycle.js), and the canonical
57
+ [`search.js`](../src/repository-index/search.js).
58
+
59
+ ## Transport protocol
60
+
61
+ The transport currently uses protocol version `1` and state schema version `1`.
62
+ Its supported methods are deliberately small:
63
+
64
+ | Method | Purpose | Access rule |
65
+ | --- | --- | --- |
66
+ | `handshake` | Prove protocol, package, scope, and host ownership identity | First request on every connection |
67
+ | `repository.search` | Dispatch one bounded normalized Repository Search request | Requires a successful handshake |
68
+ | `transport.status` | Return the host's ready/version projection | Requires a successful handshake |
69
+ | `transport.shutdown` | Ask the verified host to shut down | Requires a successful handshake and matching nonce |
70
+
71
+ Requests and responses are JSON encoded in UTF-8 and carried in a
72
+ length-prefixed frame. The length is a four-byte unsigned big-endian value;
73
+ the JSON payload is bounded before it is parsed or written.
74
+
75
+ The defaults are defined in
76
+ [`constants.js`](../src/persistent-transport/constants.js):
77
+
78
+ | Limit | Default |
79
+ | --- | ---: |
80
+ | Host startup timeout | 15 seconds |
81
+ | Search request timeout | 120 seconds |
82
+ | Idle shutdown | 10 minutes |
83
+ | Maximum request frame | 1 MiB |
84
+ | Maximum response frame | 16 MiB |
85
+ | Maximum search pattern | 4,096 characters |
86
+
87
+ The request projection accepts only the canonical search fields: pattern,
88
+ globs, types, context, before/after context, max count, files-with-matches,
89
+ stats, fixed strings, ignore case, smart case, and word regexp. Internal
90
+ transport fields, executable arguments, arbitrary binaries, and machine-local
91
+ path options are not forwarded as public query fields. See
92
+ [`protocol.js`](../src/persistent-transport/protocol.js) for the allowlist and
93
+ validation rules.
94
+
95
+ ## Host lifecycle
96
+
97
+ ### Startup and reuse
98
+
99
+ When the CLI search path needs a host, the client:
100
+
101
+ 1. acquires a user-scoped startup coordination lock;
102
+ 2. reads and validates the existing host state, if present;
103
+ 3. reuses the host only after ownership, endpoint, protocol, package version,
104
+ and handshake checks succeed;
105
+ 4. otherwise removes only verified stale or incompatible transport state;
106
+ 5. starts the packaged ForgeLoop host with a shell-free Node.js child process;
107
+ 6. waits for a bounded successful handshake before dispatching the search.
108
+
109
+ Concurrent callers coordinate startup and requests for the same repository are
110
+ serialized by the host. Requests for different repositories may be served by
111
+ the same user-scoped host without sharing repository result data.
112
+
113
+ There is no separate public `persistent-host-start` command. The host starts
114
+ on demand for CLI `search`, and it can be observed through the sanitized
115
+ `persistentTransport` projection returned by `forgeloop doctor --json`.
116
+
117
+ ### Recovery
118
+
119
+ The client permits at most one bounded connection/startup recovery attempt for
120
+ a search request. Recoverable transport failures include an unavailable host,
121
+ timeout, protocol mismatch, or invalid response when the failure is at the
122
+ transport boundary. A remote Repository Index or query error is returned to the
123
+ caller and is not hidden by transport recovery.
124
+
125
+ If state is stale, the verified host has exited, or the endpoint cannot prove
126
+ the expected identity, the client repairs transport coordination state only
127
+ within its user-scoped transport boundary. It does not delete project
128
+ `.forgeloop` state, rebuild an index implicitly beyond the canonical search
129
+ service's existing readiness behavior, or alter lifecycle artifacts.
130
+
131
+ ### Idle shutdown
132
+
133
+ After ten minutes without active connections or in-flight requests, the host
134
+ shuts down. Idle shutdown removes the host's coordination state and POSIX
135
+ endpoint; it does not stop the Repository Index watcher or delete the derived
136
+ repository index. A later CLI search starts or reuses the host again.
137
+
138
+ Explicit shutdown is sent through the verified endpoint. If ownership cannot be
139
+ proved, ForgeLoop fails closed rather than killing a process by PID or name.
140
+
141
+ ## Platform transport
142
+
143
+ On POSIX systems the host listens on a user-scoped Unix-domain socket in the
144
+ local temporary namespace. On Windows it listens on a user-scoped named pipe.
145
+ The authoritative state and startup lock are kept in the user's ForgeLoop
146
+ persistent-search directory. The exact endpoint, home directory, process
147
+ entrypoint, and lock paths are internal machine-local details; normal status,
148
+ doctor, search results, and MCP projections do not expose them.
149
+
150
+ The host is launched with:
151
+
152
+ - the current ForgeLoop package entrypoint and package version;
153
+ - a user-scoped home/environment binding;
154
+ - detached, ignored stdio;
155
+ - `shell: false` and direct argument arrays;
156
+ - a generated nonce and scope identity recorded in host state.
157
+
158
+ The Windows implementation uses the same protocol, bounds, handshake, nonce,
159
+ and ownership model as POSIX. Native transport coverage is exercised by the
160
+ platform-specific test suite and the Windows CI matrix; local non-Windows
161
+ validation cannot substitute for a Windows run.
162
+
163
+ ## Ownership and safety
164
+
165
+ The state file is only a coordination hint. Before reuse, shutdown, or stale
166
+ cleanup, ForgeLoop validates the state schema and checks the endpoint and live
167
+ process identity. Depending on platform and available process inspection, the
168
+ ownership proof uses an endpoint handshake or a process command-line identity
169
+ that includes the expected host entrypoint, persistent-server marker, and
170
+ scope.
171
+
172
+ The handshake binds these values:
173
+
174
+ - transport protocol version;
175
+ - ForgeLoop package version;
176
+ - user scope identity;
177
+ - host process ID;
178
+ - generated host nonce.
179
+
180
+ Shutdown requires the same nonce. A PID by itself is never enough. Invalid
181
+ state, endpoint substitution, a mismatched version, an unverified process, or
182
+ an unexpected endpoint produces a stable transport error and fails closed.
183
+
184
+ Relevant error codes are exported by
185
+ [`errors.js`](../src/persistent-transport/errors.js) and include:
186
+
187
+ | Code | Meaning |
188
+ | --- | --- |
189
+ | `E_PERSISTENT_TRANSPORT_UNAVAILABLE` | The expected local host or connection is unavailable |
190
+ | `E_PERSISTENT_TRANSPORT_TIMEOUT` | A bounded connect, handshake, or request wait expired |
191
+ | `E_PERSISTENT_TRANSPORT_START_FAILED` | Startup coordination or host readiness exceeded its bound |
192
+ | `E_PERSISTENT_TRANSPORT_PROTOCOL_MISMATCH` | Client and host protocol/package identity is incompatible |
193
+ | `E_PERSISTENT_TRANSPORT_OWNERSHIP_UNVERIFIED` | State or endpoint identity cannot be proven |
194
+ | `E_PERSISTENT_TRANSPORT_FRAME_INVALID` | A frame is truncated or not valid JSON |
195
+ | `E_PERSISTENT_TRANSPORT_FRAME_TOO_LARGE` | A request or response exceeds its frame bound |
196
+ | `E_PERSISTENT_TRANSPORT_INVALID_REQUEST` | Method, request ID, parameters, or handshake order is invalid |
197
+ | `E_PERSISTENT_TRANSPORT_INVALID_RESPONSE` | The response shape or response ID is invalid |
198
+ | `E_PERSISTENT_TRANSPORT_HOST_STALE` | A stale host condition is detected at the transport boundary |
199
+
200
+ The full public error inventory remains generated in
201
+ [`TROUBLESHOOTING.md`](./TROUBLESHOOTING.md).
202
+
203
+ ## Privacy and public projections
204
+
205
+ Repository content is searched locally. The persistent host does not persist
206
+ query history, matches, repository content, task evidence, or lifecycle
207
+ receipts. Search results are returned to the requesting local caller and are
208
+ normalized by the Repository Index service.
209
+
210
+ Public status projections are intentionally smaller than internal state. A
211
+ normal `forgeloop doctor --json` or integration status result may report the
212
+ transport schema, status, running/owned booleans, protocol version, and
213
+ ForgeLoop version, but not endpoint, state, lock, repository-root, index, or
214
+ binary paths. The same rule applies to the MCP resource
215
+ `forgeloop://repository/index-status` and `forgeloop_search` results.
216
+
217
+ This is local process isolation and path minimization, not cryptographic
218
+ authentication against a privileged process running as the same user. A
219
+ privileged same-user process can still observe or deny local IPC. The ownership
220
+ checks are designed to prevent accidental PID reuse, stale-state cleanup, and
221
+ endpoint substitution from being treated as trusted ForgeLoop host activity.
222
+ See [`THREAT_MODEL.md`](../THREAT_MODEL.md) and
223
+ [`SECURITY.md`](../SECURITY.md) for the broader security boundary.
224
+
225
+ ## Integration API and MCP
226
+
227
+ The public Integration API remains direct and transport-neutral:
228
+
229
+ ```js
230
+ import {
231
+ repositorySearch,
232
+ repositoryIndexStatus,
233
+ } from "@cassiomc1/forgeloop/integration";
234
+
235
+ const result = await repositorySearch({
236
+ projectPath: ".",
237
+ pattern: "needle",
238
+ fixedStrings: true,
239
+ });
240
+
241
+ const status = await repositoryIndexStatus({ projectPath: "." });
242
+ ```
243
+
244
+ The MCP adapter maps `forgeloop_search` and
245
+ `forgeloop://repository/index-status` to those canonical services. MCP does
246
+ not connect to, start, stop, or inspect the persistent CLI host. This keeps
247
+ MCP session metadata, transport choice, and host presentation separate from
248
+ Repository Index and lifecycle authority. See
249
+ [`UNIVERSAL_INTEGRATION.md`](./UNIVERSAL_INTEGRATION.md) and
250
+ [`MCP.md`](./MCP.md).
251
+
252
+ ## Operational diagnosis
253
+
254
+ Use the public Repository Index commands when search is unhealthy:
255
+
256
+ ```bash
257
+ forgeloop index-status --json
258
+ forgeloop doctor --json
259
+ forgeloop search "pattern" --json
260
+ ```
261
+
262
+ For an absent or incomplete managed engine, use the explicitly authorized
263
+ maintenance flow described in [`REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md):
264
+
265
+ ```bash
266
+ forgeloop index-setup --asset <pinned-asset-archive>
267
+ forgeloop index-start --json
268
+ forgeloop index-rebuild --json
269
+ ```
270
+
271
+ Do not delete the whole `.forgeloop` directory, manually edit host state, or
272
+ stop a process by executable name. If the persistent host is unavailable, a
273
+ subsequent CLI search will perform its bounded on-demand recovery. If the
274
+ canonical search service reports an index, engine, request, or native-output
275
+ error, follow the Repository Index troubleshooting procedure; transport
276
+ recovery does not authorize an alternate backend.
277
+
278
+ ## Release and compatibility
279
+
280
+ The 1.11.0 release candidate documents this transport while preserving
281
+ protocol v1, schema v1, and Integration API v1. The package version, registry
282
+ publication, Git tag, GitHub Release, deployment, and merge are separate
283
+ external lifecycle events. Local tests or a successful PR do not prove that
284
+ the package has been published.
285
+
286
+ The package release boundary ships the transport runtime and this reference,
287
+ but not user-specific state, sockets, named pipes, native release binaries, or
288
+ derived repository indexes. The release checklist is
289
+ [`RELEASE_CHECKLIST.md`](./RELEASE_CHECKLIST.md).
package/docs/RECIPES.md CHANGED
@@ -29,6 +29,7 @@ Concise, copy-paste friendly recipes for common ForgeLoop tasks.
29
29
  21. [Generate and Verify Code Attestation](#recipe-21--generate-and-verify-code-attestation)
30
30
  22. [Verify a Revision Range](#recipe-22--verify-a-revision-range)
31
31
  23. [Run Structural Quality Feedback](#recipe-23--run-structural-quality-feedback)
32
+ 24. [Use ForgeLoop Repository Search](#recipe-24--use-forgeloop-repository-search)
32
33
 
33
34
  ---
34
35
 
@@ -662,6 +663,35 @@ does not block completion by itself. See
662
663
  [`STRUCTURAL_QUALITY.md`](./STRUCTURAL_QUALITY.md) for policy, provider,
663
664
  Sentrux, bundle, and error-code details.
664
665
 
666
+ ---
667
+
668
+ ### Recipe 24 — Use ForgeLoop Repository Search
669
+
670
+ Repository-wide search uses the mandatory managed Repository Index. The
671
+ service is shared by the CLI, Integration API, and MCP adapter; it never
672
+ silently falls back to an unpinned executable or another search tool.
673
+
674
+ ```bash
675
+ forgeloop init
676
+ forgeloop index-status --json
677
+ forgeloop search "ExecutionReceipt" --glob "*.js" --context 2 --json
678
+ ```
679
+
680
+ Use the explicit `FORGELOOP_TGREP_BINARY=/absolute/path/to/tgrep` override
681
+ only for development or tests. For an air-gapped setup, preload the exact
682
+ release archive:
683
+
684
+ ```bash
685
+ forgeloop index-setup --asset /absolute/path/tgrep-v1.0.3-asset.tar.gz --json
686
+ ```
687
+
688
+ If status is not `READY`, inspect its structured diagnostic and use the
689
+ narrowest repair (`index-start`, `index-setup`, or `index-rebuild`). Search
690
+ output is discovery data, never verification evidence, task state, or a
691
+ reason to narrow a verification scope. See
692
+ [`REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md) for the provider-neutral result
693
+ contract, resource policy, offline behavior, and security boundary.
694
+
665
695
  ## Run ForgeLoop through MCP (safe mode)
666
696
 
667
697
  Start the local MCP adapter and inspect what it exposes:
@@ -3,6 +3,27 @@
3
3
  This is the current release checklist for `@cassiomc1/forgeloop`. It is a
4
4
  preparation and verification checklist; it does not authorize publication.
5
5
 
6
+ ## ForgeLoop 1.11.0 candidate scope
7
+
8
+ The 1.11.0 candidate refreshes the public documentation architecture around
9
+ the managed Repository Index and CLI-only persistent search transport. The
10
+ candidate must keep these boundaries explicit:
11
+
12
+ - [ ] README architecture visual and text fallback describe CLI persistent
13
+ search separately from direct Integration API/MCP access.
14
+ - [ ] [`docs/REPOSITORY_INDEX.md`](./REPOSITORY_INDEX.md) and
15
+ [`docs/PERSISTENT_SEARCH_TRANSPORT.md`](./PERSISTENT_SEARCH_TRANSPORT.md)
16
+ agree on tgrep management, no-fallback behavior, local IPC, ownership,
17
+ bounded recovery, privacy, and derived-state semantics.
18
+ - [ ] All package-shipped documentation indexes and the package file list
19
+ include the persistent transport reference.
20
+ - [ ] Lifecycle, evidence, completion, and publication remain independent of
21
+ Repository Index and persistent-host health.
22
+
23
+ This branch prepares the candidate and its pull request. npm publication,
24
+ tagging, GitHub Release, deployment, and merge remain separately authorized
25
+ actions.
26
+
6
27
  ## Contract and package identity
7
28
 
8
29
  - [ ] `package.json` and `package-lock.json` contain the same package version.
@@ -68,11 +89,24 @@ preparation and verification checklist; it does not authorize publication.
68
89
  ## Integration and cross-platform evidence
69
90
 
70
91
  - [ ] `npm run pack:check` and `npm run pack:smoke` pass.
92
+ - [ ] `npm pack --dry-run` includes Repository Index runtime/manifest/docs and
93
+ excludes native release binaries and derived `.forgeloop` index data.
71
94
  - [ ] The npm publication workflow runs `npm run pack:smoke` before its
72
95
  provenance-backed publish step.
73
96
  - [ ] `npm run mcp:test` either runs the configured MCP tests or reports the
74
97
  single actionable setup prerequisite.
75
98
  - [ ] `npm run mcp:pack:check` passes when MCP dependencies are available.
99
+ - [ ] Repository Index provider-neutral CLI, Integration API, and MCP
100
+ surfaces expose the same normalized result and status contracts.
101
+ - [ ] The checked-in tgrep manifest passes archive and executable checksum/
102
+ version validation for every supported platform, with no placeholder
103
+ hashes or `latest` URL.
104
+ - [ ] Matrix CI runs the real pinned tgrep artifact on Linux, macOS, and
105
+ Windows; native setup/start/status/search/live-watcher, crash-recovery,
106
+ migration, differential, and stop tests are green with no continue-on-
107
+ error path.
108
+ - [ ] `doctor` reports an unhealthy mandatory Repository Index instead of
109
+ silently falling back to `rg`, `grep`, or `PATH` discovery.
76
110
  - [ ] Generic CI verification uses explicit provider, base, and head revisions.
77
111
  - [ ] Windows full-suite evidence is green on the main branch when scheduled.
78
112
  - [ ] Frozen Python 3.9+ validators pass with `python3 -m unittest discover -s tests`.