From c1f9c24b499cf2f27536aa3ba8ff1616fa779ea1 Mon Sep 17 00:00:00 2001 From: Jodson Graves Date: Mon, 5 Oct 2026 23:00:18 -0400 Subject: [PATCH] docs(l10n): add missing P2-002 translations (7 files) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Machine-assisted community drafts, pending regional maintainer review per P2-002 §3.1. - CONFORMANCE.ar.md (from CONFORMANCE.md @ 8f0591e) - CONFORMANCE.es.md (from CONFORMANCE.md @ 8f0591e) - CONFORMANCE.fr.md (from CONFORMANCE.md @ 8f0591e) - CONFORMANCE.hi.md (from CONFORMANCE.md @ 8f0591e) - CONFORMANCE.pt.md (from CONFORMANCE.md @ 8f0591e) - CONFORMANCE.tok.md (from CONFORMANCE.md @ 8f0591e) - CONFORMANCE.zh.md (from CONFORMANCE.md @ 8f0591e) Co-Authored-By: Claude Opus 5.5 --- CONFORMANCE.ar.md | 69 +++++++++++++++++++++++++++++++++++++++++++ CONFORMANCE.es.md | 69 +++++++++++++++++++++++++++++++++++++++++++ CONFORMANCE.fr.md | 70 ++++++++++++++++++++++++++++++++++++++++++++ CONFORMANCE.hi.md | 70 ++++++++++++++++++++++++++++++++++++++++++++ CONFORMANCE.pt.md | 69 +++++++++++++++++++++++++++++++++++++++++++ CONFORMANCE.tok.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++ CONFORMANCE.zh.md | 68 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 488 insertions(+) create mode 100644 CONFORMANCE.ar.md create mode 100644 CONFORMANCE.es.md create mode 100644 CONFORMANCE.fr.md create mode 100644 CONFORMANCE.hi.md create mode 100644 CONFORMANCE.pt.md create mode 100644 CONFORMANCE.tok.md create mode 100644 CONFORMANCE.zh.md diff --git a/CONFORMANCE.ar.md b/CONFORMANCE.ar.md new file mode 100644 index 0000000..0d10b4d --- /dev/null +++ b/CONFORMANCE.ar.md @@ -0,0 +1,69 @@ +> ترجمة مجتمعية (مسوّدة) — سياسة NTARI رقم P2-002، البث العالمي المتعدد اللغات. المصدر: CONFORMANCE.md (الأصل الإنجليزي، لقطة بتاريخ 2026-10-05). مسوّدة مجتمعية بمساعدة آلية، في انتظار مراجعة المشرف الإقليمي وفق §3.1 من P2-002. تبقى المواصفات التقنية الأساسية بالإنجليزية وفق §2.2. +> +> تصحيحات الترجمة مساهمات نرحّب بها ونقدّرها كسائر المساهمات، فإذا لاحظت خطأً +> في هذه الترجمة فيمكنك إصلاحه بنفسك عبر إنشاء fork للمستودع وفتح pull +> request: https://github.com/NTARI-RAND/Cloudy + +> الأصل الإنجليزي هو النص المعياري. تُقدَّم هذه الترجمة للقراءة لا للتفسير: فحيثما اختلفت عن `CONFORMANCE.md`، فالحُكم للنص الإنجليزي. وتبقى الكلمات المفتاحية المعيارية (MUST، MUST NOT، SHOULD، SHOULD NOT، MAY) وأسماء الحقول والوسوم والمعرّفات بالإنجليزية لأنها تمثّل عقد المطابقة. + +# المطابقة — العمارة ذات الوجهين (Janus-Facing Architecture) + +وصف المستودع لنفسه بمصطلحات العمارة ذاتها، مذكورًا **قبل** أي شيء خاص بالمنتج، وفقًا لقاعدة الترتيب في العمارة. وكل ادّعاء مطابقة مربوط بالآلية والفحص اللذين يفرضانه، وإلا وُسِم بأنه بديل مؤقت أو هيكل أولي (stub). فالنثر غير المربوط تسويق. + +العمارة هي **العمارة ذات الوجهين (Janus-Facing Architecture, JFA)** — وثيقة العمارة الموحّدة لـ NTARI، وهي توثيق حرّ ضمن مشاع المشروع المرخّص بـ AGPL-3.0. + +## إعلان الدور + +Cloudy **واجهة أمامية** لركيزة JFA — أي التطبيق الموجَّه للأعضاء — وهو موطن **طبقات اقتصاد الأعضاء** التي لا يعرّفها بروتوكول التنسيق في الركيزة عن قصد: سجل الحوار الخاص بكل مشغّل، وعهد السمعة، والائتمان الذي يُصدره الأعضاء. فالأعضاء موجودون هنا وهنا فقط؛ وخطّ التنسيق الذي يقع تحت هذا المستودع لا يعرف أشخاصًا. وCloudy منتج مستقل قابل للتفرّع (fork): يتحدّث البروتوكول المنشور، ويمكن لأي منسّق مطابق أن يخدمه. + +| مصطلح هذا المستودع | الدور في العمارة | +|---|---| +| `internal/record` | **دفتر الحوار الخاص بكل مشغّل** — إضافيّ فقط، مختوم بالحوار، مشهود | +| `internal/covenant` | تطبيق **مقياس التقييم** (سمعة الأعضاء بوصفها عهدًا) | +| `internal/economy` | **الائتمان الذي يُصدره الأعضاء** (اقتصاد الأعضاء) | +| `internal/coord` | استهلاك **بروتوكول التنسيق** في الركيزة | +| `internal/enroll` | **تسجيل الواجهة الأمامية بوصفها مشغّلًا** لدى منسّق (apply → keys → verify → conformance → active) | +| العضو (Member) | شخص، محدود النطاق بالمنصّة؛ وتبقى بيانات التعريف الشخصية (PII) محلية لدى العضو وقابلة للمحو | + +## الثوابت وارتباطاتها — بحسب `main` + +تُذكَر الحالات وفقًا لقاعدة الصراحة في العمارة. وما بُني من عمل طبقة الأعضاء بعد ذلك موجود في مجموعة طلبات الدمج (PR) المفتوحة، ويُحدِّث هذا الجدول عند دمجه. + +| الثابت (في العمارة) | الحالة على main | الآلية / الفحص | +|---|---|---| +| السجل **إضافيّ فقط**؛ والتصحيحات قيود جديدة | **مبني (Built)** | `internal/record`: لا يكشف Store/Log إلا Append — فالتحديث والحذف فعلان غائبان؛ وتوثيق الحزمة ينصّ على القواعد البنيوية؛ واختبارات | +| السجل **مختوم بالحوار** — ما اتفق عليه عضوان، لا ما يدّعيه أحدهما | **مبني (Built)** | تحقّق من الختم المزدوج على بايتات قانونية (canonical)؛ ويُرفَض الحوار مع الذات عند الإنشاء | +| **لا بيانات تعريف شخصية (PII) في المشاع**؛ ويبقى السرد محليًا لدى العضو وقابلًا للمحو | **مبني (Built)** | لا تحمل أنواع المشاع إلا قيم التجزئة والمفاتيح واللحظات الزمنية؛ ويقيم المحتوى القابل للمحو في مخزن محلي لدى العضو منفصل عنها من حيث النوع | +| **الشهادة** مع الاستقلالية البنيوية؛ والنشر ذو الشاهد الواحد بديل مؤقت موسوم | **مبني (بديل مؤقت) (Built (stand-in))** | توقيعات مصادقة من الشهود مع تحقّق من الاستقلالية بين كل زوج منهم؛ ووسم StandIn يُحسَب ولا يُدّعى | +| العهد: **لا متوسطات أبدًا**؛ توزيع كامل؛ متماثل؛ يحدّد ما إذا كان الشيء يحدث، لا مقداره أبدًا | **هيكل أولي، موسوم (Stub, labeled)** | يُعلن توثيق حزمة `internal/covenant` الثوابت غير القابلة للتفاوض التي يجب أن يستوفيها عند بنائه؛ والتطبيق المبني قيد المراجعة | +| الاقتصاد: الأرصدة **دالّة حتمية للسجل المختوم**؛ صفري المجموع؛ الضمان أولًا؛ يُكتسَب ولا يُشترى أبدًا | **هيكل أولي، موسوم (Stub, labeled)** | يُعلن توثيق حزمة `internal/economy` الثوابت؛ والتطبيق المبني قيد المراجعة | +| **هوية مشارك واحدة** — عضو واحد، مساهم ومستهلك في آنٍ معًا | مُلزِم بالتصميم (Design-binding) | لا يوجد فصل بين المنتج والمستهلك في أي مخطط أو نوع؛ ويُلزِم كل سطح للأعضاء عند دمجه | +| **قابلية التفرّع** | مبني (Built) | يستهلك بروتوكول التنسيق عند وسم إصدار منشور؛ ولا يتمتّع أي منسّق بامتياز | + +## ارتباطات سجلّ القيد في JFA + +الاختبارات التي تربط معرّفًا من سجلّ قيد الثوابت في Janus (`jfa-conformance-suite.py` في NTARI-RAND/Janus) تُسمّى `TestInvariant__`، مع كتابة أي `-` في المعرّف على هيئة `_` (فيصبح `REC-six-holders` على هيئة `TestInvariant_REC_six_holders_…`). ويسرد الأمر `go test -run TestInvariant_ -v ./...` كل ارتباط ونتيجته. + +| معرّف سجلّ القيد | الاختبار | ما يضيفه زيادةً على الاختبارات القائمة في الحزمة | +|---|---|---| +| **L1** — كل تبادل يحرّك رصيدين يتصافيان إلى الصفر | `internal/economy` `TestInvariant_L1_ZeroSumBalance` | دافعون متزامنون عبر دفترين يتشاركان مخزنًا واحدًا؛ وتصافٍ لكل سجل؛ وإعادة التشغيل تُعيد إنتاج كل رصيد | +| **L6** — لا تحديث في الموضع، ولا حذف؛ والإسقاط تعليق | `internal/record` `TestInvariant_L6_AppendOnly` (نصف الإسقاط: `internal/covenant` `TestAnswersCloseTheSymmetryBreach`) | التصحيح يُضاف ويترك القيد المصحَّح وكل الإثباتات السابقة سليمة؛ وإعادة الكتابة في الموضع التي تُجرى مباشرةً على التخزين تفشل في الاتساق مقارنةً بنقطة تحقّق أُخذت قبلها؛ ومسح للشيفرة المصدرية على مستوى الوحدة كلها لا يجد فعل تحديث أو حذف على أي نوع إضافيّ فقط — يُتتبَّع بالاسم (Store/Log/Ledger/Book) أو بتعليق توثيقي "append-only"، مع تثبيت `market.Catalog` و`techtree.Tree` كي لا يخرجا من النطاق | +| **L7** — لا يحمل المشاع إلا قيم التجزئة والأنواع والأوسمة الزمنية والمراجع | `internal/record` `TestInvariant_L7_CommonsSchema` | كل نوع من أنواع المشاع، حقلًا حقلًا، لا يقبل إلا مصفوفات البايتات، والأعداد الصحيحة غير المؤشَّرة، و`time.Time`، وحقول `[]byte` المسمّاة في قائمة سماح صريحة لمفاتيح ed25519 وتوقيعاتها — لا سلاسل نصية، ولا خرائط، ولا واجهات، ولا أعداد عشرية، ولا `[]byte` غير مدرجة؛ وكل حقل مدرج في قائمة السماح، إذا حُشي بملاحظة، يفشل في التحقّق مقارنةً بعيّنة ضابطة غير محشوّة ناجحة، ولا يدخل أي سجل أبدًا | +| **L8** — يُحمَل التوزيع الكامل؛ ولا نتيجة رقمية مفردة في أي مكان | `internal/covenant` `TestInvariant_L8_NoScalarAggregation` | عضوان لهما المتوسط نفسه وشكلان مختلفان يبقيان قابلَين للتمييز؛ ومسح للشيفرة المصدرية على مستوى الوحدة كلها بحثًا عن الدوال المُصدَّرة المسمّاة بالنتيجة (score) أو التي تُعيد أعدادًا عشرية، ووسوم JSON الشبيهة بالنتيجة، والحقول العشرية في حزم السمعة | + +## البدائل المؤقتة والمسائل المتبقية المفتوحة + +- **البديل المؤقت ذو الشاهد الواحد (StandIn).** كل نقطة تحقّق مشهودة اليوم لديها أقلّ من شاهدين مستقلّين؛ وطبقة السجل تحسب هذا الوسم وتُبلغ عنه بنيويًا. والاتحاد الحيّ هو المسألة المفتوحة 2 في العمارة — البناء المحوري. +- **العهد والاقتصاد هيكلان أوّليان على main.** يحمل توثيق حزمتيهما الثوابت المُلزِمة؛ والتطبيقات المبنية موجودة في طلبات الدمج (PR) المفتوحة المتراكبة، ويجب أن تستوفي ذلك التوثيق كي تُدمَج. +- **إعادة تسمية وسم نطاق السجل** (تسمية المنتج) معلّقة، ويجب أن تُدمَج **قبل أي حفظ دائم** — فإعادة الوسم بعد وجود سجلات دائمة ستكون إعادة كتابة. +- **المسائل المتبقية المسمّاة في السجل** (الحدّ الأدنى لإخفاء المعلومات (steganographic floor)، والقناة الخفية للأوسمة الزمنية، وفقدان ذاكرة الشاهد، وفجوة الحيوية) موثّقة في توثيق حزمة السجل بدلًا من التظاهر بعدم وجودها. +- **عقدة المساهم — فاصل Executor مبني؛ وتطبيقات وقت التشغيل معلّقة.** تثبّت `internal/contribute` عقد مساهمة العقدة (Executor / ServiceExecutor / Registry / NodeContract) مع ثابتين تفرضهما الاختبارات: العقدة المستغَلّة من الموارد الفائضة لا تقبل إلا المنفّذين القابلين للإيقاف الاستباقي (المالك لا يُقاطَع أبدًا)، وعبء عمل Service يتطلّب تموضعًا مثبّتًا. ويشغّلها `cmd/cloudy-agent` من البداية إلى النهاية مع منفّذ Storage **حقيقي** (أجزاء مختومة معتمة + إثبات الحيازة في `internal/storage`) ومنفّذَي Compute/Service **مؤقّتين (placeholder)**. أما النقل الثقيل لوقت التشغيل من `internal/agent` الانتقالية لدى المنسّق — منفّذ Docker، وأخذ عيّنات العتاد عبر gopsutil، والانسحاب/قائمة السماح/الطابعات، والترحيل agent→cloudyd→`/v0` — فهو الخطوة التالية المسمّاة، ويُدمَج *خلف* هذا الفاصل دون تغييره. +- **أداة تسجيل المشغّلين (driver) — مبني ومُتحقَّق منه حيًّا.** يقود `internal/enroll` + `cmd/cloudy-enroll` دورة حياة انضمام المشغّل لدى المنسّق من البداية إلى النهاية (التقديم → تسجيل مجموعة المفاتيح السبعة → التحقّق عبر البريد الإلكتروني → مجموعتا المطابقة A/B → التفعيل التلقائي)، مع إعادة استخدام `internal/opcred` لحفظ المفاتيح ولحساب إجابات المطابقة عبر الصيغة القانونية (canon) الفعلية للبروتوكول. وتُقيَّم المجموعة C لدى المنسّق ولا تحتاج إلى استجابة من المشغّل، لذا لا توجد خطوة للمجموعة C. والعميل منفصل عن قصد عن `internal/coord`: فالتسجيل JSON عادي على سطح **البوابة (portal)** لدى المنسّق، لا على خطّ `/v0` من جهة العقد. ويُقدَّم رمز البريد الإلكتروني خارج النطاق عبر `CodeSource` مُحقَن. وقد تُحقِّق منه أمام منسّق SoHoLINK حيّ — فبلغ المشغّل المسجَّل الحالة `active`، ثم صادقت بيانات اعتماده على `/v0`. + +## إعلان الاعتماديات + +يستهلك `sohocloud-protocol` عند وسم إصدار منشور — ولا شيء آخر من الحزمة. وتشير طبقات الأعضاء إلى التبادلات المختومة بمعرّف ورقة معتم، بالقيمة، ولا تستورد أبدًا أنواع السجل إلى طبقات أخرى؛ ولا يحدث التحويل إلا عند جذر التركيب. + +## ملاحظات خاصة بالمنتج (أخيرًا، وفقًا لقاعدة الترتيب) + +يُشحَن Cloudy منتجًا استهلاكيًا مستقلًا (بواجهة برمجية للأعضاء وأسطح تطبيق خاصة به، قيد المراجعة). وSoHoLINK هو المنسّق المرجعي الذي يتحدّث إليه؛ ويمكن لأي منسّق مطابق أن يحلّ محلّه. diff --git a/CONFORMANCE.es.md b/CONFORMANCE.es.md new file mode 100644 index 0000000..13978a0 --- /dev/null +++ b/CONFORMANCE.es.md @@ -0,0 +1,69 @@ +> Traducción comunitaria (borrador) — Política P2-002 de NTARI, Difusión Multilingüe Global. Fuente: CONFORMANCE.md (original en inglés, instantánea del 2026-10-05). Borrador comunitario asistido por máquina, pendiente de revisión por mantenedores regionales conforme a P2-002 §3.1. Las especificaciones técnicas centrales permanecen en inglés conforme a §2.2. +> +> ¿Encontraste un error en esta traducción? Tu corrección es una contribución +> bienvenida y valorada: haz un fork del repositorio y abre un pull request en +> https://github.com/NTARI-RAND/Cloudy. + +> **El original en inglés es normativo.** Esta traducción se ofrece para lectura, no para interpretación: donde difiera de `CONFORMANCE.md`, rige el inglés. Las palabras clave normativas (MUST, MUST NOT, SHOULD, SHOULD NOT, MAY), los nombres de campos, las etiquetas y los identificadores se mantienen en inglés porque constituyen el contrato de conformidad. + +# Conformidad — Janus-Facing Architecture + +La autodescripción del repositorio en los propios términos de la arquitectura, expuesta **antes** de cualquier cosa específica del producto, según la regla de orden de la arquitectura. Cada afirmación de conformidad está vinculada al mecanismo y a la verificación que la hacen cumplir; de lo contrario, se etiqueta como suplencia o como stub. La prosa no vinculada es marketing. + +La arquitectura es **Janus-Facing Architecture (JFA)**: el documento de arquitectura unificada de NTARI, documentación libre bajo el bien común AGPL-3.0 del proyecto. + +## Declaración de rol + +Cloudy es un **frontend** de un sustrato de JFA — la aplicación de cara a los miembros — y el hogar de las **capas de la economía de miembros** que el protocolo de coordinación del sustrato deliberadamente no define: la bitácora de diálogos por operador, el pacto de reputación y el crédito emitido por los miembros. Los miembros existen aquí y solo aquí; el canal de coordinación que está por debajo de este repositorio no conoce personas. Cloudy es un producto independiente y bifurcable: habla el protocolo publicado y cualquier coordinador conforme puede servirlo. + +| Término de este repositorio | Rol en la arquitectura | +|---|---| +| `internal/record` | la **bitácora de diálogos por operador** — de solo adición, sellada por diálogo, atestiguada | +| `internal/covenant` | la implementación de la **escala de evaluación** (la reputación de los miembros como pacto) | +| `internal/economy` | el **crédito emitido por los miembros** (la economía de miembros) | +| `internal/coord` | el consumo del **protocolo de coordinación** del sustrato | +| `internal/enroll` | la **inscripción de frontend-como-operador** ante un coordinador (solicitud → claves → verificación → conformidad → activo) | +| Miembro | una persona, con alcance de plataforma; la PII permanece local del miembro y es borrable | + +## Invariantes y sus vínculos — a la fecha de `main` + +Los estados se declaran según la regla de honestidad de la arquitectura. El trabajo ya construido de la capa de miembros más allá de esto existe en la pila de PR abiertos y actualiza esta tabla a medida que se integra. + +| Invariante (arquitectura) | Estado en main | Mecanismo / verificación | +|---|---|---| +| El registro es **de solo adición**; las correcciones son entradas nuevas | **Construido** | `internal/record`: Store/Log solo exponen Append — actualizar y borrar son verbos ausentes; la documentación del paquete enuncia las reglas estructurales; pruebas | +| El registro está **sellado por diálogo** — lo que dos miembros acordaron, no lo que uno afirma | **Construido** | Verificación de doble sello sobre bytes canónicos; el autodiálogo se rechaza en la construcción | +| **Nada de PII en el bien común**; la narrativa permanece local del miembro y borrable | **Construido** | Los tipos del bien común llevan solo hashes, claves e instantes; el contenido borrable vive en un almacén local del miembro con tipos disjuntos | +| **Atestiguamiento** con independencia estructural; un despliegue de un solo testigo es una suplencia etiquetada | **Construido (suplencia)** | Contrafirmas de testigos con verificación de independencia por pares; la etiqueta StandIn se calcula, no se afirma | +| Pacto: **nunca promediar**; distribución completa; simétrico; decide si, nunca cuánto | **Stub, etiquetado** | La documentación del paquete `internal/covenant` declara los invariantes innegociables que debe satisfacer cuando se construya; la implementación construida está en revisión | +| Economía: los saldos son una **función determinista del registro sellado**; suma cero; depósito de garantía primero; ganado, nunca comprado | **Stub, etiquetado** | La documentación del paquete `internal/economy` declara los invariantes; la implementación construida está en revisión | +| **Identidad única de participante** — un miembro, simultáneamente contribuyente y consumidor | Vinculante por diseño | No existe ninguna separación productor/consumidor en ningún esquema ni tipo; vincula cada superficie de miembros a medida que se integra | +| **Bifurcabilidad** | Construido | Consume el protocolo de coordinación en una etiqueta de versión publicada; ningún coordinador es privilegiado | + +## Vínculos con el registro de JFA + +Las pruebas que vinculan un ID del registro de invariantes de Janus (`jfa-conformance-suite.py` en NTARI-RAND/Janus) se nombran `TestInvariant__`, escribiendo como `_` cualquier `-` del ID (así, `REC-six-holders` pasa a ser `TestInvariant_REC_six_holders_…`). `go test -run TestInvariant_ -v ./...` lista cada vínculo y su resultado. + +| ID del registro | Prueba | Lo que añade más allá de las pruebas existentes del paquete | +|---|---|---| +| **L1** — cada intercambio mueve dos saldos que se compensan a cero | `internal/economy` `TestInvariant_L1_ZeroSumBalance` | Pagadores concurrentes en dos libros contables que comparten un mismo almacén; compensación por registro; la reproducción reconstruye cada saldo | +| **L6** — sin actualización en el lugar, sin borrado; la desestimación es una anotación | `internal/record` `TestInvariant_L6_AppendOnly` (mitad de la desestimación: `internal/covenant` `TestAnswersCloseTheSymmetryBreach`) | Una corrección se añade y deja intactas la entrada corregida y todas las pruebas anteriores; una reescritura en el lugar hecha directamente sobre el almacenamiento falla la verificación de consistencia frente a un checkpoint tomado antes de ella; un escaneo del código fuente de todo el módulo no encuentra ningún verbo de actualización ni de borrado en ningún tipo de solo adición — rastreados por nombre (Store/Log/Ledger/Book) o por un comentario de documentación "append-only", con `market.Catalog` y `techtree.Tree` fijados para que no puedan salir del alcance | +| **L7** — el bien común contiene solo hashes, tipos, marcas de tiempo y referencias | `internal/record` `TestInvariant_L7_CommonsSchema` | Cada tipo del bien común, campo por campo, admite solo arreglos de bytes, enteros sin signo, `time.Time` y campos `[]byte` nombrados en una lista explícita de permitidos de claves y firmas ed25519 — ningún string, map, interface, float ni `[]byte` no listado; cada campo de la lista de permitidos, rellenado con un memo, falla la verificación frente a un control sin relleno que sí la supera, y nunca entra en un log | +| **L8** — se lleva la distribución completa; ninguna puntuación escalar en ninguna parte | `internal/covenant` `TestInvariant_L8_NoScalarAggregation` | Dos miembros con medias iguales y formas distintas siguen siendo distinguibles; un escaneo del código fuente de todo el módulo en busca de funciones exportadas con nombres de puntuación o que devuelvan float, etiquetas JSON con aspecto de puntuación y campos float en los paquetes de reputación | + +## Suplencias y residuos abiertos + +- **Suplencia StandIn de un solo testigo.** Hoy, cada checkpoint atestiguado tiene menos de dos testigos independientes; la capa de registro calcula e informa esta etiqueta de forma estructural. La federación en vivo es el problema abierto 2 de la arquitectura — la pieza clave por construir. +- **El pacto y la economía son stubs en main.** La documentación de sus paquetes contiene los invariantes vinculantes; las implementaciones construidas están en los PR abiertos y apilados, y deben satisfacer esa documentación para integrarse. +- **El cambio de nombre de la etiqueta de dominio del registro** (nomenclatura del producto) está pendiente y debe integrarse **antes de cualquier persistencia duradera** — reetiquetar después de que existan logs duraderos sería una reescritura. +- **Los residuos nombrados del registro** (piso esteganográfico, canal encubierto de marcas de tiempo, amnesia del testigo, brecha de vivacidad) se documentan en la documentación del paquete de registro en lugar de fingir que no existen. +- **Nodo contribuyente — costura Executor construida; implementaciones de tiempo de ejecución pendientes.** `internal/contribute` fija el contrato de contribución de nodos (Executor / ServiceExecutor / Registry / NodeContract) con dos invariantes que las pruebas hacen cumplir: un nodo aprovechado solo acepta ejecutores interrumpibles (el propietario nunca es interrumpido), y una carga de trabajo Service requiere una ubicación fijada. `cmd/cloudy-agent` lo ejecuta de extremo a extremo con un ejecutor de Storage **real** (fragmentos sellados opacos + la prueba de posesión de `internal/storage`) y ejecutores de Compute/Service **provisionales**. La migración pesada del tiempo de ejecución desde el `internal/agent` transitorio del coordinador — ejecutor de Docker, muestreo de hardware con gopsutil, exclusión voluntaria/lista de permitidos/impresoras, y el relevo agent→cloudyd→`/v0` — es el siguiente paso nombrado y se integra *detrás* de esta costura sin modificarla. +- **Controlador de inscripción de operadores — construido y verificado en vivo.** `internal/enroll` + `cmd/cloudy-enroll` conducen de extremo a extremo el ciclo de vida de incorporación de operadores de un coordinador (solicitud → registro del conjunto de 7 claves → verificación por correo electrónico → suites de conformidad A/B → activación automática), reutilizando `internal/opcred` para la custodia de claves y para calcular las respuestas de conformidad a través del canon real del protocolo. La suite C se califica del lado del coordinador y no necesita respuesta del operador, por lo que no hay un paso de la suite C. El cliente está deliberadamente separado de `internal/coord`: la inscripción es JSON simple sobre la superficie de **portal** del coordinador, no sobre el canal `/v0` del lado de los nodos. El código de correo electrónico fuera de banda se suministra mediante un `CodeSource` inyectado. Verificado contra un coordinador SoHoLINK en vivo — el operador inscrito alcanzó `active` y su credencial luego se autenticó en `/v0`. + +## Declaración de dependencias + +Consume `sohocloud-protocol` en una etiqueta de versión publicada — nada más de la pila. Las capas de miembros referencian los intercambios sellados por un ID de hoja opaco, por valor, nunca importando tipos del registro en otras capas; la conversión ocurre solo en la raíz de composición. + +## Notas específicas del producto (al final, según la regla de orden) + +Cloudy se distribuye como un producto de consumo independiente (su propia API de miembros y sus superficies de aplicación, en revisión). SoHoLINK es el coordinador de referencia con el que habla; cualquier coordinador conforme puede reemplazarlo. diff --git a/CONFORMANCE.fr.md b/CONFORMANCE.fr.md new file mode 100644 index 0000000..03e8c05 --- /dev/null +++ b/CONFORMANCE.fr.md @@ -0,0 +1,70 @@ +> Traduction communautaire (brouillon) — politique NTARI P2-002, Diffusion multilingue mondiale. Source : CONFORMANCE.md (original anglais, instantané du 2026-10-05). Brouillon communautaire assisté par machine, en attente de relecture par le mainteneur régional conformément à P2-002 §3.1. Les spécifications techniques essentielles restent en anglais conformément au §2.2. +> +> Vous avez remarqué une erreur de traduction ? N'hésitez pas à la corriger +> vous-même : forkez le dépôt https://github.com/NTARI-RAND/Cloudy et +> ouvrez une pull request. Les corrections de traduction sont des +> contributions précieuses, tout autant que le code. + +> L'original anglais est normatif. Cette traduction est proposée pour la lecture, non pour l'interprétation : là où elle diverge de `CONFORMANCE.md`, l'anglais prévaut. Les mots-clés normatifs (MUST, MUST NOT, SHOULD, SHOULD NOT, MAY), les noms de champs, les libellés et les identifiants sont conservés en anglais, car ils constituent le contrat de conformité. + +# Conformité — Janus-Facing Architecture + +L'autodescription du dépôt dans les termes propres à l'architecture, énoncée **avant** tout élément propre au produit, conformément à la règle d'ordonnancement de l'architecture. Chaque affirmation de conformité est rattachée au mécanisme et à la vérification qui la font respecter ; à défaut, elle est étiquetée comme substitution ou comme ébauche. Une prose non rattachée relève du marketing. + +L'architecture est **Janus-Facing Architecture (JFA)** — le document d'architecture unifié de NTARI, documentation libre placée sous les communs AGPL-3.0 du projet. + +## Déclaration de rôle + +Cloudy est un **frontend** d'un substrat JFA — l'application destinée aux membres — et le foyer des **couches de l'économie des membres** que le protocole de coordination du substrat ne définit délibérément pas : le registre de dialogues par opérateur, le pacte de réputation et le crédit émis par les membres. Les membres existent ici et seulement ici ; le fil de coordination situé sous ce dépôt ne connaît aucune personne. Cloudy est un produit autonome et forkable : il parle le protocole publié, et tout coordinateur conforme peut le servir. + +| Terme de ce dépôt | Rôle dans l'architecture | +|---|---| +| `internal/record` | le **registre de dialogues par opérateur** — en ajout seul, scellé par dialogue, attesté par témoins | +| `internal/covenant` | l'implémentation de l'**échelle d'évaluation** (la réputation des membres en tant que pacte) | +| `internal/economy` | le **crédit émis par les membres** (l'économie des membres) | +| `internal/coord` | la consommation du **protocole de coordination** du substrat | +| `internal/enroll` | l'**enrôlement du frontend en tant qu'opérateur** auprès d'un coordinateur (candidature → clés → vérification → conformité → actif) | +| Membre | une personne, rattachée à une plateforme ; les données personnelles (PII) restent locales au membre et effaçables | + +## Invariants et leurs rattachements — état de `main` + +Les statuts sont énoncés conformément à la règle d'honnêteté de l'architecture. Le travail déjà construit sur la couche des membres au-delà de ce qui figure ici se trouve dans la pile de PR ouvertes et met ce tableau à jour à mesure qu'il est fusionné. + +| Invariant (architecture) | Statut sur main | Mécanisme / vérification | +|---|---|---| +| Le registre est **en ajout seul** ; les corrections sont de nouvelles entrées | **Construit** | `internal/record` : Store/Log n'exposent que Append — la mise à jour et la suppression sont des verbes absents ; la documentation du paquet énonce les règles structurelles ; tests | +| Le registre est **scellé par dialogue** — ce dont deux membres ont convenu, et non ce qu'un seul affirme | **Construit** | Vérification du double scellement sur les octets canoniques ; le dialogue avec soi-même est rejeté dès la construction | +| **Aucune donnée personnelle (PII) dans les communs** ; le récit reste local au membre et effaçable | **Construit** | Les types des communs ne portent que des empreintes, des clés et des instants ; le contenu effaçable réside dans un magasin local au membre, disjoint par les types | +| **Attestation par témoins** avec indépendance structurelle ; un déploiement à témoin unique est une substitution étiquetée | **Construit (substitution)** | Contresignatures des témoins avec vérification de l'indépendance deux à deux ; l'étiquette StandIn est calculée, et non affirmée | +| Pacte : **jamais de moyenne** ; distribution complète ; symétrique ; détermine si, jamais combien | **Ébauche, étiquetée** | La documentation du paquet `internal/covenant` déclare les invariants non négociables qu'il doit respecter une fois construit ; l'implémentation construite est en cours de revue | +| Économie : les soldes sont une **fonction déterministe du registre scellé** ; somme nulle ; séquestre d'abord ; gagné, jamais acheté | **Ébauche, étiquetée** | La documentation du paquet `internal/economy` déclare les invariants ; l'implémentation construite est en cours de revue | +| **Identité unique du participant** — un seul membre, à la fois contributeur et consommateur | Contraignant pour la conception | Aucune séparation producteur/consommateur n'existe dans aucun schéma ni aucun type ; s'impose à chaque surface destinée aux membres à mesure qu'elle arrive | +| **Forkabilité** | Construit | Consomme le protocole de coordination à une étiquette de version publiée ; aucun coordinateur n'est privilégié | + +## Rattachements au registre JFA + +Les tests qui rattachent un ID du registre des invariants de Janus (`jfa-conformance-suite.py` dans NTARI-RAND/Janus) sont nommés `TestInvariant__`, tout `-` de l'ID étant écrit `_` (ainsi `REC-six-holders` devient `TestInvariant_REC_six_holders_…`). `go test -run TestInvariant_ -v ./...` liste chaque rattachement et son résultat. + +| ID du registre | Test | Ce qu'il ajoute au-delà des tests existants du paquet | +|---|---|---| +| **L1** — chaque échange modifie deux soldes dont la somme est nulle | `internal/economy` `TestInvariant_L1_ZeroSumBalance` | Payeurs concurrents sur deux registres partageant un même magasin ; compensation par enregistrement ; la relecture reproduit chaque solde | +| **L6** — aucune mise à jour sur place, aucune suppression ; un rejet est une annotation | `internal/record` `TestInvariant_L6_AppendOnly` (volet rejet : `internal/covenant` `TestAnswersCloseTheSymmetryBreach`) | Une correction s'ajoute et laisse intactes l'entrée corrigée et toutes les preuves antérieures ; une réécriture sur place effectuée directement sur le stockage échoue au contrôle de cohérence face à un point de contrôle pris avant elle ; un balayage du code source à l'échelle du module ne trouve aucun verbe de mise à jour ou de suppression sur aucun type en ajout seul — repéré par son nom (Store/Log/Ledger/Book) ou par un commentaire de documentation « append-only », `market.Catalog` et `techtree.Tree` étant épinglés afin qu'ils ne puissent pas sortir du périmètre | +| **L7** — les communs ne contiennent que des empreintes, des types, des horodatages et des références | `internal/record` `TestInvariant_L7_CommonsSchema` | Chaque type des communs, champ par champ, n'admet que des tableaux d'octets, des entiers non signés, `time.Time` et des champs `[]byte` nommés dans une liste d'autorisation explicite de clés et de signatures ed25519 — aucun string, map, interface, float ni `[]byte` non listé ; chaque champ autorisé, complété par un mémo, échoue à la vérification face à un cas de contrôle non complété qui, lui, réussit, et n'entre jamais dans un journal | +| **L8** — distribution complète portée ; aucun score scalaire nulle part | `internal/covenant` `TestInvariant_L8_NoScalarAggregation` | Deux membres ayant des moyennes égales et des formes de distribution différentes restent distinguables ; un balayage du code source à l'échelle du module recherche les fonctions exportées nommées d'après un score ou renvoyant un float, les balises JSON évoquant un score et les champs float dans les paquets de réputation | + +## Substitutions et résidus ouverts + +- **Substitution StandIn à témoin unique.** Chaque point de contrôle attesté par témoins compte aujourd'hui moins de deux témoins indépendants ; la couche registre calcule et signale cette étiquette de manière structurelle. La fédération en conditions réelles est le problème ouvert 2 de l'architecture — la construction clé de voûte. +- **Le pacte et l'économie sont des ébauches sur main.** La documentation de leurs paquets porte les invariants contraignants ; les implémentations construites se trouvent dans les PR ouvertes et empilées, et doivent respecter cette documentation pour être fusionnées. +- **Le renommage de l'étiquette de domaine du registre** (nommage du produit) est en attente et doit être fusionné **avant toute persistance durable** — réétiqueter une fois que des journaux durables existent reviendrait à une réécriture. +- **Les résidus nommés du registre** (plancher stéganographique, canal caché par horodatage, amnésie des témoins, écart de vivacité) sont documentés dans la documentation du paquet registre plutôt que passés sous silence. +- **Nœud contributeur — jointure Executor construite ; implémentations d'exécution en attente.** `internal/contribute` fixe le contrat de contribution des nœuds (Executor / ServiceExecutor / Registry / NodeContract) avec deux invariants imposés par des tests : un nœud récupéré n'accepte que des exécuteurs préemptibles (le propriétaire n'est jamais interrompu), et une charge de travail Service exige un placement épinglé. `cmd/cloudy-agent` l'exécute de bout en bout avec un exécuteur Storage **réel** (fragments scellés opaques + la preuve de possession de `internal/storage`) et des exécuteurs Compute/Service **provisoires**. Le portage lourd de l'environnement d'exécution depuis le `internal/agent` transitoire du coordinateur — exécuteur Docker, échantillonnage matériel gopsutil, exclusion volontaire/liste d'autorisation/imprimantes, et le relais agent→cloudyd→`/v0` — est l'étape suivante désignée et s'insère *derrière* cette jointure sans la modifier. +- **Pilote d'enrôlement des opérateurs — construit et vérifié en conditions réelles.** `internal/enroll` + `cmd/cloudy-enroll` pilotent de bout en bout le cycle d'intégration des opérateurs d'un coordinateur (candidature → enregistrement du jeu de 7 clés → vérification par e-mail → suites de conformité A/B → activation automatique), en réutilisant `internal/opcred` pour la garde des clés et pour le calcul des réponses de conformité à travers le canon réel du protocole. La suite C est évaluée côté coordinateur et n'exige aucune réponse de l'opérateur ; il n'y a donc pas d'étape pour la suite C. Le client est délibérément séparé de `internal/coord` : l'enrôlement est du JSON simple sur la surface **portail** du coordinateur, et non sur le fil `/v0` côté nœud. Le code e-mail hors bande est fourni par une `CodeSource` injectée. Vérifié face à un coordinateur SoHoLINK en conditions réelles — l'opérateur enrôlé a atteint `active`, et son justificatif s'est ensuite authentifié sur `/v0`. + +## Déclaration de dépendances + +Consomme `sohocloud-protocol` à une étiquette de version publiée — rien d'autre de la pile. Les couches des membres référencent les échanges scellés par un ID de feuille opaque, par valeur, sans jamais importer les types du registre dans d'autres couches ; la conversion n'a lieu qu'à la racine de composition. + +## Notes propres au produit (en dernier, conformément à la règle d'ordonnancement) + +Cloudy est livré comme un produit grand public autonome (sa propre API destinée aux membres et ses propres surfaces applicatives, en cours de revue). SoHoLINK est le coordinateur de référence auquel il s'adresse ; tout coordinateur conforme peut le remplacer. diff --git a/CONFORMANCE.hi.md b/CONFORMANCE.hi.md new file mode 100644 index 0000000..08fdb07 --- /dev/null +++ b/CONFORMANCE.hi.md @@ -0,0 +1,70 @@ +> सामुदायिक अनुवाद (मसौदा) — NTARI नीति P2-002, Global Multilingual Broadcast (वैश्विक बहुभाषी प्रसारण)। स्रोत: CONFORMANCE.md (अंग्रेज़ी मूल, स्नैपशॉट 2026-10-05)। P2-002 §3.1 के अनुसार क्षेत्रीय अनुरक्षक की समीक्षा हेतु लंबित, मशीन-सहायता से तैयार सामुदायिक मसौदा। §2.2 के अनुसार मूल तकनीकी विनिर्देश अंग्रेज़ी में ही रहते हैं। +> +> अनुवाद में कोई त्रुटि दिखे तो कृपया उसे स्वयं सुधारने में मदद करें: +> रिपॉज़िटरी को फ़ॉर्क (fork) करें और अपना सुधार पुल रिक्वेस्ट (pull request) +> के रूप में भेजें — https://github.com/NTARI-RAND/Cloudy। अनुवाद-सुधार +> हमारे लिए किसी भी अन्य योगदान जितने ही मूल्यवान हैं, और उनका सदा स्वागत है। + +> **प्राथमिकता-सूचना।** अंग्रेज़ी मूल ही मानकीय (normative) है। यह अनुवाद पढ़ने के लिए प्रस्तुत है, व्याख्या के लिए नहीं: जहाँ यह `CONFORMANCE.md` से भिन्न हो, वहाँ अंग्रेज़ी पाठ ही मान्य होगा। मानकीय कुंजीशब्द (MUST, MUST NOT, SHOULD, SHOULD NOT, MAY), फ़ील्ड नाम, लेबल और पहचानकर्ता अंग्रेज़ी में ही रखे गए हैं, क्योंकि वही अनुरूपता का अनुबंध हैं। + +# अनुरूपता — Janus-Facing Architecture + +संरचना की अपनी शब्दावली में इस रिपॉज़िटरी का आत्म-विवरण, संरचना के क्रम-नियम के अनुसार किसी भी उत्पाद-विशिष्ट बात से **पहले** प्रस्तुत। अनुरूपता का हर दावा उसे प्रवर्तित करने वाले तंत्र और जाँच से आबद्ध है, अन्यथा उसे स्टैंड-इन (stand-in) या स्टब (stub) के रूप में लेबल किया जाता है। आबद्धता-रहित गद्य विपणन है। + +यह संरचना **द्विमुखी संरचना — Janus-Facing Architecture (JFA)** है — NTARI का एकीकृत संरचना-दस्तावेज़, जो परियोजना के AGPL-3.0 साझा कोष (commons) के अंतर्गत मुक्त प्रलेखन है। + +## भूमिका-घोषणा + +Cloudy एक JFA आधार (substrate) का **फ़्रंटएंड** है — सदस्य-मुखी अनुप्रयोग — और उन **सदस्य-अर्थव्यवस्था स्तरों** का घर है जिन्हें आधार का समन्वय प्रोटोकॉल जान-बूझकर परिभाषित नहीं करता: प्रति-संचालक संवाद अभिलेख, प्रतिष्ठा-प्रतिज्ञा (reputation covenant), और सदस्य-निर्गमित ऋण। सदस्य यहीं और केवल यहीं अस्तित्व में हैं; इस रिपॉज़िटरी के नीचे का समन्वय वायर (wire) किसी व्यक्ति को नहीं जानता। Cloudy एक स्वतंत्र, फ़ॉर्क-योग्य उत्पाद है: यह प्रकाशित प्रोटोकॉल बोलता है और कोई भी अनुरूप कोऑर्डिनेटर (coordinator) इसे सेवा दे सकता है। + +| इस रिपॉज़िटरी का शब्द | संरचना में भूमिका | +|---|---| +| `internal/record` | **प्रति-संचालक संवाद बहीखाता (per-operator dialog ledger)** — केवल-संवर्धी (append-only), संवाद-मुहरबंद (dialog-sealed), साक्षीकृत | +| `internal/covenant` | **आकलन-पैमाने (assessment scale)** का कार्यान्वयन (प्रतिज्ञा के रूप में सदस्य-प्रतिष्ठा) | +| `internal/economy` | **सदस्य-निर्गमित ऋण (member-issued credit)** (सदस्य-अर्थव्यवस्था) | +| `internal/coord` | आधार के **समन्वय प्रोटोकॉल (coordination protocol)** का उपभोग | +| `internal/enroll` | किसी कोऑर्डिनेटर के साथ **फ़्रंटएंड-संचालक के रूप में नामांकन (frontend-as-operator enrollment)** (apply → keys → verify → conformance → active) | +| सदस्य (Member) | एक व्यक्ति, प्लेटफ़ॉर्म-सीमित (platform-scoped); PII सदस्य-स्थानीय और मिटाने-योग्य रहती है | + +## अपरिवर्तनीय नियम (invariants) और उनके बंधन — `main` की स्थिति के अनुसार + +स्थितियाँ संरचना के ईमानदारी-नियम के अनुसार बताई गई हैं। इससे आगे का निर्मित सदस्य-स्तर कार्य खुले PR स्टैक में मौजूद है, और जैसे-जैसे वह शामिल (land) होता है, यह तालिका अद्यतन होती है। + +| अपरिवर्तनीय नियम (संरचना) | main पर स्थिति | तंत्र / जाँच | +|---|---|---| +| अभिलेख **केवल-संवर्धी** है; सुधार नई प्रविष्टियाँ होते हैं | **Built** (निर्मित) | `internal/record`: Store/Log केवल Append उजागर करते हैं — update और delete अनुपस्थित क्रियाएँ (verbs) हैं; पैकेज-प्रलेखन (package doc) संरचनात्मक नियम बताता है; परीक्षण | +| अभिलेख **संवाद-मुहरबंद** है — जिस पर दो सदस्यों ने सहमति दी, न कि जो एक सदस्य दावा करे | **Built** (निर्मित) | कैनोनिकल बाइटों (canonical bytes) पर द्वि-मुहर (dual-seal) सत्यापन; स्व-संवाद (self-dialog) निर्माण के समय ही अस्वीकृत | +| **साझा कोष (commons) में कोई PII नहीं**; विवरण (narrative) सदस्य-स्थानीय और मिटाने-योग्य रहता है | **Built** (निर्मित) | साझा कोष के प्रकार (types) केवल हैश, कुंजियाँ और क्षण (instants) वहन करते हैं; मिटाने-योग्य सामग्री एक प्रकार-पृथक (type-disjoint) सदस्य-स्थानीय भंडार में रहती है | +| संरचनात्मक स्वतंत्रता के साथ **साक्ष्यकरण**; एकल-साक्षी परिनियोजन एक लेबल किया गया स्टैंड-इन है | **Built (stand-in)** (निर्मित, स्टैंड-इन) | युग्मवार-स्वतंत्रता (pairwise-independence) सत्यापन के साथ साक्षी प्रति-हस्ताक्षर; StandIn लेबल गणना से निकाला जाता है, घोषित नहीं किया जाता | +| प्रतिज्ञा: **कभी औसत नहीं**; पूर्ण वितरण; सममित; केवल "हाँ या नहीं" का द्वार तय करती है, "कितना" का कभी नहीं (gates whether-never-how-much) | **Stub, labeled** (स्टब, लेबल-सहित) | `internal/covenant` का पैकेज-प्रलेखन उन अपरिहार्य (non-negotiable) अपरिवर्तनीय नियमों की घोषणा करता है जिन्हें निर्मित होने पर उसे संतुष्ट करना होगा; निर्मित कार्यान्वयन समीक्षाधीन | +| अर्थव्यवस्था: शेष-राशियाँ **मुहरबंद अभिलेख का नियतात्मक फलन** हैं; शून्य-योग (zero-sum); एस्क्रो-प्रथम; अर्जित, कभी क्रय नहीं (earned-never-bought) | **Stub, labeled** (स्टब, लेबल-सहित) | `internal/economy` का पैकेज-प्रलेखन अपरिवर्तनीय नियमों की घोषणा करता है; निर्मित कार्यान्वयन समीक्षाधीन | +| **एकल प्रतिभागी पहचान** — एक सदस्य, एक साथ योगदानकर्ता और उपभोक्ता | Design-binding (डिज़ाइन-बाध्यकारी) | किसी भी स्कीमा या प्रकार में उत्पादक/उपभोक्ता विभाजन मौजूद नहीं; जैसे-जैसे हर सदस्य-सतह शामिल होती है, यह उसे बाध्य करता है | +| **फ़ॉर्क-योग्यता (Forkability)** | Built (निर्मित) | समन्वय प्रोटोकॉल का एक प्रकाशित संस्करण-टैग पर उपभोग करता है; कोई भी कोऑर्डिनेटर विशेषाधिकार-प्राप्त नहीं | + +## JFA रजिस्ट्री बंधन + +Janus अपरिवर्तनीय-नियम रजिस्ट्री (NTARI-RAND/Janus में `jfa-conformance-suite.py`) की किसी ID को आबद्ध करने वाले परीक्षणों का नाम `TestInvariant__` रखा जाता है, जिसमें ID का हर `-` `_` के रूप में लिखा जाता है (इसलिए `REC-six-holders` बन जाता है `TestInvariant_REC_six_holders_…`)। `go test -run TestInvariant_ -v ./...` हर बंधन और उसका परिणाम सूचीबद्ध करता है। + +| रजिस्ट्री ID | परीक्षण | पैकेज के मौजूदा परीक्षणों से आगे यह क्या जोड़ता है | +|---|---|---| +| **L1** — प्रत्येक विनिमय दो शेष-राशियों को बदलता है, जिनका शुद्ध योग शून्य होता है | `internal/economy` `TestInvariant_L1_ZeroSumBalance` | एक ही भंडार साझा करने वाले दो बहीखातों के आर-पार समवर्ती (concurrent) भुगतानकर्ता; प्रति-अभिलेख शुद्ध-योग (netting); पुनःचालन (replay) हर शेष-राशि को फिर से उत्पन्न करता है | +| **L6** — कोई यथास्थान-अद्यतन नहीं, कोई विलोपन नहीं; खारिजी (dismissal) एक टिप्पणी (annotation) है | `internal/record` `TestInvariant_L6_AppendOnly` (खारिजी वाला आधा भाग: `internal/covenant` `TestAnswersCloseTheSymmetryBreach`) | एक सुधार नई प्रविष्टि के रूप में जुड़ता (append) है और सुधारी गई प्रविष्टि तथा सभी पूर्ववर्ती प्रमाणों को अक्षुण्ण छोड़ता है; भंडारण पर सीधे किया गया यथास्थान पुनर्लेखन, उससे पहले लिए गए चेकपॉइंट के विरुद्ध संगति-जाँच में विफल होता है; मॉड्यूल-व्यापी स्रोत-स्कैन किसी भी केवल-संवर्धी प्रकार पर कोई update या delete क्रिया नहीं पाता — ऐसे प्रकारों का अनुसरण नाम से (Store/Log/Ledger/Book) या "append-only" डॉक-टिप्पणी से किया जाता है, और `market.Catalog` तथा `techtree.Tree` को पिन किया गया है ताकि वे दायरे से बाहर न हो सकें | +| **L7** — साझा कोष केवल हैश, प्रकार, टाइमस्टैम्प और संदर्भ रखता है | `internal/record` `TestInvariant_L7_CommonsSchema` | साझा कोष का हर प्रकार, फ़ील्ड-दर-फ़ील्ड, केवल बाइट-ऐरे, अचिह्नित (unsigned) पूर्णांक, `time.Time`, और ed25519 कुंजियों व हस्ताक्षरों की एक स्पष्ट अनुमति-सूची (allowlist) में नामित `[]byte` फ़ील्ड ही स्वीकार करता है — कोई string, map, interface, float, या असूचीबद्ध `[]byte` नहीं; अनुमति-सूची का हर फ़ील्ड, किसी मेमो (memo) से भरे (padded) जाने पर, एक सफल बिना-भराव वाले नियंत्रण (control) के मुक़ाबले सत्यापन में विफल होता है और कभी किसी लॉग में प्रवेश नहीं करता | +| **L8** — पूर्ण वितरण वहन किया जाता है; कहीं भी कोई अदिश (scalar) स्कोर नहीं | `internal/covenant` `TestInvariant_L8_NoScalarAggregation` | समान माध्य और भिन्न आकार वाले दो सदस्य अलग-अलग पहचाने जा सकते रहते हैं; स्कोर-नामित या float लौटाने वाले निर्यातित (exported) फ़ंक्शनों, स्कोर-जैसे JSON टैगों, और प्रतिष्ठा पैकेजों में float फ़ील्डों के लिए मॉड्यूल-व्यापी स्रोत-स्कैन | + +## स्टैंड-इन और खुले अवशेष + +- **एकल-साक्षी StandIn।** आज हर साक्षीकृत चेकपॉइंट के पास दो से कम स्वतंत्र साक्षी हैं; अभिलेख स्तर इस लेबल की संरचनात्मक रूप से गणना करता है और उसे रिपोर्ट करता है। सजीव संघ (live federation) संरचना की खुली समस्या 2 है — आधारशिला निर्माण (keystone build)। +- **प्रतिज्ञा और अर्थव्यवस्था main पर स्टब हैं।** उनके पैकेज-प्रलेखन बाध्यकारी अपरिवर्तनीय नियम वहन करते हैं; निर्मित कार्यान्वयन खुले, एक-के-ऊपर-एक रखे (stacked) PR में हैं, और मर्ज होने के लिए उन्हें उन प्रलेखनों को संतुष्ट करना होगा। +- **अभिलेख डोमेन-टैग का नाम-परिवर्तन** (उत्पाद-नामकरण) लंबित है और इसे **किसी भी टिकाऊ स्थायित्व (durable persistence) से पहले** शामिल होना होगा — टिकाऊ लॉग बन जाने के बाद पुनः-टैग करना एक पुनर्लेखन होगा। +- **नामित अभिलेख अवशेष** (स्टेगनोग्राफ़िक न्यूनतम सीमा, टाइमस्टैम्प गुप्त चैनल, साक्षी-विस्मृति, जीवंतता-अंतराल) अभिलेख पैकेज-प्रलेखन में दर्ज हैं, उन्हें अनदेखा करने का दिखावा नहीं किया गया है। +- **योगदानकर्ता नोड — Executor सीम (seam) निर्मित; रनटाइम कार्यान्वयन लंबित।** `internal/contribute` नोड-योगदान अनुबंध (Executor / ServiceExecutor / Registry / NodeContract) तय करता है, परीक्षणों द्वारा प्रवर्तित दो अपरिवर्तनीय नियमों के साथ: एक स्कैवेंज्ड (scavenged) नोड केवल प्रीएम्प्टिबल (preemptible) एक्ज़ीक्यूटर स्वीकार करता है (स्वामी कभी बाधित नहीं — owner-never-interrupted), और एक Service वर्कलोड को पिन किया गया प्लेसमेंट चाहिए। `cmd/cloudy-agent` इसे आरंभ से अंत तक चलाता है, एक **वास्तविक** Storage एक्ज़ीक्यूटर (अपारदर्शी मुहरबंद शार्ड + `internal/storage` कब्ज़े-का-प्रमाण / proof-of-possession) और **प्लेसहोल्डर** Compute/Service एक्ज़ीक्यूटरों के साथ। कोऑर्डिनेटर के संक्रमणकालीन `internal/agent` से भारी रनटाइम पोर्ट — Docker एक्ज़ीक्यूटर, gopsutil हार्डवेयर सैंपलिंग, opt-out/allowlist/printers, और agent→cloudyd→`/v0` रिले — नामित अगला कदम है, और यह इस सीम को बदले बिना इसके *पीछे* शामिल होता है। +- **संचालक नामांकन ड्राइवर — निर्मित और सजीव-सत्यापित।** `internal/enroll` + `cmd/cloudy-enroll` किसी कोऑर्डिनेटर के संचालक ऑनबोर्डिंग जीवनचक्र को आरंभ से अंत तक चलाते हैं (आवेदन → 7-कुंजी समुच्चय का पंजीकरण → ईमेल सत्यापन → अनुरूपता सूट A/B → स्वचालित सक्रियण), और कुंजी-अभिरक्षा के लिए तथा वास्तविक प्रोटोकॉल कैनन (canon) के माध्यम से अनुरूपता-उत्तरों की गणना के लिए `internal/opcred` का पुनः उपयोग करते हैं। Suite C का मूल्यांकन कोऑर्डिनेटर की ओर होता है और उसे किसी संचालक-प्रतिक्रिया की आवश्यकता नहीं होती, इसलिए कोई suite-C चरण नहीं है। क्लाइंट को जान-बूझकर `internal/coord` से अलग रखा गया है: नामांकन कोऑर्डिनेटर की **पोर्टल** सतह पर सादा JSON है, `/v0` नोड-पक्षीय वायर नहीं। आउट-ऑफ़-बैंड ईमेल कोड एक इंजेक्ट किए गए `CodeSource` के माध्यम से दिया जाता है। एक सजीव SoHoLINK कोऑर्डिनेटर के विरुद्ध सत्यापित — नामांकित संचालक `active` तक पहुँचा, और उसके बाद उसके क्रेडेंशियल ने `/v0` पर प्रमाणीकरण किया। + +## निर्भरता-घोषणा + +`sohocloud-protocol` का एक प्रकाशित संस्करण-टैग पर उपभोग करता है — स्टैक से और कुछ नहीं। सदस्य-स्तर मुहरबंद विनिमयों को अपारदर्शी लीफ़ ID (opaque leaf ID) द्वारा, मान (value) के रूप में संदर्भित करते हैं, कभी भी अभिलेख-प्रकारों को अन्य स्तरों में आयात करके नहीं; रूपांतरण केवल संयोजन-मूल (composition root) पर होता है। + +## उत्पाद-विशिष्ट टिप्पणियाँ (अंत में, क्रम-नियम के अनुसार) + +Cloudy एक स्वतंत्र उपभोक्ता उत्पाद के रूप में जारी होता है (इसकी अपनी सदस्य API और ऐप सतहें, समीक्षाधीन)। SoHoLINK वह संदर्भ कोऑर्डिनेटर है जिससे यह संवाद करता है; कोई भी अनुरूप कोऑर्डिनेटर उसका स्थान ले सकता है। diff --git a/CONFORMANCE.pt.md b/CONFORMANCE.pt.md new file mode 100644 index 0000000..0e09bcd --- /dev/null +++ b/CONFORMANCE.pt.md @@ -0,0 +1,69 @@ +> Tradução comunitária (rascunho) — Política NTARI P2-002, Transmissão Multilíngue Global (Global Multilingual Broadcast). Fonte: CONFORMANCE.md (original em inglês, snapshot de 2026-10-05). Rascunho comunitário assistido por máquina, pendente de revisão por mantenedor regional conforme P2-002 §3.1. As especificações técnicas centrais permanecem em inglês conforme §2.2. +> +> Notou algum erro nesta tradução? Correções de tradução são contribuições +> valiosas e muito bem-vindas: faça um fork do repositório e abra um pull +> request em https://github.com/NTARI-RAND/Cloudy. + +> O original em inglês é normativo. Esta tradução é oferecida para leitura, não para interpretação: onde ela divergir de `CONFORMANCE.md`, prevalece o inglês. As palavras-chave normativas (MUST, MUST NOT, SHOULD, SHOULD NOT, MAY), os nomes de campos, os rótulos e os identificadores são mantidos em inglês porque constituem o contrato de conformidade. + +# Conformidade — Arquitetura de Dupla Face (Janus-Facing Architecture) + +A autodescrição do repositório nos próprios termos da arquitetura, apresentada **antes** de qualquer coisa específica do produto, conforme a regra de ordenação da arquitetura. Toda alegação de conformidade está vinculada ao mecanismo e à verificação que a fazem cumprir, ou então é rotulada como provisória (stand-in) ou stub. Prosa sem vínculo é marketing. + +A arquitetura é a **Arquitetura de Dupla Face (Janus-Facing Architecture, JFA)** — o documento de arquitetura unificada da NTARI, documentação livre sob o commons AGPL-3.0 do projeto. + +## Declaração de papel + +O Cloudy é um **frontend** de um substrato JFA — a aplicação voltada aos membros — e o lar das **camadas de economia dos membros** que o protocolo de coordenação do substrato deliberadamente não define: o registro de diálogos por operador, o pacto de reputação e o crédito emitido pelos membros. Os membros existem aqui e somente aqui; o canal de coordenação abaixo deste repositório não conhece pessoas. O Cloudy é um produto autônomo e passível de fork: ele fala o protocolo publicado, e qualquer coordenador conforme pode servi-lo. + +| Termo deste repositório | Papel na arquitetura | +|---|---| +| `internal/record` | o **livro-razão de diálogos por operador** — somente de adição, selado por diálogo, testemunhado | +| `internal/covenant` | a implementação da **escala de avaliação** (reputação dos membros como pacto) | +| `internal/economy` | o **crédito emitido pelos membros** (a economia dos membros) | +| `internal/coord` | o consumo do **protocolo de coordenação** do substrato | +| `internal/enroll` | a **inscrição do frontend como operador** junto a um coordenador (apply → keys → verify → conformance → active) | +| Membro | uma pessoa, com escopo de plataforma; a PII permanece local ao membro e apagável | + +## Invariantes e seus vínculos — conforme `main` + +Os status são apresentados conforme a regra de honestidade da arquitetura. O trabalho já construído na camada de membros além deste existe na pilha de PRs abertos e atualiza esta tabela à medida que é integrado. + +| Invariante (arquitetura) | Status em main | Mecanismo / verificação | +|---|---|---| +| O registro é **somente de adição**; correções são novas entradas | **Construído** | `internal/record`: Store/Log expõem apenas Append — atualização e exclusão são verbos ausentes; a documentação do pacote enuncia as regras estruturais; testes | +| O registro é **selado por diálogo** — o que dois membros acordaram, não o que um deles afirma | **Construído** | Verificação de selo duplo sobre bytes canônicos; o autodiálogo é rejeitado na construção | +| **Nenhuma PII no commons**; a narrativa permanece local ao membro e apagável | **Construído** | Os tipos do commons carregam apenas hashes, chaves e instantes; o conteúdo apagável vive em um armazenamento local ao membro, disjunto em tipos | +| **Testemunho** com independência estrutural; uma implantação com uma única testemunha é uma solução provisória (stand-in) rotulada | **Construído (provisório)** | Contra-assinaturas de testemunhas com verificação de independência par a par; o rótulo StandIn é computado, não afirmado | +| Pacto: **nunca fazer média**; distribuição completa; simétrico; controla o se, nunca o quanto | **Stub, rotulado** | A documentação do pacote `internal/covenant` declara as invariantes inegociáveis que ele deve satisfazer quando construído; a implementação construída está em revisão | +| Economia: saldos são uma **função determinística do registro selado**; soma zero; custódia em primeiro lugar; conquistado, nunca comprado | **Stub, rotulado** | A documentação do pacote `internal/economy` declara as invariantes; a implementação construída está em revisão | +| **Identidade única de participante** — um membro, simultaneamente contribuidor e consumidor | Vinculante por design | Não existe divisão entre produtor e consumidor em nenhum esquema ou tipo; vincula toda superfície de membro à medida que é integrada | +| **Possibilidade de fork** | Construído | Consome o protocolo de coordenação em uma tag de versão publicada; nenhum coordenador é privilegiado | + +## Vínculos ao registro da JFA + +Os testes que vinculam um ID do registro de invariantes do Janus (`jfa-conformance-suite.py` em NTARI-RAND/Janus) são nomeados `TestInvariant__`, com qualquer `-` do ID escrito como `_` (assim, `REC-six-holders` torna-se `TestInvariant_REC_six_holders_…`). `go test -run TestInvariant_ -v ./...` lista cada vínculo e seu resultado. + +| ID no registro | Teste | O que acrescenta além dos testes já existentes do pacote | +|---|---|---| +| **L1** — cada troca movimenta dois saldos cuja soma líquida é zero | `internal/economy` `TestInvariant_L1_ZeroSumBalance` | Pagadores concorrentes em dois livros-razão que compartilham um mesmo armazenamento; compensação por registro; a reexecução reproduz cada saldo | +| **L6** — nenhuma atualização no lugar, nenhuma exclusão; o arquivamento é anotação | `internal/record` `TestInvariant_L6_AppendOnly` (metade do arquivamento: `internal/covenant` `TestAnswersCloseTheSymmetryBreach`) | Uma correção é adicionada e deixa intactas a entrada corrigida e todas as provas anteriores; uma reescrita no lugar feita diretamente no armazenamento falha na verificação de consistência contra um checkpoint tomado antes dela; uma varredura do código-fonte de todo o módulo não encontra nenhum verbo de atualização ou exclusão em nenhum tipo somente de adição — rastreado pelo nome (Store/Log/Ledger/Book) ou por um comentário de documentação "append-only", com `market.Catalog` e `techtree.Tree` fixados para que não possam sair do escopo | +| **L7** — o commons guarda apenas hashes, tipos, carimbos de tempo e referências | `internal/record` `TestInvariant_L7_CommonsSchema` | Todo tipo do commons, campo por campo, admite apenas arrays de bytes, inteiros sem sinal, `time.Time` e campos `[]byte` nomeados em uma lista de permissões explícita de chaves e assinaturas ed25519 — nenhum campo string, map, interface, float ou `[]byte` não listado; todo campo da lista de permissões, preenchido com um memorando, falha na verificação contra um controle sem preenchimento que passa, e nunca entra em um log | +| **L8** — a distribuição completa é mantida; nenhuma pontuação escalar em lugar algum | `internal/covenant` `TestInvariant_L8_NoScalarAggregation` | Dois membros com médias iguais e formas diferentes permanecem distinguíveis; uma varredura do código-fonte de todo o módulo em busca de funções exportadas com nome de pontuação ou que retornam float, tags JSON semelhantes a pontuação e campos float nos pacotes de reputação | + +## Soluções provisórias e resíduos em aberto + +- **StandIn de testemunha única.** Todo checkpoint testemunhado hoje tem menos de duas testemunhas independentes; a camada de registro computa e reporta esse rótulo estruturalmente. A federação ao vivo é o problema em aberto 2 da arquitetura — a construção central. +- **Pacto e economia são stubs em main.** A documentação de seus pacotes carrega as invariantes vinculantes; as implementações construídas estão nos PRs abertos e empilhados e devem satisfazer essa documentação para serem integradas. +- **Renomeação da domain-tag do registro** (nomenclatura do produto) está pendente e deve ser integrada **antes de qualquer persistência durável** — reetiquetar depois que existirem logs duráveis seria uma reescrita. +- **Resíduos nomeados do registro** (piso esteganográfico, canal encoberto de carimbo de tempo, amnésia de testemunha, lacuna de vivacidade) são documentados na documentação do pacote de registro, em vez de serem ignorados como se não existissem. +- **Nó contribuidor — interface Executor construída; implementações de runtime pendentes.** `internal/contribute` fixa o contrato de contribuição de nós (Executor / ServiceExecutor / Registry / NodeContract) com duas invariantes impostas por testes: um nó aproveitado aceita apenas executores preemptíveis (o proprietário nunca é interrompido), e uma carga de trabalho Service exige posicionamento fixado. `cmd/cloudy-agent` executa isso de ponta a ponta com um executor Storage **real** (fragmentos selados opacos + a prova de posse de `internal/storage`) e executores Compute/Service **provisórios** (placeholder). A portabilidade pesada de runtime a partir do `internal/agent` transitório do coordenador — executor Docker, amostragem de hardware com gopsutil, opt-out/allowlist/impressoras e o relay agent→cloudyd→`/v0` — é o próximo passo nomeado e será integrada *por trás* dessa interface sem alterá-la. +- **Driver de inscrição de operadores — construído e verificado ao vivo.** `internal/enroll` + `cmd/cloudy-enroll` conduzem de ponta a ponta o ciclo de vida de integração de operadores de um coordenador (apply → registro do conjunto de 7 chaves → verificação por e-mail → conjuntos de conformidade A/B → ativação automática), reutilizando `internal/opcred` para a custódia de chaves e para computar as respostas de conformidade por meio do cânone real do protocolo. O conjunto C é avaliado do lado do coordenador e não precisa de resposta do operador, portanto não há etapa do conjunto C. O cliente é deliberadamente separado de `internal/coord`: a inscrição é JSON simples na superfície de **portal** do coordenador, não no canal `/v0` do lado dos nós. O código de e-mail fora de banda é fornecido por meio de um `CodeSource` injetado. Verificado contra um coordenador SoHoLINK ao vivo — o operador inscrito alcançou `active` e sua credencial então se autenticou em `/v0`. + +## Declaração de dependências + +Consome `sohocloud-protocol` em uma tag de versão publicada — nada mais da pilha. As camadas de membros referenciam trocas seladas por ID de folha opaco, por valor, nunca importando tipos de registro para outras camadas; a conversão ocorre apenas na raiz de composição. + +## Notas específicas do produto (por último, conforme a regra de ordenação) + +O Cloudy é distribuído como um produto de consumo autônomo (com sua própria API de membros e superfícies de aplicativo, em revisão). O SoHoLINK é o coordenador de referência com o qual ele se comunica; qualquer coordenador conforme pode substituí-lo. diff --git a/CONFORMANCE.tok.md b/CONFORMANCE.tok.md new file mode 100644 index 0000000..0ca5762 --- /dev/null +++ b/CONFORMANCE.tok.md @@ -0,0 +1,73 @@ +# lipu pi nasin sama — Janus-Facing Architecture (toki pona) + +> **toki lili pi lipu ni:** lipu ni li lipu pi kulupu, li tan nasin NTARI "P2-002". lipu suli li lipu Inli "CONFORMANCE.md" (tenpo pi 2026-10-05). ilo sona li pali e lipu ni; kulupu li wile lukin e ona kepeken nasin "P2-002" kipisi "3.1". +> +> **Note:** This is a community rendering under NTARI policy P2-002. The complete document is the English original CONFORMANCE.md (snapshot 2026-10-05). Machine-assisted draft pending community review per P2-002 section 3.1. +> +> sina lukin e pakala lon toki ni la o pona e ona: o pali e "fork" lon +> https://github.com/NTARI-RAND/Cloudy, o pana e "pull request". pana sina +> li pona tawa mi mute. +> +> **lipu Inli li lawa.** lipu ni li tawa lukin, li tawa ala sona pi nasin lawa: lipu ni li ante tan `CONFORMANCE.md` la lipu Inli li lawa. nimi lawa (MUST, MUST NOT, SHOULD, SHOULD NOT, MAY), nimi pi poki sona, nimi sitelen en nimi ilo li awen lon toki Inli, tan ni: ona li lipu lawa pi nasin sama. + +--- + +lipu ni la poki lipu li toki e ona sama kepeken nimi pi nasin JFA. ona li toki e ni **lon open**, li toki e ijo pi ilo Cloudy taso lon monsi, tan nasin pi nanpa toki pi nasin JFA. toki ale pi nasin sama li linja tawa ilo en lukin ni: ilo en lukin li wawa e toki ni. linja li lon ala la sitelen li toki e ni: toki ni li ijo pi tenpo lili (stand-in) anu ijo open (stub). toki pi linja ala li toki esun taso. + +nasin ni li **Janus-Facing Architecture (JFA)** — lipu wan pi nasin ilo pi kulupu NTARI. jan ale li ken kepeken lipu ni; ona li lon poki pi jan ale pi poki ni (nasin "AGPL-3.0"). + +## toki pi pali + +ilo Cloudy li **lupa lukin** pi kipisi ilo JFA — ona li ilo tawa jan kulupu — li tomo pi **kipisi pi esun pi jan kulupu**. nasin insa pi kipisi ilo li toki ala e kipisi ni, tan wile: lipu toki pi jan pi ilo suli wan wan, toki awen pi sona pona jan, en mani pi jan kulupu (jan kulupu li pana e ona). jan kulupu li lon ni, li lon ni taso; linja pi nasin insa anpa poki ni li sona ala e jan. ilo Cloudy li ilo wan taso, li ken kama ilo sin tan sama ("fork"): ona li toki kepeken nasin insa open; ilo insa ale pi nasin sama li ken pana tawa ona. + +| nimi pi poki ni | pali lon nasin JFA | +|---|---| +| `internal/record` | **lipu toki pi jan pi ilo suli wan wan** — toki sin taso li ken kama lon ona; toki li awen tan jan tu pi toki; jan lukin li lukin e ona | +| `internal/covenant` | ilo pi **nasin nanpa lukin** (sona pona pi jan kulupu li toki awen) | +| `internal/economy` | **mani pi jan kulupu** (jan kulupu li pana e ona) (esun pi jan kulupu) | +| `internal/coord` | ona li kepeken **nasin insa** pi kipisi ilo | +| `internal/enroll` | **lupa lukin li kama jan pi ilo suli** lon ilo insa (apply → keys → verify → conformance → active) | +| Member | jan, lon ilo wan taso; sona pi jan ("PII") li awen lon poki pi jan kulupu, jan li ken weka e ona | + +## nasin awen en linja ona — lon `main` + +toki pi lon seme li kama tan nasin pi toki lon pi nasin JFA. pali pini ante pi kipisi pi jan kulupu li lon kulupu PR open; ona li kama lon `main` la ona li ante e lipu leko ni. + +| nasin awen (nasin JFA) | lon seme lon main | ilo / lukin | +|---|---|---| +| lipu awen li **kama suli taso**; pona pi pakala li toki sin | **Built** (pali li pini) | `internal/record`: Store/Log li pana e Append taso — nimi pali pi ante (update) en weka (delete) li lon ala; lipu pi poki ilo li toki e nasin pi sijelo ona; ilo lukin (tests) | +| lipu awen li **awen tan toki** — ona li ijo pi wile sama pi jan kulupu tu, li ijo pi toki pi jan wan ala | **Built** (pali li pini) | ilo li lukin e sitelen awen tu lon nanpa lili pi nasin wan (canonical bytes); jan li toki tawa ona sama la ilo li ken ala pali e toki ni | +| **sona pi jan ("PII") li lon ala poki pi jan ale**; toki suli li awen lon poki pi jan kulupu, jan li ken weka e ona | **Built** (pali li pini) | kule ijo pi poki pi jan ale li jo e nanpa "hash", e nimi open (keys), e tenpo taso; ijo pi ken weka li lon poki pi jan kulupu; kule ijo pi poki ni li wan ala tawa kule ijo pi poki pi jan ale | +| **jan lukin** li lon, li lawa ala tan jan ante tan sijelo pi nasin; ilo li jo e jan lukin wan taso la sitelen li toki e ni: ona li ijo pi tenpo lili | **Built (stand-in)** (pali li pini, li ijo pi tenpo lili) | jan lukin li sitelen e nimi ona lon poka; ilo li lukin e ni: jan lukin tu ale li lawa ala e jan ante; ilo li nanpa e sitelen StandIn; sitelen ni li kama ala tan toki jan taso | +| toki awen: **nanpa meso ala lon tenpo ale**; mute ale pi pana; jasima; ona li toki e ni taso: "esun li ken anu seme?", li toki ala e ni: "mute seme?" | **Stub, labeled** (ijo open, sitelen li toki e ni) | lipu pi poki ilo `internal/covenant` li toki e nasin awen; jan li ken ala ante e nasin ni; ilo pini o pona tawa nasin ni; ilo pini li lon lukin | +| esun: mani pi jan li **kama tan lipu awen taso, kepeken nasin pi ante ala**; nanpa ale li ala (0); mani awen li nanpa wan; jan li pali e mani, li esun ala e mani | **Stub, labeled** (ijo open, sitelen li toki e ni) | lipu pi poki ilo `internal/economy` li toki e nasin awen; ilo pini li lon lukin | +| **jan pali jo wan** — jan kulupu wan li jan pana li jan kama jo lon tenpo sama | Design-binding (nasin pi pali ilo li lawa) | nasin ilo ale (schema) en kule ijo ale li tu ala e jan pana e jan kama jo; lupa ale pi jan kulupu li kama la nasin ni li lawa e ona | +| **ken pi kama sin tan sama ("fork")** | Built (pali li pini) | ona li kepeken nasin insa lon nimi nanpa open (version tag); ilo insa ala li jo e ken suli | + +## linja tawa lipu nimi pi nasin JFA + +ilo lukin (tests) li linja e nimi nanpa (ID) tan lipu nimi pi nasin awen pi ilo Janus (`jfa-conformance-suite.py` lon NTARI-RAND/Janus) la nimi ona li `TestInvariant__`. sitelen `-` li lon nimi nanpa la ona li kama `_` (sama ni: `REC-six-holders` li kama `TestInvariant_REC_six_holders_…`). `go test -run TestInvariant_ -v ./...` li pana e linja ale e pini ona. + +| nimi nanpa (Registry ID) | ilo lukin (Test) | ona li pana e seme lon poka pi ilo lukin pi poki ilo | +|---|---|---| +| **L1** — esun ale li ante e mani tu; nanpa ale ona li ala | `internal/economy` `TestInvariant_L1_ZeroSumBalance` | jan pana mute li pana lon tenpo sama lon lipu mani tu; lipu tu li kepeken poki wan; nanpa pi toki wan wan li ala; ilo li pali sin e lipu la mani ale li kama sama | +| **L6** — ante lon poka sama ala, weka ala; jan li weka e toki la ona li pana e toki lon poka | `internal/record` `TestInvariant_L6_AppendOnly` (kipisi pi weka e toki: `internal/covenant` `TestAnswersCloseTheSymmetryBreach`) | pona pi pakala li toki sin lon pini; toki pakala en sitelen ale pi lon pi tenpo pini li awen sama; jan li sitelen sin e toki lon poki awen lon poka sama la ilo li lukin e ni: ona li sama ala sitelen awen (checkpoint) tan tenpo pini; ilo li lukin e lipu ilo ale pi kulupu ilo (module), li lukin ala e nimi pali pi ante (update) anu weka (delete) lon kule ijo ale pi kama suli taso — ilo li sona e kule ijo ni tan nimi (Store/Log/Ledger/Book) anu tan toki "append-only" lon lipu ilo; `market.Catalog` en `techtree.Tree` li awen lon lipu, la ona li ken ala weka tan lukin | +| **L7** — poki pi jan ale li jo e nanpa "hash", e kule ijo, e tenpo, e nasin tawa sona taso | `internal/record` `TestInvariant_L7_CommonsSchema` | kule ijo ale pi poki pi jan ale li ken jo e ni taso lon poki lili ale ona: kulupu nanpa lili (byte arrays), nanpa ale pi anpa ala (unsigned integers), `time.Time`, en poki lili `[]byte` lon lipu pi ken (allowlist) pi nimi open en sitelen nimi pi nasin ed25519 — sitelen toki (string) ala, poki nimi (map) ala, lupa ilo (interface) ala, nanpa kipisi (float) ala, `[]byte` pi lipu ala ala; jan li pana e toki lili (memo) tawa poki lili ale pi lipu pi ken la ilo lukin li pakala, taso ijo sama pi toki lili ala li pona; ijo ni li kama ala lon lipu awen (log) | +| **L8** — mute ale pi pana li awen; nanpa wan (scalar score) li lon ala lon ma ale | `internal/covenant` `TestInvariant_L8_NoScalarAggregation` | jan kulupu tu li jo e nanpa meso sama e selo ante la ilo li ken sona e ante ona; ilo li lukin e lipu ilo ale pi kulupu ilo (module) tawa ni: nasin pali open (exported functions) pi nimi "score" anu pi pana e nanpa kipisi (float), nimi lili JSON sama "score", en poki lili pi nanpa kipisi lon poki ilo pi sona pona jan | + +## ijo pi tenpo lili en ijo pi pini ala + +- **StandIn pi jan lukin wan.** tenpo ni la sitelen awen (checkpoint) ale pi jan lukin li jo e jan lukin ala anu jan lukin wan taso (jan lukin ni li lawa ala tan jan ante); kipisi pi lipu awen li nanpa e sitelen ni tan sijelo ona, li toki e ona. kulupu pi ilo mute (federation) pi tenpo lon li wile sona nanpa 2 pi pini ala pi nasin JFA — ona li pali pi kiwen lawa (keystone). +- **toki awen en esun li ijo open (stub) lon main.** lipu pi poki ilo ona li jo e nasin awen lawa; ilo pini li lon kulupu PR open (PR li lon sewi pi PR ante), li wile pona tawa lipu ni la ona li ken kama wan (merge). +- **ante nimi pi sitelen ma (domain tag) pi lipu awen** (nimi pi ilo esun) li pini ala, li wile kama **lon tenpo ni: awen suli li lon ala** — lipu awen suli li lon la nimi sin li sitelen sin pi lipu ale. +- **ijo pi pini ala lon lipu awen, li jo e nimi** (steganographic floor, timestamp covert channel, witness amnesia, liveness gap) li lon lipu pi poki ilo pi lipu awen; jan li len ala e ona, li toki ala e ni: "ona li lon ala." +- **ilo pana — selo Executor li pini; ilo pi tenpo pali li pini ala.** `internal/contribute` li awen e nasin lawa pi pana ilo (Executor / ServiceExecutor / Registry / NodeContract). nasin awen tu li lon, ilo lukin (tests) li wawa e ona: ilo pi tenpo lape (scavenged) li ken kepeken ilo pali ni taso: ilo ante li ken pini e ona (preemptible) (jan pi jo ilo li kama ala pini tan ni lon tenpo ale); pali Service li wile e ma awen (pinned placement). `cmd/cloudy-agent` li pali e ni tan open tawa pini kepeken ilo pali Storage **lon** (kipisi len pi sitelen awen + lukin pi jo `internal/storage`) en ilo pali Compute/Service **pi tenpo lili**. pali suli pi tawa ilo tan `internal/agent` pi ilo insa (ona li ijo pi tenpo ante) — ilo pali Docker, lukin pi ilo sijelo kepeken gopsutil, opt-out/allowlist/printers, en linja agent→cloudyd→`/v0` — li pali kama pi nimi, li kama *monsi* selo ni, li ante ala e selo. +- **ilo pi kama jan pi ilo suli — pali li pini, li lukin lon ilo lon.** `internal/enroll` + `cmd/cloudy-enroll` li tawa e nasin ale pi kama sin pi jan pi ilo suli lon ilo insa, tan open tawa pini (wile → sitelen e kulupu pi nimi open 7 → lukin kepeken lipu "email" → kulupu lukin A/B pi nasin sama → open pi ilo taso). ona li kepeken sin e `internal/opcred` tawa awen pi nimi open, li kepeken sin e ona tawa nanpa e toki pi nasin sama kepeken nasin lawa lon pi nasin insa. ilo insa li pana e nanpa pona tawa kulupu lukin C, la jan pi ilo suli li wile ala toki tawa ona; tan ni, tenpo pi kulupu lukin C li lon ala. ilo jan (client) li weka tan `internal/coord`, tan wile: kama sin li JSON taso lon selo **lupa** (portal) pi ilo insa, li lon ala linja `/v0` pi ilo anpa. nimi lili pi lipu "email" li kama tan nasin ante, kepeken `CodeSource` pi pana insa. ona li lukin lon ilo insa SoHoLINK lon — jan pi ilo suli sin li kama `active`, la sitelen ken ona li kama sona pona lon `/v0`. + +## toki pi ijo wile + +ona li kepeken `sohocloud-protocol` lon nimi nanpa open (version tag) — ona li kepeken ala ijo ante tan kulupu ilo. kipisi pi jan kulupu li toki e esun awen kepeken nimi nanpa len pi lipu lili (leaf ID), kepeken ijo ona (by value); ona li pana ala e kule ijo pi lipu awen tawa kipisi ante lon tenpo ale; ante li kama lon open pi wan ilo (composition root) taso. + +## toki pi ilo Cloudy taso (lon pini, tan nasin pi nanpa toki) + +ilo Cloudy li kama tawa jan kepeken ilo wan taso (ona li jo e API pi jan kulupu ona e selo ilo ona; ona li lon lukin). ilo SoHoLINK li ilo insa pi lipu sama, ilo Cloudy li toki tawa ona; ilo insa ale pi nasin sama li ken kama lon ma ona. diff --git a/CONFORMANCE.zh.md b/CONFORMANCE.zh.md new file mode 100644 index 0000000..765ef0c --- /dev/null +++ b/CONFORMANCE.zh.md @@ -0,0 +1,68 @@ +> 社区翻译(草稿)——NTARI 政策 P2-002《全球多语言广播》。来源:CONFORMANCE.md(英文原文,2026-10-05 快照)。本文为机器辅助的社区翻译草稿,依照 P2-002 §3.1 待区域维护者审校。根据 §2.2,核心技术规范仍以英文为准。 +> +> 如发现译文有误,欢迎 fork 仓库并提交 Pull Request +> 来改进翻译:https://github.com/NTARI-RAND/Cloudy。翻译修正与代码贡献同样宝贵,我们诚挚欢迎。 + +> 英文原文具有规范效力。本译文仅供阅读,不作解释之用:凡与 `CONFORMANCE.md` 存在分歧之处,以英文为准。规范性关键词(MUST、MUST NOT、SHOULD、SHOULD NOT、MAY)、字段名、标签与标识符均保留英文,因为它们构成符合性契约。 + +# 符合性——雅努斯双面架构 + +本仓库以该架构自身的术语所作的自我描述,依照架构的顺序规则,在任何产品特定内容**之前**陈述。每一项符合性声明都绑定到执行它的机制与检查,否则即被标注为暂代或桩(stub)。未经绑定的文字只是营销。 + +该架构即**雅努斯双面架构(Janus-Facing Architecture,JFA)**——NTARI 的统一架构文档,是本项目 AGPL-3.0 公域下的自由文档。 + +## 角色声明 + +Cloudy 是 JFA 基质的一个**前端**——面向成员的应用——也是基质协调协议刻意不加定义的**成员经济层**的所在:按运营者划分的对话记录、声誉约定,以及成员发行的信用。成员存在于此,且仅存在于此;本仓库之下的协调线路不知晓任何个人。Cloudy 是一个独立、可分叉的产品:它使用已发布的协议通信,任何符合规范的协调者都可以为它提供服务。 + +| 本仓库术语 | 架构角色 | +|---|---| +| `internal/record` | **按运营者划分的对话账本**——仅追加、经对话密封、经见证 | +| `internal/covenant` | **评估量表**的实现(作为约定的成员声誉) | +| `internal/economy` | **成员发行的信用**(成员经济) | +| `internal/coord` | 对基质**协调协议**的使用 | +| `internal/enroll` | 向协调者进行的**前端即运营者注册**(申请 → 密钥 → 验证 → 符合性 → 激活) | +| 成员(Member) | 一个人,以平台为范围;PII 保留在成员本地且可擦除 | + +## 不变式及其绑定——以 `main` 为准 + +各项状态依照架构的诚实规则陈述。超出本表的已构建成员层工作存在于开放的 PR 堆栈中,并会在合入时更新本表。 + +| 不变式(架构) | 在 main 上的状态 | 机制 / 检查 | +|---|---|---| +| 记录**仅追加**;更正是新的条目 | **Built**(已构建) | `internal/record`:Store/Log 只暴露 Append——update 与 delete 是不存在的动词;包文档陈述了结构性规则;测试 | +| 记录**经对话密封**——记录的是两名成员所约定的内容,而非一方所断言的内容 | **Built**(已构建) | 基于规范字节的双重密封验证;自我对话在构造时即被拒绝 | +| **公域中无 PII**;叙述保留在成员本地且可擦除 | **Built**(已构建) | 公域类型只携带哈希、密钥与时刻;可擦除内容存放在一个类型上不相交的成员本地存储中 | +| **见证**具有结构独立性;单见证者部署是带标注的暂代 | **Built (stand-in)**(已构建,暂代) | 见证者会签,并进行两两独立性验证;StandIn 标签是计算得出的,而非断言的 | +| 约定:**绝不取平均**;完整分布;对称;只把关"是否",绝不把关"多少" | **Stub, labeled**(桩,已标注) | `internal/covenant` 包文档声明了它在构建时必须满足的不可协商的不变式;已构建的实现正在审查中 | +| 经济:余额是**密封记录的确定性函数**;零和;托管优先;只可赚取、绝不可购买 | **Stub, labeled**(桩,已标注) | `internal/economy` 包文档声明了这些不变式;已构建的实现正在审查中 | +| **单一参与者身份**——一名成员,同时是贡献者与消费者 | Design-binding(设计约束) | 任何模式(schema)或类型中都不存在生产者/消费者之分;随每个成员界面的落地对其形成约束 | +| **可分叉性** | Built(已构建) | 以已发布的版本标签使用协调协议;没有任何协调者享有特权 | + +## JFA 注册表绑定 + +绑定 Janus 不变式注册表(NTARI-RAND/Janus 中的 `jfa-conformance-suite.py`)中某个 ID 的测试,命名为 `TestInvariant__`,ID 中的任何 `-` 都写作 `_`(因此 `REC-six-holders` 变为 `TestInvariant_REC_six_holders_…`)。`go test -run TestInvariant_ -v ./...` 会列出每一项绑定及其结果。 + +| 注册表 ID | 测试 | 在该包现有测试之外新增的内容 | +|---|---|---| +| **L1**——每次交换使两个余额发生变动,合计净额为零 | `internal/economy` `TestInvariant_L1_ZeroSumBalance` | 共享同一存储的两个账本上的并发付款方;按记录轧差;重放可重现每一笔余额 | +| **L6**——不原地更新,不删除;宽免即标注 | `internal/record` `TestInvariant_L6_AppendOnly`(宽免部分:`internal/covenant` `TestAnswersCloseTheSymmetryBreach`) | 一次更正会追加条目,并使被更正的条目及所有更早的证明保持完好;直接在存储上进行的原地重写,在与重写之前所取检查点进行一致性校验时会失败;一次全模块源码扫描在任何仅追加类型上都找不到 update 或 delete 动词——这些类型通过名称(Store/Log/Ledger/Book)或"append-only"文档注释加以追踪,并固定 `market.Catalog` 与 `techtree.Tree`,使它们不会脱离范围 | +| **L7**——公域只保存哈希、类型、时间戳与引用 | `internal/record` `TestInvariant_L7_CommonsSchema` | 每一个公域类型都逐字段检查,只接纳字节数组、无符号整数、`time.Time`,以及在一份显式允许列表中列名的 ed25519 密钥与签名 `[]byte` 字段——不允许 string、map、interface、float 或未列名的 `[]byte`;每一个允许列表中的字段在用备注(memo)填充后,与一个通过验证的未填充对照组相比都会验证失败,且绝不会进入日志 | +| **L8**——携带完整分布;任何地方都没有标量分数 | `internal/covenant` `TestInvariant_L8_NoScalarAggregation` | 均值相同而分布形状不同的两名成员仍可区分;一次全模块源码扫描,查找以分数命名或返回浮点数的导出函数、类似分数的 JSON 标签,以及声誉包中的浮点字段 | + +## 暂代与未决残余问题 + +- **单见证者 StandIn。** 如今每一个经见证的检查点都只有不到两名独立见证者;记录层以结构方式计算并报告这一标签。实时联邦是该架构的开放问题 2——拱顶石构建。 +- **约定与经济在 main 上是桩。** 它们的包文档载有具约束力的不变式;已构建的实现位于开放的、堆叠的 PR 中,必须满足这些文档才能合并。 +- **记录域标签重命名**(产品命名)尚待完成,且必须在**任何持久化存储之前**落地——在持久日志已经存在之后再重新打标签,就等同于重写。 +- **已命名的记录残余问题**(隐写下限、时间戳隐蔽信道、见证者失忆、活性缺口)记载于记录包文档中,而不是假装它们不存在。 +- **贡献者节点——Executor 接缝已构建;运行时实现待完成。** `internal/contribute` 确定了节点贡献契约(Executor / ServiceExecutor / Registry / NodeContract),并由测试强制执行两项不变式:利用闲置资源的(scavenged)节点只接受可抢占的执行器(所有者绝不被打断),而 Service 工作负载要求固定放置。`cmd/cloudy-agent` 以一个**真实的** Storage 执行器(不透明的密封分片 + `internal/storage` 持有证明)和**占位的** Compute/Service 执行器端到端运行它。从协调者过渡性的 `internal/agent` 进行的繁重运行时移植——Docker 执行器、gopsutil 硬件采样、opt-out/allowlist/printers,以及 agent→cloudyd→`/v0` 中继——是已命名的下一步,并将在此接缝*之后*落地,而不改变它。 +- **运营者注册驱动——已构建并经实时验证。** `internal/enroll` + `cmd/cloudy-enroll` 端到端驱动协调者的运营者入驻生命周期(申请 → 注册 7 密钥集 → 邮件验证 → 符合性套件 A/B → 自动激活),复用 `internal/opcred` 进行密钥保管,并通过真实的协议规范(canon)计算符合性答案。套件 C 在协调者一侧评分,无需运营者回应,因此没有套件 C 步骤。该客户端刻意与 `internal/coord` 分离:注册是在协调者**门户**界面上进行的普通 JSON 交互,而非 `/v0` 节点侧线路。带外邮件验证码通过注入的 `CodeSource` 提供。已在一个实时 SoHoLINK 协调者上完成验证——注册的运营者达到了 `active` 状态,其凭证随后在 `/v0` 上通过了认证。 + +## 依赖声明 + +以已发布的版本标签使用 `sohocloud-protocol`——不使用技术栈中的任何其他内容。成员层通过不透明的叶子 ID、按值引用已密封的交换,绝不通过将记录类型导入其他层来引用;转换只在组合根处进行。 + +## 产品特定说明(依照顺序规则,置于最后) + +Cloudy 作为独立的消费级产品发布(拥有自己的成员 API 与应用界面,正在审查中)。SoHoLINK 是它所通信的参考协调者;任何符合规范的协调者都可以取代它。