From 17f08d747448c3c2e75cf4dc8c24311dfcb049ec Mon Sep 17 00:00:00 2001 From: Elmehdi Aitbrahim Date: Wed, 16 Sep 2026 18:27:17 -0400 Subject: [PATCH 1/2] fix(content): sync the copy to v0.16.0, and correct a claim that went false (#142) The site's hand-written copy was last verified against v0.13.3. Three minor releases have shipped since. The fetched half -- changelog, engine docs, roadmap, release assets -- re-resolves at build time and needed nothing; this is the half a human writes. **The claim that went false.** The Install page said of the web console: "every capability increase in keel still requires a person at a terminal". That stopped being true at v0.15.0 (#781), when `keel/capabilities.py` gained a BROWSER gate beside TTY and two `web` rows became capability increases reachable from a browser -- Resume trading after the kill-switch, and Clear streak halt for rail 16's consecutive-loss halt. Each sits behind a typed phrase, a loopback-only check and a gate token of its own, which is narrow and well guarded, and is still not a terminal. The copy now says so, and says the other half too: halting is deliberately NEVER gated on locality, because an operator whose keel is behind a tunnel must be able to stop it from the tunnel. Counts corrected against v0.16.0: - rails twenty -> TWENTY-ONE, numbered 1-14 and 16-22; rail 22 (cash posture, #691) shipped in v0.14.0 and is now listed beside 20 and 21. - web console eight views -> THIRTEEN, with Positions, Balances, Timeline, Research and Plans named; Docs is the fourteenth header entry. The Get Started screenshot predates the six added since v0.13.2 and its caption now says so rather than quietly showing an old header. - research modules thirteen -> FOURTEEN. `spread.py` joined the front door's registry for #371 -- 14 `module=` rows in `commands/research.py`, though that file's own docstring still says thirteen. The site follows the registry. - suite about 5,000 -> about 6,650 tests. - the broker port gains Kraken, described as what it is: a port-complete stub whose every data and market method raises. It proves the port's shape, not that keel can trade there. **The front page can stop hedging.** `2026-09-05-restatement-restated.md` ships in v0.16.0, and the site resolves links at the latest release tag, so copy written deliberately around that record can now quote it: 0 of 240 configurations at the taker rate priced per product, and break-even inside the fee-free allowance of 20.5% against a reconstructed 14.9% win rate -- roughly five and a half points underwater, inside the window this page once called break-even. The honest-result pointer on the home page, the compliance page and the footer moves to that record. Verified unchanged at v0.16.0 and left alone: eight MCP tools, the Python 3.14 floor, the 5-183.8bp slippage range, the six RULE_REGISTRY kinds. All copy is EN/AR/FR. The Arabic and French were written for this change and have not had a native reader. `npm run check`: 0 errors. Build: 74 pages, resolving v0.16.0, and both experiment links return 200. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01EXz13qp1UM3pBa6BqsRqvC --- src/components/Footer.astro | 2 +- src/components/pages/HomePage.astro | 2 +- src/i18n/guides/content.ts | 8 +++--- src/i18n/guides/explainers.ts | 36 +++++++++++++------------- src/i18n/pages/compare.ts | 8 +++--- src/i18n/pages/compliance.ts | 6 ++--- src/i18n/pages/features.ts | 39 +++++++++++++++-------------- src/i18n/pages/home.ts | 28 ++++++++++----------- src/i18n/pages/install.ts | 16 ++++++------ 9 files changed, 73 insertions(+), 72 deletions(-) diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 3d1cea0..4d5cdf5 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -18,7 +18,7 @@ const chrome = t(locale); const c = home[locale]; const honestExperiment = engineBlobUrl( - "docs/experiments/2026-08-13-restated-under-a-production-faithful-engine.md", + "docs/experiments/2026-09-05-restatement-restated.md", ); const editionLinks = [ diff --git a/src/components/pages/HomePage.astro b/src/components/pages/HomePage.astro index 64ea362..95554c6 100644 --- a/src/components/pages/HomePage.astro +++ b/src/components/pages/HomePage.astro @@ -69,7 +69,7 @@ const honestLinks = [ { label: c.honest.experimentLabel, href: engineBlobUrl( - "docs/experiments/2026-08-13-restated-under-a-production-faithful-engine.md", + "docs/experiments/2026-09-05-restatement-restated.md", ), }, { diff --git a/src/i18n/guides/content.ts b/src/i18n/guides/content.ts index 959a4c9..b9b16d4 100644 --- a/src/i18n/guides/content.ts +++ b/src/i18n/guides/content.ts @@ -1,7 +1,7 @@ /** * Get Started guides — editorial, site-authored newbie walkthroughs (EN for * now, like the engine documents themselves). Every command, page and button - * below was verified against keel v0.13.2: the screenshots in + * below was verified against keel v0.16.0: the screenshots in * public/get-started/ were captured by scripts/render-webui-shots.mjs from a * real `keel serve` console on a fresh paper working directory — the curses * TUI these guides used to teach was deleted from the engine before v0.12.2 @@ -66,13 +66,13 @@ export const guides: Guide[] = [ code: "keel serve", }, { - title: "Step 4 — Take the tour: eight views", + title: "Step 4 — Take the tour: thirteen views", body: [ - "keel serve prints a URL carrying a one-time token for this run, opens your browser, and from there everything lives behind the header's eight views. Status (the page you land on) answers \"is it alive\"; Setup is the checklist of what this deployment still needs; Activity, Insights, Rules and Venues report what keel did and found; Orders is the ledger of every order placed, each carrying the venue's own bid and ask at the moment keel submitted it; Gates lists every capability-increasing action and what gates it. The ninth header entry, Docs, links out to the documentation you are reading.", + "keel serve prints a URL carrying a one-time token for this run, opens your browser, and from there everything lives behind the header's thirteen views. Status (the page you land on) answers \"is it alive\"; Setup is the checklist of what this deployment still needs. Activity, Insights, Rules and Venues report what keel did and found. Orders is the ledger of every order placed, each carrying the venue's own bid and ask at the moment keel submitted it; Positions marks what is held at the rails' own price; Balances shows what a cycle actually recorded; Timeline is one chronology assembled over four separate stores. Research publishes the evidence record — rejected trials included — and what a fill is assumed to cost on each product. Plans is a transparency artifact with nothing to click. Gates lists every capability-increasing action and what gates it, and since v0.15.0 two of them can be run from the browser itself. The fourteenth header entry, Docs, links out to the documentation you are reading.", ], shot: "/get-started/webui-status.png", shotCaption: - "The console's Status view with the eight-view header: Status, Setup, Activity, Orders, Insights, Rules, Venues, Gates. The paper badge (top right) is the deployment's mode; the footer says it is served from this machine only.", + "The console's Status view. The header carries thirteen views — Status, Setup, Activity, Orders, Positions, Balances, Timeline, Insights, Research, Rules, Venues, Gates, Plans — and this screenshot predates the six added since v0.13.2. The paper badge (top right) is the deployment's mode; the footer says it is served from this machine only.", }, { title: "Step 5 — Read the dashboard", diff --git a/src/i18n/guides/explainers.ts b/src/i18n/guides/explainers.ts index 3fa77a6..a0edec9 100644 --- a/src/i18n/guides/explainers.ts +++ b/src/i18n/guides/explainers.ts @@ -119,7 +119,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "Screening is not profitability", paragraphs: [ - "What screening governs is admission, not results. No shipped rule family is net positive at the taker fee actually paid on Coinbase — about 1.2% on each side of a trade. Every signal rule keel ships has now been measured at its shipped defaults across 24 assets: 0 of 120 configurations cleared, and 0 of 138 counting every matrix run. Fees are not the whole cost either — priced at each asset's own liquidity rather than at a flat floor no asset reaches, the results fall further still.", + "What screening governs is admission, not results. No shipped rule family is net positive at the taker fee actually paid on Coinbase — about 1.2% on each side of a trade. Every signal rule keel ships has now been measured at its shipped defaults across 24 assets: 0 of 240 configurations cleared, re-run on v0.16.0 and priced per product. Fees are not the whole cost either — priced at each asset's own liquidity rather than at a flat floor no asset reaches, the results fall further still.", "A perfectly screened asset traded by a losing rule is still a losing trade. Compliance and performance are separate axes: the first is enforced by the engine, the second is reported honestly, first.", ], links: [ @@ -130,7 +130,7 @@ export const explainers: Explainer[] = [ }, footnote: "keel is not a fatwa engine, and this guide is neither a fatwa nor financial advice. The boundary gets its own treatment in Attestation is not a fatwa — and possession gets its own guide, Qabd (constructive possession) in spot crypto.", - rev: "2026-08-21.1", + rev: "2026-09-16.1", }, ar: { title: "كيف يعمل الفرزُ الشرعي للعملات الرقمية فعلًا", @@ -202,7 +202,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "الفرزُ ليس ربحية", paragraphs: [ - "ما يحكمُه الفرزُ هو القبولُ لا النتائج. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة. وقد قيست الآن كلُّ قاعدةِ إشارةٍ يُصدِّرها كيل عند إعداداتها المُصدَّرة على 24 أصلًا: صفرٌ من 120 تهيئةً اجتازت، وصفرٌ من 138 بعدِّ كلِّ مصفوفةٍ أُجريت. وليست الرسومُ كلَّ التكلفة أيضًا — فبتسعير كلِّ أصلٍ على قدر سيولته هو، لا على أرضيةٍ ثابتةٍ لا يبلغها أصل، تنخفض النتائج أكثر.", + "ما يحكمُه الفرزُ هو القبولُ لا النتائج. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة. وقد قيست الآن كلُّ قاعدةِ إشارةٍ يُصدِّرها كيل عند إعداداتها المُصدَّرة على 24 أصلًا: صفرٌ من 240 تهيئةً اجتازت، بإعادة القياس على الإصدار v0.16.0 وبالتسعير لكلِّ منتج. وليست الرسومُ كلَّ التكلفة أيضًا — فبتسعير كلِّ أصلٍ على قدر سيولته هو، لا على أرضيةٍ ثابتةٍ لا يبلغها أصل، تنخفض النتائج أكثر.", "فالأصلُ المفروز فرزًا تامًّا إذا تداولته قاعدةٌ خاسرة فقد خسرت. الامتثالُ والأداء محوران مختلفان: الأول يُنفّذه المحرّك، والثاني يُبلَّغ عنه بصدقٍ أولًا.", ], links: [ @@ -213,8 +213,8 @@ export const explainers: Explainer[] = [ }, footnote: "كيل ليس محرّك فتاوى، وهذه المقالة ليست فتوى ولا نصيحةً مالية. فالحدُّ الفاصل له مقالُه الخاص «التوثيقُ ليس فتوى» — وللقبض دليلٌ خاصٌّ به: «القبضُ الحُكمي في العملات الفورية».", - rev: "2026-08-21.1", - translatedFromRev: "2026-08-21.1", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", }, }, { @@ -250,7 +250,7 @@ export const explainers: Explainer[] = [ { heading: "Rail 17: the test as code", paragraphs: [ - "Rail 17 is one of the two rails, among keel's twenty, that encode a fiqh ruling as an executable check — the other is rail 21, which refuses to sell what the account does not own. Its mechanics are deliberately blunt. The operator attests withdrawal capability per product with keel withdrawals attest. The attestation is live-read on every order intent — not cached from yesterday's session. It expires after seven days, because a stale attestation is no better than none: capability demonstrated last month says nothing about this morning. And when the attestation is missing or expired, acquisition fails closed — refusing to decide is the decision.", + "Rail 17 is one of the two rails, among keel's twenty-one, that encode a fiqh ruling as an executable check — the other is rail 21, which refuses to sell what the account does not own. Its mechanics are deliberately blunt. The operator attests withdrawal capability per product with keel withdrawals attest. The attestation is live-read on every order intent — not cached from yesterday's session. It expires after seven days, because a stale attestation is no better than none: capability demonstrated last month says nothing about this morning. And when the attestation is missing or expired, acquisition fails closed — refusing to decide is the decision.", "And the rail enforces the attestation; it never produces it. Whether possession is valid in your school's reading is your attestation's question. The rail only refuses to let the engine keep buying what nobody has evidenced it can withdraw.", ], }, @@ -278,7 +278,7 @@ export const explainers: Explainer[] = [ { heading: "The other rails, for contrast", paragraphs: [ - "Rail 17's uniqueness is easier to see against its neighbours. Of keel's twenty rails (numbered 1–14 and 16–21 — there is no rail 15), two encode a fiqh ruling: rail 17, and rail 21, which refuses a SELL for a base the venue reports the account does not hold — bay' ma la yamlik, the sale of what one does not own. Rail 17 remains the only rail that encodes qabd. Rails 1, 18, and 19 enforce what the screen and the charter admit: the allowlist itself, settlement confined to the operator's configured currencies, and the requirement that every product id be a well-formed spot pair. The rest are prudential — spend caps, drawdown breakers, exposure limits, and rail 20's veto on a venue credential nobody has attested for trading — risk and operational discipline carrying no religious claim.", + "Rail 17's uniqueness is easier to see against its neighbours. Of keel's twenty-one rails (numbered 1–14 and 16–22 — there is no rail 15), two encode a fiqh ruling: rail 17, and rail 21, which refuses a SELL for a base the venue reports the account does not hold — bay' ma la yamlik, the sale of what one does not own. Rail 17 remains the only rail that encodes qabd. Rails 1, 18, and 19 enforce what the screen and the charter admit: the allowlist itself, settlement confined to the operator's configured currencies, and the requirement that every product id be a well-formed spot pair. The rest are prudential — spend caps, drawdown breakers, exposure limits, and rail 20's veto on a venue credential nobody has attested for trading — risk and operational discipline carrying no religious claim.", "The fiqh content behind the spot-only charter is real enough: what makes speculation maisir, the basis records from §65.6, is non-ownership, non-delivery, or difference-settlement — not frequency, and not price speculation as such. But the rails that enforce spot-only are the agent's charter, justified by measurement and verified against the venue's actual listings — which is why their justification never has to overreach into doctrine.", ], }, @@ -286,7 +286,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "Possession is not profitability", paragraphs: [ - "Rail 17 protects the validity of acquisition, not the outcome of trading. No shipped rule family is net positive at the taker fee actually paid on Coinbase — about 1.2% on each side of a trade; 0 of 120 configurations cleared across every signal rule keel ships, and 0 of 138 counting every matrix run. A fully qabd-compliant fill on a fully screened asset can still be a losing trade — the two axes are independent, and both are reported.", + "Rail 17 protects the validity of acquisition, not the outcome of trading. No shipped rule family is net positive at the taker fee actually paid on Coinbase — about 1.2% on each side of a trade; 0 of 240 configurations cleared across every signal rule keel ships, priced per product. A fully qabd-compliant fill on a fully screened asset can still be a losing trade — the two axes are independent, and both are reported.", "That is not a caveat bolted onto the compliance story; it is the same honesty applied to numbers instead of rulings. The honest result is linked from the repository's first screen, and it asks for no one's endorsement — the rail and the report are two halves of one posture.", ], links: [ @@ -297,7 +297,7 @@ export const explainers: Explainer[] = [ }, footnote: "keel is not a fatwa engine, and this guide is neither a fatwa nor financial advice. How screening admits assets at all is the subject of How Shariah crypto screening actually works — and the governance boundary is the subject of Attestation is not a fatwa.", - rev: "2026-09-02.1", + rev: "2026-09-16.1", }, ar: { title: "القبضُ الحُكمي في العملات الرقمية الفورية: شرح", @@ -366,7 +366,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "القبضُ ليس ربحية", paragraphs: [ - "تحمي السكةُ 17 صحةَ الاقتناء، لا مآلَ التداول. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة؛ صفرٌ من 120 تهيئةً اجتازت عبر كلِّ قاعدةِ إشارةٍ يُصدِّرها كيل، وصفرٌ من 138 بعدِّ كلِّ مصفوفةٍ أُجريت. فتنفيذٌ مستوفٍ للقبض على أصلٍ مفروزٍ فرزًا تامًّا قد يظلُّ صفقةً خاسرة — المحوران مستقلّان، وكلاهما يُبلَّغ عنه.", + "تحمي السكةُ 17 صحةَ الاقتناء، لا مآلَ التداول. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة؛ صفرٌ من 240 تهيئةً اجتازت عبر كلِّ قاعدةِ إشارةٍ يُصدِّرها كيل، بالتسعير لكلِّ منتج. فتنفيذٌ مستوفٍ للقبض على أصلٍ مفروزٍ فرزًا تامًّا قد يظلُّ صفقةً خاسرة — المحوران مستقلّان، وكلاهما يُبلَّغ عنه.", "وهذا ليس تنبيهًا لُصق بقصة الامتثال من خارجها؛ بل هو الصدقُ نفسُه مطبَّقًا على الأرقام بدل الأحكام. فالنتيجةُ الصادقة موصولةٌ من أول شاشةٍ في المستودع، ولا تطلب من أحدٍ أن يوافق عليها — السكةُ والتقرير شطران لوضعٍ واحد.", ], links: [ @@ -377,8 +377,8 @@ export const explainers: Explainer[] = [ }, footnote: "كيل ليس محرّك فتاوى، وهذه المقالة ليست فتوى ولا نصيحةً مالية. أمّا كيف يُدخل الفرزُ الأصولَ أصلًا فموضوعُ «كيف يعمل الفرزُ الشرعي للعملات الرقمية فعلًا» — وحدُّ الحوكمة موضوعُ «التوثيقُ ليس فتوى».", - rev: "2026-09-02.1", - translatedFromRev: "2026-09-02.1", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", }, }, { @@ -442,7 +442,7 @@ export const explainers: Explainer[] = [ { heading: "What the boundary is not", paragraphs: [ - "The boundary is not soft enforcement. Everything attested is enforced deterministically: every order intent passes through twenty un-overridable rails, and an asset without an attestation never trades — the machine's neutrality about rulings coexists with total firmness in executing them. Refusing to be the mufti does not make keel a lighter enforcement engine; it makes the enforcement attributable.", + "The boundary is not soft enforcement. Everything attested is enforced deterministically: every order intent passes through twenty-one un-overridable rails, and an asset without an attestation never trades — the machine's neutrality about rulings coexists with total firmness in executing them. Refusing to be the mufti does not make keel a lighter enforcement engine; it makes the enforcement attributable.", "Nor is the boundary a hedge bolted on for liability. It is the mechanism that lets the engine be audited at all: because every enforced ruling resolves to a record with a source and a name, disagreement has a place to land — your own database — instead of a black box you can only take or leave. keel's own one-line pitch for reviewers says it plainly: classifications are attested, never inferred, and enforced deterministically. The first two clauses are the boundary; the third is the product.", ], }, @@ -456,7 +456,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "The boundary extends to results", paragraphs: [ - "A review would not endorse performance — and nothing on this site asks you to, either. No shipped rule family is net positive at the taker fee actually paid on Coinbase: about 1.2% on each side of a trade, and 0 of 120 configurations cleared across every signal rule keel ships. This site used to add that the rules touch break-even inside the venue's fee-free allowance; that claim was priced at a slippage floor no asset reaches, and it has been withdrawn. Enforcement and honesty are separate products; keel ships both.", + "A review would not endorse performance — and nothing on this site asks you to, either. No shipped rule family is net positive at the taker fee actually paid on Coinbase: about 1.2% on each side of a trade, and 0 of 240 configurations cleared across every signal rule keel ships. This site used to add that the rules touch break-even inside the venue's fee-free allowance; that claim was priced at a slippage floor no asset reaches, and it has been withdrawn. Enforcement and honesty are separate products; keel ships both.", "The refusal runs in both directions: the engine will not issue your rulings, and it does not ask you to endorse its numbers. One posture, two directions — enforcement of what you attest, honesty about what it measures.", ], links: [ @@ -467,7 +467,7 @@ export const explainers: Explainer[] = [ }, footnote: "keel is not a fatwa engine, and this guide is neither a fatwa nor financial advice. How assets are admitted at all is the subject of How Shariah crypto screening actually works — and possession, of Qabd (constructive possession) in spot crypto.", - rev: "2026-09-02.1", + rev: "2026-09-16.1", }, ar: { title: "التوثيقُ ليس فتوى", @@ -542,7 +542,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "الحدُّ يمتدُّ إلى النتائج", paragraphs: [ - "لن توافقَ المراجعةُ على الأداء — ولا شيءٌ في هذا الموقع يطلب منك ذلك أصلًا. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase: نحو 1.2٪ لكلِّ طرفٍ من الصفقة، وصفرٌ من 120 تهيئةً اجتازت عبر كلِّ قاعدةِ إشارةٍ يُصدِّرها كيل. وكان هذا الموقع يضيف أنّ القواعد تلامس نقطة التعادل داخل الحصّة المعفاة من الرسوم؛ وتلك الدعوى كانت مُسعَّرةً عند أرضيةِ انزلاقٍ لا يبلغها أيُّ أصل، وقد سُحبت. الإنفاذُ والصدق منتجان منفصلان — وكيل تشحنهما معًا.", + "لن توافقَ المراجعةُ على الأداء — ولا شيءٌ في هذا الموقع يطلب منك ذلك أصلًا. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase: نحو 1.2٪ لكلِّ طرفٍ من الصفقة، وصفرٌ من 240 تهيئةً اجتازت عبر كلِّ قاعدةِ إشارةٍ يُصدِّرها كيل. وكان هذا الموقع يضيف أنّ القواعد تلامس نقطة التعادل داخل الحصّة المعفاة من الرسوم؛ وتلك الدعوى كانت مُسعَّرةً عند أرضيةِ انزلاقٍ لا يبلغها أيُّ أصل، وقد سُحبت. الإنفاذُ والصدق منتجان منفصلان — وكيل تشحنهما معًا.", "والامتناعُ يجري في الاتجاهين معًا: فالمحرّك لا يُصدر أحكامَك، ولا يطلب منك أن توافق على أرقامه. وضعٌ واحدٌ باتجاهين اثنين — إنفاذٌ أمينٌ لما توثّقه، وصدقٌ كاملٌ فيما يقيسه.", ], links: [ @@ -553,8 +553,8 @@ export const explainers: Explainer[] = [ }, footnote: "كيل ليس محرّك فتاوى، وهذه المقالة ليست فتوى ولا نصيحةً مالية. أمّا كيف تُدخل الأصولُ أصلًا فموضوعُ «كيف يعمل الفرزُ الشرعي للعملات الرقمية فعلًا» — والقبضُ موضوعُ «القبضُ الحُكمي في العملات الرقمية الفورية».", - rev: "2026-09-02.1", - translatedFromRev: "2026-09-02.1", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", }, }, ]; diff --git a/src/i18n/pages/compare.ts b/src/i18n/pages/compare.ts index 95dccc7..7d8d9bf 100644 --- a/src/i18n/pages/compare.ts +++ b/src/i18n/pages/compare.ts @@ -181,7 +181,7 @@ const contentFor = ( Object.entries(content).map(([key, texts]) => [key, texts[locale]]), ) as unknown as Omit; -const REV = "2026-09-02.1"; +const REV = "2026-09-16.1"; export const compare: LocalizedPage = { en: { rev: REV, ...contentFor("en") }, @@ -337,9 +337,9 @@ const table: { label: LocalizedCell; cells: [Cell, Cell, Cell, Cell, Cell] }[] = }, cells: [ { - en: "Attested screening that fails closed + 20 rails no order can skip (including qabd)", - ar: "فرزٌ موثَّق يرفض عند الفشل + 20 سكةَ أمانٍ لا تُتجاوَز (منها القبض الحُكمي)", - fr: "Filtrage attesté qui bloque par défaut + 20 garde-fous incontournables (dont le qabd)", + en: "Attested screening that fails closed + 21 rails no order can skip (including qabd)", + ar: "فرزٌ موثَّق يرفض عند الفشل + 21 سكةَ أمانٍ لا تُتجاوَز (منها القبض الحُكمي)", + fr: "Filtrage attesté qui bloque par défaut + 21 garde-fous incontournables (dont le qabd)", }, NOT_BUILT_IN, NOT_BUILT_IN, diff --git a/src/i18n/pages/compliance.ts b/src/i18n/pages/compliance.ts index 7a1a34d..7d65e7e 100644 --- a/src/i18n/pages/compliance.ts +++ b/src/i18n/pages/compliance.ts @@ -110,7 +110,7 @@ export const compliance: LocalizedPage = { { label: "The honest result — experiment record", note: "No shipped rule family is net-positive at the taker fee actually paid; every number stated.", - path: "docs/experiments/2026-08-13-restated-under-a-production-faithful-engine.md", + path: "docs/experiments/2026-09-05-restatement-restated.md", }, { label: "The glossary (docs/glossary.md)", @@ -209,7 +209,7 @@ export const compliance: LocalizedPage = { { label: "النتيجة الصادقة — سجلّ التجربة", note: "لا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ الفعلية؛ وكلُّ الأرقام مذكورة.", - path: "docs/experiments/2026-08-13-restated-under-a-production-faithful-engine.md", + path: "docs/experiments/2026-09-05-restatement-restated.md", }, { label: "المسرد (docs/glossary.md)", @@ -308,7 +308,7 @@ export const compliance: LocalizedPage = { { label: "Le résultat honnête — le compte rendu de l'expérience", note: "Aucune famille de règles livrée ne dégage un résultat net positif aux frais de preneur réellement payés ; tous les chiffres sont donnés.", - path: "docs/experiments/2026-08-13-restated-under-a-production-faithful-engine.md", + path: "docs/experiments/2026-09-05-restatement-restated.md", }, { label: "Le glossaire (docs/glossary.md)", diff --git a/src/i18n/pages/features.ts b/src/i18n/pages/features.ts index b508085..f830311 100644 --- a/src/i18n/pages/features.ts +++ b/src/i18n/pages/features.ts @@ -29,10 +29,10 @@ export interface FeaturesContent { export const features: LocalizedPage = { en: { - rev: "2026-09-05.1", + rev: "2026-09-16.1", title: "Shariah Compliance Engine Features — keel", description: - "Attested screening that fails closed, 20 rails no order can skip, gates checked for overfitting, honest measurement against DCA, and execution hardened for correctness — all mapped to source.", + "Attested screening that fails closed, 21 rails no order can skip, gates checked for overfitting, honest measurement against DCA, and execution hardened for correctness — all mapped to source.", intro: "This page describes only what the engine repository can show. Each section links to the source that proves it — if a claim ever drifts from the code, the link is how you catch us.", verifyNote: "Verify in the repository", @@ -43,8 +43,8 @@ export const features: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "The rails — twenty checks no order can skip", - body: "Deterministic guards that nothing can override, not even autonomy mode. Twenty of them — numbered 1–14 and 16–21, because rail 15 was retired and its number was never reused:", + title: "The rails — twenty-one checks no order can skip", + body: "Deterministic guards that nothing can override, not even autonomy mode. Twenty-one of them — numbered 1–14 and 16–22, because rail 15 was retired and its number was never reused:", points: [ "The halal allowlist, per-order and per-day spend caps, exposure and concentration caps", "Correlation-aware sizing, a minimum-move floor, no-martingale and no-stop-widening", @@ -55,6 +55,7 @@ export const features: LocalizedPage = { "A maximum-spread entry gate that refuses live BUYs at a spread of 50 basis points or wider, and refuses outright if the order book cannot be read", "Rail 20 — trade scope: a credential that reads fine is not evidence it can trade, so every live entry is vetoed until the venue itself has confirmed that credential may place one", "Rail 21 — base balance: a SELL is refused when the venue affirmatively reports no holding, and deliberately let through when the balance is merely unknown, because a blocked exit strands a position that wanted out", + "Rail 22 — cash posture: a venue must be attested as cash-only, and that attestation is bound to the credential that earned it and expires, because a margin-enabled account can borrow without ever being asked", "A rail veto names the rail that fired and the command that clears it", ], verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, @@ -80,8 +81,8 @@ export const features: LocalizedPage = { verify: { label: "commands/orders.py", path: "keel/commands/orders.py" }, }, { - title: "keel research — one front door over thirteen evidence modules", - body: "The evidence toolkit had thirteen modules and nowhere that said so; six of them were reachable only by reading the source. keel research index now names all thirteen — what each one answers, what it cannot answer, and the command that runs it. It adds no statistics of its own: the five that already had a home under keel trials are registered a second time as the same command objects, never copies, because a front door that reimplements drifts the moment one copy takes a bugfix the other does not. The \"cannot answer\" column is meant to be read as carefully as the other one.", + title: "keel research — one front door over fourteen evidence modules", + body: "The evidence toolkit had thirteen modules and nowhere that said so; six of them were reachable only by reading the source. keel research index now names all fourteen — what each one answers, what it cannot answer, and the command that runs it. It adds no statistics of its own: the five that already had a home under keel trials are registered a second time as the same command objects, never copies, because a front door that reimplements drifts the moment one copy takes a bugfix the other does not. The \"cannot answer\" column is meant to be read as carefully as the other one.", verify: { label: "commands/research.py", path: "keel/commands/research.py" }, }, { @@ -91,7 +92,7 @@ export const features: LocalizedPage = { }, { title: "A broker port, not a broker lock-in", - body: "Adapters implement one contract — the keel-broker-api port — and register under the keel.brokers entry point. Coinbase Advanced Trade is the reference adapter; Robinhood ships as an optional, deliberately unwired venue; an Alpaca adapter joined in v0.10.0. A deliberately divergent fake venue keeps the port honest: the conformance suite runs against both, inside a suite of about 5,000 tests.", + body: "Adapters implement one contract — the keel-broker-api port — and register under the keel.brokers entry point. Coinbase Advanced Trade is the reference adapter; Robinhood ships as an optional, deliberately unwired venue; an Alpaca adapter joined in v0.10.0; and a Kraken adapter is present as a port-complete stub whose every data and market method raises — it proves the port's shape, not that keel can trade there. A deliberately divergent fake venue keeps the port honest: the conformance suite runs against both, inside a suite of about 6,650 tests.", verify: { label: "packages/", path: "packages", kind: "tree" }, }, { @@ -136,11 +137,11 @@ export const features: LocalizedPage = { }, ar: { - rev: "2026-09-05.1", - translatedFromRev: "2026-09-05.1", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", title: "خصائص محرّك الامتثال الشرعي — كيل", description: - "فرزٌ موثَّق يرفض عند الفشل، و20 سكةَ أمانٍ لا تُتجاوَز، وبواباتُ ترقيةٍ تفحص الإفراط في المُلاءمة، وقياسٌ صادقٌ مقابل مؤشّر DCA، وتنفيذٌ تُحصَّن فيه صحةُ الأوامر — وكلُّ خاصيةٍ تشير إلى مصدرها في الشيفرة.", + "فرزٌ موثَّق يرفض عند الفشل، و21 سكةَ أمانٍ لا تُتجاوَز، وبواباتُ ترقيةٍ تفحص الإفراط في المُلاءمة، وقياسٌ صادقٌ مقابل مؤشّر DCA، وتنفيذٌ تُحصَّن فيه صحةُ الأوامر — وكلُّ خاصيةٍ تشير إلى مصدرها في الشيفرة.", intro: "لا تصف هذه الصفحة إلا ما يستطيع مستودعُ المحرّك إظهارَه. وكلُّ قسمٍ يرتبط بالمصدر الذي يُثبته — فإن انحرفت دعوى يومًا عن الشيفرة، فالرابط هو سبيلك إلى الإمساك بنا.", verifyNote: "تحقّق في المستودع", @@ -151,8 +152,8 @@ export const features: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "سكك الأمان — عشرون فحصًا لا يتجاوزها أيُّ أمر", - body: "ضوابطُ حتميةٌ لا يتجاوزها شيء، ولا حتى وضعُ الاستقلالية. وهي عشرون، مرقَّمةٌ من 1 إلى 14 ومن 16 إلى 21، إذ أُلغيت السكةُ 15 ولم يُعَد استعمالُ رقمها:", + title: "سكك الأمان — إحدى وعشرون فحصًا لا يتجاوزها أيُّ أمر", + body: "ضوابطُ حتميةٌ لا يتجاوزها شيء، ولا حتى وضعُ الاستقلالية. وهي إحدى وعشرون، مرقَّمةٌ من 1 إلى 14 ومن 16 إلى 22، إذ أُلغيت السكةُ 15 ولم يُعَد استعمالُ رقمها:", points: [ "قائمةُ الأصول الحلال المسموح بها، وسقوفُ الإنفاق للأمر الواحد ولليوم، وسقوفُ التعرُّض والتركيز", "تحجيمٌ يراعي الارتباط، وحدٌّ أدنى لحركة السعر، ومنعُ المارتينغال ومنعُ توسيع وقف الخسارة", @@ -199,7 +200,7 @@ export const features: LocalizedPage = { }, { title: "منفذُ وسطاءٍ، لا ارتهانٌ لوسيط", - body: "تُنفّذ المحوّلات عقدًا واحدًا — منفذ keel-broker-api — وتُسجَّل تحت نقطة الدخول keel.brokers. ومحوّل Coinbase Advanced Trade هو المحوّل المرجعي؛ ويُسلَّم Robinhood منصّةً اختياريةً غيرَ موصولةٍ عمدًا؛ وانضمّ محوّل Alpaca في الإصدار v0.10.0. وثمّة منصّةٌ وهميةٌ متعمَّدةُ الاختلاف تُبقي المنفذ أمينًا: إذ تعمل حزمةُ اختبارات المطابقة على الاثنتين معًا، ضمن حزمةِ اختباراتٍ تناهز 5,000 اختبار.", + body: "تُنفّذ المحوّلات عقدًا واحدًا — منفذ keel-broker-api — وتُسجَّل تحت نقطة الدخول keel.brokers. ومحوّل Coinbase Advanced Trade هو المحوّل المرجعي؛ ويُسلَّم Robinhood منصّةً اختياريةً غيرَ موصولةٍ عمدًا؛ وانضمّ محوّل Alpaca في الإصدار v0.10.0؛ ويوجد محوّلُ Kraken هيكلًا مكتملَ المنفذ تُطلق كلُّ دواله للبيانات والسوق استثناءً — فهو يُثبت شكلَ المنفذ لا أنّ كيل يستطيع التداول هناك. وثمّة منصّةٌ وهميةٌ متعمَّدةُ الاختلاف تُبقي المنفذ أمينًا: إذ تعمل حزمةُ اختبارات المطابقة على الاثنتين معًا، ضمن حزمةِ اختباراتٍ تناهز 6,650 اختبارًا.", verify: { label: "packages/", path: "packages", kind: "tree" }, }, { @@ -244,11 +245,11 @@ export const features: LocalizedPage = { }, fr: { - rev: "2026-09-05.1", - translatedFromRev: "2026-09-05.1", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", title: "Fonctionnalités du moteur de conformité — keel", description: - "Un filtrage attesté qui bloque par défaut, vingt garde-fous incontournables, des verrous de promotion avec contrôle de surapprentissage, une mesure honnête face au DCA, une exécution durcie pour la justesse — chaque fonctionnalité renvoie à sa source dans le code.", + "Un filtrage attesté qui bloque par défaut, vingt-et-un garde-fous incontournables, des verrous de promotion avec contrôle de surapprentissage, une mesure honnête face au DCA, une exécution durcie pour la justesse — chaque fonctionnalité renvoie à sa source dans le code.", intro: "Cette page ne décrit que ce que le dépôt du moteur peut montrer. Chaque section renvoie à la source qui l'atteste : si une affirmation s'écartait un jour du code, c'est par ce lien que vous nous prendriez en défaut.", verifyNote: "Vérifier dans le dépôt", @@ -259,8 +260,8 @@ export const features: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "Les garde-fous (rails) — vingt contrôles qu'aucun ordre ne contourne", - body: "Des contrôles déterministes que rien ne peut désactiver, pas même le mode autonome. Ils sont vingt, numérotés de 1 à 14 et de 16 à 21 — le garde-fou 15 a été retiré et son numéro jamais réattribué :", + title: "Les garde-fous (rails) — vingt-et-un contrôles qu'aucun ordre ne contourne", + body: "Des contrôles déterministes que rien ne peut désactiver, pas même le mode autonome. Ils sont vingt-et-un, numérotés de 1 à 14 et de 16 à 22 — le garde-fou 15 a été retiré et son numéro jamais réattribué :", points: [ "La liste blanche halal, les plafonds de dépense par ordre et par jour, les plafonds d'exposition et de concentration", "Un dimensionnement qui tient compte des corrélations, un seuil de mouvement minimal, l'interdiction de la martingale et de l'élargissement des stops", @@ -307,7 +308,7 @@ export const features: LocalizedPage = { }, { title: "Un port courtier, pas un enfermement propriétaire", - body: "Les adaptateurs mettent en œuvre un seul contrat — le port keel-broker-api — et se déclarent sous le point d'entrée keel.brokers. Coinbase Advanced Trade est l'adaptateur de référence ; Robinhood est livré comme plateforme optionnelle, délibérément non raccordée ; un adaptateur Alpaca s'y est ajouté en v0.10.0. Une plateforme factice, volontairement divergente, maintient le port honnête : la suite de conformité s'exécute sur les deux, au sein d'une base d'environ 5 000 tests.", + body: "Les adaptateurs mettent en œuvre un seul contrat — le port keel-broker-api — et se déclarent sous le point d'entrée keel.brokers. Coinbase Advanced Trade est l'adaptateur de référence ; Robinhood est livré comme plateforme optionnelle, délibérément non raccordée ; un adaptateur Alpaca s'y est ajouté en v0.10.0 ; et un adaptateur Kraken est présent à l'état d'ébauche complète du port, dont chaque méthode de données et de marché lève une exception — il atteste la forme du port, non que keel puisse y négocier. Une plateforme factice, volontairement divergente, maintient le port honnête : la suite de conformité s'exécute sur les deux, au sein d'une base d'environ 6 650 tests.", verify: { label: "packages/", path: "packages", kind: "tree" }, }, { diff --git a/src/i18n/pages/home.ts b/src/i18n/pages/home.ts index 677e0e8..e26fb01 100644 --- a/src/i18n/pages/home.ts +++ b/src/i18n/pages/home.ts @@ -57,7 +57,7 @@ export interface HomeContent { export const home: LocalizedPage = { en: { - rev: "2026-09-05.1", + rev: "2026-09-16.1", title: "keel: the open-source Shariah compliance engine for crypto", description: "The open-source engine that enforces Shariah compliance on spot crypto: attested screening that fails closed and rails no order can skip. Not a fatwa engine.", @@ -71,9 +71,9 @@ export const home: LocalizedPage = { summaryBadge: "In plain words: after the fees and the spreads actually paid, none of keel's shipped rules is profitable and none beats simple dollar-cost averaging (DCA) — including inside the venue's fee-free allowance, where this page used to say they touched break-even.", body: [ - "No shipped rule family is net positive at the taker fee actually paid on Coinbase — about 1.2% on each side of a trade. Every signal rule keel ships has now been measured at its shipped defaults across 24 assets: 0 of 120 configurations cleared. Counting every matrix we have run, it is 0 of 138.", + "No shipped rule family is net positive at the taker fee actually paid on Coinbase — about 1.2% on each side of a trade. Every signal rule keel ships has now been measured at its shipped defaults across 24 assets, re-run on v0.16.0 and priced at what each asset's own book plausibly costs: 0 of 240 configurations cleared. Not one, at the fee this account actually pays.", "Fees are not the whole cost, and we had been understating the rest. keel prices each asset's spread from its own liquidity — and when we finally measured that against the universe, not one of the 24 assets trades at the 5 basis points our earlier numbers assumed. The range is 1.1 to 36.8 times that floor, with a median near ten times it. Charged honestly, the median result across the matrix drops by 0.09 and the one configuration that had looked positive disappears. The error in our own cost model was larger than the best genuine improvement any rule change of ours has produced.", - "That correction reaches a claim this page used to make, so we are withdrawing it here rather than quietly editing it. We said the rules sit at break-even inside the venue's fee-free monthly allowance — a 14.9% win rate against a 14.88% break-even. That 14.88% was computed at the 5 basis points nothing actually trades at; the same note's own sensitivity check fails the claim at twice that, and the measured median is ten times it. The allowance is still the single largest term in the result, worth around 14 points of break-even — more than any change we have made to a rule. It is the boundary between decisively negative and clearly negative, not between negative and profitable.", + "That correction reaches a claim this page used to make, so we are withdrawing it here rather than quietly editing it. We said the rules sit at break-even inside the venue's fee-free monthly allowance — a 14.9% win rate against a 14.88% break-even. That 14.88% was computed at the 5 basis points nothing actually trades at. Re-derived at the spread the assets are actually assumed to pay — a median ten times that floor — break-even inside the allowance is 20.5%, against the same 14.9% win rate. Roughly five and a half points underwater, inside the window we used to call break-even. The allowance is still the single largest term in the result, worth around 14 points of break-even — more than any change we have made to a rule. It is the boundary between decisively negative and clearly negative, not between negative and profitable.", "The point of this project is the enforcement machinery and the honest measurement of what runs through it, not a claim of profit. Every result is compared against a simple buy-every-period (DCA) benchmark, and the reference rules currently do not beat it after fees. We would rather you know that on the front page than discover it yourself. And we are working hard to improve the results of the algorithms and the strategies. We will report our progress here.", ], experimentLabel: "Read the experiment record", @@ -88,7 +88,7 @@ export const home: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "Twenty rails no order can skip", + title: "Twenty-one rails no order can skip", body: "Spend caps, drawdown breakers, exposure limits, no-martingale, feed-staleness checks, and a kill-switch that fails closed: when something breaks, it refuses rather than allows. Then the fiqh-derived rails — the venue subscription attestation, the constructive-possession (qabd) check, which holds that an asset you cannot withdraw may never have been validly possessed, and a refusal to sell a base the venue reports the account does not hold, because selling what you do not own is bay' ma la yamlik.", verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, }, @@ -144,8 +144,8 @@ export const home: LocalizedPage = { }, ar: { - rev: "2026-09-05.1", - translatedFromRev: "2026-09-05.1", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", title: "كيل: محرّك امتثال شرعي مفتوح المصدر للعملات المشفّرة", description: "المحرّك مفتوح المصدر الذي يُنفِّذ الامتثال الشرعي في التداول الفوري للعملات المشفّرة: فرزٌ موثَّق يرفض عند الفشل، وسككُ أمانٍ لا يتجاوزها أيُّ أمر. وليس محرّك فتاوى.", @@ -159,9 +159,9 @@ export const home: LocalizedPage = { summaryBadgeAr: "بلغةٍ مبسّطة: بعد خصم الرسوم وفوارقِ الأسعار المدفوعة فعليًّا، لا تحقّق أيُّ قاعدةٍ من قواعد كيل المُصدَّرة ربحًا ولا تتفوّق على الشراء الدوري المنتظم (DCA) — حتى داخل الحصّة الشهرية المعفاة من الرسوم، حيث كانت هذه الصفحة تقول إنّها تلامس نقطة التعادل.", body: [ - "لا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase‏ (نحو 1.2٪ لكلِّ طرفٍ من الصفقة). وقد قيست الآن كلُّ قاعدةِ إشارةٍ يُصدِّرها كيل عند إعداداتها المُصدَّرة على 24 أصلًا: صفرٌ من 120 تهيئةً اجتازت. وبعدِّ كلِّ مصفوفةٍ أجريناها: صفرٌ من 138.", + "لا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase‏ (نحو 1.2٪ لكلِّ طرفٍ من الصفقة). وقد قيست الآن كلُّ قاعدةِ إشارةٍ يُصدِّرها كيل عند إعداداتها المُصدَّرة على 24 أصلًا، وأُعيد القياسُ على الإصدار v0.16.0 بتسعيرِ ما يكلّفه دفترُ كلِّ أصلٍ على الأرجح: صفرٌ من 240 تهيئةً اجتازت. ولا واحدة، عند الرسوم التي يدفعها هذا الحساب فعلًا.", "وليست الرسومُ كلَّ التكلفة، وقد كنّا نبخس ما بقي منها. فكيل يُسعّر فارقَ سعر كلِّ أصلٍ من سيولته هو — ولمّا قِسنا ذلك أخيرًا على الكون كلِّه، لم يتداول ولا أصلٌ واحدٌ من الأربعة والعشرين عند نقاط الأساس الخمس التي افترضتها أرقامُنا السابقة. بل يمتدّ المدى من 1.1 إلى 36.8 ضعفَ تلك الأرضية، ووسيطُه قرابةَ عشرة أضعافها. وبالتسعير الأمين ينخفض وسيطُ النتيجة عبر المصفوفة بمقدار 0.09، وتختفي التهيئةُ الوحيدة التي بدت موجبة. فقد كان الخطأ في نموذج تكلفتنا نحن أكبرَ من أفضل تحسينٍ حقيقيٍّ أنتجه أيُّ تعديلٍ أجريناه على قاعدة.", - "وهذا التصحيح يطال دعوى كانت هذه الصفحة تقولها، فنحن نسحبها هنا جهارًا بدل تعديلها في صمت. قلنا إنّ القواعد تقف عند نقطة التعادل داخل الحصّة الشهرية المعفاة من الرسوم — نسبةُ ربحٍ 14.9٪ مقابل تعادلٍ عند 14.88٪. وتلك الـ14.88٪ حُسبت عند نقاط الأساس الخمس التي لا يتداول عندها شيء؛ بل إنّ فحص الحساسية في المذكّرة نفسِها يُسقط الدعوى عند ضعفَي ذلك، والوسيطُ المقيس عشرةُ أضعافه. وتبقى الحصّةُ أكبرَ حدٍّ منفردٍ في النتيجة، إذ تساوي نحو 14 نقطةً من التعادل — أكثرَ من أيّ تغييرٍ أدخلناه على قاعدة. لكنّها حدٌّ بين السالب القاطع والسالب الواضح، لا بين السالب والرابح.", + "وهذا التصحيح يطال دعوى كانت هذه الصفحة تقولها، فنحن نسحبها هنا جهارًا بدل تعديلها في صمت. قلنا إنّ القواعد تقف عند نقطة التعادل داخل الحصّة الشهرية المعفاة من الرسوم — نسبةُ ربحٍ 14.9٪ مقابل تعادلٍ عند 14.88٪. وتلك الـ14.88٪ حُسبت عند نقاط الأساس الخمس التي لا يتداول عندها شيء. وبإعادة الاشتقاق عند الفارق الذي يُفترض أنّ الأصول تدفعه فعلًا — ووسيطُه عشرةُ أضعاف تلك الأرضية — تصير نقطةُ التعادل داخل الحصّة 20.5٪ مقابل نسبة الربح نفسِها 14.9٪. أي نحو خمس نقاطٍ ونصفٍ تحت الماء، داخل النافذة التي كنّا نسمّيها تعادلًا. وتبقى الحصّةُ أكبرَ حدٍّ منفردٍ في النتيجة، إذ تساوي نحو 14 نقطةً من التعادل — أكثرَ من أيّ تغييرٍ أدخلناه على قاعدة. لكنّها حدٌّ بين السالب القاطع والسالب الواضح، لا بين السالب والرابح.", "والغاية من هذا المشروع هي آلياتُ الإنفاذ والقياسُ الصادق لما يمرّ عبرها — لا ادّعاءُ الربح. فكلُّ نتيجةٍ تُقارَن بمؤشّرٍ مرجعيٍّ بسيط هو الشراء الدوري المنتظم (DCA)، والقواعد المرجعية لا تتفوّق عليه بعد خصم الرسوم. ونحن نفضّل أن تعرف ذلك من الصفحة الأولى على أن تكتشفه بنفسك. ونعمل جاهدين على تحسين نتائج الخوارزميات والاستراتيجيات — وسنوافيك بما نُحرزه أوّلًا بأوّل.", ], experimentLabel: "اقرأ سجلّ التجربة", @@ -176,7 +176,7 @@ export const home: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "عشرون سكةَ أمانٍ لا يتجاوزها أيُّ أمر", + title: "إحدى وعشرون سكةَ أمانٍ لا يتجاوزها أيُّ أمر", body: "سقوفُ إنفاق، وقواطعُ تراجُعٍ (drawdown)، وحدودُ تعرُّض، ومنعُ مضاعفة الخسارة (المارتينغال)، وفحوصُ تقادُم موجزات البيانات، ومفتاحُ إيقافٍ يرفض عند الفشل — إضافةً إلى ما اشتُقّ من الفقه: توثيقُ الاشتراك في المنصّة، وفحصُ القبض الحُكمي (qabd) القائمُ على أنّ الأصل الذي لا يمكن سحبُه قد لا يكون قد قُبِض قبضًا صحيحًا، ورفضُ بيعِ أصلٍ تُفيد المنصّةُ أنّ الحساب لا يملكه، لأنّ بيعَ ما لا تملك غيرُ جائز.", verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, }, @@ -223,8 +223,8 @@ export const home: LocalizedPage = { }, fr: { - rev: "2026-09-05.1", - translatedFromRev: "2026-09-05.1", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", title: "keel : le moteur open-source de conformité Shariah pour les cryptomonnaies", description: "Le moteur open-source qui applique la conformité Shariah au trading de crypto au comptant : un filtrage attesté qui bloque par défaut, des garde-fous qu'aucun ordre ne contourne. Pas un moteur de fatwas.", @@ -237,9 +237,9 @@ export const home: LocalizedPage = { title: "Le résultat honnête, annoncé d'emblée", summaryBadgeFr: "En clair : une fois les frais et les écarts de cotation réellement payés déduits, aucune règle livrée de keel n'est rentable et aucune ne bat le simple achat périodique (DCA) — y compris dans le quota mensuel sans frais, où cette page affirmait qu'elles touchaient le point mort.", body: [ - "Aucune famille de règles livrée ne dégage un résultat net positif aux frais de preneur (taker) réellement payés sur Coinbase (~1,2 % par sens). Chaque règle de signal que keel livre a désormais été mesurée à ses réglages livrés sur 24 actifs : 0 configuration sur 120 n'a franchi le seuil. Toutes matrices confondues, c'est 0 sur 138.", + "Aucune famille de règles livrée ne dégage un résultat net positif aux frais de preneur (taker) réellement payés sur Coinbase (~1,2 % par sens). Chaque règle de signal que keel livre a désormais été mesurée à ses réglages livrés sur 24 actifs, rejouée sur la v0.16.0 et tarifée au coût plausible du carnet propre à chaque actif : 0 configuration sur 240 n'a franchi le seuil. Pas une seule, aux frais que ce compte paie réellement.", "Les frais ne sont pas tout le coût, et nous sous-estimions le reste. keel calcule l'écart de cotation de chaque actif à partir de sa propre liquidité — et lorsque nous l'avons enfin mesuré sur l'ensemble de l'univers, pas un seul des 24 actifs ne se négocie aux 5 points de base que supposaient nos chiffres antérieurs. L'éventail va de 1,1 à 36,8 fois ce plancher, avec une médiane proche de dix fois. Facturé honnêtement, le résultat médian de la matrice recule de 0,09 et la seule configuration qui paraissait positive disparaît. L'erreur de notre propre modèle de coûts était plus grande que la meilleure amélioration réelle qu'aucune de nos modifications de règle ait produite.", - "Cette correction atteint une affirmation que portait cette page ; nous la retirons donc ici, plutôt que de la corriger en silence. Nous disions que les règles se situent au point mort dans le quota mensuel sans frais — 14,9 % de trades gagnants pour un seuil d'équilibre de 14,88 %. Ce 14,88 % était calculé aux 5 points de base auxquels rien ne se négocie ; le propre test de sensibilité de la note fait tomber l'affirmation au double de ce chiffre, et la médiane mesurée en vaut dix fois. Le quota reste le terme le plus lourd du résultat — environ 14 points de seuil d'équilibre, davantage que toute modification que nous ayons apportée à une règle. Mais c'est la frontière entre nettement perdant et clairement perdant, non entre perdant et rentable.", + "Cette correction atteint une affirmation que portait cette page ; nous la retirons donc ici, plutôt que de la corriger en silence. Nous disions que les règles se situent au point mort dans le quota mensuel sans frais — 14,9 % de trades gagnants pour un seuil d'équilibre de 14,88 %. Ce 14,88 % était calculé aux 5 points de base auxquels rien ne se négocie. Recalculé à l'écart que les actifs sont réellement censés payer — une médiane valant dix fois ce plancher — le point mort dans le quota s'établit à 20,5 %, face au même taux de 14,9 %. Soit environ cinq points et demi sous l'eau, à l'intérieur de la fenêtre que nous appelions le point mort. Le quota reste le terme le plus lourd du résultat — environ 14 points de seuil d'équilibre, davantage que toute modification que nous ayons apportée à une règle. Mais c'est la frontière entre nettement perdant et clairement perdant, non entre perdant et rentable.", "Ce projet a pour objet la machinerie d'application, et la mesure honnête de ce qui la traverse — pas une promesse de gain. Chaque résultat est comparé à une référence simple, l'achat périodique (DCA), et les règles de référence ne la battent pas une fois les frais déduits. Nous préférons que vous l'appreniez dès la page d'accueil plutôt que de le découvrir par vous-même. Nous nous employons à améliorer les résultats des algorithmes et des stratégies, et nous rendrons compte de nos progrès.", ], experimentLabel: "Lire le compte rendu de l'expérience", @@ -254,7 +254,7 @@ export const home: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "Vingt garde-fous qu'aucun ordre ne contourne", + title: "Vingt-et-un garde-fous qu'aucun ordre ne contourne", body: "Plafonds de dépense, disjoncteurs de perte maximale (drawdown), limites d'exposition, interdiction de la martingale, contrôles de fraîcheur des données, un coupe-circuit qui se ferme en cas de défaillance — auxquels s'ajoutent ceux qui découlent du fiqh : l'attestation d'abonnement à la plateforme, le contrôle de prise de possession (qabd), au motif qu'un actif impossible à retirer n'a peut-être jamais été valablement possédé, et le refus de vendre un actif que la plateforme déclare absent du compte, car vendre ce qu'on ne possède pas est bay' ma la yamlik.", verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, }, diff --git a/src/i18n/pages/install.ts b/src/i18n/pages/install.ts index ab72484..1c4a445 100644 --- a/src/i18n/pages/install.ts +++ b/src/i18n/pages/install.ts @@ -125,7 +125,7 @@ export interface InstallContent { export const install: LocalizedPage = { en: { - rev: "2026-08-28.7", + rev: "2026-09-16.1", title: "Download keel — macOS & Windows", description: "Download keel for macOS or Windows. Version and links come from GitHub Releases at build time; the five-minute source path is here too.", @@ -194,7 +194,7 @@ export const install: LocalizedPage = { link: "Open Get Started", }, browserTitle: "Work from the browser — the desktop app", - browserBody: "The desktop app opens keel in your browser: a first-run checklist, credentials kept in your OS keychain, market data fetched as a background job, and asset attestations and rule promotions done from a page instead of a terminal — a promotion launched from the page advances only if it clears the gate, with no force option, because bypassing a gate needs a terminal. That setup surface cannot arm a rule, release funds or spend anything — every capability increase in keel still requires a person at a terminal. Since v0.12.1 the interface wears this site's own identity — the same paper, the same teal, the same ship mark — and since v0.12.2 its header carries a light-or-dark theme choice beside a badge naming the mode you are running; the badge only reports, for changing mode stays a deliberate edit to the config file, not a click in a page. Every money figure arrives as text, already computed and formatted by the engine — the page displays numbers, it never derives them — profit and loss differ in brightness as well as colour, so the distinction survives a greyscale screen, form fields carry a visible border, and the page is served under a content-security policy that stops it sending your positions or trade history anywhere but your own machine. The database beneath runs in WAL mode, so watching a live fetch never blocks the engine writing it. macOS gets the double-clickable app; since v0.12.0, Windows installs through a proper setup wizard. Updating the desktop app means downloading the new installer — it never replaces itself — and your config, database and credentials are never touched by an update. The desktop builds are unsigned — the note below says exactly what your computer will show, and how to verify what you downloaded — and the changelog lists each version the day it ships.", + browserBody: "The desktop app opens keel in your browser: a first-run checklist, credentials kept in your OS keychain, market data fetched as a background job, and asset attestations and rule promotions done from a page instead of a terminal — a promotion launched from the page advances only if it clears the gate, with no force option, because bypassing a gate needs a terminal. That setup surface cannot arm a rule, promote one, attest an asset, release funds or spend anything. Since v0.15.0 it can do exactly two things that increase what keel may do — resume trading after the kill-switch, and clear rail 16's consecutive-loss halt — each behind a typed phrase, on a loopback session only, refused outright if the console is reachable from anywhere but this machine. Halting, by contrast, is deliberately never gated on locality: an operator whose keel sits behind a tunnel must be able to stop it from the tunnel. Everything else still requires a person at a terminal. Since v0.12.1 the interface wears this site's own identity — the same paper, the same teal, the same ship mark — and since v0.12.2 its header carries a light-or-dark theme choice beside a badge naming the mode you are running; the badge only reports, for changing mode stays a deliberate edit to the config file, not a click in a page. Every money figure arrives as text, already computed and formatted by the engine — the page displays numbers, it never derives them — profit and loss differ in brightness as well as colour, so the distinction survives a greyscale screen, form fields carry a visible border, and the page is served under a content-security policy that stops it sending your positions or trade history anywhere but your own machine. The database beneath runs in WAL mode, so watching a live fetch never blocks the engine writing it. macOS gets the double-clickable app; since v0.12.0, Windows installs through a proper setup wizard. Updating the desktop app means downloading the new installer — it never replaces itself — and your config, database and credentials are never touched by an update. The desktop builds are unsigned — the note below says exactly what your computer will show, and how to verify what you downloaded — and the changelog lists each version the day it ships.", fromSource: { title: "From source — try it in five minutes", lead: "Everything in this path is read-only and paper-side: no funds, and nothing here can place an order. You need uv and a free, read-only Coinbase Developer Platform (CDP) API key — candle history is fetched through the authenticated client, so keel fetch without a key fails with an AuthenticationError. We say so here rather than let it surprise you at step four.", @@ -248,8 +248,8 @@ export const install: LocalizedPage = { }, ar: { - rev: "2026-08-28.7", - translatedFromRev: "2026-08-28.7", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", title: "تنزيل كيل — macOS وWindows", description: "نزّل كيل لنظام macOS أو Windows. ويأتي رقمُ الإصدار وروابطه من GitHub Releases وقت البناء؛ ومسارُ التثبيت من المصدر في خمس دقائق هنا أيضًا.", @@ -318,7 +318,7 @@ export const install: LocalizedPage = { link: "افتح دليل البداية", }, browserTitle: "العمل من المتصفّح — تطبيق سطح المكتب", - browserBody: "تطبيقُ سطح المكتب يفتح كيل في متصفّحك: قائمةُ تحقّقٍ للتشغيل الأول، وبياناتُ الدخول تُحفظ في سلسلة مفاتيح نظام التشغيل، وبياناتُ السوق تُجلب مهمّةً في الخلفية، وتُسجَّل شهاداتُ تصنيف الأصول وترقياتُ القواعد من صفحةٍ لا من طرفية — والترقيةُ التي تُطلَق من الصفحة لا تتقدّم إلا إذا اجتازت القاعدةُ البوابة، وبلا خيارِ تجاوز، لأنّ تجاوز البوابة يقتضي طرفية. وسطحُ الإعداد ذاك لا يستطيع تسليحَ قاعدةٍ ولا تحريرَ أموالٍ ولا إنفاقَ شيء — فكلُّ توسيعٍ لقدرات كيل ما يزال يتطلّب إنسانًا عند طرفية. ومنذ الإصدار v0.12.1 تلبس الواجهةُ هويةَ هذا الموقع نفسِه — الورقُ نفسُه، والأخضرُ المزرقُ نفسُه، وعلامةُ السفينة نفسُها — ومنذ v0.12.2 تحمل ترويسةُ الواجهة اختيارًا بين الفاتح والداكن إلى جانب شارةٍ تسمّي النمطَ الذي تعمل عليه؛ والشارةُ تُخبر فقط، فتغييرُ النمط يبقى تعديلًا مقصودًا في ملفّ الإعداد لا نقرةً في صفحة. وكلُّ رقمٍ ماليٍّ يصل نصًّا، محسوبًا ومنسّقًا من المحرّك نفسه — فالصفحةُ تعرض الأرقام ولا تشتقّها أبدًا — والربحُ والخسارة يفترقان في السطوع لا في اللون وحده فينجو التمييزُ على شاشةٍ رمادية، وحقولُ الإدخال تحمل حدودًا مرئية، وتُقدَّم الصفحةُ تحت سياسةِ أمانِ المحتوى التي تمنعها إرسالَ مراكزك أو تاريخِ تداولك إلى غير جهازك. وقاعدةُ البيانات تحتها تعمل بوضع WAL، فمراقبةُ جلبٍ مباشرٍ لن تُعطّل المحرّك أثناء كتابته. و‏macOS يحصل على التطبيق القابل للفتح بنقرةٍ مزدوجة؛ ومنذ الإصدار v0.12.0 يتم تثبيت ‏Windows عبر معالجِ إعدادٍ حقيقي. وتحديثُ تطبيق سطح المكتب يعني تنزيلَ المُثبِّت الجديد — فهو لا يستبدل نفسه أبدًا — وملفُّ إعدادك وقاعدةُ بياناتك وبياناتُ دخولك لا يمسّها تحديثٌ أبدًا. وتُسلَّم حزمتا سطح المكتب دون توقيعٍ رقمي — والملاحظةُ أدناه تقول بالضبط ما سيعرضه حاسوبك وكيف تتحقّق ممّا نزّلته — وسجلُّ التغييرات يُدرج كلَّ إصدارٍ يومَ صدوره.", + browserBody: "تطبيقُ سطح المكتب يفتح كيل في متصفّحك: قائمةُ تحقّقٍ للتشغيل الأول، وبياناتُ الدخول تُحفظ في سلسلة مفاتيح نظام التشغيل، وبياناتُ السوق تُجلب مهمّةً في الخلفية، وتُسجَّل شهاداتُ تصنيف الأصول وترقياتُ القواعد من صفحةٍ لا من طرفية — والترقيةُ التي تُطلَق من الصفحة لا تتقدّم إلا إذا اجتازت القاعدةُ البوابة، وبلا خيارِ تجاوز، لأنّ تجاوز البوابة يقتضي طرفية. وسطحُ الإعداد ذاك لا يستطيع تسليحَ قاعدةٍ ولا ترقيتَها ولا توثيقَ أصلٍ ولا تحريرَ أموالٍ ولا إنفاقَ شيء. ومنذ الإصدار v0.15.0 صار يستطيع أمرين اثنين لا غير ممّا يوسّع قدرات كيل: استئنافَ التداول بعد مفتاح الإيقاف، ورفعَ حاجزِ الخسائر المتتالية (السكة 16) — كلٌّ منهما خلف عبارةٍ تُكتب بخطّ اليد، وعلى جلسةٍ محليةٍ فقط، ويُرفض رفضًا قاطعًا إن كانت الواجهةُ بالغةً من غير هذا الجهاز. أمّا الإيقاف فلا يُشترط فيه المحلّيةُ عمدًا: فمن كان كيله خلف نفقٍ وجب أن يستطيع إيقافه من النفق. وما عدا ذلك ما يزال يتطلّب إنسانًا عند طرفية. ومنذ الإصدار v0.12.1 تلبس الواجهةُ هويةَ هذا الموقع نفسِه — الورقُ نفسُه، والأخضرُ المزرقُ نفسُه، وعلامةُ السفينة نفسُها — ومنذ v0.12.2 تحمل ترويسةُ الواجهة اختيارًا بين الفاتح والداكن إلى جانب شارةٍ تسمّي النمطَ الذي تعمل عليه؛ والشارةُ تُخبر فقط، فتغييرُ النمط يبقى تعديلًا مقصودًا في ملفّ الإعداد لا نقرةً في صفحة. وكلُّ رقمٍ ماليٍّ يصل نصًّا، محسوبًا ومنسّقًا من المحرّك نفسه — فالصفحةُ تعرض الأرقام ولا تشتقّها أبدًا — والربحُ والخسارة يفترقان في السطوع لا في اللون وحده فينجو التمييزُ على شاشةٍ رمادية، وحقولُ الإدخال تحمل حدودًا مرئية، وتُقدَّم الصفحةُ تحت سياسةِ أمانِ المحتوى التي تمنعها إرسالَ مراكزك أو تاريخِ تداولك إلى غير جهازك. وقاعدةُ البيانات تحتها تعمل بوضع WAL، فمراقبةُ جلبٍ مباشرٍ لن تُعطّل المحرّك أثناء كتابته. و‏macOS يحصل على التطبيق القابل للفتح بنقرةٍ مزدوجة؛ ومنذ الإصدار v0.12.0 يتم تثبيت ‏Windows عبر معالجِ إعدادٍ حقيقي. وتحديثُ تطبيق سطح المكتب يعني تنزيلَ المُثبِّت الجديد — فهو لا يستبدل نفسه أبدًا — وملفُّ إعدادك وقاعدةُ بياناتك وبياناتُ دخولك لا يمسّها تحديثٌ أبدًا. وتُسلَّم حزمتا سطح المكتب دون توقيعٍ رقمي — والملاحظةُ أدناه تقول بالضبط ما سيعرضه حاسوبك وكيف تتحقّق ممّا نزّلته — وسجلُّ التغييرات يُدرج كلَّ إصدارٍ يومَ صدوره.", fromSource: { title: "من المصدر — جرّبه في خمس دقائق", lead: "كلُّ ما في هذا المسار بصلاحية القراءة فقط وعلى جانب التداول التجريبي: لا أموال، ولا شيء هنا يستطيع تقديم أمر تداول. وتحتاج إلى uv وإلى مفتاح API مجّانيٍّ للقراءة فقط من منصّة Coinbase Developer Platform‏ (CDP) — إذ تُجلب بيانات الشموع عبر العميل المُصادَق عليه، ولذلك يفشل الأمر keel fetch من دون مفتاحٍ بخطأ AuthenticationError؛ نقولها مقدَّمًا كي لا تكون مفاجأةً في الخطوة الرابعة.", @@ -372,8 +372,8 @@ export const install: LocalizedPage = { }, fr: { - rev: "2026-08-28.7", - translatedFromRev: "2026-08-28.7", + rev: "2026-09-16.1", + translatedFromRev: "2026-09-16.1", title: "Télécharger keel — macOS et Windows", description: "Téléchargez keel pour macOS ou Windows. Le numéro de version et les liens proviennent de GitHub Releases, récupérés au moment du build ; le parcours en cinq minutes depuis les sources figure également ici.", @@ -442,7 +442,7 @@ export const install: LocalizedPage = { link: "Ouvrir Premiers pas", }, browserTitle: "Travailler depuis le navigateur — l'application de bureau", - browserBody: "L'application de bureau ouvre keel dans votre navigateur : liste de contrôle au premier lancement, identifiants gardés dans le trousseau du système, données de marché rapatriées en tâche de fond, attestations d'actifs et promotions de règles faites depuis une page plutôt qu'un terminal — une promotion lancée depuis la page n'avance que si la règle franchit le verrou, sans option de contournement, car contourner un verrou exige un terminal. Cette surface de configuration ne peut armer une règle, libérer des fonds ni rien dépenser — chaque élargissement des capacités de keel exige encore une personne devant un terminal. Depuis la v0.12.1, l'interface porte l'identité de ce site lui-même — même papier, même sarcelle, même marque au navire — et depuis la v0.12.2 son en-tête offre un choix clair ou sombre à côté d'un badge nommant le mode en cours ; le badge informe seulement, car changer de mode reste une modification délibérée du fichier de configuration, pas un clic dans une page. Chaque montant arrive en texte, déjà calculé et mis en forme par le moteur — la page affiche des nombres, elle n'en dérive jamais — gain et perte se distinguent par la luminosité autant que par la couleur, donc la distinction survit à un écran en niveaux de gris, les champs de formulaire portent une bordure visible, et la page est servie sous une politique de sécurité du contenu qui lui interdit d'envoyer vos positions ou votre historique de transactions ailleurs que sur votre propre machine. En dessous, la base tourne en mode WAL : regarder une récupération en direct ne bloquera jamais le moteur qui l'écrit. macOS reçoit l'application à double-clic ; depuis la v0.12.0, Windows s'installe via un véritable assistant d'installation. Mettre à jour l'application de bureau passe par le téléchargement du nouvel installateur — elle ne se remplace jamais elle-même — et votre configuration, votre base et vos identifiants ne sont jamais touchés par une mise à jour. Les builds bureau ne sont pas signés — la note ci-dessous dit exactement ce que votre ordinateur affichera et comment vérifier ce que vous avez téléchargé — et le journal des versions inscrit chaque sortie le jour de sa publication.", + browserBody: "L'application de bureau ouvre keel dans votre navigateur : liste de contrôle au premier lancement, identifiants gardés dans le trousseau du système, données de marché rapatriées en tâche de fond, attestations d'actifs et promotions de règles faites depuis une page plutôt qu'un terminal — une promotion lancée depuis la page n'avance que si la règle franchit le verrou, sans option de contournement, car contourner un verrou exige un terminal. Cette surface de configuration ne peut armer une règle, la promouvoir, attester un actif, libérer des fonds ni rien dépenser. Depuis la v0.15.0, elle peut faire exactement deux choses qui élargissent les capacités de keel — relancer les échanges après le coupe-circuit et lever le blocage pour pertes consécutives du garde-fou 16 — chacune derrière une phrase à saisir, sur une session en boucle locale uniquement, refusée d'emblée si la console est joignable depuis ailleurs que cette machine. L'arrêt, lui, n'est délibérément jamais conditionné à la localité : un opérateur dont le keel est derrière un tunnel doit pouvoir l'arrêter depuis ce tunnel. Tout le reste exige encore une personne devant un terminal. Depuis la v0.12.1, l'interface porte l'identité de ce site lui-même — même papier, même sarcelle, même marque au navire — et depuis la v0.12.2 son en-tête offre un choix clair ou sombre à côté d'un badge nommant le mode en cours ; le badge informe seulement, car changer de mode reste une modification délibérée du fichier de configuration, pas un clic dans une page. Chaque montant arrive en texte, déjà calculé et mis en forme par le moteur — la page affiche des nombres, elle n'en dérive jamais — gain et perte se distinguent par la luminosité autant que par la couleur, donc la distinction survit à un écran en niveaux de gris, les champs de formulaire portent une bordure visible, et la page est servie sous une politique de sécurité du contenu qui lui interdit d'envoyer vos positions ou votre historique de transactions ailleurs que sur votre propre machine. En dessous, la base tourne en mode WAL : regarder une récupération en direct ne bloquera jamais le moteur qui l'écrit. macOS reçoit l'application à double-clic ; depuis la v0.12.0, Windows s'installe via un véritable assistant d'installation. Mettre à jour l'application de bureau passe par le téléchargement du nouvel installateur — elle ne se remplace jamais elle-même — et votre configuration, votre base et vos identifiants ne sont jamais touchés par une mise à jour. Les builds bureau ne sont pas signés — la note ci-dessous dit exactement ce que votre ordinateur affichera et comment vérifier ce que vous avez téléchargé — et le journal des versions inscrit chaque sortie le jour de sa publication.", fromSource: { title: "Depuis les sources — essayez keel en cinq minutes", lead: "Tout ce parcours est en lecture seule et côté papier : aucun fonds, et rien ici ne peut passer d'ordre. Il vous faut uv et une clé d'API Coinbase Developer Platform (CDP) gratuite, en lecture seule — l'historique des bougies passe par le client authentifié, si bien que keel fetch sans clé échoue sur une AuthenticationError. Autant le dire tout de suite, pour que l'étape 4 ne surprenne personne.", From 956dbc97b8e7871c8e575a24a58c3ea63c0f85b3 Mon Sep 17 00:00:00 2001 From: Elmehdi Aitbrahim Date: Thu, 24 Sep 2026 19:39:42 -0400 Subject: [PATCH 2/2] feat(social): wire Telegram channel, X profile, and Organization JSON-LD entity graph (#15) --- src/components/BaseHead.astro | 18 +++++++++++++++++- src/components/Footer.astro | 10 ++++++++++ src/components/pages/NewsPage.astro | 6 ++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/components/BaseHead.astro b/src/components/BaseHead.astro index e01c449..52690f8 100644 --- a/src/components/BaseHead.astro +++ b/src/components/BaseHead.astro @@ -28,6 +28,22 @@ const analyticsToken = import.meta.env.PUBLIC_CF_ANALYTICS_TOKEN; /** Google Search Console verification token (URL-prefix method, #61); the Domain-property TXT method needs no code. Tokens are public by design. */ const gscVerification = import.meta.env.PUBLIC_GSC_VERIFICATION_TOKEN; + +/** Organization JSON-LD graph (#15) — entity graph with sameAs social profiles. */ +const organizationJsonLd = { + "@context": "https://schema.org", + "@type": "Organization", + "name": "keel", + "url": SITE, + "logo": new URL("/og.png", SITE).href, + "sameAs": [ + "https://github.com/CodeGateSoftware", + "https://x.com/keeltrading", + "https://t.me/keeltrading" + ] +}; + +const allJsonLd = [organizationJsonLd, ...jsonLd]; --- @@ -72,7 +88,7 @@ const gscVerification = import.meta.env.PUBLIC_GSC_VERIFICATION_TOKEN; -{jsonLd.map((entry) => ( +{allJsonLd.map((entry) => (