{"_id":"friction-cli","_rev":"37-45a6a2a49ea50c4f1b8f4cace8656a3f","name":"friction-cli","dist-tags":{"latest":"0.6.17"},"versions":{"0.1.2":{"name":"friction-cli","version":"0.1.2","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.1.2","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"eae83073b479bca5bd17510b890cf32b14d7f497","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.1.2.tgz","fileCount":3,"integrity":"sha512-qWcv5iScBILq2Mwh/pMRtlfRzNG+4kdYY1Bzitduzxl2OJFXUM3oaQfFneIfrBxhJ4dyA/o6buuAyYpbFVlA6A==","signatures":[{"sig":"MEUCIGymFE7TYUTY9rqMurKUzqYKU2ighJD1USaR93cuodzkAiEA8ADkBOnOeYqWOogxQ2dkVgBC1XHp14OsTHdlTBIW8y0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":31793},"engines":{"node":">=18"},"gitHead":"54ae9c9c5537deb6509fbdbca264844da77687ea","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.1.2","@mhriaznov/friction-win32-x64":"0.1.2","@mhriaznov/friction-darwin-x64":"0.1.2","@mhriaznov/friction-linux-arm64":"0.1.2","@mhriaznov/friction-darwin-arm64":"0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.1.2_1785071419650_0.4693253099005197","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"friction-cli","version":"0.1.3","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.1.3","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"16c95633df931c16f477de27f95163500a4b2efb","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.1.3.tgz","fileCount":3,"integrity":"sha512-+v8+f9zABiO+E89GSPqMqr09s3sF4WIx3Qv3jpa5VhQ0x93qnU1vZvpnmWXHRObR6qsugMueHYOccQ0SwJfM5Q==","signatures":[{"sig":"MEUCIQCj3IHEXX0JsiZzf2i4mumfkp7nBsdlGOkNVRtvhXVfKwIgdJgKJlbudNyZtiJacyDwdGWbr07r/h5Kmn0Uy61iApc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":32404},"engines":{"node":">=18"},"gitHead":"d55a3646b040baff107f0bb54c11e70f137124ac","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.1.3","@mhriaznov/friction-win32-x64":"0.1.3","@mhriaznov/friction-darwin-x64":"0.1.3","@mhriaznov/friction-linux-arm64":"0.1.3","@mhriaznov/friction-darwin-arm64":"0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.1.3_1785089032470_0.3738200845637667","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"friction-cli","version":"0.1.4","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.1.4","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"99522db6926bbe7135a898cf59c04f0c6b29d284","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.1.4.tgz","fileCount":3,"integrity":"sha512-ywQxfVnj97IBE0X7WSpCPcoyks2Kl89ioEkr2MASdnhyLnpCtQu8E7iVkHHiBxpXVahmvPmKj3U3STzz2CEXdQ==","signatures":[{"sig":"MEUCIQCiogrc3UfX+v6+nodtj2Oep8k3aoxuaweHwtFhFmPX9QIgaL0yFHo6QqYo2bDi94N8xFrWnNRvj5Sl9B9ntXS5asQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":32867},"engines":{"node":">=18"},"gitHead":"10fdf81e21a017bcfbe24d828e5154a8b81a6447","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.1.4","@mhriaznov/friction-win32-x64":"0.1.4","@mhriaznov/friction-darwin-x64":"0.1.4","@mhriaznov/friction-linux-arm64":"0.1.4","@mhriaznov/friction-darwin-arm64":"0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.1.4_1785101725014_0.11576371096550342","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"friction-cli","version":"0.1.5","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.1.5","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"e12435a56da100f906d64c214ffe32e77b5ffe53","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.1.5.tgz","fileCount":3,"integrity":"sha512-NeMQ8JCUFAjtrJQx8tbokms4S96aODXDC58mOwKZCfdTHuOxHcy9miB3AI8BPr1/m4NTXYiCiOSrT5VgEi095A==","signatures":[{"sig":"MEUCIQDRHUhYf/ATnj03yrsijbaOfH2ho3N+g8ktav8pflNTegIgSqF/GxNt4QX/5Dkj5ejcsNGbnXTunNP1Xtbi9Tw7yDs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":33446},"engines":{"node":">=18"},"gitHead":"5cc4a83053b8c3493ecf1e4407084ac1bfad906f","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.1.5","@mhriaznov/friction-win32-x64":"0.1.5","@mhriaznov/friction-darwin-x64":"0.1.5","@mhriaznov/friction-linux-arm64":"0.1.5","@mhriaznov/friction-darwin-arm64":"0.1.5"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.1.5_1785136159476_0.9866916366100322","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"friction-cli","version":"0.2.0","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.2.0","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"a5f3848ecd0ec3cac1e223c0396445fe7c6c7687","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.2.0.tgz","fileCount":3,"integrity":"sha512-sFCsU2eJzBmKT066Ajf4CE60gscVOniZHH4R1Sgm7jhxK9aBD9pOyCnfMQGcrLFtNbfi2lkB6hw5VdgrtrRseg==","signatures":[{"sig":"MEUCIGgxUnXM1djzSnDyf0PNFmV6I7CnGbbEmsr7rW/dtFWVAiEAnX7/HjHyW181ANHNTGXgWYD0YUCoaESGjxUFaSZN0zw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38183},"engines":{"node":">=18"},"gitHead":"599ab7f53ad83691e1ec9d7ad5884f1384355d73","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.2.0","@mhriaznov/friction-win32-x64":"0.2.0","@mhriaznov/friction-darwin-x64":"0.2.0","@mhriaznov/friction-linux-arm64":"0.2.0","@mhriaznov/friction-darwin-arm64":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.2.0_1785148863652_0.21832981928827144","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"friction-cli","version":"0.2.1","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.2.1","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"b143aa0c9668f8731769963dabd61d37f1871f77","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.2.1.tgz","fileCount":3,"integrity":"sha512-XvrAeMkfIsonf5MuPtb1gxaIBo/9AdLAQRwF/du30s1t5JdqJwC5bEbzXf/6TL/oVjqhxwbl5hm/bSBiFqv4/A==","signatures":[{"sig":"MEUCIHrG+50yDb6dGFUcN8WsSF9Xc/9q4MXPV5Hgl0LiJ4jlAiEA2iugWep7GLZI76lLAl9Q+OomqZLgZdIilJ32SJdAAiE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38183},"engines":{"node":">=18"},"gitHead":"d3d8f464a39eb1ebc094ad4ec3227efd594de978","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.2.1","@mhriaznov/friction-win32-x64":"0.2.1","@mhriaznov/friction-darwin-x64":"0.2.1","@mhriaznov/friction-linux-arm64":"0.2.1","@mhriaznov/friction-darwin-arm64":"0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.2.1_1785160851120_0.23000505990252007","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"friction-cli","version":"0.2.2","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.2.2","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"e0ce0a7615a43383e95231a3c2c0915178eeeeff","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.2.2.tgz","fileCount":3,"integrity":"sha512-Oh4xp6UmrSIL6yHCHDwEVv/HP91cXo8HP+3qKfMmd9tWMzrzqEmTJ0XYPdEd7SGHE/NiSO3BEDMbOtrT3b3HlQ==","signatures":[{"sig":"MEYCIQDDh7QYQzl4G4HPOGPsaFGwToZvsDlSpTjWI+gG8flfuAIhALCfYOTmz2lN30ihlSzPCSWq3fBx1euSQlW6JNjpIyuI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38547},"engines":{"node":">=18"},"gitHead":"b8ad8a48f5949a59017d34d77498dc4eb3449939","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.2.2","@mhriaznov/friction-win32-x64":"0.2.2","@mhriaznov/friction-darwin-x64":"0.2.2","@mhriaznov/friction-linux-arm64":"0.2.2","@mhriaznov/friction-darwin-arm64":"0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.2.2_1785170104271_0.7824232543590897","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"friction-cli","version":"0.3.0","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.3.0","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"f71a7fe7365278fff504dbd218a7ff14cb819038","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.3.0.tgz","fileCount":3,"integrity":"sha512-Q77JkUrDFu8o6ImL6YwDbM5D5ixxsVDzqBc6S4/i4iF9zrfmsjJ2PFjLoB6EntdpSUbqVZglzPSAbuKRQuiZbA==","signatures":[{"sig":"MEQCIA9RfHgR67O+ClzwnGuYe8wmee4fEL/WZy47mJJ5ieY9AiBn9+y/KE8+xCWmM+Jg8pQAFnZKkIZZKaRCO2NAyooEHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38547},"engines":{"node":">=18"},"gitHead":"f0a05f6ffc4557f2e47554ec704b13f1c55d42c3","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.3.0","@mhriaznov/friction-win32-x64":"0.3.0","@mhriaznov/friction-darwin-x64":"0.3.0","@mhriaznov/friction-linux-arm64":"0.3.0","@mhriaznov/friction-darwin-arm64":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.3.0_1785190034991_0.8878544411592242","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"friction-cli","version":"0.3.1","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.3.1","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"c358613813bb1b9ecc641bdc7a89a6d35ace6c87","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.3.1.tgz","fileCount":3,"integrity":"sha512-IX8Mq+HWTVV4lep7tZOQ9gjhM5XDjj0/gYKnbt2ynWggJPl9B4slYgYvVad/SDZm+s3haNj6R2xpq5/HYEeoZA==","signatures":[{"sig":"MEUCIBgpwYoTcifFHEt4pxotwF0rhh32R6YfSaPsEBbf4wk4AiEA1g0ZgApEiuSYJRs6ppgjLAbTsV6iVVkHrCL2uPQi+B8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38547},"engines":{"node":">=18"},"gitHead":"a3f7142c78adcc7cc82baceed6dcc604a748ed9a","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.3.1","@mhriaznov/friction-win32-x64":"0.3.1","@mhriaznov/friction-darwin-x64":"0.3.1","@mhriaznov/friction-linux-arm64":"0.3.1","@mhriaznov/friction-darwin-arm64":"0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.3.1_1785225955886_0.3437889109570349","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"friction-cli","version":"0.3.2","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.3.2","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"4c3e6064d5ff860b9b476792ec3d92abaaf0befc","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.3.2.tgz","fileCount":3,"integrity":"sha512-TBeHMMo4zODbJoKKbezDbrWYDxMWn4llmnxmI3yNb/Tikqh9FjiFca0kk6vzoXwGXKPjpxxXYyPJqPUiSKinRg==","signatures":[{"sig":"MEQCH0mGJMJTWQ11Klw2/V5VJgq5PX5dez3qO4LYPmlFiCoCIQCIe8GKF0hs8/8N0pZc9g+h3ih4aCzAN0lsacK/geSv6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38854},"engines":{"node":">=18"},"gitHead":"d909e045ae324e3dc768bfdcc7d6a3af6e017336","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.3.2","@mhriaznov/friction-win32-x64":"0.3.2","@mhriaznov/friction-darwin-x64":"0.3.2","@mhriaznov/friction-linux-arm64":"0.3.2","@mhriaznov/friction-darwin-arm64":"0.3.2"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.3.2_1785241069595_0.37315869595979123","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"friction-cli","version":"0.3.3","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.3.3","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"8f80123fca05e7c54147d8fc70ea8aebc3ff2f51","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.3.3.tgz","fileCount":3,"integrity":"sha512-N+1Z0C0jfwWCvEX9QJu2I8X0n9fesXRNTcp+tNFIB+O/5dhCWLAOreJD92AcKkPfH6v6yQhIo14jeykWCETsHQ==","signatures":[{"sig":"MEQCICJJoTsd5P4f1iiMt033KuNO1bIxM6zyt0C2T2EyiuOvAiBefokg7ydo/AMEeIgz/5pyAbd7cbryw34vudOVFYfCxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38854},"engines":{"node":">=18"},"gitHead":"16bc9bca59fa915f9381066ba0ff14e1bce9e586","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.3.3","@mhriaznov/friction-win32-x64":"0.3.3","@mhriaznov/friction-darwin-x64":"0.3.3","@mhriaznov/friction-linux-arm64":"0.3.3","@mhriaznov/friction-darwin-arm64":"0.3.3"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.3.3_1785242918931_0.6048775413133489","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"friction-cli","version":"0.3.4","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.3.4","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"8ac5a47b59342298f43fe9c7480f19119aa9b4e1","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.3.4.tgz","fileCount":3,"integrity":"sha512-eGWmGtipDlh4eTMn2DY6+jQ+uVnhlqs3Bi2KW4HeSj4k2UywdOTOuNSBBz8jnj5eu8454D/GwSzZW4n6H234FA==","signatures":[{"sig":"MEUCIQCk9ejmW9kJ7IfAXBZ6rGiCbN6DoQTXzLCTrDINIK3o0gIgJwMBAMAh5OaGwA3T3Fobw7AR4bXS3TdLiOZmKGZyxkc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39337},"engines":{"node":">=18"},"gitHead":"2ccb57f496059cd32db8c0590e24aefb4a0bcd4d","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.3.4","@mhriaznov/friction-win32-x64":"0.3.4","@mhriaznov/friction-darwin-x64":"0.3.4","@mhriaznov/friction-linux-arm64":"0.3.4","@mhriaznov/friction-darwin-arm64":"0.3.4"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.3.4_1785249335291_0.2467630274771191","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"friction-cli","version":"0.4.0","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.4.0","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"d42166b681c6f6d1d36ff63ba4128ddcbff37910","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.4.0.tgz","fileCount":3,"integrity":"sha512-UY1cZ0mTFG+zarPpmgWk96qguF9Ogd9gT/+srPXT7u7fWkijsDZpoE/Nrr974MLlvJmB77Oo9+6Yi0qPFVx9sw==","signatures":[{"sig":"MEUCIQDXNd4nqbX6tCYSOx37bqB5d8R+oMy2oHRkuv+VNOCbgwIgGuFOXRU03+Rcfp/A8mfxTHmz2W9t5GhO3ZJdqNC7MUE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":40901},"engines":{"node":">=18"},"gitHead":"08fcc152240de5e53b811abd73bd582a839aefb5","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.4.0","@mhriaznov/friction-win32-x64":"0.4.0","@mhriaznov/friction-darwin-x64":"0.4.0","@mhriaznov/friction-linux-arm64":"0.4.0","@mhriaznov/friction-darwin-arm64":"0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.4.0_1785409917979_0.7244882945513562","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"friction-cli","version":"0.4.1","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.4.1","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"f6f3854df17804bf1742d40c91569e8718920e1a","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.4.1.tgz","fileCount":3,"integrity":"sha512-7q5WYd5sngtkGT2Hck2dN+00lxFzkLNU/yir31rDMQ9ykSc7gtoXZwYuG0vojpEsZHDKpt1kGR20cSoqf+E5hw==","signatures":[{"sig":"MEYCIQD93dq00On57avDmjyHSyjOVAZjlb5qFTOaoqWGjkBHpQIhANWI117OMo9RbUkGmUbUkhOD9vHnHW5t8GCG7yFFT8/B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":40901},"engines":{"node":">=18"},"gitHead":"71ed08f1af0ed59d27f2a90014867cd3592070af","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.4.1","@mhriaznov/friction-win32-x64":"0.4.1","@mhriaznov/friction-darwin-x64":"0.4.1","@mhriaznov/friction-linux-arm64":"0.4.1","@mhriaznov/friction-darwin-arm64":"0.4.1"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.4.1_1785417136227_0.5945737746901889","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"friction-cli","version":"0.5.0","keywords":["markdown","lint","documentation","llm","prose","cli"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.5.0","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://github.com/ngriaznov/friction#readme","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"0862900613e9dfc7c98709575ecbf3ee1e20381f","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.5.0.tgz","fileCount":3,"integrity":"sha512-ycNcSnrZt2FVuBGqn5+qquFLdtn8UewTjUUK2gKDxXb9UcaCF6AM2mBodGxHAtvKTk7q/lhtgkEeyfpqxEOJ4A==","signatures":[{"sig":"MEQCIEBdQtlUXHMvOg6g/zMSCKSZy5BcoPOPUkSSZPDxRUWgAiBALdzvWCw12hHYjBcjVxkSMwck2idGf1t82OGpjOPjUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":45130},"engines":{"node":">=18"},"gitHead":"84e0a124a1614ebb763ad1389daecd2e298590f3","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.5.0","@mhriaznov/friction-win32-x64":"0.5.0","@mhriaznov/friction-darwin-x64":"0.5.0","@mhriaznov/friction-linux-arm64":"0.5.0","@mhriaznov/friction-darwin-arm64":"0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.5.0_1785656110941_0.15220266007118322","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"friction-cli","version":"0.5.1","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.5.1","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"0db1779b30398232e60a5bebfe31f94d84e9af89","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.5.1.tgz","fileCount":3,"integrity":"sha512-EGaJqWatjYsLzRwF7NyWZf+6moBGyhBUQGCIDUexGdzsXfQpotc/FcSqo/lNdbnwyAT2j42G99+usV54qcTDPQ==","signatures":[{"sig":"MEUCIGSaUG4LWWHFEPmLnI3jzmPv5CQXCwwfTDh+NcnKF61CAiEAuMs/sAkwxbeR+NejpiZnSUEJGAWakDIdDEtSGvjJhvQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39269},"engines":{"node":">=18"},"gitHead":"5de44139b1b2e87008e2b5816c7059c42aa5b5ee","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.5.1","@mhriaznov/friction-win32-x64":"0.5.1","@mhriaznov/friction-darwin-x64":"0.5.1","@mhriaznov/friction-linux-arm64":"0.5.1","@mhriaznov/friction-darwin-arm64":"0.5.1"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.5.1_1785693405628_0.16747800358945963","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"friction-cli","version":"0.5.2","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.5.2","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"bb90660471c172c531e088799fc298651e7007a9","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.5.2.tgz","fileCount":3,"integrity":"sha512-OAIsLBJM3y1rnf8nRCz7pTqvplks32tUVkQJtN4T947wqYmqwrnFOZvTIOD6ILprpmOoEbbJqVy7XRM+L9twdA==","signatures":[{"sig":"MEQCIBbWjMbDJ2/s+GrV8knLNPzKOEopSrFDSaQLzZp0NYp2AiAtzE0KYQzZ4ZA/IycEJUHWlrhkseFackHSR3Xui1ENCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39121},"engines":{"node":">=18"},"gitHead":"32a8c2fab354a1ca5a99c31a60ff2d8896ceaa39","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.5.2","@mhriaznov/friction-win32-x64":"0.5.2","@mhriaznov/friction-darwin-x64":"0.5.2","@mhriaznov/friction-linux-arm64":"0.5.2","@mhriaznov/friction-darwin-arm64":"0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.5.2_1785785889196_0.9820026576459784","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"friction-cli","version":"0.5.3","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.5.3","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"9454c91c6dd9fae2a096bb9dec813422215e20ce","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.5.3.tgz","fileCount":3,"integrity":"sha512-LjSuIe18L35lfYxAv9mJVQPs+3MvIz0gbHtja73gWPc0eaOs4PmrMpOg2qZWWriBPH/WzJGSo+HcBL4DrUEsXA==","signatures":[{"sig":"MEUCICJx3yZb+f4uWzU7JtNhlKVK6oCIEpWy2QU5mWxKNJdvAiEAlSgW8dd31IVhXKoN0U5XDnCHyyBNAX41S/f+F4vzNFo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39163},"engines":{"node":">=18"},"gitHead":"b33bf4291ccfd9b484c9f64a0173e503ebf67f55","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.5.3","@mhriaznov/friction-win32-x64":"0.5.3","@mhriaznov/friction-darwin-x64":"0.5.3","@mhriaznov/friction-linux-arm64":"0.5.3","@mhriaznov/friction-darwin-arm64":"0.5.3"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.5.3_1785936365035_0.899265810037079","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"friction-cli","version":"0.5.4","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.5.4","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"962adbf23b0952811e59d177c0e4fd8587c46b10","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.5.4.tgz","fileCount":3,"integrity":"sha512-tpcK52WV3NUKhVFfvEbFzSpGjsLw99Wgvtd8glaqKnoFXcsBu1xHS8Gl4oWL0fS/VY9bwfaXAtgmV29711dvUg==","signatures":[{"sig":"MEUCIGPDpfm7kxO1fBjfPKe3NdgN9VVfBgH4eM8iN+41rAOnAiEAshz+MKQL/C1OewlF1QAjp0JByrZTB4rejN19n/YW6Bo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39263},"engines":{"node":">=18"},"gitHead":"cbd0c72af643bea1e92ed7f4a81cc3bd6d93736e","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.5.4","@mhriaznov/friction-win32-x64":"0.5.4","@mhriaznov/friction-darwin-x64":"0.5.4","@mhriaznov/friction-linux-arm64":"0.5.4","@mhriaznov/friction-darwin-arm64":"0.5.4"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.5.4_1786118810172_0.864650877872233","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"friction-cli","version":"0.6.0","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.0","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"4784e39469e6e88c9d56c3e3c360db65227d89d7","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.0.tgz","fileCount":3,"integrity":"sha512-sGvmGukpzBxSzPwgFPzcvzFeUCqVX6j0xibC1Yvn5WjMFi0kmhg7jERBB1ph993MrEP+MdRk1z+UNRCvtWT17g==","signatures":[{"sig":"MEQCIHlTXWcPCxfa8Jsytp+M3x9Gn1YaHI2+iNOx4mzvT4gWAiBqOGGvQ4RYdeK7xVg3q5dd+dGZqjqMVy+xNy58ph+nEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39363},"engines":{"node":">=18"},"gitHead":"93c2a0a5ce2460d6eba7329470d66b7e5eff0259","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.0","@mhriaznov/friction-win32-x64":"0.6.0","@mhriaznov/friction-darwin-x64":"0.6.0","@mhriaznov/friction-linux-arm64":"0.6.0","@mhriaznov/friction-darwin-arm64":"0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.0_1786178241042_0.5446905133542408","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"friction-cli","version":"0.6.1","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.1","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"844b4c99572f7a8ad36861a270481a7a2e300f5d","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.1.tgz","fileCount":3,"integrity":"sha512-npKEn5BiKYx+Gl2hqn5Tpufb5ac+gh1hqh3peqGMuulnmjstL8QpYr4tYIbzVw3zyQydmT4nNopNJ+y9ATUIqA==","signatures":[{"sig":"MEQCIAh9fDrRFr+5xDKx0Mv2sOUYL0gqdpYrz7vs3fPa65tSAiAaYOkjpszkQKwdtQgCDglZ0KcZwWkOZ2Jfzf4k/1N7zQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":40307},"engines":{"node":">=18"},"gitHead":"65c75e881fbbff392b15f35508ca8c55ef2f01fe","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.1","@mhriaznov/friction-win32-x64":"0.6.1","@mhriaznov/friction-darwin-x64":"0.6.1","@mhriaznov/friction-linux-arm64":"0.6.1","@mhriaznov/friction-darwin-arm64":"0.6.1"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.1_1786310533251_0.53526618491221","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"friction-cli","version":"0.6.2","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.2","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"2db823e6c576c04ba5f6205ea4922e163a68ac86","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.2.tgz","fileCount":3,"integrity":"sha512-UDvaLJsO6zHbqVyKwsvwa6EKU4X5KezSaj/lqPiq/27S3Mhh9r8et6a+1jwvVSrKsWURuy/lXuovhk+X6A+P1Q==","signatures":[{"sig":"MEUCIG4wVOXE2afiEPRjsqVvy/7tYE8gtiF2xjeG4T4ZBSpSAiEAxlVkfGEFDeuhTWQ6+zoVD7qdQ4+M4JNCHYW5NdrW690=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42536},"engines":{"node":">=18"},"gitHead":"a5ff2a92037d621335d59bf64f4dc0c0cad9b21f","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.2","@mhriaznov/friction-win32-x64":"0.6.2","@mhriaznov/friction-darwin-x64":"0.6.2","@mhriaznov/friction-linux-arm64":"0.6.2","@mhriaznov/friction-darwin-arm64":"0.6.2"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.2_1786356693619_0.41203274432138337","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"friction-cli","version":"0.6.3","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.3","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"f467241f3679eeff92574ae9e5732dca5ee4ee95","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.3.tgz","fileCount":3,"integrity":"sha512-1kpXu0EhS/Lu8vBSP6lIoOFFZiZjpMN657RSDERIJh+ankU94I1Qj7HsegHhOUPfHDLX0DoCbfvfZXYGtsQb7Q==","signatures":[{"sig":"MEQCIDSVnvXVfPfUpELJa952jhcAM7vXB3wd5J5blS+Hhe+RAiBwStIYdZsqr8wjYxwGuHRd4juL3kGma3kgQrjzDyn/Aw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42536},"engines":{"node":">=18"},"gitHead":"144d1ccaed1b352649f2e3abd32fbc49b0cfeab8","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.3","@mhriaznov/friction-win32-x64":"0.6.3","@mhriaznov/friction-darwin-x64":"0.6.3","@mhriaznov/friction-linux-arm64":"0.6.3","@mhriaznov/friction-darwin-arm64":"0.6.3"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.3_1786366997687_0.828844777759274","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"friction-cli","version":"0.6.4","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.4","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"f71af8ebbc6a243b1c7a2dfcfe6181d50f5f5065","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.4.tgz","fileCount":3,"integrity":"sha512-ubfv4k0oOy4xeH+rZXcxRhOWlF5pViiE0Yn8i3SgSyZ+hPPTO1X7QClDE8+q62RpgEYmAWQb/6hyS0XeqFwumA==","signatures":[{"sig":"MEUCIQCt3h+b1/WVb1sWTsF5wbb1cghtfc9hPbu/TFRkJY9vyAIgJnbHIbJI79XbfSTPWTGBfwyC/tbUmqnRw5gPDPLPHEs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42536},"engines":{"node":">=18"},"gitHead":"a75dac578f836500e52948ecd7b8502f95156cbb","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.4","@mhriaznov/friction-win32-x64":"0.6.4","@mhriaznov/friction-darwin-x64":"0.6.4","@mhriaznov/friction-linux-arm64":"0.6.4","@mhriaznov/friction-darwin-arm64":"0.6.4"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.4_1786434309544_0.45393541157316264","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"friction-cli","version":"0.6.5","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.5","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"2189827cf46b50c4fc98930868374fecfccbed3a","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.5.tgz","fileCount":3,"integrity":"sha512-2FOqOtAwxlVSrrpymrw8r5QmGgouSDFELSpbz3jyIRQtP9b1XROXUGC8XWJ6u4Rfu2YQbp2djuWxUTqTiO3pHQ==","signatures":[{"sig":"MEQCIEY+wJL2ZYAjGb9PL68bPYu1STTh/jWOWMyemuYsObD+AiB3CvsJBWMKk/IWlaP5pypV9uE2bjY0LeN4KxZV9SC8dA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42535},"engines":{"node":">=18"},"gitHead":"f3b253f5a670a2f682288ee1eea7898b0994b673","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.5","@mhriaznov/friction-win32-x64":"0.6.5","@mhriaznov/friction-darwin-x64":"0.6.5","@mhriaznov/friction-linux-arm64":"0.6.5","@mhriaznov/friction-darwin-arm64":"0.6.5"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.5_1786445672228_0.7610194275896212","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"name":"friction-cli","version":"0.6.6","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.6","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"19c35ca8c22cb0991d0bd21befb7cc11c61c45b2","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.6.tgz","fileCount":3,"integrity":"sha512-5WZGr9klL21C0ri12qNkSLuypq1GdzAGtKNq4FIZQVClCZBuUC+OFNR6rG28p3sAGh5gn1Q4FKUkpAm6bhRBdw==","signatures":[{"sig":"MEUCIQD7nIJJIzU4vOn/n4QbOPExdHtlCwn2GNbDreVfIUr/QwIgDkw2xixZliKKHiJ7ZCemiMK54YZXGF0YtgURIMa/snw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42535},"engines":{"node":">=18"},"gitHead":"232406883b4b24e4ff703b1dc0708288011caec9","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.6","@mhriaznov/friction-win32-x64":"0.6.6","@mhriaznov/friction-darwin-x64":"0.6.6","@mhriaznov/friction-linux-arm64":"0.6.6","@mhriaznov/friction-darwin-arm64":"0.6.6"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.6_1786466321050_0.17351937293030129","host":"s3://npm-registry-packages-npm-production"}},"0.6.7":{"name":"friction-cli","version":"0.6.7","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.7","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"e7395d7db869ce042549f3dfc98d205daf264e40","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.7.tgz","fileCount":3,"integrity":"sha512-dTiBTJUsuZft1LnYI6V5+DIL3RCWO46pP3UUVmdHnorK3msceNN6Z4dQeBmqYQBouWWnRf2b9eqMXZVY9bhyvw==","signatures":[{"sig":"MEUCIQCryvc6uXA+WHuh3mrd716zGpGW83u51nsUjFKCYxKHCAIgAOTCQcWDrKnJ7uKyjl2stEmxX3jWxY0YTVpT2Ld51Rk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42535},"engines":{"node":">=18"},"gitHead":"66b649506b59886662867d4915a9aff10dc9e82a","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.7","@mhriaznov/friction-win32-x64":"0.6.7","@mhriaznov/friction-darwin-x64":"0.6.7","@mhriaznov/friction-linux-arm64":"0.6.7","@mhriaznov/friction-darwin-arm64":"0.6.7"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.7_1786469049540_0.062271025295637106","host":"s3://npm-registry-packages-npm-production"}},"0.6.8":{"name":"friction-cli","version":"0.6.8","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.8","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"a602fb4a4a62f9d79dfbb4dc48d78bfc29646e53","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.8.tgz","fileCount":3,"integrity":"sha512-X7AoiU+mlqFZ8gpRCrAVv7nduPtHmipWZ7ac6HwlsGbUmlzxEeLVM9cPkCZ3BxddROsi0D0RkvnDvFRf/FLASg==","signatures":[{"sig":"MEUCIA5Og+uiEsflQEvuCLyN6qjdNUQLcNgaNMdvF9Z06j/sAiEA7OOcIuBrFm1T+bnc2GFUYfK+zNOqXQEmliFwGjDzFek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42535},"engines":{"node":">=18"},"gitHead":"92a045f333f498f571abd5590c28861bd021d06c","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.8","@mhriaznov/friction-win32-x64":"0.6.8","@mhriaznov/friction-darwin-x64":"0.6.8","@mhriaznov/friction-linux-arm64":"0.6.8","@mhriaznov/friction-darwin-arm64":"0.6.8"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.8_1786693204313_0.10054599984785861","host":"s3://npm-registry-packages-npm-production"}},"0.6.9":{"name":"friction-cli","version":"0.6.9","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.9","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"538d8877a087e12f3a5ac0c1112a280069767161","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.9.tgz","fileCount":3,"integrity":"sha512-1Oi4P3AmqN3t68VlViTgp/SeAzPZvgP2838v/4x71eyP9ab1y6ilHBnBYoZ3qviAsAm3UAyEBbTkk3HMCMqmTg==","signatures":[{"sig":"MEYCIQDEwtgqKVejfj8VQQotU2yG2R4vHC1wESoG3jaRCqK2kQIhANuftmynGvg152hB39F/fSIo9WhAur+S+d2hH16NEd0j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42535},"engines":{"node":">=18"},"gitHead":"9ec4fffdba997190126f00b9d7eac0ad29df1772","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.9","@mhriaznov/friction-win32-x64":"0.6.9","@mhriaznov/friction-darwin-x64":"0.6.9","@mhriaznov/friction-linux-arm64":"0.6.9","@mhriaznov/friction-darwin-arm64":"0.6.9"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.9_1786785122907_0.665786218896214","host":"s3://npm-registry-packages-npm-production"}},"0.6.10":{"name":"friction-cli","version":"0.6.10","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.10","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"238b0a46981e08aa34db883911d9fcd916f56506","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.10.tgz","fileCount":3,"integrity":"sha512-Uosr1NPyEELMBTOm0DUtd8bNHvmz7D11Vd1oReOkyUTWbAuVHHZnf6GWuXXfAWayxjwm4F+aTbRy7DX/Ppsqpg==","signatures":[{"sig":"MEYCIQCoiMsJJAz5nRHsHrHzrbn4jnOkN34IeS8HcMyo6bft9gIhAM9bDgV7vOqVnsox/qxYD2w8l4zpCFRbboD3ujFKnI5A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"engines":{"node":">=18"},"gitHead":"7ef18010d52e010b6d5c023b9ed4fcdcc24c2c10","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.10","@mhriaznov/friction-win32-x64":"0.6.10","@mhriaznov/friction-darwin-x64":"0.6.10","@mhriaznov/friction-linux-arm64":"0.6.10","@mhriaznov/friction-darwin-arm64":"0.6.10"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.10_1787140049514_0.43222992152424555","host":"s3://npm-registry-packages-npm-production"}},"0.6.11":{"name":"friction-cli","version":"0.6.11","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.11","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"774cc5a8a80e3a91d81882bc702abc76a0f053d1","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.11.tgz","fileCount":3,"integrity":"sha512-TttVwuz9MhtcHMROTjov0ITPQR/2oPiM+MzKlfbNq1vl3hTngoBPrrzN1LcMIMXU1pWXQ45KekLe38mL4h8nmA==","signatures":[{"sig":"MEYCIQDljY3tHy3pErSMoc/pRx0DS/OtkowzGN0c+gAeHezlVQIhAJXujxhSV9UAu+ND/4QVhPmz7b42/hPi5gm8rf6RM0nM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"engines":{"node":">=18"},"gitHead":"cac85e11d36bab6752761eb1a8bf1472d8866392","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.11","@mhriaznov/friction-win32-x64":"0.6.11","@mhriaznov/friction-darwin-x64":"0.6.11","@mhriaznov/friction-linux-arm64":"0.6.11","@mhriaznov/friction-darwin-arm64":"0.6.11"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.11_1787930030587_0.28802761462653215","host":"s3://npm-registry-packages-npm-production"}},"0.6.12":{"name":"friction-cli","version":"0.6.12","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.12","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"eb7c4c1a4504540677da15acfcc8f40423e1ba14","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.12.tgz","fileCount":3,"integrity":"sha512-lHv/rJKQxvgDibLDzMOhoymmB2l8je3A9gFPcLb8VLC2gr7unV6RYg/3cUC5KPDm3+dqTwPzil11zRwmkZlLJg==","signatures":[{"sig":"MEUCIQDLJ+1aW3hlcclVkdl7lnGP4v5dLUw4cGsoiGAoqifxyAIgMki6+18f7IMIDenItObREYSJ1RDhowckk8zCShAv9Jw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"engines":{"node":">=18"},"gitHead":"0d3809cfb30bfa1cc9a4c79b739ed8b2422e158e","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.12","@mhriaznov/friction-win32-x64":"0.6.12","@mhriaznov/friction-darwin-x64":"0.6.12","@mhriaznov/friction-linux-arm64":"0.6.12","@mhriaznov/friction-darwin-arm64":"0.6.12"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.12_1788244600985_0.3759640909836701","host":"s3://npm-registry-packages-npm-production"}},"0.6.13":{"name":"friction-cli","version":"0.6.13","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.13","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"78186bd74ef86d0b644212a07b162e7a09f82f1c","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.13.tgz","fileCount":3,"integrity":"sha512-lRInbeoxhnSMC9d0NHeDaQNQnTyS49/JjeY4zc+38L29G8pC5Zph00F/2kl6yFeL63DX5EP/f1VJVL0lNGVj8A==","signatures":[{"sig":"MEUCIBtpF/h+XrQiBGBgnMmwkrZOyV7mOj9F814myOSlPQd1AiEAgY/vhkHgODhV0pd/UNcK/rnjd3UBY380qrqyG1E3uNY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"engines":{"node":">=18"},"gitHead":"a743d8077c1d2cd6125aa582d0a4596701241bdc","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.13","@mhriaznov/friction-win32-x64":"0.6.13","@mhriaznov/friction-darwin-x64":"0.6.13","@mhriaznov/friction-linux-arm64":"0.6.13","@mhriaznov/friction-darwin-arm64":"0.6.13"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.13_1788681303976_0.40820641529574164","host":"s3://npm-registry-packages-npm-production"}},"0.6.14":{"name":"friction-cli","version":"0.6.14","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.14","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"bf61de6a4365ef0341702eaa6ff3c48a50517b5d","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.14.tgz","fileCount":3,"integrity":"sha512-DGiDyIR2PuxKC+d712ECe/9+avAeZ56Qjfj320tnaBeRI+zba1azHXoRhoZ4bZMI2tEcizFOCEh8vPtMCDdgMw==","signatures":[{"sig":"MEUCIFAn3za3CpDD2wXdkFNcSdXa8aoEiVMvWGMTVZFYPlMyAiEAm9RSThi2ilvWORb91zXP5KmtYV+Et0UkUnSWOZCKAb0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"engines":{"node":">=18"},"gitHead":"97f88cf4ba819fd442136ee84472eccae363cfa6","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.14","@mhriaznov/friction-win32-x64":"0.6.14","@mhriaznov/friction-darwin-x64":"0.6.14","@mhriaznov/friction-linux-arm64":"0.6.14","@mhriaznov/friction-darwin-arm64":"0.6.14"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.14_1789063365635_0.6577459258990157","host":"s3://npm-registry-packages-npm-production"}},"0.6.15":{"name":"friction-cli","version":"0.6.15","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.15","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"470374db280d9b11b4f529985cf98312d352df05","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.15.tgz","fileCount":3,"integrity":"sha512-LSYMMDUEQpBthKijqBet6OsiP0BRSuF1qS10tKDVFn6lZsdh4+uPeqysT59ooWt6adyVdka604iou3bX2eSsww==","signatures":[{"sig":"MEUCIG95gF2Pqg+C1r+rljQYzHL4i01DRolnyq/myOd1nUuYAiEAgdDCj1WGcCGT04EsYtPZp8d0qJJ0vATfd7Eg8pCNAc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDvpeWiY/FwmGRUeME/0cVgxU+i7hAtmeSwd/jkUdYwJAiBEj4IeqnugY0mThY7pXWlDxLQRqtcp16vJo0gvHr9UVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"engines":{"node":">=18"},"gitHead":"6b62d05a5710150d61ef9eb185a1a501c8d76128","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.15","@mhriaznov/friction-win32-x64":"0.6.15","@mhriaznov/friction-darwin-x64":"0.6.15","@mhriaznov/friction-linux-arm64":"0.6.15","@mhriaznov/friction-darwin-arm64":"0.6.15"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.15_1790247177541_0.6961240441146284","host":"s3://npm-registry-packages-npm-production"}},"0.6.16":{"name":"friction-cli","version":"0.6.16","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"license":"MIT OR Apache-2.0","_id":"friction-cli@0.6.16","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"homepage":"https://friction-cli.dev","bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"bin":{"friction":"bin/friction.js"},"dist":{"shasum":"dcc3285d173b5a92db7689a5f1e285ba48e2c597","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.16.tgz","fileCount":3,"integrity":"sha512-/X02zWjBXQc4/8ZC9bVEYK1aOmIURDSQlvjp7c+xbkivvtbzNGlscckgxSEESaKu/VnmrLH1cIu6M2HPEz62uA==","signatures":[{"sig":"MEUCIEfAgVjbc97AoPD032U8VoUIC+nPm7RKyu3CnJEhf76WAiEAgSLM7hjl8uAiiWL9U0yUxgDg3PCzvbD698Ui7I+2czk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBn/f6LLGVbzoZ9zJ+YUZ7IIIyVyJgDl+E8lDWz+n8/PAiEAs+p68D/7xXuXwCI7Fv1kUvNYKTpdF6ZWOQYi/X2Ts1Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"engines":{"node":">=18"},"gitHead":"653062ae0e7eeb606008bdf2bf78406e6364bef0","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.16","@mhriaznov/friction-win32-x64":"0.6.16","@mhriaznov/friction-darwin-x64":"0.6.16","@mhriaznov/friction-linux-arm64":"0.6.16","@mhriaznov/friction-darwin-arm64":"0.6.16"},"_npmOperationalInternal":{"tmp":"tmp/friction-cli_0.6.16_1790253421244_0.7651789342418842","host":"s3://npm-registry-packages-npm-production"}},"0.6.17":{"_id":"friction-cli@0.6.17","bin":{"friction":"bin/friction.js"},"bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"dist":{"shasum":"b9c764fb2c5a29960dd3aaa894f838e4db45a8a9","tarball":"https://registry.npmjs.org/friction-cli/-/friction-cli-0.6.17.tgz","fileCount":3,"integrity":"sha512-cyaShqkQVCYkK/KZ1qIIiAXV7XxLbCQ4VPf7jzEcTgzxwwxcl/To5/Zlq1WMZK7dNLDDO7DKvXEmYEqFJVtCUQ==","signatures":[{"sig":"MEYCIQDImOb1S4Wadctt8noo9Tag5Cuz9XPmCIbFDrWMwTGx7gIhAMjPGcQE0Scg6Shbf+pB4x+p91Thp06zOYKSyt4IkZv3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB7LDl0ol03Dco1zIATNyrIeUHBRdrCnUxTZ2KBRhvCaAiEAtN//uhqGLd+QVsWh3cCDg8RdfDkICFX5nq55GEgoHSU="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/friction-cli@0.6.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42542},"name":"friction-cli","engines":{"node":">=18"},"gitHead":"ae2fde67497a46cc200781fdcbc49e3d64317809","license":"MIT OR Apache-2.0","version":"0.6.17","_npmUser":{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"},"homepage":"https://friction-cli.dev","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"_npmVersion":"10.8.2","description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","directories":{},"maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"optionalDependencies":{"@mhriaznov/friction-linux-x64":"0.6.17","@mhriaznov/friction-win32-x64":"0.6.17","@mhriaznov/friction-darwin-x64":"0.6.17","@mhriaznov/friction-linux-arm64":"0.6.17","@mhriaznov/friction-darwin-arm64":"0.6.17"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/friction-cli_0.6.17_1790316388371_0.035389904845462006"}}},"time":{"created":"2026-07-26T13:10:19.485Z","modified":"2026-09-25T06:06:28.801Z","0.1.2":"2026-07-26T13:10:19.765Z","0.1.3":"2026-07-26T18:03:52.616Z","0.1.4":"2026-07-26T21:35:25.157Z","0.1.5":"2026-07-27T07:09:19.600Z","0.2.0":"2026-07-27T10:41:03.772Z","0.2.1":"2026-07-27T14:00:51.267Z","0.2.2":"2026-07-27T16:35:04.419Z","0.3.0":"2026-07-27T22:07:15.108Z","0.3.1":"2026-07-28T08:05:56.022Z","0.3.2":"2026-07-28T12:17:49.754Z","0.3.3":"2026-07-28T12:48:39.075Z","0.3.4":"2026-07-28T14:35:35.428Z","0.4.0":"2026-07-30T11:11:58.135Z","0.4.1":"2026-07-30T13:12:16.363Z","0.5.0":"2026-08-02T07:35:11.080Z","0.5.1":"2026-08-02T17:56:45.785Z","0.5.2":"2026-08-03T19:38:09.331Z","0.5.3":"2026-08-05T13:26:05.157Z","0.5.4":"2026-08-07T16:06:50.311Z","0.6.0":"2026-08-08T08:37:21.193Z","0.6.1":"2026-08-09T21:22:13.374Z","0.6.2":"2026-08-10T10:11:33.757Z","0.6.3":"2026-08-10T13:03:17.852Z","0.6.4":"2026-08-11T07:45:09.732Z","0.6.5":"2026-08-11T10:54:32.361Z","0.6.6":"2026-08-11T16:38:41.214Z","0.6.7":"2026-08-11T17:24:09.677Z","0.6.8":"2026-08-14T07:40:04.457Z","0.6.9":"2026-08-15T09:12:03.058Z","0.6.10":"2026-08-19T11:47:29.629Z","0.6.11":"2026-08-28T15:13:50.736Z","0.6.12":"2026-09-01T06:36:41.133Z","0.6.13":"2026-09-06T07:55:04.102Z","0.6.14":"2026-09-10T18:02:45.764Z","0.6.15":"2026-09-24T10:52:57.631Z","0.6.16":"2026-09-24T12:37:01.336Z","0.6.17":"2026-09-25T06:06:28.460Z"},"bugs":{"url":"https://github.com/ngriaznov/friction/issues"},"license":"MIT OR Apache-2.0","homepage":"https://friction-cli.dev","keywords":["markdown","lint","documentation","llm","prose","cli","technical-writing","docs","ai","rust","prose-linter","sarif","vale"],"repository":{"url":"git+https://github.com/ngriaznov/friction.git","type":"git"},"description":"Deterministic removal of the machine layer from LLM-generated English technical documentation.","maintainers":[{"name":"mhriaznov","email":"mykyta.hriaznov@gmail.com"}],"readme":"# friction\n\nA deterministic engine that removes the machine layer from LLM-generated technical\ndocumentation (the ritual closers, filler spans, hedge phrases, and light-verb\nconstructions that make text read as machine-written) without touching the\ninformation.\n\n**English technical documentation only.** Both constraints are real, not\naspirational, and neither is checked at runtime:\n\n- **English.** Every shipped artifact is English-trained: the tagger, the\n  dependency parser, the sentence segmenter, and every phrase in the tell\n  inventory. There is no language detection and no other language pack. On\n  non-English prose friction is inert rather than wrong (measured: zero edits on\n  German, Spanish, Dutch, Italian and Portuguese), but it will repair English\n  sentences embedded in another language. See the limits below.\n- **Technical documentation.** Reference docs, READMEs, design notes,\n  postmortems, migration guides. The inventory was mined from that kind of\n  writing, and the register pass is calibrated against it specifically. It is\n  not a general-purpose editor and not for prose whose voice is the point:\n  fiction, marketing, personal writing.\n\nfriction never invents content. Every content word it emits is already present in\nthe input or derived from one through a static table (\"performs validation of\" →\n\"validates\"). It may introduce function words, but only from a fixed set declared\nper operation (`was`, `were`, `is`, `are`, and nothing else): never a word chosen\nby searching for one that fits. Where no safe edit exists, it reports instead of\nrewriting. No model runs at fix time; everything is offline, table-driven, and\nbyte-deterministic.\n\n## What it does\n\nEight operations edit text. Nothing else does.\n\n1. **Ritual deletion**: boilerplate sentences removed whole: *\"If you have\n   any questions or require further assistance, please reach out to our\n   support team.\"* → gone.\n2. **Gated span deletion**: *\"It is important to note that the agent…\"* →\n   *\"The agent…\"*.\n3. **Paired substitution**: *\"will walk you through\"* → *\"covers\"*,\n   *\"leverages\"* → *\"uses\"*, *\"in order to\"* → *\"to\"*.\n4. **Derivational pivot**: *\"performs validation of the config file\"* →\n   *\"validates the config file\"*.\n5. **Frame-gated `just`-deletion**: *\"is provenance just metadata, or…?\"* →\n   *\"is provenance metadata, or…?\"*; the question itself is never touched.\n6. **Frame rewriting**: 848 corpus-adjudicated rules with measured rates:\n   *\"We utilized the cache\"* → *\"We used the cache\"*, *\"worth confirming\"* →\n   *\"worth checking\"*, *\"Honestly,\"* → deleted.\n7. **Clause restructuring**: parse-level rewrites of constructions no flat\n   template can express: *\"Review the config to ensure that logging is\n   enabled\"* → *\"Review the config to enable logging\"*, *\"Profiling\n   surfaced a bottleneck\"* → *\"Profiling found a bottleneck\"* (only when\n   the verb provably takes a direct object). Negated or adverb-carrying\n   complements always decline: *\"ensure that telemetry is not sent\"* is\n   never touched.\n8. **Register rephrasing**: homes punctuation and constructions the models\n   over- or under-use toward bands measured from human writing: em dashes,\n   semicolons, the agentless passive, and the past progressive (*\"the\n   tool was crashing on start\"* → *\"the tool crashed on start\"*).\n\nEvery candidate passes hard gates: meaning preserved, clauses complete, code\nspans, links, numbers, and quotes untouched, near-no-op on human text. When a\ngate says no, friction reports instead of rewriting, and seven detection\nchannels only ever report. [docs/OPERATIONS.md](docs/OPERATIONS.md) covers\neach operation, gate, and channel in depth;\n[docs/EXTENDING.md](docs/EXTENDING.md) maps where new rules, features,\nmetrics, and transducers go and the verification each one owes.\n\n## Install\n\n### npm\n\n```bash\nnpm install -g friction-cli          # global, on your PATH as `friction`\nnpm install --save-dev friction-cli  # project-local, for CI and npm scripts\nnpx friction-cli fix draft.md        # no install at all\n```\n\nProject-local is usually what you want for a repo, since it pins the version in\nyour lockfile:\n\n```json\n{\n  \"scripts\": {\n    \"lint:docs\": \"friction fix README.md | cmp -s - README.md\"\n  },\n  \"devDependencies\": {\n    \"friction-cli\": \"0.6.17\"\n  }\n}\n```\n\n`friction-cli` is the only package you name. The binary for your platform\narrives as an optional dependency (one of `@mhriaznov/friction-darwin-arm64`,\n`-darwin-x64`, `-linux-x64`, `-linux-arm64`, `-win32-x64`) and npm picks it from\neach one's `os`/`cpu` fields, skipping the rest.\n\nThere is **no postinstall script and nothing is downloaded at install time**, so\nlockfiles pin it, npm verifies its integrity, and `--ignore-scripts`, offline and\nair-gapped installs all work. Linux x64 gets the statically linked build, so\nAlpine and Debian are the same package.\n\n**It does not update itself, by design.** A tool your package manager installed\nshould be updated by that package manager. A self-updating binary would fight\nnpm over a file npm owns, break integrity checks, and fail outright on a\nread-only install. Pick whichever of these you want:\n\n| you want | do this |\n|---|---|\n| always the latest, no install | `npx friction-cli@latest fix draft.md` |\n| update on demand | `npm update -g friction-cli` |\n| automatic PRs on new versions | Dependabot or Renovate against your `package.json` |\n| pinned, reproducible | commit the lockfile; nothing moves until you bump |\n\nFor CI, pin it. A linter that silently changes version changes your build's\noutput, and you want that to be a commit.\n\n### Prebuilt binary\n\nDownload for your platform from [Releases](../../releases), extract, and put\n`friction` on your `PATH`. No toolchain needed.\n\n| platform | archive |\n|---|---|\n| macOS, Apple silicon | `aarch64-apple-darwin` |\n| macOS, Intel | `x86_64-apple-darwin` |\n| Linux x86-64 | `x86_64-unknown-linux-gnu` |\n| Linux x86-64, static | `x86_64-unknown-linux-musl` |\n| Linux arm64 | `aarch64-unknown-linux-gnu` |\n| Windows x86-64 | `x86_64-pc-windows-msvc` |\n\nPrefer the **musl** build for containers and CI images: it is statically linked\nand does not care about the host's glibc. Each archive ships a `.sha256`.\n\nThe macOS binaries are **unsigned**, so Gatekeeper refuses the first run. Either\n`xattr -cr ./friction` or right-click → Open once.\n\n### Claude Code plugin\n\n[friction-skill](https://github.com/ngriaznov/friction-skill) teaches\nClaude Code to run friction on the technical prose it writes: apply the\ndeterministic fixes, then revise the constructions friction can only\ndetect, and converge before presenting.\n\n```\n/plugin marketplace add ngriaznov/friction-skill\n/plugin install friction-skill@friction-skill\n```\n\nThe skill invokes `npx friction-cli@latest`, so it needs no local\ninstall and always runs the newest release.\n\n### From source\n\n```bash\ncargo build --release -p friction-cli\n```\n\nThe binary lands at `target/release/friction`; MSRV is 1.96.\n\nEither way the result is self-contained: the part-of-speech tagger (1.4 MB),\nthe dependency parser (6.5 MB), the matching-statistics automata\n(dms-index, 26.2 MB: per-family streams plus the pooled machine automaton\nthe runtime scans), the compound-attestation filter (2.3 MB), and the\nevidence packs are all compiled into the binary, and nothing is downloaded\nat build or run time. Everything is fixed tables, so the runtime stays\ndeterministic. There is no inference engine here, only lookups. That\naccounts for the binary being around 59 MB (about a 27 MB compressed\ndownload).\n\nA typical README (3–7 KB) runs through `friction fix` in about 30 ms; a\n10 MB document takes seconds — around 2.5 s for repetitive text, around\n6.5 s for a dense, varied corpus concatenation. <sub>Measured on an\nM-series MacBook Pro, process start included.</sub>\n\n### In the browser (WebAssembly)\n\nThere is also a browser build: the same `fix`/`check`/`explain` pipeline\ncompiled to `wasm32-unknown-unknown`, with no install and no server. The\nwasm module itself is small; the tagger, parser, and DMS-index weights\nthat make the engine's binary large are not compiled in. Instead they are\nfetched once from the GitHub release tag on first load (~10 MB total) and\ncached in the browser, so a returning visitor pays no network cost. Text\nnever leaves the page.\n\n**Run the playground.** Each release publishes\n`friction-playground-{version}.tar.gz` as a release asset alongside the\nnative binaries. Extract it and serve the directory with any static file\nserver:\n\n```sh\ntar xzf friction-playground-*.tar.gz -C playground\nnpx -y serve playground\n```\n\n**Embed the engine in your own page.** `loader.js` (in the same tarball,\nnext to the `pkg/` wasm build it loads) is the wrapper API:\n\n```js\nimport { loadFriction } from \"./loader.js\";\n\nconst engine = await loadFriction({\n  onEvent: (e) => console.log(e.type, e), // asset progress, ready, error\n});\n\nconst r = engine.fix(\"It's worth noting that the cache is fast.\");\nr.output;   // the fixed text\nr.changed;  // true\nr.diff;     // line-level edit script: [{ type: \"equal\"|\"del\"|\"add\", line }]\nr.fired;    // which rules fired: [{ pass, rule, count }]\n\nengine.check(text);   // `friction check --format json`, parsed\nengine.explain(text); // `friction explain --format json`, parsed\n```\n\nThe same lifecycle events also fire on `window` as\n`friction:progress`, `friction:ready`, and `friction:error` CustomEvents,\nso a page can show a loading screen without importing the module. Model\ndownloads default to `raw.githubusercontent.com` pinned to the matching\nrelease tag; pass `baseUrl` to `loadFriction` to fetch from a mirror\ninstead.\n\n**Build it from source.**\n\n```sh\nrustup target add wasm32-unknown-unknown\nwasm-pack build crates/friction-wasm --release --target web --out-dir ../../web/pkg\n```\n\nSee [docs/WASM.md](docs/WASM.md) for the architecture, the asset list,\nand why the models download from the release tag rather than release\nassets, and [web/README.md](web/README.md) for the exact event and\nresult shapes plus the local dev flow.\n\n## Usage\n\n### `friction fix` — repair a document\n\n**`fix` never modifies your file unless you pass `--in-place`.** The default\nrun prints the fixed text to **stdout** and the summary to **stderr**, so the\nsummary can report applied patches while the file on disk stays byte-identical.\nThat default is what makes piping safe and an original impossible to destroy\nunasked; when you want the file itself repaired, say so:\n\n```bash\nfriction fix draft.md --in-place\n```\n\nThe two streams are separate, so no flag is needed to keep them apart:\nredirect stderr and you have clean text.\n\n```bash\nfriction fix draft.md                  # fixed text to stdout, summary to stderr\nfriction fix draft.md 2>/dev/null      # fixed text only\nfriction fix draft.md > fixed.md       # original untouched\nfriction fix draft.md --in-place       # rewrite the file atomically\nfriction fix draft.md --suggest        # also list what was detected but held\nfriction fix draft.md --format json    # summary as JSON instead of a table\nfriction fix page.html                 # static HTML: text nodes edited, markup untouched\n```\n\n\n#### Static HTML\n\nA `.html`/`.htm` file (or stdin starting with a doctype or `<html>`) is read\nas a static HTML page instead of markdown: text runs between tags become the\nprose, and everything else (tags, attributes, comments, entities, and the\nentire contents of `head`, `script`, `style`, `pre`, and `code`) is\nuntouchable by construction, so the output differs from the input only inside\ntext nodes. Headings and table cells follow the same rules as in markdown\n(detected against, never edited).\n\nJSON *data blocks* are prose too: a `<script>` whose `type` is\n`application/json` or any `+json` variant is inert data, not code, so the\nstring **values** inside it (slide notes, embedded content) are extracted and\nedited: keys, structure, and every escape sequence stay untouchable, which\nkeeps the document valid JSON by construction. Executable script content is\nnever touched: prose inside real JavaScript string literals is code, and the\nright place for friction there is the source the page is generated from.\n\nTemplate expressions are another processor's bytes, not prose: `{{ ... }}`,\n`{% ... %}`, and `<% ... %>` (mustache, Jinja, Liquid, Hugo, ERB, EJS) are\nrun boundaries wherever they appear. A `.html` file is often really a\ntemplate, and no edit can alter or splice across an expression another tool\nwill evaluate.\n\nOne boundary to know: a sentence interrupted by inline markup is analyzed as\nfragments on either side of the tag, so a tell spanning an `<em>` boundary is\ninvisible to the span channels.\n\n#### Reading from stdin\n\nPass `-` as the path:\n\n```bash\necho \"$text\" | friction fix -\ncat draft.md  | friction fix - 2>/dev/null > fixed.md\nOUT=$(printf '%s' \"$text\" | friction fix - 2>/dev/null)\n\nfriction fix - 2>/dev/null <<'EOF'\nThis guide will walk you through deploying the collector.\nEOF\n```\n\n`--in-place` is rejected with `-`: there is no file to write back to.\n\n#### Four one-liners, verbatim\n\n```bash\n$ echo 'We will walk you through it. It is crucial that you utilize the debug flag.' \\\n    | friction fix - 2>/dev/null\nWe cover it. It matters that the debug flag is used.\n```\n\nThree substitutions and a passivization in one sentence pair.\n\n```bash\n$ echo 'The style guide bans \"will walk you through\" outright. This guide will walk you through the rest.' \\\n    | friction fix - 2>/dev/null\nThe style guide bans \"will walk you through\" outright. This guide covers the rest.\n```\n\nThe quoted phrase is a *mention* (someone's example, not the author's register) so it survives while the same words unquoted get fixed.\n\n```bash\n$ echo 'Set `leverage` in the config. We leverage the cache heavily.' \\\n    | friction fix - 2>/dev/null\nSet `leverage` in the config. We use the cache heavily.\n```\n\nInput is parsed as Markdown, so the code span is out of scope and the prose is not.\n\n```bash\n$ friction fix - 2>/dev/null <<'EOF'\nThis guide will walk you through deploying the collector.\n\nIf you have any questions or require further assistance, please reach out to our support team.\nEOF\nThis guide covers deploying the collector.\n```\n\nThe ritual closer is removed whole.\n\n#### A longer document\n\nInput:\n\n```text\nThis guide will walk you through configuring the backup agent for your staging\nenvironment. It is important to note that the agent performs validation of the\nconfiguration file before each run. Once validation succeeds, the agent\nconducts an analysis of the snapshot catalog and simply uploads any missing\nsegments. By following these steps, you can quickly and easily verify that\nyour backups are consistent. If you have any questions or require further\nassistance, please reach out to our support team.\n```\n\nOutput:\n\n```text\nThis guide covers configuring the backup agent for your staging\nenvironment. The agent validates the\nconfiguration file before each run. Once validation succeeds, the agent\nconducts an analysis of the snapshot catalog and simply uploads any missing\nsegments. You can verify that\nyour backups are consistent.\n```\n\n```\nfriction fix: 3 pass(es), 8 patch(es) applied\n  edit.recapitalize: 2\n  pivot.lvc: 1\n  ritual.delete: 1\n  span.delete: 3\n  sub.apply: 1\n  suggest: 0 finding(s) remain\n  paraphrase: 0 span(s) flagged for manual rewrite\n```\n\nThat is the engine's real output, line breaks included: friction edits bytes\nand leaves the input's own wrapping alone rather than reflowing paragraphs it\ntouched.\n\nNote what it kept: \"conducts an analysis of\" was a valid second pivot but the\nper-document budget held it, and \"simply\" stayed because deleting it would\ncreate a word seam unattested in human writing. Neither is forced, and both are\nnamed by `friction explain`, which lists every hold with the gate that\ndeclined it. The `suggest:` line above counts a different thing: findings the\ndetector surfaced that no operation claimed at all.\n\nThe `paraphrase:` line counts a third, unrelated thing: after fixing, `fix`\nalso scans its own output with the DMS statistical channel against the\npooled machine automaton, and with the contrast-frame\ntemplate scan, and reports how many spans either flagged. It never touches\nthem: there is no licensed rewrite for a DMS tell or for an `only`-marked\nquestion or a declarative correction frame, only a fixed set of literal\nedits, so a flagged span is left exactly as written for a human to\nparaphrase. `--suggest` lists each one on stderr: location, channel id, score, and\nthe flagged snippet.\n\nClean text passes through byte-identical:\n\n```\n$ friction fix clean.md\nfriction fix: 2 pass(es), 0 patch(es) applied\n  suggest: 0 finding(s) remain\n  paraphrase: 0 span(s) flagged for manual rewrite\n```\n\n### `friction check` — detect and measure, change nothing\n\n```\nfriction check draft.md\nfriction check draft.md --format sarif > report.sarif\nfriction check draft.md --residual\n```\n\nReports detected spans with byte-exact locations, tell counts,\ndistribution metrics against the cross-genre human envelope, and the document-level\nmatching-statistics differential. The SARIF output validates against the SARIF\n2.1.0 schema.\n\n`--residual` appends the spans the statistical channel flags that no\ncompiled frame rule covers. The machine tells the rule set cannot yet\nexplain or rewrite, which is exactly the evidence queue the next\nrule-generation batch should start from.\n\nEvery scan runs against one pooled machine automaton built from all\nmined family corpora (`qwen`, `gemma`, `llama`, `granite`, `claude`);\nthere is no per-family targeting to configure. Text from a generator\nwhose register none of the mined corpora resemble can still evade the\nstatistical channel. See limits below.\n\n**`check` is a report, not a gate.** Its exit code is `0` only when *every*\nmetric sits inside its envelope and no span was detected, and the envelope is\ntwo-sided. A document is flagged for falling outside it in either direction,\nincluding for being more human-favoured than the human band's upper bound.\nMeasured over 25 human documentation files from the corpus, **24 exit non-zero**.\nThat is the metric layer working as designed (it describes a distribution, it\ndoes not classify a document), but it means `check` will fail almost any real\ndocument and should not be wired to a build.\n\nGate on `fix` instead: see below.\n\n### `friction explain` — why did (or didn't) it edit?\n\n```\n$ friction explain draft.md\npass 1: 8 operation(s) fired\n  sub.apply                0..32  -> \"This guide covers\"\n  span.delete              92..121  (deleted)\n  edit.recapitalize        121..122  -> \"T\"\n  pivot.lvc                131..153  -> \"validates\"\n  span.delete              316..342  (deleted)\n  edit.recapitalize        342..343  -> \"Y\"\n  span.delete              350..369  (deleted)\n  ritual.delete            409..504  (deleted)\n  2 held:\n    pivot.lvc              194..315  KEPT (pivot held: near-no-op budget exhausted)\n    span.delete            194..315  KEPT (deletion span.simply held: SeamNotAttested)\npass 2: 0 operation(s) fired — converged\n  2 held:\n    pivot.lvc              137..258  KEPT (pivot held: near-no-op budget exhausted)\n    span.delete            137..258  KEPT (deletion span.simply held: SeamNotAttested)\npass 3: 0 operation(s) fired — converged\n```\n\nEvery range is a byte offset into your original file, and every hold names the\ngate that declined. Deleting a span can leave a lowercase word opening a\nsentence, which is why `edit.recapitalize` follows each one. The same two holds\nreappear in pass 2 at shifted offsets: the earlier deletions moved the bytes,\nand the gates decline again on the same grounds.\n\n## Scripting it — pipelines, CI, agents\n\nEverything needed is already there: stdin in, stdout out, structured output on\ndemand, meaningful exit codes, no interactive prompts, no state, no network. The\npacks and models are compiled into the binary, so per-invocation cost is model\nload rather than I/O.\n\n### Exit codes\n\n| command | `0` | `1` | `2` |\n|---|---|---|---|\n| `fix` | always, when it ran | — | error (unreadable input, bad UTF-8) |\n| `explain` | always, when it ran | — | error |\n| `check` | every metric in envelope **and** no spans | otherwise | error |\n\n`fix` does not signal \"I changed something\" through its exit code. To detect\nthat, compare bytes or read the JSON summary:\n\n```bash\n# did anything change?\nfriction fix draft.md 2>/dev/null | cmp -s - draft.md || echo \"friction would edit this\"\n\n# how much, structured\nfriction fix draft.md --format json 2>&1 >/dev/null\n# {\"passes\":3,\"patches_applied\":4,\"patches_by_rule\":{\"register.passivize\":1,\"sub.apply\":3},\"suggest_count\":0}\n```\n\nNote the redirect order: the summary is on **stderr**, so `2>&1 >/dev/null`\nsends the summary to stdout and discards the fixed text. Reversing them gives\nyou the opposite.\n\n### A CI gate that works\n\nFail the build when friction would still change a committed document (i.e.\ntreat \"already clean\" as the invariant):\n\n```bash\n#!/bin/sh\n# fails if any tracked Markdown file is not already friction-clean\nrc=0\nfor f in $(git ls-files '*.md'); do\n  if ! friction fix \"$f\" 2>/dev/null | cmp -s - \"$f\"; then\n    echo \"not friction-clean: $f\"\n    rc=1\n  fi\ndone\nexit $rc\n```\n\nTwo practical notes. Use `rc`, not `status`: the latter is a read-only special\nvariable in zsh and the loop aborts on assignment. And scope the glob to\ndocuments you actually author: pointing it at every tracked `*.md` will also\ncatch generated reports and vendored third-party text, which are not yours to\nrewrite and will fail the gate legitimately.\n\nThis repository's own README satisfies that check, which is why the examples\nabove can quote machine-register phrases without the tool rewriting its own\nexhibits.\n\n### Every edit, machine-readably\n\n`explain --format json` gives each edit's rule, byte range, and replacement\n(enough to build a diff, apply a subset, or show a human what would change\nbefore changing it):\n\n```bash\n$ friction explain draft.md --format json\n{\n  \"passes\": [\n    {\n      \"pass\": 1,\n      \"fired\": [\n        { \"rule\": \"sub.apply\", \"start\": 0,  \"end\": 24, \"replacement\": \"We cover\" },\n        { \"rule\": \"sub.apply\", \"start\": 32, \"end\": 42, \"replacement\": \"matters\" },\n        { \"rule\": \"sub.apply\", \"start\": 52, \"end\": 59, \"replacement\": \"use\" }\n      ],\n      \"held\": []\n    }\n  ]\n}\n```\n\nRanges index the **original** bytes, so `text[start..end]` is exactly what the\nreplacement replaces. Held candidates appear with the gate that declined\nthem, and that's what's worth showing a reviewer: it says what\nfriction noticed and chose not to touch.\n\n### Filtering to the operations you trust\n\nThere is no flag to disable an individual operation. To keep just the five\nclosed operations and skip register rephrasing, read the edits from `explain\n--format json`, drop the `register.*` rules, and apply the rest yourself: the ranges are byte-exact against your input, so that is a mechanical splice.\n\n## Guarantees\n\n- **Deterministic**: same input, same pack, same bytes. Always.\n- **Idempotent**: a second pass may clean up after first-pass deletions; a\n  third pass changes nothing (enforced by a CI canary over fixtures and real\n  corpus documents).\n- **Near-no-op on human text**: edits per document on curated human writing\n  stay under a corpus-calibrated threshold (1.87 edits per 1000 words, ceiling),\n  recalibrated whenever the packs are rebuilt and cross-checked against a\n  held-out split that never feeds back into the threshold.\n- **Span-honest**: every reported range slices your original bytes to exactly\n  the text the finding is about.\n- **Closed**: no code path can insert a *searched-for* word. Content words are\n  always input-derived. Function words may be introduced only from a fixed set\n  declared per operation, checked on every candidate before it is applied, so\n  the guarantee is enforced by construction rather than asserted. The approaches\n  that would break it (bridge insertion, corpus-path synthesis) were tried\n  during research, failed, and are pinned as red tests so they cannot come\n  back.\n\n## What it deliberately won't do\n\nfriction removes machine framing surgically. It does not add ideas, voice, or\nfluency. Its ceiling is a careful copy editor with a narrow brief, and an empty\nsource stays empty. It has no place in fiction, and it won't help you beat a\ndetector. And the statistical channel only knows the model families its\ncorpus was mined from: the pooled index covers\nqwen/gemma/llama/granite/claude-style output, so\nprose from an unindexed family will largely pass that channel untouched (the\nliteral inventory still applies). Growing coverage means growing the data, see\nbelow, not cleverer search.\n\nThree limits worth knowing before you rely on it.\n\n**It is English-only, and there is no language detection.** The tagger, the\ndependency parser, the segmentation rules and every phrase in the inventory are\nEnglish; given another language, friction tags it as English anyway.\n\nWhat that means in practice, measured rather than assumed. On German, Spanish,\nDutch, Italian and Portuguese paragraphs it is **completely inert**: zero\npatches, output byte-identical. The tells it looks for are English phrases and\nEnglish dependency structures, and neither is there to find, so nothing fires.\nThat is the safe failure, and it is the one you get.\n\nIt does, however, edit **English sentences embedded in another language**:\n\n```bash\n$ echo 'Ce document décrit le setup. It is important to note that we utilize the cache.' \\\n    | friction fix - 2>/dev/null\nCe document décrit le setup. The cache is used.\n```\n\nThe French is untouched and the English sentence is repaired correctly. Whether\nthat is what you want in a mixed-language document is your call. friction has\nno way to ask.\n\nSupporting another language is not a code change: it needs its own tagger,\nparser, segmentation rules and mined inventory. The engine is language-agnostic;\nall of the knowledge is in the data.\n\nRegister rephrasing is scoped to **technical documentation**, and that scope is\nnarrower than it sounds. The band was measured on reference documentation.\nREADMEs measured as a *different* register (two of the three features differ\nwith non-overlapping confidence intervals, and their correlation structure\ndiffers too), so pooling the two was rejected and the documentation target is\nused for both. Running it on prose from another genre aims at the wrong target,\nand nothing at runtime will stop you.\n\nSeparately, the gates check whether an edit preserves meaning and grammar, not\nwhether the result reads *better*. A rewrite can be licensed, correct, and\nstill flatter than what it replaced. Only a reader catches that.\n\n## FAQ\n\n**Is this an AI detector?**\nNo. friction never answers \"did a model write this\" and has no authorship\nscore. It edits register, and register is a property of the text, not of the\nauthor: people write in machine register (that is where the models learned\nit), and models can write clean. Using it to accuse anyone of anything is\nusing it wrong.\n\n**Then what does `friction check` measure?**\nThe density of machine-register constructions in the document in front of it,\nagainst bands measured from human writing. That is a statement about the\nprose, useful for deciding whether to run `fix` or to gate a pipeline. It is\nnot evidence about who typed it.\n\n**How is this different from a slop word list?**\nA word list encodes someone's taste. Every friction rule ships with measured\nper-million rates from a machine corpus on one side and 49.7 million words of\npre-ChatGPT human code review on the other, and it compiles into an edit only\nwhile the numbers hold. \"Thank you for your understanding\" looks\nmachine-flavored, but people write it constantly, so friction refuses to touch\nit. The evidence can also expire: rebuild the packs against new corpora, and a\nrule whose numbers stopped holding stops compiling.\n\n**Why repair instead of detect?**\nA detection verdict leaves you nothing to do with it except distrust the\nauthor. A repair is an artifact you can diff, review, and gate CI on: same\ninput, same pack, same bytes, every time.\n\n**Will it eat my voice?**\nIt is scoped to technical documentation and calibrated to be a near-no-op on\nhuman writing (at most 1.87 edits per 1000 words on the human corpus, enforced\nin CI). Fiction, marketing, and personal writing are out of scope on purpose.\n\n**Does my text leave the machine?**\nNo. No network, no telemetry, no model call at fix time. One offline binary\nwith the packs compiled in.\n\n## The data behind it\n\nThe packs under `crates/friction-packs/packs/` are versioned, sha256-recorded,\nand audited at load time (a substitution whose replacement re-triggers any\ndetection frame, or introduces an unattested content word, fails the build):\n\n- `inventory-en-v1.toml`: the curated tell inventory of deletion spans,\n  substitution pairs, ritual frames, licensed light-verb pairs, guard-token\n  classes. Hand-reviewed; every mined entry carries its corpus counts.\n- `dms-index-en-v1.toml`: per-family machine/human token streams for the\n  matching-statistics channel. The runtime embeds `dms-index-en-v1.bin`\n  next to it: the same streams with their suffix automata pre-built by\n  `corpus-tool dms-pack` and serialized flat, loaded as a zero-copy view\n  so process start pays no parse or automaton construction (a test\n  re-packs the TOML and fails if the two ever diverge).\n- `attestation-en-v1.toml`: human-corpus bigram seams, tag-skeleton sets, and the\n  near-no-op calibration.\n- `register-en-v1.toml`: the per-feature bands register homes toward, as the 10th\n  and 90th percentiles of the per-document rate across 58 human documentation\n  files. The band, not its centre, is the target.\n- `frame-rules-en-v1.toml`: the adjudicated frame-rewrite rule set: 3,388\n  rules in seven evidence buckets (the delivered 3,333 plus corpus-mined\n  arrivals), of which only the corpus-confirmed buckets ever compile;\n  the rest are staged evidence for `corpus-tool adjudicate`, the referee\n  that re-derives every verdict from the corpora, from the DMS streams\n  first, then from the review-register evidence pair for rules whose\n  register the DMS corpora do not carry. The runtime embeds\n  `frame-pack-en-v1.bin` (134 KB): the surviving rule program (913 edits\n  and guards plus 127 report-only rules after the rejection gauntlet),\n  serialized flat by `corpus-tool frame-pack` and loaded zero-copy,\n  with a drift test that recompiles the TOML and fails on any\n  divergence.\n- `human-evidence-en-v1.bin` + `human-evidence-en-v1.toml`: external\n  human-corpus evidence pooled into the frame-rewrite compile fences:\n  unigram rates and per-word burst envelopes (the densest any single\n  human document used a word, which is what arms the `overuse.word` channel)\n  over ~50M tokens of pre-2022, human-written code-review prose, plus\n  occurrence counts for every frame rule's literal probes,\n  built offline by `corpus-tool human-evidence` from locally staged\n  corpora (the raw text never enters this repository, only these\n  aggregate counts). External evidence feeds the one-sided fences only:\n  target-word attestation (best single-corpus rate, so one register\n  cannot dilute another's words) and the human-rate ceiling.\n  Direction verdicts stay register-matched on the DMS streams. A\n  machine-vs-human ratio over mismatched registers would measure\n  register difference, not machine-ness. Shipped-pack inputs: the Code\n  Review Stack Exchange data dump of 2022-03-07 (CC BY-SA,\n  <https://codereview.stackexchange.com/>) and the natural-language\n  review comments of Microsoft's CodeReviewer dataset (CC BY 4.0,\n  <https://doi.org/10.5281/zenodo.6900648>), both predating ChatGPT's\n  release by construction. Input sha256s and per-bucket totals are in\n  the `.toml` sidecar.\n- `machine-evidence-en-v1.bin` + `machine-evidence-en-v1.toml`: the machine\n  half of the review-register evidence pair: the same tables, built by\n  the same command over the 150 committed machine-written review\n  documents in `corpus/review/machine/`. Register-matched against the\n  human pack, it gives the two-sided fences (direction, guard\n  confirmation) and the adjudication referee a review-register\n  measurement the DMS streams cannot provide.\n- `jargon-en-v1.toml`: the curated metaphor-lexeme list `jargon.metaphor`\n  matches against, and a small attested-exceptions allowlist of compounds it\n  never flags regardless of what the filter below says. Each lexeme is\n  `mined` (measured directly against this corpus) or `external` (documented\n  LLM metaphor vocabulary); every entry, and every exception, carries its own\n  provenance note.\n- `jargon-attest-en-v1.bin` + `jargon-attest-en-v1.toml`: the web-scale\n  attestation oracle behind `jargon.metaphor`'s exception check: a\n  `BinaryFuse8` filter (`xorf`) over ~2M normalized, multiword compound keys\n  mined from Wikipedia article titles and OpenAlex Topics display names,\n  built offline by `corpus-tool jargon-attest` and embedded in the binary.\n  A compound in the filter is attested and never flagged; the filter's\n  false-positive direction is the safe one (~0.4%, no false negatives). A\n  spurious \"attested\" only ever suppresses a flag, never invents one. The\n  TOML exception list above is now a near-empty override layer for what the\n  filter misses, not the primary mechanism. Wikipedia titles are\n  CC BY-SA 4.0 and GFDL (Wikipedia contributors,\n  <https://en.wikipedia.org/>); OpenAlex Topics are CC0\n  (<https://openalex.org/>). Full provenance (input sha256s, normalization\n  and hash spec, build date) is in the `.toml` sidecar.\n\nThe contrast-frame templates (`frame.contrast.question`,\n`frame.contrast.correction`) are the one detection channel that is not\npack data: both are a fixed, closed-vocabulary lexical frame (eight\nauxiliaries, four markers, a handful of connectives) compiled directly into\n`friction-match`, with no corpus-mined pattern to version.\n\nThey are produced by `corpus-tool` (`mine-inventory`, `mine-paired`, `index`,\n`attest`) from the repository's document corpus: machine text from six local\nmodels plus a topic-matched stock-vs-antislop paired corpus that cancels topic\nso mining isolates pure style; the human side of every pair comes exclusively\nfrom license-vetted, pre-2022 human documents. All tuning uses the train split;\na sealed holdout is guarded by CI and never touched.\n\n### Evaluation\n\nMeasurements live next to the data they describe, and each was produced by a\ncommand recorded in the file itself:\n\n- [`corpus/HOLDOUT_REPORT.md`](corpus/HOLDOUT_REPORT.md): the sealed-holdout\n  evaluation. Read once, report-only: no threshold, envelope, or rule was\n  changed in response to anything on that page.\n- [`corpus/SEPARATION.md`](corpus/SEPARATION.md): per-metric human-vs-machine\n  AUC on the dev split, with the combined score's own AUC.\n- [`corpus/NEARNOOP.md`](corpus/NEARNOOP.md): what fraction of human corpus\n  sentences receive any edit, per genre.\n- [`corpus/MEANING_AUDIT.md`](corpus/MEANING_AUDIT.md): a deterministic\n  50-document sample checked for meaning preservation.\n- [`corpus/MINE_INVENTORY.md`](corpus/MINE_INVENTORY.md),\n  [`corpus/MINE_PAIRED.md`](corpus/MINE_PAIRED.md) and\n  [`corpus/OUTPUT_BANDS.md`](corpus/OUTPUT_BANDS.md): the mining provenance the\n  inventory pack's own entries cite for their corpus counts.\n- [`corpus/STATS.md`](corpus/STATS.md): corpus composition by class, genre and\n  split.\n\nThe tagger and parser are trained from the same corpus, by a pipeline that\ndrafts annotations with an offline tool and corrects them mechanically. That\ngold data is **not** committed: it is derived, no build reads it, and every\nretrain would add megabytes to history permanently. `tools/requirements.txt`\npins the environment that reproduces it byte-for-byte. The pin matters, since\na different model version parses differently and would silently produce\ndifferent gold while every check still passed.\n\nFor the algorithms themselves (the matching-statistics construction, mining\nthresholds, gate definitions, and the validated reference prototypes), see\n[docs/research/ALGORITHMS.md](docs/research/ALGORITHMS.md) and\n[docs/research/ref/](docs/research/ref/). For how the register targets were\nmeasured, including what the corpus turned out not to support, see\n[docs/research/regvec/TARGET_ESTIMATION.md](docs/research/regvec/TARGET_ESTIMATION.md).\n\n## Releasing\n\nThe version in `crates/friction-cli/Cargo.toml` is the single source of truth.\nTo cut a release: **bump it and push to `main`.** CI derives the tag, builds all\nsix targets, publishes the GitHub release with checksums, then generates and\npublishes the npm packages at the same version.\n\nnpm publishing needs an `NPM_TOKEN` repository secret. Without it that job\nreports green and does nothing, so the binary release is never held up by\ncredentials that are not configured. The platform packages publish before the\nwrapper, since the wrapper pins them by exact version and the reverse order\nwould leave a window where `npm install friction-cli` resolves a wrapper whose\nbinaries are not on the registry yet.\n\nA push whose version is already tagged is a no-op that still reports green, so\nordinary commits neither fail the workflow nor publish duplicates. Nothing is\ntagged by hand. Tagging is the pipeline's job, because a step a human has to\nremember is a step that gets forgotten.\n\n## Development\n\nRust 2024 workspace, MSRV 1.96. `cargo fmt --check`, `cargo clippy --workspace\n--all-targets -- -D warnings`, and `cargo test --workspace` must all pass; the\ntest suite includes the literal accept/reject/rank fixtures from the validation\nresearch (`docs/research/fixtures.json`): if a change makes a reject fixture\npass or an accept fixture fail, the change is wrong, not the fixture.\n\nTwo invariants are worth knowing before changing anything. A **sealed holdout\nsplit** is verified by CI and must never be read; all tuning uses the train\nsplit. And the register feature extractor is pinned against a **reference\nparity fixture** that carries both the reference parse and the counts derived\nfrom it, so a failure tells you whether the counting or the parsing broke.\nWithout that separation, a miscounted feature is invisible in the output.\n\n## License\n\nMIT ([LICENSE-MIT](LICENSE-MIT)) or Apache-2.0 ([LICENSE-APACHE](LICENSE-APACHE)),\nat your option.\n\nThe vendored corpus under `corpus/` is third-party material under its own\nlicenses; every document's provenance and license is recorded in\n`corpus/manifest.jsonl`.\n","readmeFilename":"README.md"}