diff --git a/engine-docs.manifest.json b/engine-docs.manifest.json index 9b45987..ffaaef9 100644 --- a/engine-docs.manifest.json +++ b/engine-docs.manifest.json @@ -21,6 +21,15 @@ "section": "reference", "fr": "Le raisonnement Shariah que keel encode, règle par règle, chacun avec sa source dans le dépôt — publié pour être audité et contesté." }, + { + "path": "docs/architecture.md", + "slug": "architecture", + "title": "Software Architecture Record", + "en": "The system as verified, not as imagined — what keel is, the packages it ships in, the choices holding it up, and, issue by issue, what is not built yet.", + "ar": "النظامُ كما جرى التحقّقُ منه، لا كما يُتصوَّر — ما هو كيل، والحزمُ التي يُشحن بها، والقراراتُ الحاملةُ له، وما لم يُبْنَ بعدُ، مسألةً مسألةً.", + "fr": "Le système tel qu'il est vérifié, non tel qu'on l'imagine — ce qu'est keel, les paquets qu'il livre, les choix qui le portent, et, ticket par ticket, ce qui n'est pas encore construit.", + "section": "reference" + }, { "path": "docs/decisions/0001-desktop-update-path.md", "slug": "decision-0001-desktop-update-path", @@ -48,6 +57,15 @@ "section": "decisions", "fr": "L'enquête mesure-d'abord de la couche commands — le rôle de chaque module, et pourquoi « plus grande que le moteur » s'est dissous avant même que l'enquête ne commence." }, + { + "path": "docs/decisions/0004-monetisation-not-now.md", + "slug": "decision-0004-monetisation-not-now", + "title": "Decision 0004: monetisation is not now", + "en": "Why keel does not monetise yet, and why affiliate links are a permanent no rather than a “not yet”: referral revenue would be a direct stake in the same fee schedule keel's credibility depends on assessing without one.", + "ar": "لماذا لا يُحصِّل كيل مالًا الآن، ولماذا روابطُ الإحالة رفضٌ دائمٌ لا «ليس بعد»: فعائدُ الإحالة حصّةٌ مباشرةٌ في جدول الرسوم نفسِه الذي تقوم مصداقيةُ كيل على تقييمه بلا مصلحةٍ فيه.", + "fr": "Pourquoi keel ne se monétise pas maintenant, et pourquoi les liens d'affiliation sont un non définitif plutôt qu'un « pas encore » : un revenu de parrainage serait un intérêt direct dans le barème de frais que la crédibilité de keel repose sur sa capacité à évaluer sans intérêt.", + "section": "decisions" + }, { "path": "docs/desktop-install.md", "slug": "desktop-install", @@ -84,6 +102,15 @@ "section": "reference", "fr": "keel mcp : les huit outils en lecture seule qu'un assistant peut appeler — doctor, capabilities, profiles, orders, veto_log, purification, trials, reports — et la clôture, en six murs, qui les garde en lecture seule." }, + { + "path": "docs/research-toolkit.md", + "slug": "research-toolkit", + "title": "The research toolkit", + "en": "The thirteen evidence modules keel research fronts — each with the question it answers and, to be read just as carefully, the question it refuses to answer.", + "ar": "وحداتُ الأدلّةِ الثلاث عشرة التي يقف عليها أمرُ keel research — كلٌّ منها بالسؤال الذي تجيب عنه، وبالسؤال الذي ترفض الإجابةَ عنه، وهذا الثاني يُقرأ بالعناية نفسِها.", + "fr": "Les treize modules de preuve que keel research met en façade — chacun avec la question à laquelle il répond et, à lire avec autant d'attention, celle à laquelle il refuse de répondre.", + "section": "research" + }, { "path": "docs/experiments/2026-08-13-restated-under-a-production-faithful-engine.md", "slug": "experiment-honest-result-restated", diff --git a/public/get-started/webui-fetch.png b/public/get-started/webui-fetch.png index 9ef9fe4..f0978bb 100644 Binary files a/public/get-started/webui-fetch.png and b/public/get-started/webui-fetch.png differ diff --git a/public/get-started/webui-gates.png b/public/get-started/webui-gates.png index 8ef849d..ddb4522 100644 Binary files a/public/get-started/webui-gates.png and b/public/get-started/webui-gates.png differ diff --git a/public/get-started/webui-insights.png b/public/get-started/webui-insights.png index dd56cd0..3153f2c 100644 Binary files a/public/get-started/webui-insights.png and b/public/get-started/webui-insights.png differ diff --git a/public/get-started/webui-rules.png b/public/get-started/webui-rules.png index 6a58081..ae37a11 100644 Binary files a/public/get-started/webui-rules.png and b/public/get-started/webui-rules.png differ diff --git a/public/get-started/webui-setup.png b/public/get-started/webui-setup.png index 9666d17..bfa26d3 100644 Binary files a/public/get-started/webui-setup.png and b/public/get-started/webui-setup.png differ diff --git a/public/get-started/webui-status.png b/public/get-started/webui-status.png index fd700a3..4cbb161 100644 Binary files a/public/get-started/webui-status.png and b/public/get-started/webui-status.png differ diff --git a/src/components/pages/HomePage.astro b/src/components/pages/HomePage.astro index 16dea5f..64ea362 100644 --- a/src/components/pages/HomePage.astro +++ b/src/components/pages/HomePage.astro @@ -72,6 +72,12 @@ const honestLinks = [ "docs/experiments/2026-08-13-restated-under-a-production-faithful-engine.md", ), }, + { + label: c.honest.costLabel, + href: engineBlobUrl( + "docs/experiments/2026-09-01-per-product-slippage-restatement.md", + ), + }, { label: c.honest.announcementLabel, href: "https://github.com/CodeGateSoftware/keel/discussions/304" }, ]; diff --git a/src/i18n/guides/content.ts b/src/i18n/guides/content.ts index 4d4dfde..959a4c9 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.12.2: the screenshots in + * below was verified against keel v0.13.2: 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: seven views", + title: "Step 4 — Take the tour: eight 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 seven 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; Gates lists every capability-increasing action and what gates it. The eighth 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 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.", ], shot: "/get-started/webui-status.png", shotCaption: - "The console's Status view with the seven-view header: Status, Setup, Activity, 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 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.", }, { title: "Step 5 — Read the dashboard", @@ -205,7 +205,7 @@ export const guides: Guide[] = [ ], shot: "/get-started/webui-gates.png", shotCaption: - "The Gates view: keel autonomy on, keel resume, keel withdrawals attest --enabled and friends — each with what it increases, and the terminal gate (a typed yes at an interactive TTY) it must pass.", + "The Gates view: eight actions — keel autonomy on, keel resume, keel withdrawals attest --enabled, keel scope attest --trading and the rest — each with what it increases, and the terminal gate (a typed yes at an interactive TTY) it must pass.", }, { title: "Step 2 — Screen and attest the allowlist", @@ -230,7 +230,14 @@ export const guides: Guide[] = [ code: "keel withdrawals attest --enabled", }, { - title: "Step 5 — Purification, honestly", + title: "Step 5 — Attest the venue's trade scope (rail 20)", + body: [ + "A credential that reads fine is not evidence it can trade: keel has watched a well-formed key pass every read and still have its first live order refused by the venue. Rail 20 closes that hole by failing closed — until a venue is attested, keel ships unable to place a live entry on it at all. keel scope attest --trading releases that veto, so it demands a typed yes at a terminal; --read-only only ever reduces capability and stays ungated. The record is bound to the credential that earned it, so a rotated key means re-attesting. Like rail 17, this is entries-only — exits are never affected, because an exit must always be able to leave.", + ], + code: "keel scope attest --trading", + }, + { + title: "Step 6 — Purification, honestly", body: [ "keel purification reports non-compliant income owed to charity (KB §65.9) from what actually ran through the engine. Account-level duties no rail can see — disabling USDC rewards on idle balances, chiefly — appear in the checklist as the venue-interest step, and keel will never show that one as done: the venue's API does not expose enrolment, and a green check that verifies nothing turns an open risk into a false assurance. It stays on the operator's checklist, in the operator runbook.", ], diff --git a/src/i18n/guides/explainers.ts b/src/i18n/guides/explainers.ts index f6686f1..3fa77a6 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. In one measurement matrix, 0 of 90 configurations cleared; in another, 0 of 82. Inside the venue's fee-free monthly allowance, the reconstructed rules sit indistinguishably at break-even — a 14.9% win rate against a 14.88% break-even — and one step outside it they are decisively negative.", + "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.", "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: [ @@ -202,7 +202,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "الفرزُ ليس ربحية", paragraphs: [ - "ما يحكمُه الفرزُ هو القبولُ لا النتائج. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة. في إحدى مصفوفات القياس صفرٌ من 90 تهيئة، وفي أخرى صفرٌ من 82. وداخل الحصّة الشهرية المعفاة من الرسوم تقف القواعد المُعاد بناؤها عند نقطة التعادل بلا فرقٍ يُذكر — نسبةُ ربحٍ 14.9٪ مقابل نقطة تعادلٍ عند 14.88٪ — وبخطوةٍ خارجها تصير سالبةً بوضوح.", + "ما يحكمُه الفرزُ هو القبولُ لا النتائج. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة. وقد قيست الآن كلُّ قاعدةِ إشارةٍ يُصدِّرها كيل عند إعداداتها المُصدَّرة على 24 أصلًا: صفرٌ من 120 تهيئةً اجتازت، وصفرٌ من 138 بعدِّ كلِّ مصفوفةٍ أُجريت. وليست الرسومُ كلَّ التكلفة أيضًا — فبتسعير كلِّ أصلٍ على قدر سيولته هو، لا على أرضيةٍ ثابتةٍ لا يبلغها أصل، تنخفض النتائج أكثر.", "فالأصلُ المفروز فرزًا تامًّا إذا تداولته قاعدةٌ خاسرة فقد خسرت. الامتثالُ والأداء محوران مختلفان: الأول يُنفّذه المحرّك، والثاني يُبلَّغ عنه بصدقٍ أولًا.", ], links: [ @@ -250,7 +250,7 @@ export const explainers: Explainer[] = [ { heading: "Rail 17: the test as code", paragraphs: [ - "Rail 17 is the one rail of keel's eighteen that encodes a fiqh ruling as an executable check. 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, 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 eighteen rails (there is no rail 15), only rail 17 encodes fiqh. 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 — risk discipline carrying no religious claim.", + "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.", "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 90 configurations cleared in one measurement matrix, 0 of 82 in another. 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 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.", "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-08-21.1", + rev: "2026-09-02.1", }, ar: { title: "القبضُ الحُكمي في العملات الرقمية الفورية: شرح", @@ -330,7 +330,7 @@ export const explainers: Explainer[] = [ { heading: "السكة 17: الاختبارُ شيفرةً", paragraphs: [ - "السكةُ 17 هي السكةُ الوحيدة من سكك كيل الثماني عشرة التي تُشفّر حكمًا فقهيًّا فحصًا قابلًا للتنفيذ. وميكانيكا الآلية صريحةٌ عمدًا: يوثّق المشغّل قابليةَ السحب لكلِّ منتجٍ عبر keel withdrawals attest. ويُقرأ التوثيقُ قراءةً حيّةً عند كلِّ نيّةِ أمر — لا من جلسة الأمس. وينقضي بعد سبعة أيام، لأنّ التوثيقَ المتقادم لا خيرَ فيه من عدمه: فقابليةٌ أُثبتت الشهرَ الماضي لا تقول شيئًا عن صباح اليوم. وإذا غاب التوثيقُ أو انقضى، رفض الاقتناءُ رفضًا عند الفشل — فالامتناعُ عن القرار هو القرار.", + "السكةُ 17 واحدةٌ من سكّتين اثنتين من سكك كيل العشرين تُشفّران حكمًا فقهيًّا فحصًا قابلًا للتنفيذ — والأخرى هي السكةُ 21 التي ترفض بيعَ ما لا يملكه الحساب. وميكانيكا الآلية صريحةٌ عمدًا: يوثّق المشغّل قابليةَ السحب لكلِّ منتجٍ عبر keel withdrawals attest. ويُقرأ التوثيقُ قراءةً حيّةً عند كلِّ نيّةِ أمر — لا من جلسة الأمس. وينقضي بعد سبعة أيام، لأنّ التوثيقَ المتقادم لا خيرَ فيه من عدمه: فقابليةٌ أُثبتت الشهرَ الماضي لا تقول شيئًا عن صباح اليوم. وإذا غاب التوثيقُ أو انقضى، رفض الاقتناءُ رفضًا عند الفشل — فالامتناعُ عن القرار هو القرار.", "والسكةُ تُنفّذ التوثيق ولا تُنتجه: فأهو قبضٌ صحيحٌ في قراءة مذهبك؟ سؤالُ توثيقك أنت. السكةُ ترفض فقط أن يواصل المحرّكُ شراءَ ما لم يُثبت أحدٌ القدرةَ على سحبه.", ], }, @@ -358,7 +358,7 @@ export const explainers: Explainer[] = [ { heading: "بقيةُ السكك، للمقارنة", paragraphs: [ - "تتّضح فرادةُ السكة 17 بجوار جيرانها. فمن سكك كيل الثماني عشرة (ولا وجودَ لسكة 15) لا تُشفّر الفقهَ إلا السكةُ 17 وحدها. أما السكك 1 و18 و19 فتُنفّذ ما يُدخله الفرزُ والميثاق: قائمةَ السماح ذاتها، وحصرَ التسوية في العملات التي ضبطها المشغّل، واشتراطَ أن يكون معرّفُ كلِّ منتجٍ زوجًا فوريًّا سليمَ البنية. وبقيّتُها احترازية — سقوفُ إنفاق، وقواطعُ تراجُع، وحدودُ تعرُّض — انضباطُ مخاطر لا يحمل دعوى دينية.", + "تتّضح فرادةُ السكة 17 بجوار جيرانها. فمن سكك كيل العشرين (المرقَّمة من 1 إلى 14 ومن 16 إلى 21، ولا وجودَ لسكة 15) لا تُشفّر الفقهَ إلا سكّتان: السكةُ 17، والسكةُ 21 التي ترفض بيعَ أصلٍ تُفيد المنصّةُ أنّ الحساب لا يملكه — وهو بيعُ ما لا تملك. وتبقى السكةُ 17 وحدَها ما يُشفّر القبض. أما السكك 1 و18 و19 فتُنفّذ ما يُدخله الفرزُ والميثاق: قائمةَ السماح ذاتها، وحصرَ التسوية في العملات التي ضبطها المشغّل، واشتراطَ أن يكون معرّفُ كلِّ منتجٍ زوجًا فوريًّا سليمَ البنية. وبقيّتُها احترازية — سقوفُ إنفاق، وقواطعُ تراجُع، وحدودُ تعرُّض، ورفضُ السكة 20 لاعتماد منصّةٍ لم يوثّق أحدٌ صلاحيتَه للتداول — انضباطُ مخاطر وتشغيل لا يحمل دعوى دينية.", "والمضمونُ الفقهي وراء ميثاق «الفوري فقط» حقيقي: فما يجعل المراهنةَ ميسرًا، كما يقيّد الأساسُ عن §65.6، هو عدمُ الملكية أو عدمُ التسليم أو التسويةُ على الفروق — لا التكرار، ولا المراهنةَ على تغيّر الأسعار ذاتها. لكنّ السكك التي تُنفّذ الاقتصار على الفوري هي ميثاقُ الوكيل، مسوَّغٌ بالقياس ومُتحقَّقٌ منه فعليًّا مقابل إدراجات المنصّة الحقيقية — ولذلك لا يحتاج تسويغُها إلى تجاوزٍ في الدين أصلًا.", ], }, @@ -366,7 +366,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "القبضُ ليس ربحية", paragraphs: [ - "تحمي السكةُ 17 صحةَ الاقتناء، لا مآلَ التداول. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة؛ صفرٌ من 90 تهيئةً في إحدى مصفوفات القياس، وصفرٌ من 82 في أخرى. فتنفيذٌ مستوفٍ للقبض على أصلٍ مفروزٍ فرزًا تامًّا قد يظلُّ صفقةً خاسرة — المحوران مستقلّان، وكلاهما يُبلَّغ عنه.", + "تحمي السكةُ 17 صحةَ الاقتناء، لا مآلَ التداول. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase — نحو 1.2٪ لكلِّ طرفٍ من الصفقة؛ صفرٌ من 120 تهيئةً اجتازت عبر كلِّ قاعدةِ إشارةٍ يُصدِّرها كيل، وصفرٌ من 138 بعدِّ كلِّ مصفوفةٍ أُجريت. فتنفيذٌ مستوفٍ للقبض على أصلٍ مفروزٍ فرزًا تامًّا قد يظلُّ صفقةً خاسرة — المحوران مستقلّان، وكلاهما يُبلَّغ عنه.", "وهذا ليس تنبيهًا لُصق بقصة الامتثال من خارجها؛ بل هو الصدقُ نفسُه مطبَّقًا على الأرقام بدل الأحكام. فالنتيجةُ الصادقة موصولةٌ من أول شاشةٍ في المستودع، ولا تطلب من أحدٍ أن يوافق عليها — السكةُ والتقرير شطران لوضعٍ واحد.", ], links: [ @@ -377,8 +377,8 @@ export const explainers: Explainer[] = [ }, footnote: "كيل ليس محرّك فتاوى، وهذه المقالة ليست فتوى ولا نصيحةً مالية. أمّا كيف يُدخل الفرزُ الأصولَ أصلًا فموضوعُ «كيف يعمل الفرزُ الشرعي للعملات الرقمية فعلًا» — وحدُّ الحوكمة موضوعُ «التوثيقُ ليس فتوى».", - rev: "2026-08-21.1", - translatedFromRev: "2026-08-21.1", + rev: "2026-09-02.1", + translatedFromRev: "2026-09-02.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 eighteen 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 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, 0 of 90 configurations cleared in one measurement matrix and 0 of 82 in another, and inside the venue's fee-free monthly allowance the reconstructed rules sit at break-even — a 14.9% win rate against a 14.88% break-even. 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 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.", "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-08-21.1", + rev: "2026-09-02.1", }, ar: { title: "التوثيقُ ليس فتوى", @@ -528,7 +528,7 @@ export const explainers: Explainer[] = [ { heading: "ما ليس هو الحدُّ", paragraphs: [ - "الحدُّ ليس تراخيًا في الإنفاذ. فكلُّ ما يُوثَّق يُنفَّذ تنفيذًا حتميًّا: تمرُّ كلُّ نيّةِ أمرٍ عبر ثماني عشرة سكةً لا تُتجاوز، والأصلُ الذي لا توثيقَ له لا يتداول أبدًا — فحيادُ الآلة في الأحكام يقترن بصرامتها التامة في تنفيذها. وامتناعُها عن أن تكون مفتيًا لا يجعلها محرّكَ إنفاذٍ أخفّ؛ بل يجعل الإنفاذَ منسوبًا إلى مصدره.", + "الحدُّ ليس تراخيًا في الإنفاذ. فكلُّ ما يُوثَّق يُنفَّذ تنفيذًا حتميًّا: تمرُّ كلُّ نيّةِ أمرٍ عبر عشرين سكةً لا تُتجاوز، والأصلُ الذي لا توثيقَ له لا يتداول أبدًا — فحيادُ الآلة في الأحكام يقترن بصرامتها التامة في تنفيذها. وامتناعُها عن أن تكون مفتيًا لا يجعلها محرّكَ إنفاذٍ أخفّ؛ بل يجعل الإنفاذَ منسوبًا إلى مصدره.", "وليس الحدُّ تحفّظًا لُصق لغرض المسؤولية القانونية. هو الآليةُ التي تجعل المحرّك قابلًا للتدقيق أصلًا: فما دام كلُّ حكمٍ منفَّذ يرجع إلى سجلٍّ ذي مصدرٍ واسم، فلكلامُ المعترض موضعٌ يهبط فيه — قاعدةُ بياناتك أنت — بدل صندوقٍ مغلقٍ لا خيار لك فيه إلا القبول أو الترك. وعبارةُ كيل الموجزة التي تعِدُّها لمراجعيها المحتملين تقولها بوضوح: تصنيفاتٌ موثَّقة لا مستنبَطة، ومنفَّذةٌ تنفيذًا حتميًّا. فالشقّان الأولان هما الحدُّ، والثالث هو المنتج — ولا ثالثَ غيره يُوعد به أحد.", ], }, @@ -542,7 +542,7 @@ export const explainers: Explainer[] = [ honestBox: { title: "الحدُّ يمتدُّ إلى النتائج", paragraphs: [ - "لن توافقَ المراجعةُ على الأداء — ولا شيءٌ في هذا الموقع يطلب منك ذلك أصلًا. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase: نحو 1.2٪ لكلِّ طرفٍ من الصفقة، وصفرٌ من 90 تهيئةً في إحدى مصفوفات القياس وصفرٌ من 82 في أخرى؛ وداخل الحصّة الشهرية المعفاة من الرسوم تقف القواعد المُعاد بناؤها عند نقطة التعادل — نسبةُ ربحٍ 14.9٪ مقابل نقطة تعادلٍ عند 14.88٪. الإنفاذُ والصدق منتجان منفصلان — وكيل تشحنهما معًا.", + "لن توافقَ المراجعةُ على الأداء — ولا شيءٌ في هذا الموقع يطلب منك ذلك أصلًا. فلا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ المدفوعة فعليًّا على منصّة Coinbase: نحو 1.2٪ لكلِّ طرفٍ من الصفقة، وصفرٌ من 120 تهيئةً اجتازت عبر كلِّ قاعدةِ إشارةٍ يُصدِّرها كيل. وكان هذا الموقع يضيف أنّ القواعد تلامس نقطة التعادل داخل الحصّة المعفاة من الرسوم؛ وتلك الدعوى كانت مُسعَّرةً عند أرضيةِ انزلاقٍ لا يبلغها أيُّ أصل، وقد سُحبت. الإنفاذُ والصدق منتجان منفصلان — وكيل تشحنهما معًا.", "والامتناعُ يجري في الاتجاهين معًا: فالمحرّك لا يُصدر أحكامَك، ولا يطلب منك أن توافق على أرقامه. وضعٌ واحدٌ باتجاهين اثنين — إنفاذٌ أمينٌ لما توثّقه، وصدقٌ كاملٌ فيما يقيسه.", ], links: [ @@ -553,8 +553,8 @@ export const explainers: Explainer[] = [ }, footnote: "كيل ليس محرّك فتاوى، وهذه المقالة ليست فتوى ولا نصيحةً مالية. أمّا كيف تُدخل الأصولُ أصلًا فموضوعُ «كيف يعمل الفرزُ الشرعي للعملات الرقمية فعلًا» — والقبضُ موضوعُ «القبضُ الحُكمي في العملات الرقمية الفورية».", - rev: "2026-08-21.1", - translatedFromRev: "2026-08-21.1", + rev: "2026-09-02.1", + translatedFromRev: "2026-09-02.1", }, }, ]; diff --git a/src/i18n/pages/compare.ts b/src/i18n/pages/compare.ts index 0224799..95dccc7 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-08-21.1"; +const REV = "2026-09-02.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 + 18 rails no order can skip (including qabd)", - ar: "فرزٌ موثَّق يرفض عند الفشل + 18 سكةَ أمانٍ لا تُتجاوَز (منها القبض الحُكمي)", - fr: "Filtrage attesté qui bloque par défaut + 18 garde-fous incontournables (dont le qabd)", + 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)", }, NOT_BUILT_IN, NOT_BUILT_IN, diff --git a/src/i18n/pages/features.ts b/src/i18n/pages/features.ts index c4391c9..b508085 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-08-28.1", + rev: "2026-09-05.1", title: "Shariah Compliance Engine Features — keel", description: - "Attested screening that fails closed, 18 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, 20 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 — eighteen checks no order can skip", - body: "Deterministic guards that nothing can override, not even autonomy mode:", + 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:", 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", @@ -53,10 +53,17 @@ export const features: LocalizedPage = { "Rail 14 — venue subscription/withdrawal attestations: live BUYs are refused until the operator attests", "Rail 17 — §65.4 qabd: withdrawal capability is attested and enforced, because an asset that cannot be withdrawn may not have been validly possessed", "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", "A rail veto names the rail that fired and the command that clears it", ], verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, }, + { + title: "Trade scope — the venue gets to falsify what the operator attested", + body: "A credential that reads cleanly is not evidence it can trade. A well-formed key whose every read succeeded still had its first live order refused: You do not have permission to perform this action. So the operator's claim that a venue's key may place live entries is now a record the venue itself can overturn — keel scope attest writes the operator's half, a refusal from the venue overwrites it, and the record is bound to the fingerprint of the credential that earned it, so swapping the key does not inherit the old key's permission. Rail 20 reads that record and vetoes live entries for as long as it says no. Exits are deliberately untouched, because an exit must always be able to leave.", + verify: { label: "commands/scope.py", path: "keel/commands/scope.py" }, + }, { title: "Strategy gates — candidate → paper → live", body: "A rule must walk three stages before it can touch live money. Promotion clears a two-part gate: performance floors, and an overfitting check (PBO/CSCV). The 100-trade sample floor can be met by the rule's own backtest, or pooled across products in paper. Pooling requires at least five products contributing ten trades each, because a pool of correlated samples overstates its own power.", @@ -64,9 +71,19 @@ export const features: LocalizedPage = { }, { title: "Honest measurement, against DCA", - body: "keel simulate replays the real rules over fetched history, compares against a simple DCA benchmark, and writes a GO-LIVE / TRAIN-MORE report naming every gate and its numbers. The backtester prices per-product slippage scaled from each asset's real liquidity, from 5 to 50 basis points, so results cannot be flattered by thin order books. On the default rules it will very likely tell you TRAIN-MORE. That is the engine working, not broken.", + body: "keel simulate replays the real rules over fetched history, compares against a simple DCA benchmark, and writes a GO-LIVE / TRAIN-MORE report naming every gate and its numbers. The backtester prices slippage per product, scaled from each asset's own liquidity — from 5 basis points at the most liquid end up to 183.8, the rate the thinnest name in the measured universe pays — so a result cannot be flattered by a thin order book. Measured across that universe, not one of the 24 assets reaches the 5bp floor. The report states which pass used which rate, because the edge table prices per product while the account pass and the DCA benchmark are still flat. On the default rules it will very likely tell you TRAIN-MORE. That is the engine working, not broken.", verify: { label: "the experiment record", path: "docs/experiments", kind: "tree" }, }, + { + title: "The order ledger records the book keel was actually filled against", + body: "The orders table had been written since the beginning with no surface reading it, so \"what did keel buy and sell, and at what price\" was answerable only by opening SQLite by hand. It is a service now: keel orders renders the report, and the local web console projects that same report rather than recomputing it, so the two front ends cannot drift apart. Each order carries the venue's own top of book at the moment of submission, stored as the bid and the ask rather than as a single spread number — a spread computed and then stored loses the two numbers it came from. At this deployment's order sizes the spread is very nearly the whole cost, so it is now recorded as evidence instead of reconstructed afterwards.", + 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.", + verify: { label: "commands/research.py", path: "keel/commands/research.py" }, + }, { title: "Three deployment profiles that share nothing", body: "Daily paper, live, and an hourly evidence profile (paper-hourly) — each with its own database and config. The hourly profile exists because the daily clock measures only 2.15 signals per asset-year, which puts a 100-trade review 31 to 84 years away. The same rules on ONE_HOUR bars fire 49.4 signals per asset-year, about 940 entry signals a year once pooled. That moves a forward-evidence review to weeks instead of decades. The hourly profile is measured net negative too: it exists to collect admissible forward evidence, not profit.", @@ -74,7 +91,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, about 3,000 tests, runs against both.", + 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.", verify: { label: "packages/", path: "packages", kind: "tree" }, }, { @@ -119,11 +136,11 @@ export const features: LocalizedPage = { }, ar: { - rev: "2026-08-28.1", - translatedFromRev: "2026-08-28.1", + rev: "2026-09-05.1", + translatedFromRev: "2026-09-05.1", title: "خصائص محرّك الامتثال الشرعي — كيل", description: - "فرزٌ موثَّق يرفض عند الفشل، و18 سكةَ أمانٍ لا تُتجاوَز، وبواباتُ ترقيةٍ تفحص الإفراط في المُلاءمة، وقياسٌ صادقٌ مقابل مؤشّر DCA، وتنفيذٌ تُحصَّن فيه صحةُ الأوامر — وكلُّ خاصيةٍ تشير إلى مصدرها في الشيفرة.", + "فرزٌ موثَّق يرفض عند الفشل، و20 سكةَ أمانٍ لا تُتجاوَز، وبواباتُ ترقيةٍ تفحص الإفراط في المُلاءمة، وقياسٌ صادقٌ مقابل مؤشّر DCA، وتنفيذٌ تُحصَّن فيه صحةُ الأوامر — وكلُّ خاصيةٍ تشير إلى مصدرها في الشيفرة.", intro: "لا تصف هذه الصفحة إلا ما يستطيع مستودعُ المحرّك إظهارَه. وكلُّ قسمٍ يرتبط بالمصدر الذي يُثبته — فإن انحرفت دعوى يومًا عن الشيفرة، فالرابط هو سبيلك إلى الإمساك بنا.", verifyNote: "تحقّق في المستودع", @@ -134,8 +151,8 @@ export const features: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "سكك الأمان — ثمانية عشر فحصًا لا يتجاوزها أيُّ أمر", - body: "ضوابطُ حتميةٌ لا يتجاوزها شيء، ولا حتى وضعُ الاستقلالية:", + title: "سكك الأمان — عشرون فحصًا لا يتجاوزها أيُّ أمر", + body: "ضوابطُ حتميةٌ لا يتجاوزها شيء، ولا حتى وضعُ الاستقلالية. وهي عشرون، مرقَّمةٌ من 1 إلى 14 ومن 16 إلى 21، إذ أُلغيت السكةُ 15 ولم يُعَد استعمالُ رقمها:", points: [ "قائمةُ الأصول الحلال المسموح بها، وسقوفُ الإنفاق للأمر الواحد ولليوم، وسقوفُ التعرُّض والتركيز", "تحجيمٌ يراعي الارتباط، وحدٌّ أدنى لحركة السعر، ومنعُ المارتينغال ومنعُ توسيع وقف الخسارة", @@ -144,10 +161,17 @@ export const features: LocalizedPage = { "السكة 14 — توثيقُ الاشتراك في المنصّة وقابليةِ السحب منها: تُرفض أوامرُ الشراء الحيّة حتى يوثّق المشغّل", "السكة 17 — القبض الحُكمي §65.4: تُوثَّق قابليةُ السحب وتُنفَّذ، لأن الأصل الذي لا يمكن سحبُه قد لا يكون قد قُبِض قبضًا صحيحًا", "بوابةُ دخولٍ بحدٍّ أقصى لفارق السعر: ترفض الشراء الحيّ عند 50 نقطة أساسٍ أو أكثر، وترفض كذلك عند تعذُّر قراءة دفتر الأوامر", + "السكة 20 — نطاقُ التداول: نجاحُ القراءة بمفتاحٍ ما ليس دليلًا على أنه يستطيع التداول، فيُرفض كلُّ دخولٍ حيٍّ حتى تؤكّد المنصّةُ نفسُها أنّ هذا المفتاح يجوز له وضعُ أمرِ دخول", + "السكة 21 — رصيدُ الأصل: يُرفض البيعُ إذا أفادت المنصّةُ صراحةً بعدم وجود رصيد، ويُمرَّر عمدًا إذا كان الرصيدُ مجهولًا لا غير، لأنّ منعَ الخروج يحبس مركزًا أراد الخروج", "رفضُ السكة يسمّي نفسه ويسمّي الأمرَ الذي يرفعه", ], verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, }, + { + title: "نطاقُ التداول — المنصّةُ نفسُها تستطيع تكذيبَ ما وثّقه المشغّل", + body: "نجاحُ القراءة بمفتاحٍ ما ليس دليلًا على أنه يستطيع التداول: مفتاحٌ سليمُ الصياغة نجحت به كلُّ قراءة، ثم رُفض أولُ أمرٍ حيٍّ به بعبارة «ليست لديك صلاحيةُ القيام بهذا الإجراء». فصار ادّعاءُ المشغّل أنّ مفتاح المنصّة يجوز له وضعُ أوامر دخولٍ حيّةٍ سجلًّا تستطيع المنصّةُ نفسُها نقضَه — الأمرُ keel scope attest يكتب نصيبَ المشغّل، ورفضُ المنصّة يمحوه، والسجلُّ مربوطٌ ببصمة المفتاح الذي كسبه، فلا يرث مفتاحٌ جديدٌ إذنَ سابقِه. وتقرأ السكةُ 20 هذا السجلَّ فترفض الدخولَ الحيَّ ما دام يقول لا. أمّا الخروجُ فلا يُمَسّ عمدًا، إذ يجب أن يبقى الخروجُ ممكنًا دائمًا.", + verify: { label: "commands/scope.py", path: "keel/commands/scope.py" }, + }, { title: "بوابات الاستراتيجية — مرشَّحة ← تجريبية ← حيّة", body: "على القاعدة أن تجتاز ثلاث مراحل قبل أن تلمس مالًا حقيقيًّا. ولا تُرقَّى إلا باجتياز بوابةٍ من شقّين: حدودٌ دنيا للأداء، وفحصٌ للإفراط في المُلاءمة (PBO/CSCV). ويجوز بلوغُ الحدّ الأدنى البالغ مائة صفقة بالاختبار الرجعي للقاعدة نفسها، أو بتجميع صفقات الوسائط نفسها عبر منتجاتٍ متعدّدةٍ في التداول التجريبي — بشرط أن يُسهم خمسةُ منتجاتٍ على الأقل بعشر صفقاتٍ لكلٍّ منها، لأن تجميع عيّناتٍ مترابطةٍ يُبالغ في تقدير قوّتها الإحصائية.", @@ -155,9 +179,19 @@ export const features: LocalizedPage = { }, { title: "قياسٌ صادق، مقابل الشراء الدوري المنتظم", - body: "يعيد الأمر keel simulate تشغيلَ القواعد الحقيقية على التاريخ المجلوب، ويقارنها بمؤشّرٍ مرجعيٍّ بسيطٍ هو الشراء الدوري المنتظم (DCA)، ويكتب تقرير GO-LIVE أو TRAIN-MORE مسمّيًا كلَّ بوابةٍ وأرقامَها. ويُسعّر المحرّك الرجعي الانزلاقَ لكلِّ منتجٍ على قدر سيولته الفعلية (5–50 نقطة أساس)، فلا يمكن تجميلُ النتائج بدفاترِ أوامرَ ضعيفةِ السيولة. وعلى القواعد الافتراضية سيقول لك على الأرجح TRAIN-MORE — وهذا دليلُ عمل المحرّك لا دليلُ عطبه.", + body: "يعيد الأمر keel simulate تشغيلَ القواعد الحقيقية على التاريخ المجلوب، ويقارنها بمؤشّرٍ مرجعيٍّ بسيطٍ هو الشراء الدوري المنتظم (DCA)، ويكتب تقرير GO-LIVE أو TRAIN-MORE مسمّيًا كلَّ بوابةٍ وأرقامَها. ويُسعّر المحرّك الرجعي الانزلاقَ لكلِّ منتجٍ على قدر سيولته هو — من 5 نقاط أساسٍ عند أعلى السيولة إلى 183.8، وهو ما يدفعه أرقُّ الأصول في الكون المقيس — فلا يمكن تجميلُ نتيجةٍ بدفترِ أوامرَ ضعيفِ السيولة. وبالقياس على ذلك الكون، لا يبلغ أرضيةَ الخمس نقاطٍ ولا أصلٌ واحدٌ من الأربعة والعشرين. ويذكر التقريرُ أيَّ تمريرةٍ استعملت أيَّ سعر، لأنّ جدول الأفضلية يُسعَّر لكلِّ منتج بينما تمريرةُ الحساب والمؤشّرُ المرجعي ما يزالان بسعرٍ ثابت. وعلى القواعد الافتراضية سيقول لك على الأرجح TRAIN-MORE — وهذا دليلُ عمل المحرّك لا دليلُ عطبه.", verify: { label: "سجلّ التجارب", path: "docs/experiments", kind: "tree" }, }, + { + title: "سجلُّ الأوامر يقيّد دفترَ السوق الذي نُفِّذ عليه الأمرُ فعلًا", + body: "كان جدولُ الأوامر يُكتَب منذ البداية ولا واجهةَ تقرؤه، فكان سؤالُ «ماذا اشترى كيل وباع، وبأيّ سعر» لا يُجاب إلا بفتح قاعدة البيانات يدويًّا. صار الآن خدمةً: الأمرُ keel orders يعرض التقرير، وتعرض لوحةُ الويب المحليّة التقريرَ نفسَه بدل إعادة حسابه، فلا تفترق الواجهتان. ويحمل كلُّ أمرٍ أعلى دفترِ المنصّة لحظةَ الإرسال، محفوظًا عرضًا وطلبًا لا رقمَ فارقٍ واحدًا — فالفارقُ إذا حُسب ثمّ خُزّن ضاع الرقمان اللذان جاء منهما. وعند أحجام هذا النشر يكاد الفارقُ يكون التكلفةَ كلَّها، فسُجّل دليلًا بدل أن يُعاد بناؤه لاحقًا.", + verify: { label: "commands/orders.py", path: "keel/commands/orders.py" }, + }, + { + title: "keel research — بابٌ واحدٌ على ثلاث عشرة وحدةَ أدلّة", + body: "كانت عُدّةُ الأدلّة ثلاثَ عشرة وحدةً بلا موضعٍ واحدٍ يقول ذلك؛ وستٌّ منها لا تُبلَغ إلا بقراءة الشيفرة. والآن يسمّي الأمرُ keel research index الثلاثَ عشرةَ جميعًا — ما تجيب عنه كلُّ وحدة، وما لا تستطيع الإجابةَ عنه، والأمرُ الذي يشغّلها. ولا يضيف إحصاءً من عنده: فالخمسُ التي كان لها موضعٌ تحت keel trials مُسجَّلةٌ مرّةً ثانيةً بوصفها الكائناتِ نفسَها لا نسخًا عنها، لأنّ بابًا يعيد التنفيذَ يفترق عن أصله لحظةَ يُصلَح أحدُ النسختين دون الأخرى. وعمودُ «ما لا تستطيع الإجابةَ عنه» يُقرأ بالعناية نفسِها التي يُقرأ بها الآخر.", + verify: { label: "commands/research.py", path: "keel/commands/research.py" }, + }, { title: "ثلاثة أنماط نشرٍ لا يتقاسم أيٌّ منها شيئًا", body: "نمطٌ يوميٌّ تجريبي، ونمطٌ حيّ، ونمطٌ ساعيٌّ لجمع الأدلة (paper-hourly) — لكلٍّ منها قاعدةُ بياناته وإعداداته. ووُجد النمطُ الساعي لأن المؤقّت اليومي يقيس 2.15 إشارةً لكل أصلٍ في السنة (أي إنّ مراجعة المائة صفقة تبعد ما بين 31 و84 سنة)، بينما تُطلق القواعد نفسها على شموع الساعة 49.4 إشارة — أي نحو 940 إشارة دخولٍ سنويًّا بعد التجميع، فتصير مراجعةُ الأدلة الأمامية على بُعد أسابيع بدل عقود. وهو مقيسٌ بخسارةٍ صافيةٍ أيضًا: فقد وُجد لجمع أدلةٍ أماميةٍ مقبولة، لا للربح.", @@ -165,7 +199,7 @@ export const features: LocalizedPage = { }, { title: "منفذُ وسطاءٍ، لا ارتهانٌ لوسيط", - body: "تُنفّذ المحوّلات عقدًا واحدًا — منفذ keel-broker-api — وتُسجَّل تحت نقطة الدخول keel.brokers. ومحوّل Coinbase Advanced Trade هو المحوّل المرجعي؛ ويُسلَّم Robinhood منصّةً اختياريةً غيرَ موصولةٍ عمدًا؛ وانضمّ محوّل Alpaca في الإصدار v0.10.0. وثمّة منصّةٌ وهميةٌ متعمَّدةُ الاختلاف تُبقي المنفذ أمينًا: إذ تعمل حزمةُ اختبارات المطابقة (نحو 3,000 اختبار) على الاثنتين معًا.", + body: "تُنفّذ المحوّلات عقدًا واحدًا — منفذ keel-broker-api — وتُسجَّل تحت نقطة الدخول keel.brokers. ومحوّل Coinbase Advanced Trade هو المحوّل المرجعي؛ ويُسلَّم Robinhood منصّةً اختياريةً غيرَ موصولةٍ عمدًا؛ وانضمّ محوّل Alpaca في الإصدار v0.10.0. وثمّة منصّةٌ وهميةٌ متعمَّدةُ الاختلاف تُبقي المنفذ أمينًا: إذ تعمل حزمةُ اختبارات المطابقة على الاثنتين معًا، ضمن حزمةِ اختباراتٍ تناهز 5,000 اختبار.", verify: { label: "packages/", path: "packages", kind: "tree" }, }, { @@ -210,11 +244,11 @@ export const features: LocalizedPage = { }, fr: { - rev: "2026-08-28.1", - translatedFromRev: "2026-08-28.1", + rev: "2026-09-05.1", + translatedFromRev: "2026-09-05.1", title: "Fonctionnalités du moteur de conformité — keel", description: - "Un filtrage attesté qui bloque par défaut, dix-huit 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 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", @@ -225,8 +259,8 @@ export const features: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "Les garde-fous (rails) — dix-huit 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 :", + 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é :", 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", @@ -235,10 +269,17 @@ export const features: LocalizedPage = { "Garde-fou 14 — attestations d'abonnement et de retrait sur la plateforme : tout achat réel est refusé tant que l'opérateur n'a pas attesté", "Garde-fou 17 — qabd §65.4 : la capacité de retrait est attestée puis appliquée, au motif qu'un actif impossible à retirer n'a peut-être jamais été valablement possédé", "Un plafond d'écart (spread) à l'entrée, qui refuse tout achat réel à partir de 50 points de base et bloque d'office si le carnet est illisible", + "Garde-fou 20 — périmètre de négociation : une clé qui lit correctement ne prouve pas qu'elle peut négocier ; toute entrée réelle est refusée tant que la plateforme elle-même n'a pas confirmé que cette clé peut en placer une", + "Garde-fou 21 — solde de l'actif : une vente est refusée lorsque la plateforme signale explicitement l'absence de solde, et délibérément laissée passer lorsque le solde est simplement inconnu, car bloquer une sortie enferme une position qui voulait sortir", "Tout veto d'un garde-fou se nomme et indique la commande qui le lève", ], verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, }, + { + title: "Périmètre de négociation — c'est la plateforme qui peut démentir l'attestation de l'opérateur", + body: "Une clé qui lit correctement ne prouve pas qu'elle peut négocier : une clé bien formée, dont toutes les lectures aboutissaient, s'est vu refuser son premier ordre réel — « vous n'avez pas la permission d'effectuer cette action ». L'affirmation de l'opérateur selon laquelle la clé d'une plateforme peut placer des entrées réelles est donc devenue un enregistrement que la plateforme elle-même peut renverser : keel scope attest écrit la moitié de l'opérateur, un refus de la plateforme l'écrase, et l'enregistrement est lié à l'empreinte de la clé qui l'a obtenu — changer de clé n'hérite donc pas de l'autorisation de l'ancienne. Le garde-fou 20 lit cet enregistrement et refuse les entrées réelles tant qu'il dit non. Les sorties restent délibérément intactes, car une sortie doit toujours pouvoir partir.", + verify: { label: "commands/scope.py", path: "keel/commands/scope.py" }, + }, { title: "Verrous de stratégie — candidate → papier → réel", body: "Une règle doit franchir trois étapes avant de toucher de l'argent réel. La promotion passe par un verrou en deux volets : des seuils de performance et un contrôle de surapprentissage (PBO/CSCV). Le seuil de 100 transactions peut être atteint par le backtest de la règle, ou en mutualisant le même jeu de paramètres sur d'autres produits en papier — à condition qu'au moins cinq produits y contribuent pour dix transactions chacun, car un ensemble d'échantillons corrélés surestime sa propre puissance.", @@ -246,9 +287,19 @@ export const features: LocalizedPage = { }, { title: "Mesure honnête, face au DCA", - body: "keel simulate rejoue les vraies règles sur l'historique récupéré, les compare à la référence DCA et rédige un rapport GO-LIVE / TRAIN-MORE qui nomme chaque verrou et ses chiffres. Le backtesteur applique à chaque produit un glissement calibré sur sa liquidité réelle (5 à 50 points de base), afin qu'aucun résultat ne puisse être flatté par un carnet d'ordres peu liquide. Sur les règles par défaut, il vous répondra très probablement TRAIN-MORE : c'est le moteur qui fonctionne, pas une panne.", + body: "keel simulate rejoue les vraies règles sur l'historique récupéré, les compare à la référence DCA et rédige un rapport GO-LIVE / TRAIN-MORE qui nomme chaque verrou et ses chiffres. Le backtesteur applique à chaque produit un glissement calibré sur sa propre liquidité — de 5 points de base à l'extrémité la plus liquide jusqu'à 183,8, le taux que paie le nom le plus étroit de l'univers mesuré — afin qu'aucun résultat ne puisse être flatté par un carnet d'ordres peu liquide. Sur cet univers, pas un seul des 24 actifs n'atteint le plancher de 5 points de base. Le rapport indique quelle passe emploie quel taux, car le tableau d'avantage est tarifé par produit tandis que la passe de compte et la référence DCA restent à taux fixe. Sur les règles par défaut, il vous répondra très probablement TRAIN-MORE : c'est le moteur qui fonctionne, pas une panne.", verify: { label: "le registre des expériences", path: "docs/experiments", kind: "tree" }, }, + { + title: "Le registre des ordres consigne le carnet sur lequel keel a réellement été exécuté", + body: "La table des ordres était écrite depuis le début sans qu'aucune surface ne la lise : « qu'a acheté et vendu keel, et à quel prix » n'avait de réponse qu'en ouvrant SQLite à la main. C'est un service désormais : keel orders affiche le rapport, et la console web locale projette ce même rapport au lieu de le recalculer, de sorte que les deux interfaces ne peuvent pas diverger. Chaque ordre porte le haut du carnet de la plateforme au moment de la soumission, conservé comme la paire achat/vente et non comme un unique chiffre d'écart — un écart calculé puis stocké perd les deux nombres dont il provient. Aux tailles d'ordre de ce déploiement, l'écart constitue presque tout le coût : il est donc consigné comme preuve plutôt que reconstruit après coup.", + verify: { label: "commands/orders.py", path: "keel/commands/orders.py" }, + }, + { + title: "keel research — une porte d'entrée unique sur treize modules de preuve", + body: "La boîte à outils comptait treize modules et aucun endroit ne le disait ; six d'entre eux n'étaient atteignables qu'en lisant le code. keel research index les nomme désormais tous les treize — ce à quoi chacun répond, ce à quoi il ne peut pas répondre, et la commande qui l'exécute. Il n'ajoute aucune statistique propre : les cinq qui avaient déjà leur place sous keel trials y sont enregistrés une seconde fois comme les mêmes objets de commande, jamais des copies, car une porte d'entrée qui réimplémente diverge dès que l'une des copies reçoit un correctif que l'autre n'a pas. La colonne « ne peut pas répondre » est à lire avec autant d'attention que l'autre.", + verify: { label: "commands/research.py", path: "keel/commands/research.py" }, + }, { title: "Trois profils de déploiement qui ne partagent rien", body: "Papier quotidien, réel, et un profil horaire de collecte de preuves (paper-hourly) — chacun avec sa propre base de données et sa propre configuration. Le profil horaire existe parce que l'horloge quotidienne ne mesure que 2,15 signaux par actif et par an : à ce rythme, il faudrait de 31 à 84 ans pour réunir les 100 transactions d'une revue. Les mêmes règles sur des bougies ONE_HOUR en déclenchent 49,4 — environ 940 signaux d'entrée par an une fois mutualisés — ce qui ramène cette revue à quelques semaines au lieu de quelques décennies. Lui aussi est mesuré perdant : il existe pour collecter des preuves recevables, pas du profit.", @@ -256,7 +307,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é (~3 000 tests) s'exécute sur les deux.", + 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.", verify: { label: "packages/", path: "packages", kind: "tree" }, }, { diff --git a/src/i18n/pages/home.ts b/src/i18n/pages/home.ts index ed49752..677e0e8 100644 --- a/src/i18n/pages/home.ts +++ b/src/i18n/pages/home.ts @@ -39,6 +39,8 @@ export interface HomeContent { summaryBadgeFr?: string; body: string[]; experimentLabel: string; + /** The per-product cost restatement — the record behind the slippage paragraph. */ + costLabel: string; announcementLabel: string; }; verifyNote: string; @@ -55,7 +57,7 @@ export interface HomeContent { export const home: LocalizedPage = { en: { - rev: "2026-08-28.2", + rev: "2026-09-05.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.", @@ -67,12 +69,15 @@ export const home: LocalizedPage = { honest: { title: "The honest result, stated first", summaryBadge: - "In plain words: after the platform fees actually paid, none of keel's shipped rules is profitable and none beats simple dollar-cost averaging (DCA) — at best they touch break-even inside the venue's fee-free allowance.", + "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. In one measurement matrix, 0 of 90 configurations cleared; in another, 0 of 82. We then cross-verified a stochastic modelling note, re-deriving its mathematics against keel's real numbers, and it sharpened the why: the taker fee is the entire result. Inside the venue's fee-free monthly allowance, the reconstructed rules sit indistinguishably at break-even — a 14.9% win rate against a 14.88% break-even. One step outside it, break-even jumps to 29% and the same rules are decisively negative. The allowance rail is not a budget cap. It is the profitability boundary.", + "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.", + "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.", "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", + costLabel: "How execution is priced", announcementLabel: "Read the announcement", }, verifyNote: "Verify in the repository", @@ -83,8 +88,8 @@ export const home: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "Eighteen 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, and the constructive-possession (qabd) check, which holds that an asset you cannot withdraw may never have been validly possessed.", + title: "Twenty 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" }, }, { @@ -139,8 +144,8 @@ export const home: LocalizedPage = { }, ar: { - rev: "2026-08-28.2", - translatedFromRev: "2026-08-28.2", + rev: "2026-09-05.1", + translatedFromRev: "2026-09-05.1", title: "كيل: محرّك امتثال شرعي مفتوح المصدر للعملات المشفّرة", description: "المحرّك مفتوح المصدر الذي يُنفِّذ الامتثال الشرعي في التداول الفوري للعملات المشفّرة: فرزٌ موثَّق يرفض عند الفشل، وسككُ أمانٍ لا يتجاوزها أيُّ أمر. وليس محرّك فتاوى.", @@ -152,12 +157,15 @@ export const home: LocalizedPage = { honest: { title: "النتيجة الصادقة، نقولها أولًا", summaryBadgeAr: - "بلغةٍ مبسّطة: بعد خصم رسوم المنصّة المدفوعة فعليًّا، لا تحقّق أيُّ قاعدةٍ من قواعد كيل المُصدَّرة ربحًا ولا تتفوّق على الشراء الدوري المنتظم (DCA) — وفي أحسن الأحوال تلامس نقطة التعادل داخل الحصّة الشهرية المعفاة من الرسوم.", + "بلغةٍ مبسّطة: بعد خصم الرسوم وفوارقِ الأسعار المدفوعة فعليًّا، لا تحقّق أيُّ قاعدةٍ من قواعد كيل المُصدَّرة ربحًا ولا تتفوّق على الشراء الدوري المنتظم (DCA) — حتى داخل الحصّة الشهرية المعفاة من الرسوم، حيث كانت هذه الصفحة تقول إنّها تلامس نقطة التعادل.", body: [ - "لا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase‏ (نحو 1.2٪ لكلِّ طرفٍ من الصفقة) — صفرٌ من 90 تهيئةً في إحدى مصفوفات القياس، وصفرٌ من 82 في أخرى. وقد تحقّقنا تحقّقًا مستقلًّا من مذكّرةِ نمذجةٍ عشوائية — إذ أعدنا اشتقاق رياضياتها على أرقام كيل الحقيقية — فجلَّت السبب: رسومُ الآخذ هي النتيجة كلُّها. فداخل الحصّة الشهرية المعفاة من الرسوم لدى المنصّة، تقف القواعد المُعاد بناؤها عند نقطة التعادل بلا فرقٍ يُذكر (نسبةُ ربحٍ 14.9٪ مقابل نقطة تعادلٍ عند 14.88٪)؛ وبخطوةٍ واحدةٍ خارجها تقفز نقطةُ التعادل إلى 29٪ فتصير القواعد نفسها سالبةً بوضوح. فسكةُ الحصّة ليست سقفًا للميزانية — بل هي حدُّ الربحية.", + "لا تحقّق أيُّ عائلةٍ من القواعد المُصدَّرة ربحًا صافيًا عند رسوم الآخذ (taker) المدفوعة فعليًّا على منصّة Coinbase‏ (نحو 1.2٪ لكلِّ طرفٍ من الصفقة). وقد قيست الآن كلُّ قاعدةِ إشارةٍ يُصدِّرها كيل عند إعداداتها المُصدَّرة على 24 أصلًا: صفرٌ من 120 تهيئةً اجتازت. وبعدِّ كلِّ مصفوفةٍ أجريناها: صفرٌ من 138.", + "وليست الرسومُ كلَّ التكلفة، وقد كنّا نبخس ما بقي منها. فكيل يُسعّر فارقَ سعر كلِّ أصلٍ من سيولته هو — ولمّا قِسنا ذلك أخيرًا على الكون كلِّه، لم يتداول ولا أصلٌ واحدٌ من الأربعة والعشرين عند نقاط الأساس الخمس التي افترضتها أرقامُنا السابقة. بل يمتدّ المدى من 1.1 إلى 36.8 ضعفَ تلك الأرضية، ووسيطُه قرابةَ عشرة أضعافها. وبالتسعير الأمين ينخفض وسيطُ النتيجة عبر المصفوفة بمقدار 0.09، وتختفي التهيئةُ الوحيدة التي بدت موجبة. فقد كان الخطأ في نموذج تكلفتنا نحن أكبرَ من أفضل تحسينٍ حقيقيٍّ أنتجه أيُّ تعديلٍ أجريناه على قاعدة.", + "وهذا التصحيح يطال دعوى كانت هذه الصفحة تقولها، فنحن نسحبها هنا جهارًا بدل تعديلها في صمت. قلنا إنّ القواعد تقف عند نقطة التعادل داخل الحصّة الشهرية المعفاة من الرسوم — نسبةُ ربحٍ 14.9٪ مقابل تعادلٍ عند 14.88٪. وتلك الـ14.88٪ حُسبت عند نقاط الأساس الخمس التي لا يتداول عندها شيء؛ بل إنّ فحص الحساسية في المذكّرة نفسِها يُسقط الدعوى عند ضعفَي ذلك، والوسيطُ المقيس عشرةُ أضعافه. وتبقى الحصّةُ أكبرَ حدٍّ منفردٍ في النتيجة، إذ تساوي نحو 14 نقطةً من التعادل — أكثرَ من أيّ تغييرٍ أدخلناه على قاعدة. لكنّها حدٌّ بين السالب القاطع والسالب الواضح، لا بين السالب والرابح.", "والغاية من هذا المشروع هي آلياتُ الإنفاذ والقياسُ الصادق لما يمرّ عبرها — لا ادّعاءُ الربح. فكلُّ نتيجةٍ تُقارَن بمؤشّرٍ مرجعيٍّ بسيط هو الشراء الدوري المنتظم (DCA)، والقواعد المرجعية لا تتفوّق عليه بعد خصم الرسوم. ونحن نفضّل أن تعرف ذلك من الصفحة الأولى على أن تكتشفه بنفسك. ونعمل جاهدين على تحسين نتائج الخوارزميات والاستراتيجيات — وسنوافيك بما نُحرزه أوّلًا بأوّل.", ], experimentLabel: "اقرأ سجلّ التجربة", + costLabel: "كيف يُسعَّر التنفيذ", announcementLabel: "اقرأ الإعلان", }, verifyNote: "تحقّق في المستودع", @@ -168,8 +176,8 @@ export const home: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "ثماني عشرة سكةَ أمانٍ لا يتجاوزها أيُّ أمر", - body: "سقوفُ إنفاق، وقواطعُ تراجُعٍ (drawdown)، وحدودُ تعرُّض، ومنعُ مضاعفة الخسارة (المارتينغال)، وفحوصُ تقادُم موجزات البيانات، ومفتاحُ إيقافٍ يرفض عند الفشل — إضافةً إلى ما اشتُقّ من الفقه: توثيقُ الاشتراك في المنصّة، وفحصُ القبض الحُكمي (qabd) القائمُ على أنّ الأصل الذي لا يمكن سحبُه قد لا يكون قد قُبِض قبضًا صحيحًا.", + title: "عشرون سكةَ أمانٍ لا يتجاوزها أيُّ أمر", + body: "سقوفُ إنفاق، وقواطعُ تراجُعٍ (drawdown)، وحدودُ تعرُّض، ومنعُ مضاعفة الخسارة (المارتينغال)، وفحوصُ تقادُم موجزات البيانات، ومفتاحُ إيقافٍ يرفض عند الفشل — إضافةً إلى ما اشتُقّ من الفقه: توثيقُ الاشتراك في المنصّة، وفحصُ القبض الحُكمي (qabd) القائمُ على أنّ الأصل الذي لا يمكن سحبُه قد لا يكون قد قُبِض قبضًا صحيحًا، ورفضُ بيعِ أصلٍ تُفيد المنصّةُ أنّ الحساب لا يملكه، لأنّ بيعَ ما لا تملك غيرُ جائز.", verify: { label: "execution/guards.py", path: "keel/execution/guards.py" }, }, { @@ -215,8 +223,8 @@ export const home: LocalizedPage = { }, fr: { - rev: "2026-08-28.2", - translatedFromRev: "2026-08-28.2", + rev: "2026-09-05.1", + translatedFromRev: "2026-09-05.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.", @@ -227,12 +235,15 @@ export const home: LocalizedPage = { }, honest: { title: "Le résultat honnête, annoncé d'emblée", - summaryBadgeFr: "En clair : une fois les frais de plateforme 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) — tout au plus elles touchent le point mort dans le quota mensuel sans frais.", + 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) — 0 configuration sur 90 dans une matrice de mesure, 0 sur 82 dans une autre. Nous avons recoupé une note de modélisation stochastique — en refaisant ses calculs sur les chiffres réels de keel — et elle a précisé le pourquoi : les frais de preneur font tout le résultat. Dans le quota mensuel sans frais offert par la plateforme, les règles reconstruites se situent au point mort, à l'indiscernable près (14,9 % de trades gagnants pour un seuil d'équilibre de 14,88 %) ; un pas au-delà, ce seuil bondit à 29 % et les mêmes règles deviennent nettement perdantes. Le garde-fou de quota n'est pas un plafond budgétaire : c'est la frontière de la rentabilité.", + "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.", + "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.", "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", + costLabel: "Comment l'exécution est tarifée", announcementLabel: "Lire l'annonce", }, verifyNote: "Vérifier dans le dépôt", @@ -243,8 +254,8 @@ export const home: LocalizedPage = { verify: { label: "compliance/screen.py", path: "keel/compliance/screen.py" }, }, { - title: "Dix-huit 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 et le contrôle de prise de possession (qabd), au motif qu'un actif impossible à retirer n'a peut-être jamais été valablement possédé.", + title: "Vingt 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" }, }, {