scip-query 0.19.4 → 0.19.6
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.
- package/CHANGELOG.md +75 -1
- package/README.md +242 -49
- package/dist/augment-vue-worker.js +1 -1
- package/dist/{chunk-2YU7I3QO.js → chunk-24QNP7MN.js} +2 -2
- package/dist/{chunk-CNKAGUPL.js → chunk-26X7KCJR.js} +2 -2
- package/dist/{chunk-GPBBJ5Y4.js → chunk-273W2U4Y.js} +3 -3
- package/dist/{chunk-7GXM52MI.js → chunk-2CVXCGL4.js} +2 -2
- package/dist/{chunk-ABMYA4TN.js → chunk-2EZSOTSY.js} +2 -2
- package/dist/{chunk-HKEHS2AS.js → chunk-2GSQR6YA.js} +2 -2
- package/dist/{chunk-FECYOO5O.js → chunk-2OXVAGGT.js} +2 -2
- package/dist/chunk-2ZOCHAL2.js +8 -0
- package/dist/{chunk-QGXBRIM5.js → chunk-336DC5NJ.js} +2 -2
- package/dist/chunk-35SQLYCQ.js +2 -0
- package/dist/{chunk-VXQNNXJE.js → chunk-3OIKRYU5.js} +2 -2
- package/dist/{chunk-52ZYCAEO.js → chunk-47X75ZKH.js} +2 -2
- package/dist/{chunk-NPKYOIFM.js → chunk-4CGVLUDP.js} +2 -2
- package/dist/chunk-4RI4BJGT.js +8 -0
- package/dist/{chunk-P2PC2WGR.js → chunk-52HQTTPB.js} +2 -2
- package/dist/{chunk-YNRNA5LK.js → chunk-5OC3HWP5.js} +2 -2
- package/dist/{chunk-STOL2BTL.js → chunk-6XFC7PQ5.js} +2 -2
- package/dist/{chunk-J77UIT3I.js → chunk-6XHTISLI.js} +2 -2
- package/dist/chunk-6YTSKJJ3.js +2 -0
- package/dist/{chunk-BTEE5NZQ.js → chunk-7E3TH5ZN.js} +2 -2
- package/dist/{chunk-X6D5IC6I.js → chunk-7LABSJSR.js} +2 -2
- package/dist/chunk-7Q6VYYCH.js +2 -0
- package/dist/{chunk-FWUUZTIO.js → chunk-A43URCQ3.js} +2 -2
- package/dist/chunk-A63U2W3P.js +3 -0
- package/dist/{chunk-3MJ5YA4Y.js → chunk-ADFSIJP2.js} +2 -2
- package/dist/chunk-AOLE4DYM.js +6 -0
- package/dist/chunk-APMMR5Y2.js +2 -0
- package/dist/chunk-B5MHCHP3.js +107 -0
- package/dist/{chunk-4RSI5EMG.js → chunk-CSTYYXKC.js} +2 -2
- package/dist/{chunk-25LPM4DG.js → chunk-CYJM7CYF.js} +2 -2
- package/dist/{chunk-S44IULR6.js → chunk-DD5BOU5I.js} +2 -2
- package/dist/{chunk-YGAGTIDK.js → chunk-DGMCFMPG.js} +7 -7
- package/dist/{chunk-UOAV44HR.js → chunk-E2ZXPB7J.js} +2 -2
- package/dist/{chunk-IZKFSVBV.js → chunk-EVOC5I5I.js} +2 -2
- package/dist/{chunk-XTX6QHOF.js → chunk-F42A3AKG.js} +2 -2
- package/dist/{chunk-Q4IIEGXJ.js → chunk-FHCTEANE.js} +2 -2
- package/dist/{chunk-3SVWW4PN.js → chunk-FKGN4A4E.js} +2 -2
- package/dist/{chunk-IG7N5ZIK.js → chunk-FQTPPXNA.js} +2 -2
- package/dist/{chunk-F6O7AAC3.js → chunk-G4UQL4CP.js} +2 -2
- package/dist/chunk-GA64UPMI.js +6 -0
- package/dist/{chunk-ZXJYMGD3.js → chunk-GK3GRUJX.js} +2 -2
- package/dist/chunk-HEBAY673.js +2 -0
- package/dist/chunk-HELS7KFF.js +2 -0
- package/dist/{chunk-B5NLK2B3.js → chunk-IPDCSB6N.js} +2 -2
- package/dist/{chunk-M7MTH5NR.js → chunk-IYAOX36F.js} +2 -2
- package/dist/{chunk-YVVCVR2L.js → chunk-J7VT2CRB.js} +2 -2
- package/dist/{chunk-4333ETTV.js → chunk-JELJLXEE.js} +2 -2
- package/dist/{chunk-LBMJEAEW.js → chunk-JERWGHQT.js} +2 -2
- package/dist/chunk-JJJCO4QC.js +945 -0
- package/dist/{chunk-6E7UTQY7.js → chunk-JZNLMHWY.js} +2 -2
- package/dist/{chunk-R4FQGQ4X.js → chunk-K42M2KWT.js} +2 -2
- package/dist/{chunk-H7UKLTWJ.js → chunk-KLVJABXA.js} +2 -2
- package/dist/chunk-KP4KBDVF.js +3 -0
- package/dist/{chunk-RV2FQIX3.js → chunk-LMFVTUW2.js} +2 -2
- package/dist/chunk-LRTP3DKL.js +3 -0
- package/dist/{chunk-U6WNH5GC.js → chunk-MGBJHRFB.js} +2 -2
- package/dist/{chunk-QDV6RDCP.js → chunk-MLGTCX56.js} +2 -2
- package/dist/{chunk-54HA4ZXH.js → chunk-N3SE646F.js} +2 -2
- package/dist/{chunk-KP6XRY5Z.js → chunk-NBRUH7OE.js} +2 -2
- package/dist/{chunk-M7AIS73L.js → chunk-NN4ZIRPK.js} +2 -2
- package/dist/{chunk-I5RJM53C.js → chunk-NQLSSVOB.js} +2 -2
- package/dist/{chunk-4SALD7RU.js → chunk-OBKDTVZ3.js} +2 -2
- package/dist/{chunk-GBQ5NYPR.js → chunk-OHWZKLVA.js} +6 -6
- package/dist/{chunk-6NSFJYRC.js → chunk-OP3MTFJR.js} +2 -2
- package/dist/{chunk-EOOJGLDU.js → chunk-OQ2A4G2G.js} +2 -2
- package/dist/{chunk-DLWR3NUU.js → chunk-P6HBYNBE.js} +2 -2
- package/dist/{chunk-QVWS2VWZ.js → chunk-PC44K7RF.js} +2 -2
- package/dist/{chunk-A2EZV2UM.js → chunk-QBYYWGAT.js} +2 -2
- package/dist/{chunk-QRGV2F7L.js → chunk-QHKUY4FW.js} +2 -2
- package/dist/chunk-QHRL4LKM.js +2 -0
- package/dist/{chunk-I5AWSI2G.js → chunk-QQWOFXNW.js} +2 -2
- package/dist/{chunk-WQTAC523.js → chunk-RBFFD4V2.js} +2 -2
- package/dist/{chunk-SOAT6NLA.js → chunk-RJHCPSZ7.js} +2 -2
- package/dist/{chunk-VGRICIQI.js → chunk-RWRLUZ6U.js} +2 -2
- package/dist/{chunk-4T3LTWUS.js → chunk-S2GP3CU3.js} +2 -2
- package/dist/{chunk-HEXVUYFQ.js → chunk-SHKZ7OVJ.js} +2 -2
- package/dist/{chunk-NSS46APD.js → chunk-TFUU5MQQ.js} +2 -2
- package/dist/{chunk-IUFDSKGG.js → chunk-TYQ76QHQ.js} +2 -2
- package/dist/{chunk-NRCXJDHL.js → chunk-U5CNPPTZ.js} +2 -2
- package/dist/{chunk-MITTUCEH.js → chunk-UQK5CRUK.js} +2 -2
- package/dist/{chunk-XLTP42QA.js → chunk-UUJBLG6J.js} +2 -2
- package/dist/chunk-UXP636P5.js +144 -0
- package/dist/{chunk-64RFXJT5.js → chunk-VEVBIAOJ.js} +6 -6
- package/dist/chunk-VKRQDBW5.js +9 -0
- package/dist/{chunk-C7NIYIQ4.js → chunk-VOQFGC2W.js} +4 -4
- package/dist/{chunk-DZ74OMG6.js → chunk-VP542C25.js} +2 -2
- package/dist/{chunk-Q3AFUTGB.js → chunk-WMXRRBII.js} +2 -2
- package/dist/{chunk-ZGZUZ7XE.js → chunk-WXAAURU7.js} +2 -2
- package/dist/chunk-X3NLZHPA.js +20 -0
- package/dist/{chunk-WER3B7MI.js → chunk-XF3KLXN3.js} +2 -2
- package/dist/{chunk-NH5ALKPW.js → chunk-XVJ3V7LM.js} +2 -2
- package/dist/{chunk-4XTA5OMB.js → chunk-YGQN3XGZ.js} +2 -2
- package/dist/{chunk-CFMXJPHH.js → chunk-YHXBD52M.js} +2 -2
- package/dist/{chunk-7B3UPBVA.js → chunk-YLVE3SXZ.js} +2 -2
- package/dist/{chunk-YIJ7ZAA4.js → chunk-YTUD45PU.js} +2 -2
- package/dist/{chunk-VTKGCT3V.js → chunk-YWB2EBNB.js} +2 -2
- package/dist/{chunk-UKZBVX4U.js → chunk-Z2LHPIOM.js} +2 -2
- package/dist/chunk-Z5QQPJ3U.js +30 -0
- package/dist/{chunk-NZL2DBT7.js → chunk-ZLJLE6LK.js} +2 -2
- package/dist/{chunk-XYADIZHU.js → chunk-ZTTISZ7J.js} +2 -2
- package/dist/cli.js +3 -3
- package/dist/command-descriptors-SJDZ7QGR.js +617 -0
- package/dist/{config-types-D20KuvvZ.d.ts → config-types-BWQ5xPGI.d.ts} +4 -0
- package/dist/{db-G_II8yXU.d.ts → db-B0r1o7Vt.d.ts} +18 -1
- package/dist/direct-navigation-HTKOZEOM.js +3 -0
- package/dist/{health-oblXYgkF.d.ts → health-CFnlCiTz.d.ts} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/postinstall.js +1 -1
- package/dist/queries/affected.d.ts +2 -2
- package/dist/queries/affected.js +1 -1
- package/dist/queries/architecture.d.ts +2 -2
- package/dist/queries/architecture.js +1 -1
- package/dist/queries/bottlenecks.d.ts +2 -2
- package/dist/queries/bottlenecks.js +1 -1
- package/dist/queries/by-kind.d.ts +2 -2
- package/dist/queries/by-kind.js +1 -1
- package/dist/queries/call-graph.d.ts +2 -2
- package/dist/queries/call-graph.js +1 -1
- package/dist/queries/change-surface.d.ts +2 -2
- package/dist/queries/change-surface.js +1 -1
- package/dist/queries/cleanup-plan.d.ts +2 -2
- package/dist/queries/cleanup-plan.js +1 -1
- package/dist/queries/co-change.d.ts +2 -2
- package/dist/queries/co-change.js +1 -1
- package/dist/queries/code.d.ts +2 -2
- package/dist/queries/code.js +1 -1
- package/dist/queries/complexity-hotspots.d.ts +2 -2
- package/dist/queries/complexity-hotspots.js +1 -1
- package/dist/queries/complexity.d.ts +2 -2
- package/dist/queries/complexity.js +1 -1
- package/dist/queries/convergence.d.ts +2 -2
- package/dist/queries/convergence.js +1 -1
- package/dist/queries/coupling.d.ts +2 -2
- package/dist/queries/coupling.js +1 -1
- package/dist/queries/cycles.d.ts +2 -2
- package/dist/queries/cycles.js +1 -1
- package/dist/queries/dataflow.d.ts +2 -2
- package/dist/queries/dataflow.js +1 -1
- package/dist/queries/dead.d.ts +2 -2
- package/dist/queries/dead.js +1 -1
- package/dist/queries/decorative-checkers.d.ts +3 -3
- package/dist/queries/decorative-checkers.js +1 -1
- package/dist/queries/deep-chains.d.ts +2 -2
- package/dist/queries/deep-chains.js +1 -1
- package/dist/queries/deps.d.ts +2 -2
- package/dist/queries/deps.js +1 -1
- package/dist/queries/diff-gate.d.ts +30 -2
- package/dist/queries/diff-gate.js +1 -1
- package/dist/queries/diff-impact.d.ts +2 -2
- package/dist/queries/diff-impact.js +1 -1
- package/dist/queries/doc-drift.d.ts +2 -2
- package/dist/queries/doc-drift.js +1 -1
- package/dist/queries/drift.d.ts +2 -2
- package/dist/queries/drift.js +1 -1
- package/dist/queries/duplicate-bodies.d.ts +2 -2
- package/dist/queries/duplicate-bodies.js +1 -1
- package/dist/queries/extract-candidates.d.ts +2 -2
- package/dist/queries/extract-candidates.js +1 -1
- package/dist/queries/fan.d.ts +2 -2
- package/dist/queries/fan.js +1 -1
- package/dist/queries/files.d.ts +2 -2
- package/dist/queries/health.d.ts +3 -3
- package/dist/queries/health.js +1 -1
- package/dist/queries/hierarchy.d.ts +2 -2
- package/dist/queries/hierarchy.js +1 -1
- package/dist/queries/hotspots.d.ts +2 -2
- package/dist/queries/hotspots.js +1 -1
- package/dist/queries/imports.d.ts +2 -2
- package/dist/queries/imports.js +1 -1
- package/dist/queries/incomplete-migration.d.ts +2 -2
- package/dist/queries/incomplete-migration.js +1 -1
- package/dist/queries/index.d.ts +17 -3
- package/dist/queries/index.js +1 -1
- package/dist/queries/isolated.d.ts +2 -2
- package/dist/queries/isolated.js +1 -1
- package/dist/queries/locality-candidates.d.ts +2 -2
- package/dist/queries/locality-candidates.js +1 -1
- package/dist/queries/members.d.ts +2 -2
- package/dist/queries/members.js +1 -1
- package/dist/queries/methods.d.ts +2 -2
- package/dist/queries/methods.js +1 -1
- package/dist/queries/not-implemented.d.ts +3 -3
- package/dist/queries/not-implemented.js +1 -1
- package/dist/queries/outline.d.ts +2 -2
- package/dist/queries/outline.js +1 -1
- package/dist/queries/passthrough-candidates.d.ts +2 -2
- package/dist/queries/passthrough-candidates.js +1 -1
- package/dist/queries/plan-context.d.ts +2 -2
- package/dist/queries/plan-context.js +1 -1
- package/dist/queries/react-component-duplicates.d.ts +2 -2
- package/dist/queries/react-component-duplicates.js +1 -1
- package/dist/queries/react-hook-candidates.d.ts +2 -2
- package/dist/queries/react-hook-candidates.js +1 -1
- package/dist/queries/react-large-component-pressure.d.ts +2 -2
- package/dist/queries/react-large-component-pressure.js +1 -1
- package/dist/queries/recent-duplicates.d.ts +2 -2
- package/dist/queries/recent-duplicates.js +1 -1
- package/dist/queries/redundant-reexports.d.ts +2 -2
- package/dist/queries/redundant-reexports.js +1 -1
- package/dist/queries/refs.d.ts +2 -2
- package/dist/queries/refs.js +1 -1
- package/dist/queries/self-audit.d.ts +2 -2
- package/dist/queries/self-audit.js +1 -1
- package/dist/queries/similar-chains.d.ts +2 -2
- package/dist/queries/similar-chains.js +1 -1
- package/dist/queries/similar-files.d.ts +2 -2
- package/dist/queries/similar-files.js +1 -1
- package/dist/queries/similar-signatures.d.ts +2 -2
- package/dist/queries/similar-signatures.js +1 -1
- package/dist/queries/similar.d.ts +2 -2
- package/dist/queries/similar.js +1 -1
- package/dist/queries/slice.d.ts +2 -2
- package/dist/queries/slice.js +1 -1
- package/dist/queries/stale-abstractions.d.ts +2 -2
- package/dist/queries/stale-abstractions.js +1 -1
- package/dist/queries/stats.d.ts +2 -2
- package/dist/queries/stats.js +1 -1
- package/dist/queries/surface.d.ts +2 -2
- package/dist/queries/surface.js +1 -1
- package/dist/queries/symbols.d.ts +2 -2
- package/dist/queries/symbols.js +1 -1
- package/dist/queries/system.d.ts +2 -2
- package/dist/queries/system.js +1 -1
- package/dist/queries/test-quality.d.ts +2 -2
- package/dist/queries/test-quality.js +1 -1
- package/dist/queries/trace.d.ts +2 -2
- package/dist/queries/trace.js +1 -1
- package/dist/queries/twin-ab.d.ts +3 -3
- package/dist/queries/twin-ab.js +1 -1
- package/dist/queries/twin-drift.d.ts +2 -2
- package/dist/queries/twin-drift.js +1 -1
- package/dist/queries/unused-imports.d.ts +2 -2
- package/dist/queries/unused-imports.js +1 -1
- package/dist/queries/unused-params.d.ts +2 -2
- package/dist/queries/unused-params.js +1 -1
- package/dist/queries/vue-component-duplicates.d.ts +2 -2
- package/dist/queries/vue-component-duplicates.js +1 -1
- package/dist/queries/vue-composable-candidates.d.ts +2 -2
- package/dist/queries/vue-composable-candidates.js +1 -1
- package/dist/queries/vue-large-view-pressure.d.ts +2 -2
- package/dist/queries/vue-large-view-pressure.js +1 -1
- package/dist/queries/wrapper-candidates.d.ts +2 -2
- package/dist/queries/wrapper-candidates.js +1 -1
- package/dist/reindex-worker.js +23 -24
- package/dist/reindex.d.ts +10 -4
- package/dist/reindex.js +33 -38
- package/dist/runtime.d.ts +167 -11
- package/dist/runtime.js +3 -2
- package/dist/rust-semantic-session-server.js +1 -1
- package/dist/rust-semantic-session-worker.js +1 -1
- package/dist/rust-semantic-worker.js +1 -1
- package/dist/{scip-cli-kRpaexVJ.d.ts → scip-cli-DCvnlZCu.d.ts} +5 -1
- package/dist/watch-server.js +5 -5
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/AI_FAILURE_MODES.md +18 -18
- package/docs/API_EVOLUTION.md +71 -0
- package/docs/CLI_JSON_OUTPUT.md +83 -0
- package/docs/COMMAND_REFERENCE.md +10 -8
- package/docs/COMMITTED_RECORD_COMPATIBILITY.md +117 -0
- package/docs/CONFIGURATION_WRITE_SAFETY.md +130 -0
- package/docs/DETECTOR_GUIDE.md +47 -47
- package/docs/DURABILITY.md +103 -0
- package/docs/INDEX_GENERATIONS.md +121 -0
- package/docs/LOCK_PROTOCOL.md +133 -0
- package/docs/MAILBOX_LIFECYCLE.md +197 -0
- package/docs/REINDEX_METADATA_COMPATIBILITY.md +84 -0
- package/docs/RUST_DURABLE_SESSION_PROTOCOL.md +126 -0
- package/docs/TELEMETRY_RETENTION.md +72 -0
- package/docs/TIME_SEMANTICS.md +77 -0
- package/docs/WATCH_REFRESH_REQUESTS.md +110 -0
- package/docs/WINDOWS_SIDECAR_RELEASE.md +298 -0
- package/docs/analyzer-validation-ledger.md +24 -23
- package/docs/schemas/cli-json-envelope.schema.json +53 -0
- package/docs/schemas/npm-release-state.schema.json +146 -0
- package/docs/schemas/outcome-event-record.schema.json +39 -0
- package/docs/schemas/project-config.schema.json +247 -0
- package/docs/schemas/suppression-record.schema.json +31 -0
- package/docs/schemas/windows-sidecar-provenance.schema.json +137 -0
- package/package.json +15 -5
- package/scripts/build-scip-windows.mjs +180 -61
- package/scripts/scip-windows-provenance.mjs +364 -0
- package/scripts/verify-scip-windows.mjs +29 -0
- package/skills/_shared/SKILL.md +91 -242
- package/skills/_shared/agents/openai.yaml +1 -1
- package/skills/_shared/references/agent-contract-catalog.md +105 -0
- package/skills/_shared/references/command-catalog.md +118 -0
- package/skills/_shared/references/detector-precision-and-diffgate.md +59 -0
- package/skills/_shared/references/evidence-and-dead-code.md +25 -0
- package/skills/scip-audit/SKILL.md +76 -0
- package/skills/scip-audit/agents/openai.yaml +4 -0
- package/skills/scip-audit/references/claims.md +98 -0
- package/skills/scip-audit/references/cleanup.md +101 -0
- package/skills/scip-audit/references/directory.md +222 -0
- package/skills/scip-audit/references/frontend.md +130 -0
- package/skills/scip-audit/references/integrity.md +154 -0
- package/skills/scip-audit/references/maintainability.md +162 -0
- package/skills/scip-audit/references/twin-drift.md +104 -0
- package/skills/scip-diagnose/SKILL.md +52 -0
- package/skills/scip-diagnose/agents/openai.yaml +4 -0
- package/skills/scip-diagnose/references/debug.md +117 -0
- package/skills/{scip-probe-reachability/SKILL.md → scip-diagnose/references/probe-reachability.md} +12 -27
- package/skills/scip-diagnose/references/root-cause.md +145 -0
- package/skills/scip-diagnose/references/triage.md +119 -0
- package/skills/scip-explore/SKILL.md +53 -84
- package/skills/scip-explore/agents/openai.yaml +2 -2
- package/skills/scip-explore/references/diagrams.md +40 -0
- package/skills/scip-explore/references/language-playbook.md +49 -0
- package/skills/scip-improve/SKILL.md +56 -0
- package/skills/scip-improve/agents/openai.yaml +4 -0
- package/skills/scip-improve/references/cleanup-batches.md +53 -0
- package/skills/scip-improve/references/directory-moves.md +53 -0
- package/skills/scip-improve/references/doc-reconcile.md +30 -0
- package/skills/scip-improve/references/frontend-extraction.md +39 -0
- package/skills/scip-improve/references/maintainability-mechanism.md +43 -0
- package/skills/scip-improve/references/twin-drift.md +35 -0
- package/skills/scip-plan/SKILL.md +68 -0
- package/skills/scip-plan/agents/openai.yaml +4 -0
- package/skills/scip-plan/references/api-impact.md +19 -0
- package/skills/scip-plan/references/conductor.md +41 -0
- package/skills/scip-plan/references/high-assurance.md +43 -0
- package/skills/scip-plan/references/hyper-optimization.md +50 -0
- package/skills/scip-plan/references/tla-model.md +88 -0
- package/skills/scip-query/SKILL.md +52 -97
- package/skills/scip-query/agents/openai.yaml +2 -2
- package/skills/scip-setup/SKILL.md +65 -176
- package/skills/scip-setup/agents/openai.yaml +3 -3
- package/skills/scip-setup/references/bootstrap-workflow.md +120 -0
- package/skills/scip-setup/references/language-verification.md +61 -0
- package/skills/scip-setup/references/lifecycle-commands.md +119 -0
- package/skills/scip-setup/references/per-repo-triage.md +24 -0
- package/skills/scip-verify/SKILL.md +123 -70
- package/skills/scip-verify/agents/openai.yaml +2 -2
- package/skills/scip-verify/references/calibrate-detectors.md +170 -0
- package/dist/chunk-2CTX5CMX.js +0 -4
- package/dist/chunk-2Y373BDD.js +0 -2
- package/dist/chunk-C2QSK7E7.js +0 -2
- package/dist/chunk-D4U5Q3FT.js +0 -7
- package/dist/chunk-K2ERX4UT.js +0 -3
- package/dist/chunk-KHE7J5ZN.js +0 -3
- package/dist/chunk-L7SPDE73.js +0 -84
- package/dist/chunk-LHMNRHGV.js +0 -3
- package/dist/chunk-LM72NQ7T.js +0 -3
- package/dist/chunk-MSWVMDAH.js +0 -122
- package/dist/chunk-NH7WNNQC.js +0 -20
- package/dist/chunk-OMPZHGHO.js +0 -2
- package/dist/chunk-SVLTAG5O.js +0 -927
- package/dist/chunk-U7DSEKOM.js +0 -30
- package/dist/chunk-V27BEQJN.js +0 -7
- package/dist/chunk-VMNZB6WI.js +0 -4
- package/dist/chunk-XBN5VO53.js +0 -2
- package/dist/chunk-ZAIILQNP.js +0 -5
- package/dist/command-descriptors-MFU4BCJ7.js +0 -612
- package/dist/direct-navigation-MRMQFIRB.js +0 -3
- package/skills/scip-api-impact/SKILL.md +0 -139
- package/skills/scip-api-impact/agents/openai.yaml +0 -4
- package/skills/scip-calibrate/SKILL.md +0 -131
- package/skills/scip-calibrate/agents/openai.yaml +0 -4
- package/skills/scip-claim-audit/SKILL.md +0 -106
- package/skills/scip-claim-audit/agents/openai.yaml +0 -4
- package/skills/scip-cleanup-audit/SKILL.md +0 -126
- package/skills/scip-cleanup-audit/agents/openai.yaml +0 -4
- package/skills/scip-cleanup-improve/SKILL.md +0 -84
- package/skills/scip-cleanup-improve/agents/openai.yaml +0 -4
- package/skills/scip-concrete-plan/SKILL.md +0 -262
- package/skills/scip-concrete-plan/agents/openai.yaml +0 -4
- package/skills/scip-conductor/SKILL.md +0 -133
- package/skills/scip-conductor/agents/openai.yaml +0 -4
- package/skills/scip-debug/SKILL.md +0 -130
- package/skills/scip-debug/agents/openai.yaml +0 -4
- package/skills/scip-diagram/SKILL.md +0 -110
- package/skills/scip-diagram/agents/openai.yaml +0 -4
- package/skills/scip-directory-architecture/SKILL.md +0 -254
- package/skills/scip-directory-architecture/agents/openai.yaml +0 -4
- package/skills/scip-doc-reconcile/SKILL.md +0 -89
- package/skills/scip-doc-reconcile/agents/openai.yaml +0 -4
- package/skills/scip-hyper-optimization/SKILL.md +0 -156
- package/skills/scip-hyper-optimization/agents/openai.yaml +0 -4
- package/skills/scip-integrity-audit/SKILL.md +0 -152
- package/skills/scip-integrity-audit/agents/openai.yaml +0 -4
- package/skills/scip-language-playbook/SKILL.md +0 -106
- package/skills/scip-language-playbook/agents/openai.yaml +0 -4
- package/skills/scip-maintainability/SKILL.md +0 -158
- package/skills/scip-maintainability/agents/openai.yaml +0 -4
- package/skills/scip-probe-reachability/agents/openai.yaml +0 -4
- package/skills/scip-react-maintainability/SKILL.md +0 -101
- package/skills/scip-react-maintainability/agents/openai.yaml +0 -4
- package/skills/scip-root-cause/SKILL.md +0 -150
- package/skills/scip-root-cause/agents/openai.yaml +0 -4
- package/skills/scip-tla-model-system/SKILL.md +0 -148
- package/skills/scip-tla-model-system/agents/openai.yaml +0 -4
- package/skills/scip-triage-issue/SKILL.md +0 -126
- package/skills/scip-triage-issue/agents/openai.yaml +0 -4
- package/skills/scip-twin-drift/SKILL.md +0 -107
- package/skills/scip-twin-drift/agents/openai.yaml +0 -4
- package/skills/scip-vue-maintainability/SKILL.md +0 -107
- package/skills/scip-vue-maintainability/agents/openai.yaml +0 -4
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Durable Rust session protocol
|
|
2
|
+
|
|
3
|
+
The durable Rust session protocol is the versioned filesystem-message contract
|
|
4
|
+
between a synchronous scip-query process and the reusable process that owns
|
|
5
|
+
rust-analyzer. Its essential safety property is correlation: a result becomes
|
|
6
|
+
usable only after it proves that it belongs to the same logical operation,
|
|
7
|
+
mailbox namespace, and absolute processing interval that the caller admitted.
|
|
8
|
+
|
|
9
|
+
A mailbox-session identity is a SHA-256 value derived from the absolute
|
|
10
|
+
durable-session directory and protocol version. The directory is already
|
|
11
|
+
separated by canonical project root and helper-binary fingerprint; the
|
|
12
|
+
explicit identity makes that separation part of every message rather than an
|
|
13
|
+
assumption inherited from its pathname. A response copied from another
|
|
14
|
+
project or helper directory therefore cannot satisfy the reader.
|
|
15
|
+
|
|
16
|
+
An operation identity is the SHA-256 of the answer-affecting Rust request. It
|
|
17
|
+
is wider than one client attempt: an exact retry joins the same pending,
|
|
18
|
+
inflight, or retained completion. The authoritative deadline is the absolute
|
|
19
|
+
deadline on the first admitted copy of that operation. Later duplicate
|
|
20
|
+
attempts read that retained deadline instead of substituting a new one, which
|
|
21
|
+
keeps the response's time identity stable.
|
|
22
|
+
|
|
23
|
+
## Current v3 request
|
|
24
|
+
|
|
25
|
+
Every newly written request contains:
|
|
26
|
+
|
|
27
|
+
- `mailboxVersion: 1`;
|
|
28
|
+
- `protocolVersion: 3`;
|
|
29
|
+
- `operationKey` and the derived `id: op-<operationKey>`;
|
|
30
|
+
- a non-empty `clientId`;
|
|
31
|
+
- finite `enqueuedAtMs` and `deadlineAtMs`, where their difference equals the
|
|
32
|
+
domain request's positive `timeoutMs`;
|
|
33
|
+
- `sessionIdentity`; and
|
|
34
|
+
- one strictly decoded `semantic` or `import-definitions` request.
|
|
35
|
+
|
|
36
|
+
The server recomputes the operation key after validating the domain request.
|
|
37
|
+
It validates all required definition or import-position fields and every
|
|
38
|
+
optional timeout, concurrency, boolean, and worker-environment field before
|
|
39
|
+
calling rust-analyzer. Unknown additive object members remain allowed; a
|
|
40
|
+
wrong discriminant or wrong field type does not.
|
|
41
|
+
|
|
42
|
+
The civil timestamps are shared-record facts, not wait-loop clocks. Before
|
|
43
|
+
work, the server requires `now <= deadlineAtMs`. After rust-analyzer returns,
|
|
44
|
+
it checks the absolute deadline again and publishes an `expired-request`
|
|
45
|
+
rejection instead of a success if work crossed it. Process-local waits and
|
|
46
|
+
readiness bounds continue to use monotonic time as documented in
|
|
47
|
+
[Time Semantics](TIME_SEMANTICS.md).
|
|
48
|
+
|
|
49
|
+
## Current v3 response
|
|
50
|
+
|
|
51
|
+
The bounded mailbox supplies `mailboxVersion`, `operationKey`, `clientId`,
|
|
52
|
+
`completedAtMs`, `expiresAtMs`, and the authoritative `deadlineAtMs`. The Rust
|
|
53
|
+
server adds:
|
|
54
|
+
|
|
55
|
+
- `protocolVersion: 3`;
|
|
56
|
+
- the request `id`;
|
|
57
|
+
- the request's `sessionIdentity`;
|
|
58
|
+
- either `ok: true`, the session disposition, and the kind-specific response;
|
|
59
|
+
or
|
|
60
|
+
- `ok: false`, a typed `errorCode`, and a diagnostic message.
|
|
61
|
+
|
|
62
|
+
The client accepts a success or rejection only when protocol version, mailbox
|
|
63
|
+
version, request ID, operation key, session identity, and authoritative
|
|
64
|
+
deadline exactly match its admitted operation. It also requires both the
|
|
65
|
+
helper's completion time and the observation time to be no later than that
|
|
66
|
+
deadline. A semantic request cannot consume an import-definition response,
|
|
67
|
+
and the reverse is also rejected.
|
|
68
|
+
|
|
69
|
+
Typed rejection codes are:
|
|
70
|
+
|
|
71
|
+
| Code | Meaning |
|
|
72
|
+
| ---------------------- | ----------------------------------------------------------------------- |
|
|
73
|
+
| `unsupported-protocol` | The outer lifecycle was correlatable, but its domain protocol is newer. |
|
|
74
|
+
| `malformed-request` | Identity, lifecycle, kind, or domain payload validation failed. |
|
|
75
|
+
| `expired-request` | Work was already expired or crossed its deadline. |
|
|
76
|
+
| `handler-error` | A validated request reached the Rust host and the host failed. |
|
|
77
|
+
|
|
78
|
+
When malformed bytes do not contain enough trustworthy identity to correlate
|
|
79
|
+
a response, the server still retains the rejection and dead-letter evidence,
|
|
80
|
+
but a current client will not accept that uncorrelated file as the answer to a
|
|
81
|
+
request.
|
|
82
|
+
|
|
83
|
+
## Compatibility matrix
|
|
84
|
+
|
|
85
|
+
| Writer or peer | Current reader/server behavior |
|
|
86
|
+
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
87
|
+
| Unversioned v2 `{id, request}` client | Accepted during the bounded overlap window after strict request-kind validation. The server synthesizes lifecycle/session fields and writes an additive response. |
|
|
88
|
+
| Prior v3 client without session field | Accepted as `prior-v3` when every other v3 lifecycle field and the recomputed operation identity are valid. The server supplies and echoes the namespace identity. |
|
|
89
|
+
| Current v3 client | Fully correlated current path. |
|
|
90
|
+
| Future explicitly versioned client | Never treated as legacy. A safely correlated envelope receives `unsupported-protocol`; an uncorrelatable envelope receives a generic malformed rejection. |
|
|
91
|
+
| Prior v3 server response | Rejected by the current client as an incompatible uncorrelated response because it lacks session/deadline proof. |
|
|
92
|
+
| Current v3 server to prior v3 client | Additive: the prior reader's established root fields remain in place, and it ignores the new correlation/error metadata. |
|
|
93
|
+
| Future server response | Rejected before response data is exposed. |
|
|
94
|
+
|
|
95
|
+
The server executable's content fingerprint is part of the mailbox directory,
|
|
96
|
+
so normal upgrades select a new namespace rather than pairing a current client
|
|
97
|
+
with a prior helper. The explicit compatibility behavior still matters for
|
|
98
|
+
retained files, rollback, test fixtures, and manual recovery.
|
|
99
|
+
|
|
100
|
+
## Replay, retry, and recovery
|
|
101
|
+
|
|
102
|
+
An exact retry keeps its operation key and request ID. The mailbox returns the
|
|
103
|
+
deadline of the authoritative pending, inflight, or completed record, so the
|
|
104
|
+
retry validates the original response rather than relabeling it with the new
|
|
105
|
+
attempt's deadline. A retained completion observed after that deadline is
|
|
106
|
+
rejected even if the retention window has not yet collected its bytes.
|
|
107
|
+
|
|
108
|
+
A response with the right request ID but a different operation key is a
|
|
109
|
+
different operation. A response with both identities but a different
|
|
110
|
+
mailbox-session identity is a cross-session replay. A response whose echoed
|
|
111
|
+
deadline differs is a different lifecycle. All three fail before payload
|
|
112
|
+
decoding.
|
|
113
|
+
|
|
114
|
+
If the current client reports an incompatible prior-server response, remove
|
|
115
|
+
only the specific durable session directory after confirming no current
|
|
116
|
+
scip-query process owns it, then retry so the content-addressed current helper
|
|
117
|
+
creates a fresh namespace. Do not delete a broad cache root.
|
|
118
|
+
|
|
119
|
+
Executable coverage lives in:
|
|
120
|
+
|
|
121
|
+
- `tests/semantic/rust/durable-session-protocol.test.ts`;
|
|
122
|
+
- `tests/semantic/rust/rust-durable-session.test.ts`; and
|
|
123
|
+
- `tests/storage/bounded-mailbox.test.ts`.
|
|
124
|
+
|
|
125
|
+
The shared pending/inflight/completion state machine remains documented in
|
|
126
|
+
[Filesystem mailbox lifecycle](MAILBOX_LIFECYCLE.md).
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Operational Telemetry Retention
|
|
2
|
+
|
|
3
|
+
Operational telemetry is observational history produced while scip-query
|
|
4
|
+
works. Its concrete referents here are `reindex-activity.jsonl`, which records
|
|
5
|
+
refresh frequency and estimated logical output, and `affected-shadow.jsonl`,
|
|
6
|
+
which records compact affected-set calibration outcomes. It differs from an
|
|
7
|
+
authoritative record because no index generation, policy decision, ownership
|
|
8
|
+
claim, or completed user operation is reconstructed from it.
|
|
9
|
+
|
|
10
|
+
## Retained segment set
|
|
11
|
+
|
|
12
|
+
Each history has two ordered segments:
|
|
13
|
+
|
|
14
|
+
1. `<history>.previous` is the older retained segment.
|
|
15
|
+
2. `<history>` is the current append segment.
|
|
16
|
+
|
|
17
|
+
The reindex-activity limit is 1 MiB per segment. The affected-shadow limit is
|
|
18
|
+
8 MiB per segment. A single JSON record larger than its configured limit
|
|
19
|
+
expands that segment's effective limit to the complete record size; a
|
|
20
|
+
successful append is never made immediately ineligible by its own size.
|
|
21
|
+
Rotation removes the former previous segment, renames the complete current
|
|
22
|
+
segment to previous, and then creates the new current segment. Readers scan
|
|
23
|
+
previous before current.
|
|
24
|
+
|
|
25
|
+
Retention deliberately permits deletion of records older than those two
|
|
26
|
+
segments. That bounded-history deletion is different from concurrency loss:
|
|
27
|
+
which segment is pruned is decided while the append/rotation lock excludes
|
|
28
|
+
other writers.
|
|
29
|
+
|
|
30
|
+
## Serialization and crash recovery
|
|
31
|
+
|
|
32
|
+
The rotation lock is `<history>.rotation.lock`. It is a process-instance lock:
|
|
33
|
+
its record contains a PID, an operating-system process-start identity when
|
|
34
|
+
available, and a random token, and only that owner can release it. Lock
|
|
35
|
+
acquisition, incomplete-tail repair, retention pruning, rename, append, and
|
|
36
|
+
the default retained-set read all occur beneath that lock. Waits use a
|
|
37
|
+
process-local monotonic two-second budget.
|
|
38
|
+
|
|
39
|
+
Every append is one newline-terminated JSON value. If a process stops during
|
|
40
|
+
the append, the current segment can end in one incomplete tail. The next
|
|
41
|
+
writer truncates only the bytes after the last newline before it rotates or
|
|
42
|
+
appends. Readers ignore and count incomplete tail bytes. A stop after current
|
|
43
|
+
is renamed but before the new append leaves the old complete segment at
|
|
44
|
+
`.previous`; a later writer creates a new current segment.
|
|
45
|
+
|
|
46
|
+
These files are process-visible but not crash-durable. They are not fsynced,
|
|
47
|
+
so a kernel or power failure may lose the newest observation even after the
|
|
48
|
+
write call returned. That is acceptable only because the histories are
|
|
49
|
+
operational evidence. Authoritative index, lock, suppression, configuration,
|
|
50
|
+
mailbox-response, and release records use their own durable protocols.
|
|
51
|
+
|
|
52
|
+
## Failure contract
|
|
53
|
+
|
|
54
|
+
Lock timeout and ownership-changed release are typed failures at the shared
|
|
55
|
+
helper boundary. The reindex-activity and affected-shadow production writers
|
|
56
|
+
remain best effort: they catch telemetry failure so an observation cannot
|
|
57
|
+
change the authoritative reindex result. Callers that invoke the shared helper
|
|
58
|
+
directly can distinguish lock timeout, count repaired tail bytes, and count
|
|
59
|
+
partial bytes ignored during reads.
|
|
60
|
+
|
|
61
|
+
The regression suite forces:
|
|
62
|
+
|
|
63
|
+
- a competing writer at tail repair, prior-segment pruning, current rotation,
|
|
64
|
+
and append;
|
|
65
|
+
- a stop after rotation and a partial append tail;
|
|
66
|
+
- bounded retention across three rotations;
|
|
67
|
+
- deterministic previous-then-current reads;
|
|
68
|
+
- partial legacy tails; and
|
|
69
|
+
- bounded live-owner contention.
|
|
70
|
+
|
|
71
|
+
The implementation is `src/reindex/rotating-jsonl.ts`; its direct contract
|
|
72
|
+
tests are `tests/reindex/rotating-jsonl.test.ts`.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Time Semantics
|
|
2
|
+
|
|
3
|
+
scip-query separates shared timestamps from local elapsed-time control so a
|
|
4
|
+
system-clock correction cannot prolong a wait or impersonate ownership.
|
|
5
|
+
|
|
6
|
+
A **civil timestamp** is a calendar coordinate produced by the host's system
|
|
7
|
+
clock and written so different processes and later executions can compare
|
|
8
|
+
records. ISO dates, `enqueuedAtMs`, `deadlineAtMs`, heartbeat times, retention
|
|
9
|
+
times, and diagnostic start/completion times refer to this clock. Network time
|
|
10
|
+
synchronization, administrator changes, suspend/resume behavior, virtual
|
|
11
|
+
machine migration, and a reboot can move its observed value forward or
|
|
12
|
+
backward.
|
|
13
|
+
|
|
14
|
+
A **monotonic clock reading** is a process-local elapsed-time coordinate whose
|
|
15
|
+
ordering does not move backward while that process runs. `performance.now()`
|
|
16
|
+
is the JavaScript implementation used here. A monotonic reading is suitable
|
|
17
|
+
for durations and local deadlines because a civil-clock adjustment cannot add
|
|
18
|
+
time to or remove time from the measured interval. Its numeric value is not a
|
|
19
|
+
portable timestamp and is never persisted as cross-process evidence.
|
|
20
|
+
|
|
21
|
+
A **deadline** is the boundary that ends an operation when its resource budget
|
|
22
|
+
is consumed. Local request waits, lock waits, service startup and stop waits,
|
|
23
|
+
Rust readiness work, heartbeat throttles, activity polling, cache sweeps,
|
|
24
|
+
idle shutdown, and reported elapsed durations use monotonic readings. Timer
|
|
25
|
+
delivery can be late if the process is not scheduled, but moving the civil
|
|
26
|
+
clock cannot make the deadline later.
|
|
27
|
+
|
|
28
|
+
A **durable expiry hint** is a persisted civil timestamp that lets another
|
|
29
|
+
process classify old work for bounded cleanup or rejection. It is weaker than
|
|
30
|
+
ownership evidence because timestamp age cannot identify the process that
|
|
31
|
+
created a record. Mailbox request deadlines, response retention, dead-letter
|
|
32
|
+
retention, and heartbeat times remain durable hints. They may reject or clean
|
|
33
|
+
rebuildable retained data according to the documented retention contract, but
|
|
34
|
+
they do not alone authorize signaling a process, replacing a live service, or
|
|
35
|
+
reclaiming an inflight claim.
|
|
36
|
+
|
|
37
|
+
## Decision table
|
|
38
|
+
|
|
39
|
+
| Decision | Clock/evidence used | Why |
|
|
40
|
+
| ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
|
|
41
|
+
| Stop waiting for a lock, response, startup, shutdown, or readiness phase | Process-local monotonic deadline | The wait remains bounded across forward and backward civil-clock jumps. |
|
|
42
|
+
| Report a duration | Difference between monotonic readings | A clock correction cannot create a negative or inflated elapsed duration. |
|
|
43
|
+
| Publish a heartbeat, start time, completion time, or request expiry | Civil timestamp | Other processes and later executions need an inspectable shared coordinate. |
|
|
44
|
+
| Accept a watch or mailbox service as the same owner | Protocol/project identity, live PID, and matching process-start identity when recorded | A timestamp cannot distinguish PID reuse or a different executable instance. |
|
|
45
|
+
| Replace or signal a watch service | Matching process-start identity plus the explicit stop/start protocol | An old heartbeat alone never grants process-signal authority. |
|
|
46
|
+
| Reclaim an inflight mailbox claim | Lease expired and recorded process instance is dead or replaced | The civil lease is a delay hint; process-instance loss supplies ownership evidence. |
|
|
47
|
+
| Reclaim a process lock | Dead recorded process or mismatched process-start identity, followed by a guarded unchanged recheck | Valid locks do not expire; malformed public locks fail closed. |
|
|
48
|
+
|
|
49
|
+
## Cross-process handoff
|
|
50
|
+
|
|
51
|
+
Absolute monotonic readings are not sent between independent processes.
|
|
52
|
+
Portable mailbox requests carry relative timeout budgets and civil diagnostic
|
|
53
|
+
times. The receiving Rust service converts the relative budget into a new
|
|
54
|
+
deadline in its own monotonic clock domain before it hands work to its worker
|
|
55
|
+
thread. TypeScript and Rust clients likewise use their own monotonic deadline
|
|
56
|
+
while polling for a retained response.
|
|
57
|
+
|
|
58
|
+
Legacy state without a process-start identity remains readable. A live legacy
|
|
59
|
+
PID is treated conservatively: it can support availability where no process
|
|
60
|
+
mutation is attempted, but it cannot authorize a signal or deletion. An
|
|
61
|
+
unparseable public ownership record fails closed and requires operator review.
|
|
62
|
+
|
|
63
|
+
## Verification
|
|
64
|
+
|
|
65
|
+
The clock contract is covered by injected-clock tests that independently move
|
|
66
|
+
civil time forward and backward, advance monotonic time, reuse a PID with a
|
|
67
|
+
different process-start identity, and hold a live owner beyond a civil lease.
|
|
68
|
+
Focused suites include:
|
|
69
|
+
|
|
70
|
+
- `tests/domain/time.test.ts`;
|
|
71
|
+
- `tests/platform/process-file-lock.test.ts`;
|
|
72
|
+
- `tests/runtime/repository-cache-lifecycle.test.ts`;
|
|
73
|
+
- `tests/runtime/revisioned-file.test.ts`;
|
|
74
|
+
- `tests/runtime/watch-service.test.ts`;
|
|
75
|
+
- `tests/storage/bounded-mailbox.test.ts`;
|
|
76
|
+
- the TypeScript semantic and index mailbox suites; and
|
|
77
|
+
- the durable Rust and rust-analyzer readiness suites.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Watch Refresh Requests
|
|
2
|
+
|
|
3
|
+
## Contract
|
|
4
|
+
|
|
5
|
+
A watch refresh request is a durable command-side intent to make one project's
|
|
6
|
+
index current. Its concrete referents are the records created when a command or
|
|
7
|
+
agent hook observes a stale index and asks the live watch service to reindex.
|
|
8
|
+
It is a request record distinguished from ordinary watch activity by remaining
|
|
9
|
+
authoritative until a corresponding refresh attempt completes or its declared
|
|
10
|
+
deadline expires.
|
|
11
|
+
|
|
12
|
+
Watch activity is a disposable observation that a command recently used the
|
|
13
|
+
service. Its concrete referent is `watch-activity.json`; it is a
|
|
14
|
+
last-writer-wins timestamp whose only effect is extending the daemon's idle
|
|
15
|
+
lifetime. It is not a queue and carries no current refresh authority.
|
|
16
|
+
|
|
17
|
+
An admission is the successful publication of one complete immutable request
|
|
18
|
+
under `watch-refresh-requests/requests/`. Its defining property is that the
|
|
19
|
+
stable request path exists before the caller is told the request was accepted.
|
|
20
|
+
A claim is an exclusive processing marker for that admitted request. A
|
|
21
|
+
completion is a durable receipt proving that the attempt associated with the
|
|
22
|
+
claim finished successfully, or that the request expired before execution.
|
|
23
|
+
|
|
24
|
+
These records provide at-least-once execution for an accepted, unexpired
|
|
25
|
+
request. At-least-once execution means a crash after reindex success but before
|
|
26
|
+
the completion receipt may repeat the safe reindex operation; it never means an
|
|
27
|
+
unacknowledged request can disappear.
|
|
28
|
+
|
|
29
|
+
## Layout
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
<project-cache>/
|
|
33
|
+
watch-activity.json
|
|
34
|
+
watch-refresh-requests/
|
|
35
|
+
requests/<request-id>.json
|
|
36
|
+
claims/<request-id>.json
|
|
37
|
+
completions/<request-id>.json
|
|
38
|
+
staging/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- `requests/` is the immutable admission log.
|
|
42
|
+
- `claims/` contains exclusive, temporary ownership markers.
|
|
43
|
+
- `completions/` contains immutable acknowledgements.
|
|
44
|
+
- `staging/` contains same-filesystem temporary files used to publish a
|
|
45
|
+
complete record through an exclusive hard-link operation.
|
|
46
|
+
|
|
47
|
+
The request ID is random unless the caller supplies an idempotency key. An
|
|
48
|
+
idempotency key is a caller-chosen logical-operation identity whose hash
|
|
49
|
+
becomes the stable request ID; retries with that key observe the first admitted
|
|
50
|
+
request instead of appending another one. The first request's detail and
|
|
51
|
+
deadline remain authoritative.
|
|
52
|
+
|
|
53
|
+
## Lifecycle
|
|
54
|
+
|
|
55
|
+
1. The requester durably writes a complete staging record.
|
|
56
|
+
2. It exclusively links that record into `requests/`. A collision is a
|
|
57
|
+
duplicate, not an overwrite.
|
|
58
|
+
3. The watch server, while holding the project watch lock, claims pending,
|
|
59
|
+
unexpired requests through exclusive claim records.
|
|
60
|
+
4. It deliberately coalesces one claimed batch into one `watch-demand`
|
|
61
|
+
refresh. Requests arriving while the watcher is busy remain pending.
|
|
62
|
+
5. A successful corresponding reindex writes every completion receipt before
|
|
63
|
+
removing any claim.
|
|
64
|
+
6. A failed reindex removes its claims without writing completion, making the
|
|
65
|
+
requests pending after a bounded retry delay.
|
|
66
|
+
7. A successor watch server removes predecessor claims only after acquiring
|
|
67
|
+
the same exclusive watch lock. Completed requests remain completed; all
|
|
68
|
+
other claimed requests become pending.
|
|
69
|
+
|
|
70
|
+
The default request deadline is ten minutes. An expired request gets an
|
|
71
|
+
explicit `expired` completion rather than being silently deleted. Completed
|
|
72
|
+
and expired history is retained for seven days; pruning removes only a receipt
|
|
73
|
+
and its already-acknowledged request. Pending and claimed requests are never
|
|
74
|
+
history-pruned. Idempotency is therefore guaranteed for at least the history
|
|
75
|
+
retention window.
|
|
76
|
+
|
|
77
|
+
## Crash and Concurrency Outcomes
|
|
78
|
+
|
|
79
|
+
| Boundary | Observable outcome |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| Crash before exclusive admission | No request was accepted; only staging may remain |
|
|
82
|
+
| Crash after admission before caller sees success | Request remains pending; retrying the same idempotency key returns the admitted request |
|
|
83
|
+
| Two callers use one idempotency key | Exactly one immutable request wins |
|
|
84
|
+
| Two callers use distinct keys | Both requests remain independently visible and may be coalesced deliberately |
|
|
85
|
+
| Crash after claim before reindex | Successor clears the stale claim and retries the request |
|
|
86
|
+
| Reindex failure | Claim is released; request remains pending |
|
|
87
|
+
| Crash after reindex before completion | Request may execute again; it is never lost |
|
|
88
|
+
| Crash after completion before claim removal | Completion prevents replay; successor removes the obsolete claim |
|
|
89
|
+
| Activity writer races any row above | Activity changes only `watch-activity.json` and cannot modify request state |
|
|
90
|
+
|
|
91
|
+
## Compatibility and Diagnostics
|
|
92
|
+
|
|
93
|
+
Protocol version 5 writers use the request store. During the overlap release,
|
|
94
|
+
the watch server still recognizes the former
|
|
95
|
+
`refreshRequestedAt`/`refreshDetail` fields if an older client writes them. On
|
|
96
|
+
observation it converts that timestamp to a deduplicated durable request before
|
|
97
|
+
processing it. New activity writers never place refresh intent in the activity
|
|
98
|
+
file.
|
|
99
|
+
|
|
100
|
+
`scip-query watch --status` reports pending, claimed, completed, expired, and
|
|
101
|
+
invalid record counts. A nonzero invalid count means an on-disk record failed
|
|
102
|
+
strict validation; the store does not treat malformed bytes as an accepted
|
|
103
|
+
request or completion.
|
|
104
|
+
|
|
105
|
+
This protocol does not promise exactly-once reindex execution. Exactly-once
|
|
106
|
+
execution would require atomically committing the index generation and the
|
|
107
|
+
request receipt across separate storage authorities. Reindex is safe to
|
|
108
|
+
repeat, so the protocol chooses the stronger practical guarantee: accepted
|
|
109
|
+
intent is never silently lost, and successful acknowledgement is never
|
|
110
|
+
inferred from absence.
|