Repository navigation
Releases: CTO-DRS/SuperBiz
Release list
SuperBiz V 3.5.2 — the manual line finally speaks (free-text item description)
SuperBiz V 3.5.2 — «السطر اليدوي يُسمَع أخيراً» (Owner bug fix)
versionCode 23 · branch fix/invoice-free-line-v352 from main dafb8c4 · 2026-10-21
EN — What shipped
Owner-reported bug, fixed end-to-end with documented RED-first evidence:
- The bug: a new invoice line with qty=22 × price=600 (subtotal 13,200.00 shown) was rejected on Save with "Add at least one item with a description and a quantity above zero" — while tax/total showed 0.00. Root cause: the line description could only ever be set by picking a saved product (tapping the line title opens the product picker) — there was no free-text description input anywhere in the editor, yet the save filter, the preview filter and the UI gate all required
desc.isNotBlank(). A manual line was unnameable and unsavable; the message demanded something the UI had no way to enter. - The fix (V 3.5.2):
- Free-text description field on every invoice line — type any item name manually; still editable after picking a product; title tap keeps opening the picker.
- Line validity is now quantity > 0 only; a blank description is auto-named at save with the same fallback label the UI already displays («الصنف N» / "Item N") — no blank name ever reaches the database, the PDF or the ZATCA XML. Stock guard, line discounts and line tax kinds are untouched.
- Preview uses the same filter as save (P41-L1 preview==saved invariant held): the 22×600 line now shows subtotal 13,200.00 + VAT 15% (1,980.00) + total 15,180.00 before saving.
err_items_requiredreworded for truth in all six locales (ar/en/fr/id/tr/ur): "Add at least one line with a quantity above zero".- Zero-quantity lines remain rejected — a regression guard test locks the semantics from both sides.
Verification
- RED-first:
InvoiceFreeLineTest(3 Compose/Robolectric tests on a real file DB) — 2 tests failed pre-fix exactly as diagnosed; 3/3 green post-fix (manual line saves as «الصنف 1» with total 1,518,000 piasters == preview; free text «زيت محرك 5 لتر» persists verbatim with qty 2 / 7,500 piasters; qty=0 still rejected with nothing written). - Full suite: 1847 tests / 0 failed / 0 skipped across 176 files (+3 vs the documented V3.5.1 baseline 1844/175). All existing invoice paths (P40/P42/CheckoutSheet/FreeSale) green and untouched.
aaptconfirmsversionCode='23' versionName='3.5.2'; APK signed (v1+v2) with the stable debug identity, certificate SHA-256e30e763a…7a93e— installs directly over any previous SuperBiz debug-signed build without uninstalling.
Install
Download SuperBiz-v3.5.2-debug.apk below and install over your current build. No data migration involved.
ملاحظات المالك (عربية)
- المشكلة التي أبلغتَ عنها بلقطة الشاشة أُصلحت: اكتب وصف البند نصاً حراً في الحقل الجديد داخل كل سطر، أو اتركه فارغاً فيُسمّى تلقائياً «الصنف 1» — والحفظ ينجح بكمية أكبر من صفر فقط.
- عاجل — أدر رمز الوصول (PAT): الرمز المستخدم لنشر هذه الإصدارة ظهر في قناة المحادثة، وكذلك الرموز السابقة. فلْده فوراً من إعدادات GitHub → Developer settings → Personal access tokens وأنشئ رمزاً جديداً عند الحاجة.
- ملاحظة أرشيفية صادقة: جولة V3.6.0 (أسطح الفروع/الجرد، المدفوعات القابلة للتبديل، جاهزية زاتكا مرحلة-2، صندوق الطلبات) وجولتها الترميمية V3.6.1 أُنجزتا سابقاً محلياً وأفقدتهما بيئة العمل قبل الدفع — ستعاد بناؤهما فوق 3.5.2 بنفس العقود الموثقة في سجل التغيير.
SuperBiz V 3.5.1 — Phase-0 delta: both rulings executed, biometric lockout closed
SuperBiz V 3.5.1 — Phase-0 Delta: Both Rulings Executed, Biometric Lockout Closed (E0.2 / E0.4-b)
The honest reconciliation wave. The parallel Phase-0/1/2 sessions (PRs #2/#3/#4, merged) completed E0.4's data-layer RBAC parity, published docs/RBAC_MATRIX.md, and landed Phases 1 and 2-wave-1 — but executed neither of the two §13-ه owner rulings, and the biometric unlock path still bypassed an active LockoutPolicy lock. A second session, working from a stale base without knowledge of those merges, had independently rebuilt E0.4 (PR #5 — closed unmerged; cross-validation note: both passes identified the same four unenforced matrix rows). This release lands only the genuine delta from current main: roadmap/p0-delta-v351 → PR #6 → merge commit on main.
What was done
- [E0.2 — Ruling 2, Option A] Webhook unsigned-fallback is fail-closed.
WebhookStore.secretConfiguredOnce()separates two states that used to merge into one empty string: no secret configured (signing is optional by the H4-6 contract — unsigned delivery stays the owner's explicit choice, byte-for-byte unchanged) and configured but unreadable (the production failure mode: Keystore invalidated by a device restore). In the second stateWebhookClient.sendrefuses before any socket: nothing is delivered unsigned,lastResultrecords the failure honestly, and the worst concurrent race withsetSecretlands toward refusal — never toward a silently-unsigned delivery of a configured secret. The production failure is simulated inWebhookFailClosedTestby rotating the injected PinVault key between store and read — exactly what a device restore does to the Keystore. 3 contracts: fail-closed with zero transport attempts · legitimate unsigned delivery untouched · readable secret signs with the exact HMAC of the RVW-23-locked kit. - [E0.2 — Ruling 1, Option A] RVW-21 coupon-void semantics RECORDED (behavior untouched). Decision date 2026-10-20, rationale, and the named owner-override path are in FINDINGS §13-و. Option B (compensating VOID witness +
COUNT(*) → SUM(qty)) re-opens financial-ledger semantics and needs its own adversarial pass — engineering does not adopt that unilaterally. The financial-conservative status quo stands, locked byCouponVoidSemanticsTest. - [E0.4-b] The last authentication-path bypass is closed.
openBiometricSessionpreviously opened a session for any biometric-allowed user even while the account was lockout-locked (5 failed PINs = escalating lock) — and cleared the counter, making the coercion-resistance lock circumventable the moment an enrolled fingerprint was on the device. Now a locked account refuses every unlock path: the biometric call returns false, an attributedUSER_LOGIN_FAILaudit row withlockoutdetails is written, and the counter is preserved until the lock expires. The PIN fallback itself stays refused during the lock (pre-existing guard, now test-locked), and the order-independent positive control proves the same biometric call opens a non-locked account with full rights.
Independent verification (all numbers this session's own runs)
Genuine RED-first: 6 tests written before any production change; the biometric refusal contract observed failing on main's code (returned true on a locked account); the webhook delivered unsigned pre-fix · wave 6/6 green after · full suite 1844 / 0 failed / 0 errors / 0 skipped across 175 files (main's 1838 + 6 — includes the parallel waves' 22 data-layer guard tests, zero regressions) · 4/4 Python quality gates · assembleDebug aapt confirms versionCode='22' versionName='3.5.1' · lintRelease GREEN 5m20s cold (OOM ledger entry 11: one daemon death recovered after orphan kill) · wave secret scan CLEAN · no schema change (stays at 19).
About this APK
SuperBiz-v3.5.1-debug.apk is debug-signed for testing only (CN=SuperBiz Debug, cert SHA-256 e30e763a…7a93e — the same sandbox debug identity as the v3.2.8/v3.2.9 packages). Store uploads must be built and signed with the owner's release keystore offline.
Integrity notes
- Tag
v3.5.1(annotated) points at the PR #6 merge commit onmain— the full audit chain (44 R-commits + the parallel Phase 0/1/2 waves + this delta) remains reachable. - E0.5 (v3.2.9 publish) was completed earlier in this session: release id 417918737, APK asset byte-verified against the local build.
Still open (owner-only)
- 🔴 URGENT: rotate/revoke the chat-exposed PAT (5th plaintext exposure — used for the publishes above; no further need remains).
- E0.1: release-keystore offline ceremony (escrow, two custodians) + Play Console staged rollout — hardware/credential-gated.
- E0.3: instrumented farm on three real targets (mid-tier device, API-34 emulator, 4 GB-class device) to retire the NOT-VERIFIED register (RVW-22 real-socket proof, RVW-24 ART confirmation) — device-gated.
- Optional override: switch RVW-21 to Option B (compensating VOID witness) — the path is documented in FINDINGS §13-و.
التغييرات — SuperBiz V 3.5.1
SuperBiz V 3.5.1 — «دلتا المرحلة صفر: الحكمان اللذان فاتَا الموجات المتوازية، والبصمة تخضع للقفل» (E0.2 + E0.4-b)
التاريخ: 2026-10-20 · versionCode: 22 · الفرع: roadmap/p0-delta-v351 (من main 482b970)
موجة مصالحة صادقة: الجلسات الموازية (PRs #2/#3/#4) أنجزت توازي بوابات E0.4 ونشر المصفوفة وموجتي P1/P2 — لكن حسمَي §13-ه بقيا بلا تنفيذ فيها، ومسار البصمة ظل يتجاوز قفل السياسة. هذه الدفعة تهبط بالدلتا الحقيقية فقط فوق main الحالي.
ما أُنجز
- [E0.2-أ] الفشل المغلق على توقيع الويب هوك (الخيار أ):
secretConfiguredOnce()تفصل «لا سر مُعداً» (التسليم غير الموقَّع اختيار صريح بعقد H4-6 — يبقى حرفياً) عن «سر مُعدٌّ لكن غير مقروء» (استعادة جهاز). sendيرفض قبل فتح أي مقبس: لا تسليم غير موقَّع بصمت، lastResultصادقة، وأسوأ سباق ينتهي باتجاه الرفض. الفشل الإنتاجي يُحاكى بتدوير مفتاح الحقن بين التخزين والقراءة. - [E0.2-ب] دلالة الكوبون عند الإلغاء (الخيار أ) مُسجَّلة في FINDINGS §13-و: التاريخ والمنطق ومسار التجاوز؛ السلوك لم يُلمس و
CouponVoidSemanticsTestيبقى قفل العقد. - [E0.4-ب] تكافؤ القفل بين مساري المصادقة: كان
openBiometricSessionيفتح جلسة حساب مقفل ويصفّر عدّاده — الآن يرفض بحدث تدقيق منسوب (USER_LOGIN_FAILبتفصيل lockout) دون مسّ العدّاد، والرمز البديل مقفول أثناء القفل، والضابط الإيجابي يثبت فتح الحساب الحر بكامل حقوقه.
التحقق المستقل
إثبات أحمر أولاً: 6 اختبارات كُتبت قبل أي تغيير إنتاجي (عقد الرفض رُصد فاشلاً على كود main) · أخضر 6/6 · الجناح الكامل 1844/0/0/0 عبر 175 ملفاً بلا أي انحدار · 4 بوابات ناجحة · aapt يؤكد 22/3.5.1 · lintRelease أخضر 5م20ث بارداً · فحص أسرار الموجة نظيف · بلا تغيير مخطط.
SuperBiz V 3.5.0 — branches multiply without ghosts (E2.1: multi-branch data core, transfer engine, no-ghost invariant)
SuperBiz V 3.5.0 — "Branches multiply without ghosts: every unit accounted on every transfer path" (E2.1)
versionCode: 21 · Merge: 482b970 (PR #4) · Base: main c9e24f4 (V 3.4.0)
Roadmap Phase 2 first wave (Merchant Depth). The epic's own V3.5–V3.6 split governs this release: the data core ships in V3.5 — branch/warehouse entities, the transfer engine with explicit in-transit state, and the conservation invariant — while the surfaces (stocktake sessions UI, transfer screens, transfer-plane reconciliation with POS) ride V3.6.
What shipped
- Schema 19 — four append-only tables with the exact Room-generated DDL:
branches(unique name),branch_stock(composite-PK per-branch transfer-plane ledger),stock_transfers(IN_TRANSIT / RECEIVED / CANCELED),stock_transfer_lines(qty vs receivedQty = the recorded variance). Idempotent seed (INSERT OR IGNORE): the main branch ("المخزن الرئيسي") plus a transfer-plane snapshot of global stock at upgrade time. No existing row touched. - Transfer engine (
TransferRepo) with the E0.4 data-layer RBAC contract (all writesINVENTORY_MANAGE; implicit/SYSTEM pass verbatim):- Send: in-transaction sufficiency check against fresh reads — insufficient source rejects the WHOLE transfer (no partial transfers, no deductions without a record); stock deducted immediately, transfer enters IN_TRANSIT — the gap is visible state, not a silent number.
- Receive: receipts clamped to [0, sent] (no over-receiving), added to the destination branch, and every shortfall recorded on the line — a variance is visible loss handled by the documented reconciliation report, never a vanishing unit.
- Cancel: returns exactly what was sent to the source; only IN_TRANSIT transfers can be canceled (no double-cancel, no receive-after-cancel).
- The "no ghost stock" contract, property-tested: branches + in-transit + recorded variance = seeded total, asserted after every operation across 200 seeded fuzz scenarios of random send/receive/cancel sequences. The fuzz pack caught a genuine flaw in the first invariant formulation (in-transit lines have no variance yet) — the contract was corrected and locked.
- Documented design decision (in-code): the transfer plane is seeded once and driven solely by this engine in V3.5; POS keeps the v18 global-stock contract byte-identical; reconciling the planes with stocktake and POS = the V3.6 surface.
- Chain-contract fixes:
MigrationChainCompositionTest's PK check conflated PRAGMA's 1-based ordinal with membership — a latent bug exposed by the schema's first composite PK; fixed. Tail assertions updated (18 migrations, last = 18→19).
Independent verification (this wave)
- Full forced suite: 1838 tests / 0 failed / 0 skipped across 173 files (+8/+2).
MultiBranchCoreTest7/7 (conservation + RBAC cells + automation contract + fail-closed paths) andMigration18to19Test(byte-identity via Room's own validator, exact seeded values, zero data loss) — green after a documented defect-fix loop.- Wave secret scan clean.
Install
Signed with the same debug identity as v3.2.8–v3.4.0 — certificate SHA-256 e30e763a c330f56e 86bda534 2ec6395a 02c154a4 e18652f2 75c016c6 6bd7a93e. Installs over prior debug builds.
Owner decisions & open items
- URGENT — revoke/rotate the chat-exposed GitHub token.
- E2.2 payments expansion (PSP matrix + abstraction), E2.3 ZATCA phase-2 readiness, E2.4 commerce ingestion — next waves; real PSP/platform credentials = owner-gated.
- V3.6 surfaces: stocktake sessions UI, transfer screens, plane reconciliation.
- Standing: RVW-21 + unsigned-fallback rulings; receivables authority; E0.1 keystore ceremony; E0.3 device matrix.
SuperBiz V 3.4.0 — performance as a contract (E1.1-E1.5: CI pipelines, budget gate, named conflict policy, telemetry)
SuperBiz V 3.4.0 — "Performance is a contract, not a hope" (E1.1–E1.5)
versionCode: 20 · Merge: c9e24f4 (PR #3) · Base: main ed37115 (V 3.3.0)
Roadmap Phase 1 (Performance & Reliability Foundations) — everything executable without hardware, verified; everything device-bound honestly marked.
What shipped
- [E1.1] Performance budget gate — the 5th quality gate (
tools/check_perf_budgets.py): cold start p50 < 2.0s, search p95 < 200ms @ 10k items, sync p95 < 2.0s, checkout p50 ≤ 30s. Self-tested falsifiable (catches a regression, fails closed on corrupt files), honestNOT-VERIFIED-ON-DEVICEmode until the E0.3 device matrix lands — enforced in CI the moment a results file is attached. Macrobenchmark harness authored underdocs/perf-harness/with a documented activation gate — unbuilt code never enters the build graph. - [E1.2] CI/CD:
ci.yml(every PR: the 4 quality gates + self-tests, the budget gate, full forced unit suite, lintRelease, assembleDebug, reports on failure) andrelease.yml(tagv*: signs from secrets when present, otherwise ships explicitly-unsigned with a loud warning — never a fake identity; aapt identity + SHA-256 printed; artifacts attached). Branch protection is live on main: PRs required, the CI context required, force-push denied — the PR discipline of waves R1–R11 is now GitHub-enforced law. - [E1.3] Privacy-first telemetry contract (
TelemetryContract/TelemetryState): closed event allowlist (aggregate counters/durations ONLY — no identifiers, no contents, Long-typed), per-event PDPL spec (unit/retention/purpose), zero-silence consent gate (nothing recorded without explicit opt-in; egress literally empty even with prior local data; withdrawal empties egress), fail-closed on unknown events. External crash-report provider = documented keys-gated follow-up. - [E1.4] Named per-entity conflict policy (
SyncConflictPolicy): the decision table read from SyncEngine reality + ADR-002 — LWW with conservative tie→local, currencies remote-wins,products.stockQty+parties.favorite/lat/lnglocally-owned (D3), coupon redemptions append-only (RVW-17); fail-closed on unknown entities; pure merge executor. The 500-seeded-scenario fuzz pack caught a real defect in the first implementation (rescue-from-loser instead of rescue-from-local) — fixed and locked. End-to-end fuzz over the real SyncEngine = the epic's documented next increment. - [E1.5] Flake program:
VMSchedulinginjection point (production defaults byte-identical) extracting the Search trio's hardcoded dispatchers; explicit reset for the leaked lockout counter; patientsetMainfor in-flight Unconfined continuations.docs/FLAKE_LEDGER.mdinstitutionalized: 5 consecutive forced runs at final state — 4 flaky cells across ~9,150 executions ≈ 0.04% vs the <1% budget (met with margin); the 3-consecutive-zero aspiration documented as NOT met in this sandbox (Robolectric process-shared singletons — DataStore/Main/AppGraph), fork-isolation ticket open with its cost trade-off.
Independent verification (this wave)
- Full forced suite: 1830 tests / 0 failed / 0 skipped across 171 files (+11/+1), five consecutive runs (3/5 green; all 4 flaky cells isolated-green repeatedly — the documented singleton class).
- Telemetry + policy contracts: 11/11 first-run green (new-capability locking, WebhookKitTest precedent) — after the fuzz-driven merge fix.
assembleDebug— aapt confirms versionCode 20 / versionName 3.4.0; signed APK below carries the same debug identity as v3.2.8–v3.3.0: SHA-256e30e763a c330f56e 86bda534 2ec6395a 02c154a4 e18652f2 75c016c6 6bd7a93e.- Wave secret scan clean. OOM ledger: entries 11–12 (a stray unconstrained daemon from a prior run) — lesson recorded: constrain every command.
Owner decisions & open items
- URGENT — revoke/rotate the chat-exposed GitHub token.
- E0.3 device matrix unlocks: benchmark gate enforcement, instrumented farm, Macrobenchmark activation.
- Standing: RVW-21 + unsigned-fallback rulings; receivables authority (new from V 3.3.0); release-keystore ceremony (E0.1).
SuperBiz V 3.3.0 — the data layer guards itself (E0.4: 19 write points matrix-locked)
SuperBiz V 3.3.0 — «طبقة البيانات تحرس نفسها: كل خلية محروسة بالاسم، وارتداد الرمز يُدوَّن» (E0.4)
التاريخ: 2026-10-20 · versionCode: 19 · الفرع: review/independent-premerge-2026-10
موجة أولى من تنفيذ خارطة الطريق (E0.4 — «إكمال توازي RBAC للعامل عبر بقية المستودعات») بعد أن صار main = d555c39 حرفياً حامل سلسلة R1–R11 الموثقة. المصفوفة النقية كانت محكومة منذ v13 (68 خلية بالاسم في RbacMatrixTest) وطبقة البيانات كانت محروسة جزئياً (BackupRepo/BackupRestoreRepo/WebhookStore/StatementPrefs منذ RVW-12 وما قبله) — هذه الموجة تُكمل الحرس عند حد المستودع لنقاط الكتابة في بقية المستودعات، انعكاساً لبوابات قائمة لا سياسة جديدة، وبنفس العمليات السبعة عشر حصراً (عقد «الافتراض مغلق»: لا Op جديد).
ما أُنجز
- حرس طبقة البيانات على 9 مستودعات (19 نقطة كتابة): فاتورة بيع/شراء/إلغاء (POS_SELL/INVENTORY_MANAGE/INVOICE_CANCEL) · صنف قائم/أرشفة/حذف/حركة يدوية (PARTY_PRODUCT_EDIT/HARD_DELETE/INVENTORY_MANAGE) · طرف قائم/حذف (نفس البابين) · مصروفات وشيكات وأقساط بكامل نقاط كتابتها (EXPENSES_CHECKS_INSTALLMENTS) · كوبونات وتعديل نقاط يدوي (LOYALTY_MANAGE) · استيراد CSV (انعكاس بوابة importCsv الموثقة — BACKUP_RESTORE) · تفعيل ZATCA وبيئة الإنتاج (TAX_OWNER_DATA — سطر 8-ب حرفياً) · إعدادات الهوية الضريبية (توازي RVW-13) · إعدادات الضريبة/العملة/الأتمتة ومجدول التقارير (GENERAL_SETTINGS). الضمني وSYSTEM يمران حرفياً (عقد §4.3 والأتمتة — مُثبت بالفحص: لا مستدعٍ في
work/يمر من نقطة كتابة محروسة، والسّنك يكتب عبر DAO مباشرة كسلطة إقران). - القصد المسند موثق لا مصمت: مسارات القراءة تبقى على حكم الشاشات (حراسة الـFlows تفتح باب كسر الويدجات بلا حماية حقيقية) · الذمم بلا سطر مصفوفة يحكمها — بند قرار للمالك ·
recomputeStatusبلا مستدعٍ خارجي — لا حرس بلا مسار. كله فيdocs/RBAC_MATRIX.md— المصفوفة المنشورة (الحقيقة الواحدة للمنتج والهندسة). - ارتداد الرمز يُدوَّن (البقية الصامتة الأخيرة في مسار المصادقة): كل فشل تحقق فعلي لرمز الجهاز (
SettingsVM.verifyPin— وضع المالك الأحادي حيث البصمة غير متاحة) يكتبDEVICE_PIN_FAILبإسناد ما قبل المصادقة الصادق (actor="device"، بلا هوية جلسة بعد) — نمطUSER_LOGIN_FAILللمسار المتعدد نفسه؛ النجاح جلسة لا حدث فلا يُدوَّن، والرفض أثناء قفل سارٍ ليس محاولة تحقق فلا يكتب ولا يزيد العدّاد. - إصلاح عزل اختباري حقيقي: عدّاد قفل الدخول كان يتسرب بين طرق الاختبار عبر مخزن
superbiz_lockoutالمشترك (مفرد الـdelegate) بمعرّفu<id>حتمي — تصفير صريح يجعل عقدcashierLoginمحلياً بلا إضعاف أي تأكيد.
التحقق المستقل لهذه الجولة
أحمر حقيقي أولاً: تشغيل مصفّى أفقي 21 من 22 (كل خلية رفض مفتوحة بلا حرس + اختبارا التدقيق) ثم أخضر 22/22 بعد الحرس — الخلية الوحيدة الخضراء قبل الحرس هي عقد الإنشاء بلا بوابة (عقد السطر 4 حرفياً) · الجناح الكامل 1819 اختباراً / 0 فاشل / 0 متخطى عبر 170 ملفاً (+22/+2) بإعادة تشغيل قسرية · قتيلان OOM من kernel أثناء الجناح الكامل الأول (التاسع والعاشر في السجل — نمط صندوق 4غ، daemon قُتل) ثم إعادة بذاكرة مقيدة خضراء · حالتا تداخل DataStore مشتركاً بين طرق الاختبار (ConfigRbacGateTest) أخضرتا معزولتين ×2 — صنف التذبذب الموثق (مفرد DataStore عبر الطرق، لا سللوك منتج: الحرس لا يرفض SYSTEM/OWNER بالبناء) وعلاجه الجذري مرصود لـE1.5 · فحص أسرار الموجة نظيف.
SuperBiz V 3.2.9 — «الثلاثة أقاليم الأخيرة: لا صيغة تمرّ من السالب، ولا سعر سالب يدخل، ولا عنصر سام يُهمَس» (RVW-25..27)
التاريخ: 2026-10-19 · versionCode: 18 · الفرع: review/independent-premerge-2026-10
موجة «أكمل المهام المتبقية» — مراجعة تخريبية للأقاليم الثلاثة المرصودة في خارطة R10: سطح حِقن CSV (استيراداً وتصديراً)، وحسابات الشيكات والأقساط، وانتقالات قائمة انتظار ZATCA. أقاليم الأقساط والشيكات ثبتت صلبة بحرسها الموثّق في طبقة المستودع (حدود الخطة، قصّ السداد على المفتوح، قائمة تحولات الشيكات البيضاء، القراءة الحديثة داخل المعاملة) — حُسمت بلا تعديل.
ما أُنجز
- [RVW-25] ثقب الحِقن الوحيد الباقي في التصدير أُغلق بحرس شكل-واعٍ: حسم L-5 جزئياً بدليل جديد — ادّعاء «السالب لا يبدأ صيغة» صحيح للأرقام الخالصة فقط، لكن إكسل يقيّم -SUM(A1) و-1+WEBSERVICE(…) صيغةً كاملة، وسلسلة الهجوم حقيقية هنا: ملف استيراد عدائي يُخزَّن نصه حرفياً (عقد الاستيراد الموثق) ثم يعبر كل تصدير لاحق خاماً فيفتحه صاحب المتجر في إكسل فيُنفَّذ. الإصلاح: بادئة الحرس ' تُضاف حين يبدأ الحقل بـ '-' ويليه حرف (دالة/مرجع خلية/نص عربي) — والأرقام الخالصة (-46.6، -2+3) تبقى عارية كعقد L-5 حرفياً فلا تُكسر إحداثيات ولا أرصدة.
- [RVW-26] الأسعار السالبة ترفض صفّ الاستيراد بأسباب مسمّاة: كان المحلل يرفض الكمية السالبة منذ H4-6 ويقبل سعر تكلفة/بيع سالباً — انضباطان مختلفان لعمودين شقيقين. الصف السالب يُتخطى الآن («سعر تكلفة سالب»/«سعر بيع سالب») والصفر مشروع للهدايا. سلة البيع كانت تطويق الإجماليات عند صفر فلا نهب مال — هذا عقد جودة بيانات وتقييم مخزني.
- [RVW-27] عنصر ZATCA السام صار مرئياً: وثيقة أرشيف مفقودة كانت تُتخطى بصمت فتدور مستحقةً كل دفعة بلا أثر في أي عدّاد.
ProcessSummaryاكتسبmissingDocs(إضافي غير مكسور) — السياسة نفسها: لا إرسال ولا كتابة حالة، لكن الشذوذ يُرى فيتلخّص له المستدعي ويقرر. - حسمَا مالك بجداول قرار بوضع النظرة الواحدة (مرصودان لا منفَّذان): دلالات إبطال الكوبون (RVW-21: إبقاء مقفول بالاختبار مقابل شاهد VOID تعويضي)، وwebhook unsigned-fallback (فشل مغلق لا يسلّم غير موقَّع مقابل الوضع الراهن) — FINDINGS §13-ه.
التحقق المستقل لهذه الجولة
4 بوابات Python ناجحة + اختباراتها الذاتية الأربعة ناجحة · إثبات أحمر حقيقي أولاً: التشغيل المُصفّى أفق 3 اختبارات جديدة بالضبط ثم أخضر 57/57 بعد الإصلاح (اسنتادَا الاختبار نفسه أُصلحا في الحلقة وسُجّلا بصدق) · الجناح الكامل 1797 اختباراً / 0 فاشل / 0 متخطى عبر 168 ملفاً (+5) بإعادة تشغيل قسرية — حالتا SearchHealthVMTest تذبذبتا تحت حمل الجناح (Dispatchers.Main المتزامن) وأخضرتا معزولتين مرتين، نفس صنف التذبذب الموثق في R10 · قتلان OOM من kernel (السابع والثامن الموثّقان — نمط صندوق 4غ) استُعيدا ببروتوكول الذاكرة المقيدة بعد إثبات الأخضر · assembleDebug ناجح — aapt يؤكد versionCode='18' versionName='3.2.9' · lintRelease أخضر 5م21ث بتحليل حقيقي جديد بعد إزالة مخلفات lint · فحص أسرار الموجة نظيف. القراءة لم تتغير: APPROVED FOR MERGE — الدمج قرار المالك (PR #1 مفتوح ويستقبل هذه الموجة تلقائياً).
SuperBiz V 3.2.8 — «سلسلة الويب هوك تحت المجهر: لا تسريب مقابس، وعقد الحمولة مقفول» (RVW-22..24)
التاريخ: 2026-10-18 · versionCode: 17 · الفرع: review/independent-premerge-2026-10
موجة مراجعة تخريبية على سلسلة تسليم الويب هوك (باني الحمولة → عميل النقل → بوابة التخزين والسر) — المسار الخارجي الوحيد الذي لم تُراجعه موجة سابقة من طرف إلى طرف — تنفيذاً لأمر «أصلح العلل». جانب التخزين ثبت صلابته كما أُصلح سابقاً (سر مشفّر بصيغة ks من إصلاح AUD-7، بوابات RBAC طبقة-بيانات من RVW-13، تدهور صادق بلا إخفاء). ملاحظة نزاهة: هذه الموجة نُفِّذت مرتين — نسخة الجلسة الأولى (الالتزامان الأصليان) فقدها تراجع بيئي لصندوق العمل إلى لقطة R9 قبل أي دفع، وأُعيد تنفيذها كاملة من سجل المحادثة بتحقق مستقل حقيقي حديث من الصفر؛ النتائج مطابقة حرفياً في الحالتين.
ما أُنجز
- [RVW-22] إغلاق مجرى الاستجابة في كل الحالات — لا تسريب مقبس لكل تسليم فاشل: كان
WebhookClient.sendيغلقinputStreamفقط — وعلى استجابة 4xx/5xx يرمي الوصول استثناءً يبتلعهrunCatchingفيبقىerrorStreamمفتوحاً بلا قارئ، فلا يعود الاتصال لمِجمع الاتصالات ويتسرب مقبس/واصف لكل حدث فاشل: نقطة نهاية منقولة أو معطوبة تجيب 404/500 لكل فاتورة تعني تسريباً متراكماً على جهاز يطلق حدثاً لكل بيع. الإصلاح: المجرى المُغلق يتبع رمز الاستجابة (2xx يغلق inputStream، وغيره يغلق errorStream بأمان عدمي)، والتعامل مع الفشل عابر مسجَّل كما هو، ونجاح المسار السليم بمواكبته (keep-alive) لم يُمَس — معالجة موارد خالصة لا تستطيع تغيير ما يُرسل أو يُسجَّل، ولهذا أُصلحت هنا حيث وُجِّه الند في الدلالات (RVW-21) إلى المالك. تعليق موضعي يسجّل الآلية في الموقع. - [RVW-23] عقد الحمولة العامة أصبح مقفولاً —
WebhookKitTest(8 عقود، JVM خالص): العقد الموثق («الحقول تُضاف فقط، لا تُحذف ولا تُعاد تسميتها — مستقبِلات أصحاب المتاجر تعتمد الأسماء حرفياً») كان بلا اختبار واحد. القفل: حمولة ذهبية لمدخلات مرجعية مثبتة حرفياً بأسمائها وترتيبها وقيمها (أي تغيير شكل يُسقط الاختبار عمداً — احتكاك مقصود يجعل تعديل العقد مراجعة واعية)، نصوص معادية (اقتباسات ومائل عكسي وأسطر ومحارف تحكم وعربية) تدور تهريباً→تحليلاً عبر MiniJson مطابقة بيتياً في الحقلين، و«party» غائبة تُسلسَل null صريحاً، وكتلة العملة الأصلية تُحذف كلياً بغيابها وتظهر باحتياطها الموثق (عملة بلا مبلغ = 0)، والتوقيع يطابق متجه RFC 4231 (الحالة 2) مرجعاً مستقلاً مقططعاً 16 بايت، والسر الفارغ يعود "" صادقاً، والسداسي ASCII نقي تحت محلية عربية (ar-SA). 8/8 أخضر من أول تشغيل في كلتا التنفيذتين — قفل صرف بلا تعديل سلوك. - [RVW-24] مشتبه به يُرفض بالبرهان — سداسي التوقيع لا يُعرَّب: احتمال أن يُحيل
String.format("%02x", …)بالمحلية الافتراضية الأرقام السداسية إلى أرقام غير لاتينية (كان سيكسر التحقق عند كل مستقبِل بصمت في تطبيق عربي أولاً) فُحص تجريبياً على JDK 17.0.13: ست محليات معادية (ar-SA وar وfa-IR وhi-IN وdz وmr) كلها سداسي ASCII؛ مواصفة Formatter تُعرِّب تحويل 'd' العشري وحده. لا تعديل كود — مع قفل رجعي دائم (signAsciiHexUnderArabicLocale) يصطاد أي انحراف منصّي مستقبلي قبل الإصدار. - [موجّه إلى المالك — مرصود لا مُنفَّذ]: إذا صار سرٌّ مهيَّأ غير قابل للفك (فشل PinVault — كإبطال Keystore بعد استعادة جهاز) يواصل
sendالتسليم غير الموقَّع بصمت بينما يظن المالك التوقيع مفعّلاً: اندماج حالتَي «لا سر» و«سر غير مقروء» في موقع الإرسال. البديل المغلق (لا إرسال بلا توقيع،lastResult=falseصادقة) يغيّر دلالات التسليم — قرار المالك، كـ RVW-21.
التحقق المستقل لهذه الجولة
4 بوابات Python ناجحة + اختباراتها الذاتية الأربعة ناجحة · الجناح الكامل 1792 اختباراً / 0 فاشل / 0 متخطى عبر 168 ملفاً (+8 اختبارات) — بإعادة تشغيل قسرية لمهمة الاختبار بعد تشغيل مُصفّى أخضر للملف الجديد، على أداة مبنية من الصفر (إعادة ضبط بيئي: Temurin 17.0.13 + platform-36 + build-tools 35.0.0 + Gradle 8.11.1 بكامل التبعيات) · قتل OOM من kernel موثق بـ dmesg أثناء lint البارد (anon-rss 2.63غ — نمط صندوق 4غ) ثم قتل يتيم 797MB وإعادة محاولة بذاكرة محدودة أخضر 4م7ث بتحليل lintAnalyzeRelease حقيقي · assembleDebug ناجح — aapt يؤكد versionCode='17' versionName='3.2.8' · فحص أسرار الموجة نظيف. لا شيء مُرسل؛ القراءة لم تتغير: APPROVED FOR MERGE — الدمج والدفع قرار المالك وحده.
SuperBiz V 3.2.7 — «الشاهد إلزامي: لا استهلاك بلا دفتر» (RVW-20)
التاريخ: 2026-10-18...
SuperBiz V 3.2.9 — three final territories sealed (RVW-25..27)
SuperBiz V 3.2.9 — «Three Final Territories» (RVW-25..27)
Wave R11 — the last three queued adversarial territories from the R10 map: CSV import/export injection surface, Checks/Installments money math, and ZATCA queue transitions. Version 3.2.9 (versionCode 18) on branch review/independent-premerge-2026-10 @ d6f498a, merged to main via PR #1 (merge commit d555c39).
What was done
- [RVW-25] The last CSV formula-injection hole closed — shape-aware guard. Partial re-opening of L-5 with new evidence: pure numbers do not start a formula, but Excel evaluates
-SUM(A1)and-1+WEBSERVICE(…)as full formulas, and the hostile-import → verbatim-store → raw-export chain was real for exactly those. Fix: the'guard prefix is added only when a field starts with-followed by a letter (function / cell reference / text); pure numbers (-46.6,-2+3) stay bare per the L-5 contract, so coordinates and balances are never broken. - [RVW-26] Negative import prices now reject the row with named reasons. The parser rejected negative quantities since H4-6 but accepted negative cost/sale prices — two sibling columns, two disciplines. Negative rows are now skipped with explicit reasons; zero stays legal (gifts). The POS sale cart already floored totals at zero, so no money could be stolen — this is a data-quality / inventory-valuation contract.
- [RVW-27] The ZATCA poison element became visible. A missing archived document was skipped silently, spinning the receivable forever with no trace in any counter.
ProcessSummarygainedmissingDocs(additive, non-breaking) — same policy: no send, no status write, but the anomaly is now counted and surfaced to the caller. The reboot-stall suspect was dismissed (the worker passeslastAttemptElapsedMs=0→ production immune); the callback-crash path remains documented at-least-once with idempotent AUD-4 transactions. - Checks/Installments: VERDICT-SOLID. Every suspect is pre-guarded at the repository layer: plan bounds (months 1..120), pay clamps to an open plan inside the transaction, transition whitelist + fresh read, ghost-free delete. The engine's silent-empty and unbounded-months paths are unreachable from production.
- Two owner rulings packaged as one-glance decision tables (documented, NOT executed): coupon-void semantics (RVW-21: keep locked-as-tested vs compensating VOID marker) and webhook unsigned-fallback (fail-closed vs status quo) — FINDINGS §13-ه.
Independent verification for this wave
4/4 Python gates + 4/4 gate self-tests · genuine RED-first proof: exactly the 3 new tests failed first, then 57/57 filtered green (2 test-defects of our own caught and fixed in the loop, honestly recorded in VERIFICATION §17) · full suite 1797 tests / 0 failed / 0 skipped across 168 files (+5), forced rerun · 2 SearchHealthVMTest load-flakes isolated-green ×2 (same documented Dispatchers.Main flake class as R10) · assembleDebug green — aapt confirms versionCode='18' versionName='3.2.9' · lintRelease green 5m21s with fresh real analysis · wave secret scan CLEAN · OOM ledger now 8 entries (7th full-suite, 8th cold lint — both recovered, both after green).
About this APK
SuperBiz-v3.2.9-debug.apk is debug-signed for testing only (CN=SuperBiz Debug, cert SHA-256 e30e763a…7a93e — the same sandbox debug key as the v3.2.8 package). It installs and runs, but Play Store uploads must be built and signed with the owner's release keystore offline.
Integrity notes
- Tag
v3.2.9(annotated) points atd6f498a— the R11 docs tip of the fully-verified 44-commit chain (waves R1–R11). maincarries the same content via PR #1 merged555c39(merge method preserved the full 44-commit audit history).- Remote states independently verified via
ls-remoteafter upload.
Still open (owner-only)
- 🔴 URGENT: revoke/rotate all chat-exposed tokens (4 plaintext exposures across sessions, one admin-scoped).
- Rule on RVW-21 (coupon-void semantics) and webhook unsigned-fallback — one-glance tables ready in FINDINGS §13-ه.
- Instrumented-device run for the hardware-gated NOT-VERIFIED items (RVW-22 failure path on a real device, RVW-24 ART confirmation).
التغييرات — SuperBiz V 3.2.9
SuperBiz V 3.2.9 — «الثلاثة أقاليم الأخيرة: لا صيغة تمرّ من السالب، ولا سعر سالب يدخل، ولا عنصر سام يُهمَس» (RVW-25..27)
التاريخ: 2026-10-19 · versionCode: 18 · الفرع: review/independent-premerge-2026-10
موجة «أكمل المهام المتبقية» — مراجعة تخريبية للأقاليم الثلاثة المرصودة في خارطة R10: سطح حِقن CSV (استيراداً وتصديراً)، وحسابات الشيكات والأقساط، وانتقالات قائمة انتظار ZATCA. أقاليم الأقساط والشيكات ثبتت صلبة بحرسها الموثّق في طبقة المستودع (حدود الخطة، قصّ السداد على المفتوح، قائمة تحولات الشيكات البيضاء، القراءة الحديثة داخل المعاملة) — حُسمت بلا تعديل.
ما أُنجز
- [RVW-25] ثقب الحِقن الوحيد الباقي في التصدير أُغلق بحرس شكل-واعٍ: حسم L-5 جزئياً بدليل جديد — ادّعاء «السالب لا يبدأ صيغة» صحيح للأرقام الخالصة فقط، لكن إكسل يقيّم -SUM(A1) و-1+WEBSERVICE(…) صيغةً كاملة، وسلسلة الهجوم حقيقية هنا: ملف استيراد عدائي يُخزَّن نصه حرفياً (عقد الاستيراد الموثق) ثم يعبر كل تصدير لاحق خاماً فيفتحه صاحب المتجر في إكسل فيُنفَّذ. الإصلاح: بادئة الحرس ' تُضاف حين يبدأ الحقل بـ '-' ويليه حرف (دالة/مرجع خلية/نص عربي) — والأرقام الخالصة (-46.6، -2+3) تبقى عارية كعقد L-5 حرفياً فلا تُكسر إحداثيات ولا أرصدة.
- [RVW-26] الأسعار السالبة ترفض صفّ الاستيراد بأسباب مسمّاة: كان المحلل يرفض الكمية السالبة منذ H4-6 ويقبل سعر تكلفة/بيع سالباً — انضباطان مختلفان لعمودين شقيقين. الصف السالب يُتخطى الآن («سعر تكلفة سالب»/«سعر بيع سالب») والصفر مشروع للهدايا. سلة البيع كانت تطويق الإجماليات عند صفر فلا نهب مال — هذا عقد جودة بيانات وتقييم مخزني.
- [RVW-27] عنصر ZATCA السام صار مرئياً: وثيقة أرشيف مفقودة كانت تُتخطى بصمت فتدور مستحقةً كل دفعة بلا أثر في أي عدّاد.
ProcessSummaryاكتسبmissingDocs(إضافي غير مكسور) — السياسة نفسها: لا إرسال ولا كتابة حالة، لكن الشذوذ يُرى فيتلخّص له المستدعي ويقرر. - حسمَا مالك بجداول قرار بوضع النظرة الواحدة (مرصودان لا منفَّذان): دلالات إبطال الكوبون (RVW-21: إبقاء مقفول بالاختبار مقابل شاهد VOID تعويضي)، وwebhook unsigned-fallback (فشل مغلق لا يسلّم غير موقَّع مقابل الوضع الراهن) — FINDINGS §13-ه.
التحقق المستقل لهذه الجولة
4 بوابات Python ناجحة + اختباراتها الذاتية الأربعة ناجحة · إثبات أحمر حقيقي أولاً: التشغيل المُصفّى أفق 3 اختبارات جديدة بالضبط ثم أخضر 57/57 بعد الإصلاح (اسنتادَا الاختبار نفسه أُصلحا في الحلقة وسُجّلا بصدق) · الجناح الكامل 1797 اختباراً / 0 فاشل / 0 متخطى عبر 168 ملفاً (+5) بإعادة تشغيل قسرية — حالتا SearchHealthVMTest تذبذبتا تحت حمل الجناح (Dispatchers.Main المتزامن) وأخضرتا معزولتين مرتين، نفس صنف التذبذب الموثق في R10 · قتلان OOM من kernel (السابع والثامن الموثّقان — نمط صندوق 4غ) استُعيدا ببروتوكول الذاكرة المقيدة بعد إثبات الأخضر · assembleDebug ناجح — aapt يؤكد versionCode='18' versionName='3.2.9' · lintRelease أخضر 5م21ث بتحليل حقيقي جديد بعد إزالة مخلفات lint · فحص أسرار الموجة نظيف. القراءة لم تتغير: APPROVED FOR MERGE — الدمج قرار المالك (PR #1 مفتوح ويستقبل هذه الموجة تلقائياً).
SuperBiz V 3.2.8 — webhook delivery chain sealed (RVW-22..24)
SuperBiz V 3.2.8 — «سلسلة الويب هوك تحت المجهر: لا تسريب مقابس، وعقد الحمولة مقفول» (RVW-22..24)
versionCode: 17 · Branch: review/independent-premerge-2026-10 · Commit: 87c81e8 · Tag: v3.2.8
Tip of the independent pre-merge remediation chain (waves R4–R10, 42 commits ahead of main). Adversarial review of the webhook delivery chain (payload builder → transport client → store/secret gateway) — the last outbound path never reviewed end-to-end. Decision: APPROVED FOR MERGE (merge to main remains the owner's call — a PR is open for one-click review).
Installation package (APK)
SuperBiz-v3.2.8-debug.apk— debug-signed for testing installs only (fresh debug key, SHA-256e30e763ac330f56e86bda5342ec6395a02c154a4e18652f275c016c66bd7a93e; a previous debug build signed with a different key must be uninstalled first).- Verified:
com.superbiz.app,versionCode='17',versionName='3.2.8', minSdk 24, zipaligned, v1+v2 signatures (apksigner, build-tools 35.0.0). - Store/production uploads must be signed with the owner's release keystore (kept offline by design —
keystore.propertiesis intentionally not in the repo).
Verification (independently re-run on a from-scratch toolchain)
- Full suite 1792 tests / 0 failed / 0 skipped across 168 files (forced re-run after a green filtered run of the new file)
- 4 Python gates + 4 self-tests PASS ·
assembleDebugOK (aapt-confirmed identity) ·lintReleaseGREEN (4m7s, reallintAnalyzeRelease) - Wave secret scan CLEAN · Temurin JDK 17.0.13+11 · platform-36 · build-tools 35.0.0 · Gradle 8.11.1
ما أُنجز (from CHANGELOG)
- [RVW-22] إغلاق مجرى الاستجابة في كل الحالات — لا تسريب مقبس لكل تسليم فاشل: كان
WebhookClient.sendيغلقinputStreamفقط — وعلى استجابة 4xx/5xx يرمي الوصول استثناءً يبتلعهrunCatchingفيبقىerrorStreamمفتوحاً بلا قارئ، فلا يعود الاتصال لمِجمع الاتصالات ويتسرب مقبس/واصف لكل حدث فاشل. الإصلاح: المجرى المُغلق يتبع رمز الاستجابة، ونجاح المسار السليم بمواكبته (keep-alive) لم يُمَس — معالجة موارد خالصة لا تغيّر ما يُرسل أو يُسجَّل. - [RVW-23] عقد الحمولة العامة أصبح مقفولاً —
WebhookKitTest(8 عقود، JVM خالص): حمولة ذهبية مثبتة حرفياً بأسمائها وترتيبها وقيمها، نصوص معادية تدور تهريباً→تحليلاً عبر MiniJson مطابقة بيتياً، توقيع يطابق متجه RFC 4231 (الحالة 2) مقططعاً 16 بايت، والسداسي ASCII نقي تحت محلية عربية. 8/8 أخضر من أول تشغيل. - [RVW-24] مشتبه به يُرفض بالبرهان — سداسي التوقيع لا يُعرَّب: ست محليات معادية (ar-SA/ar/fa-IR/hi-IN/dz/mr) كلها سداسي ASCII على JDK 17.0.13؛ مواصفة Formatter تُعرِّب 'd' وحدها. مع قفل رجعي دائم يصطاد أي انحراف منصّي مستقبلي.
- [موجّه إلى المالك — مرصود لا مُنفَّذ]: سرٌّ مهيَّأ غير قابل للفك يجعل
sendيواصل التسليم غير الموقَّع بصمت — البديل المغلق يغيّر دلالات التسليم، قرار المالك (كـ RVW-21: دلالات إبطال الكوبون).
Integrity notes
- This wave was executed twice (an environment rollback lost the first execution before any push); the re-execution from the session transcript reproduced identical results — documented honestly in the repo docs (
INDEPENDENT_VERIFICATION_RESULTS.md§16). mainis intentionally untouched; this release is cut from the review branch tip.
SuperBiz V 3.2.0 — الأفق الخامس «العالمية»: امتثال خليجي ثلاثي + الفرنسية + مبدّل الست لغات + عقد التصدير
SuperBiz V 3.2.0 — «الأفق الخامس: العالمية»
التاريخ: 2026-10-09 · versionCode: 9 · الوسم: v3.2.0 · التوقيع: شهادة المفتاح الأصلي (SHA-256: 04ad9be1…3e3109) — ترقية تراكبية تحفظ كل البيانات (مخطط v16 دون تغيير في هذا الإصدار).
ما الجديد
🏛️ الامتثال الخليجي — ثلاث ولايات بقوانينها
- السعودية 15% · الإمارات 5% · البحرين 10% — اختيار الولاية من مركز الإعدادات (بطاقة «الولاية الضريبية الخليجية») يضبط نسبة الضريبة الافتراضية بفعل صريح من المالك/المدير، والفواتير المحفوظة تحمل نسبتها اللحظية فلا يتأثر التاريخ أبداً.
- ربط ZATCA (فاتورة) سعودي حصراً: خارج الولاية السعودية يبقى التطبيق صامتاً شبكياً كلياً — لا ختم ولا QR ولا UBL ولا أي اتصال، حتى لو كان الربط مفعّلاً.
- ملصق «فاتورة ضريبية / Tax Invoice» على PDF A4 والإيصال الحراري للفواتير الضريبية B2B — إلزامي في الولايات الثلاث.
- عملة البحرين (دينار) متاحة بدقة 2-عشرية — وهي نفس دقة تقريب ضريبة البحرين الرسمية (أقرب 10 فلس).
🌍 الفرنسية + مبدّل اللغات الست داخل التطبيق
- الفرنسية انضمت كاملة (2436 سلسلة × 6 لغات: العربية، الإنجليزية، التركية، الفرنسية، الأردية، الإندونيسية) بمطابقة تامة مفاتيحاً وترتيباً ومعاملات.
- لأول مرة: مبدّل لغة داخل التطبيق (الملف الشخصي ← التفضيلات) — كانت اللغات الإضافية تُفعَّل بلغة النظام فقط.
- حراس CI معمّمون على اللغات الست كشفوا ورمّموا 55 سلسلة كانت ستحطم الواجهة وقت التشغيل في التركية/الأردية/الإندونيسية.
📤 عقد التصدير العام الموثق
- مواصفات عامة ثابتة لأعمدة ملفات التصدير القياسية (الفواتير 13 عموداً، المخزون 9، المطالبات 6) بمفاتيح آلة وأنواع موثقة —
docs/EXPORT_API.md— فوق محرك العملات التاريخي (R17) دون أي مساس.
📚 وثائق حاكمة جديدة
docs/ROADMAP.md(أول إنشاء): الأفاق الخمسة كاملة بحالاتها وبوابات خروجها.docs/ADR-002_MONEY_CURRENCY.md: قرارات النقود متعددة العملات والامتثال الخليجي.
الجودة
- 1716 اختبار وحدة أخضر على debug وrelease (كانت 1690، زادت 26).
- CI أخضر: بناء + اختبارات + lint + حارس السلاسل الست + فاحص الحدود الشبكية.
- APK موقّع 6,224,607 بايت (SHA-256:
816d45df…3730595) · AAB 9,940,833 بايت.
الترقية
ثبّت فوق أي إصدار سابق مباشرة — نفس شهادة التوقيع منذ v1.0.0، وكل بياناتك محفوظة. خذ نسخة احتياطية من داخل التطبيق قبل الترقية كإجراء وقائي.
SuperBiz V 3.1.0 — اكتمال اللغات (خمس لغات بتغطية 100%)
SuperBiz V 3.1.0 — «اكتمال اللغات» · versionCode 8 · الأفق الرابع مغلق بالكامل
إغلاق آخر بند قابل للتنفيذ في الأفق الرابع: الإندونيسية تكتمل 100% فتنضم إلى العائلة — خمس لغات مشحونة بتغطية كاملة مثبتة آلياً: العربية المرجعية، الإنجليزية، الأوردية (RTL)، التركية، والإندونيسية الجديدة — كلٌّ بـ2427 مفتاحاً بترتيب المرجع حرفياً.
الجديد في هذا الإصدار
- الإندونيسية (Bahasa Indonesia) 100% — استُكملت الـ607 المتبقية من نقطة حفظ 75% التزاماً بعقد «لا لغة ناقصة تُشحن» (LANGUAGE_PLAN §2): شاشات الكشف كاملة (الاستوديو، التسليمات، بريد SMTP، قواعد التوليد التلقائي، شاشة التحقق)، الولاء والكوبونات، لوحة المؤشرات، المستخدمون والأدوار، المنسّق الذكي، العملات، استيراد CSV، المزامنة المشفرة، النبض الكامل، الويب هوك وقوالب الطباعة.
- مصطلحات تجارية إندونيسية طبيعية: Rekening Koran للكشف، Piutang للذمم، Titik Pesan لنقطة الطلب، Frasa Sandi لعبارة المرور — بوسائط تنسيق
%1$sمحفوظة حرفياً ومُتحقَّق بها آلياً قبل الدمج. - الإندونيسية ظاهرة في مبدّل لغة النظام (App Languages) على أندرويد 13+ عبر locales_config.
الجودة
- 1706 اختبار وحدة أخضر على نسختي debug وrelease (مخطط قاعدة v16).
- فاحص التغطية اللغوية (بوابة CI): values-id 100% — 2427/2427، صفر مفاتيح يتيمة.
- توازن المرجع: 2427 عربياً = 2427 إنجليزياً بنفس الترتيب.
ماذا يعني «الأفق الرابع مغلق»؟
اكتملت رحلة التوسع العالمي على ثلاث دفعات: V 2.5.0 (عملات متعددة محاسبياً صحيحة + استيراد CSV)، V 3.0.0 (مزامنة مشفرة طرف-لطرف + الأوردية والتركية + التكيف اللوحي + الويب هوك وقوالب الطباعة + النبض الكامل)، V 3.1.0 (اكتمال الإندونيسية). ما تبقى من بنود الأفق بيد المالك: عنوان خادم المزامنة، وبيانات ZATCA sandbox، والنشر على Play Console.
التثبيت
نزّل app-release.apk من الأسفل وثبّته مباشرة (فعّل «التثبيت من مصادر غير معروفة» عند الحاجة). النسخة موقّعة بشهادة الإصدار الرسمية نفسها — الترقيات فوق أي إصدار سابق تحفظ كل بياناتك. للترقية من إصدار أقدم ثبّت فوقه ببساطة.
دون اتصال 100% كما always: كل وظائف المحاسبة تعمل بلا إنترنت، والمزامنة المشفرة خيار بيد المالك حصراً.
SuperBiz — دفترك المحاسبي الكامل في جيبك. صُنع بعناية من CTO-DRS.
SuperBiz V 3.0.0 — «المعيار العالمي»
SuperBiz V 3.0.0 — «المعيار العالمي»
الأفق الرابع — الدفعة الثانية مكتملة. من 1.0 إلى 3.0 ترقية تراكبية بنفس شهادة التوقيع تحفظ كل بياناتك.
المزامنة المشفرة طرف-لطرف (H4-3)
- مفتاحك من عبارة مرور لا تُخزَّن إطلاقاً (Argon2id 64MiB على الجهاز) ويُغلَّف بمفتاح جهازك — نسيان العبارة يعني فقدان وصول المزامنة وبيانات كل جهاز سليمة محلياً.
- الدمج حتمي (LWW) بهوية أصلية لكل صف، والحذف شاهد لا غياب صامت، والسجلات المالية لا تُدمج قط.
- بصمة إقران تُقارن وجهاً لوجه بين الجهازين — جهازان ببصمتين مختلفتين لن يشاركا أي شيء.
- الخادم ترحيل عمياء تملكها أنت: يرى كتلاً مشفرة حصراً (عقد النقل داخل التطبيق).
- الاختبار الحاكم: جهازان يحرران نفس الصنف دون اتصال ثم يتقاربان بايتاً-ببايتاً — أخضر.
لغتان جديدتان بتغطية 100%
- الأوردية (RTL) والتركية — 2427 مفتاحاً لكل منهما، والاكتمال مُثبت بفاحص آلي في CI (الإندونيسية بنقطة حفظ 75% تُستأنف — لا ناقص يُشحن).
قوالب الطباعة + الويب هوك (H4-6)
- ثلاثة قوالب (كلاسيكي/مفصّل/مضغوط) للحراري وA4 معاً.
- إشعار فوري عند كل فاتورة جديدة نحو عنوان HTTPS تملكه، بتوقيع HMAC اختياري.
بطاقة النبض الكامل (H4-7) + التكيف اللوحي (H4-4)
- نبض عمل 0..100 من ستة مؤشرات موزونة بأحكام صادقة — بلا أساس لا نبض.
- تخطيطات لوحية: أعمدة نقطة البيع 2/3/5 ولوحة KPI بعمودين.
1706 اختبار وحدة أخضر على مخطط قاعدة v16. APK 5.96MB (سقف الجودة 10MB).