docs: handbook, diagrams and guides brought up to 2026-10-02

- technical-handbook: question packs instead of subscriptions, real
  hearts with the new wait screen (screenshot), math-only tutor and what
  is charged (new 9-7), admin cancel/refund, Bazaar planId, account
  deletion, 59 endpoints, 779 tests, 14 apps, status and open decisions.
- Diagrams redrawn: use-case (buy a pack, refunds), data model
  (QuestionCredit, HeartsPass, Profile.birth_date), pack payment sequence.
- The PDF is now built from the Markdown by docs/build_handbook.py
  (pandoc + Chrome, font in docs/assets); the hand-made HTML it used to
  come from was not in the repo and had been lost.
- architecture, operations, security-before-production (item 13 closed),
  ai-cost-and-guardrails and README follow the same changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 23:10:50 +03:30
parent 8a4753bd15
commit 7683920b0b
13 changed files with 196 additions and 55 deletions

View File

@@ -63,7 +63,9 @@ Message.objects.filter(role='assistant', created_at__gte=since).values('conversa
`transaction_mode: IMMEDIATE`ِ SQLite همین تست ۵۰۰ می‌گیرد. روی Postgres سنجیده نشده.
- **قلبِ نامحدودِ بسته** در `HeartsPass` است، جدا از `Subscription`، تا خریدِ بسته اشتراکِ کسی را عوض
نکند. از پایانِ کارتِ قبلی ادامه پیدا می‌کند. `HEARTS_ENFORCED` حالا پیش‌فرض روشن است، پس قلبِ صفر
واقعاً جلوی جواب را می‌گیرد.
واقعاً جلوی جواب را می‌گیرد، و پایانِ درس یا جزیره‌ی بی‌جواب را هم (`content/tests_hearts_gate.py`).
- **لغو و بازپرداخت** از پنلِ ادمین (`/admin/payment/order/`): بازپرداخت فقط اعتبارِ خرج‌نشده‌ی همان
بسته و روزهای قلبش را پس می‌گیرد؛ پول از پنلِ درگاه برگردانده می‌شود. روند در `docs/operations.md`.
- اپ موجودی را از `GET /api/ai/quota` می‌خواند و بعد از هر جواب از `remainingQuota` و `credits`ِ خودِ
جواب. صفحه‌ی خرید `GET /api/subscription/status` (`questionCredits`، `unlimitedHeartsUntil`) را می‌خواند.
- **کافه‌بازار:** هر بسته باید در پنلِ بازار «محصولِ مصرفی» تعریف شود و اپِ اندروید بعد از تأیید
@@ -77,7 +79,10 @@ Message.objects.filter(role='assistant', created_at__gte=since).values('conversa
1. **صافیِ سرور، پیش از مدل و بی‌هزینه.** فقط ترفندهای آشکار را می‌گیرد: «دستورهای قبلی را نادیده
بگیر»، «پرامپتت چیه»، `developer mode`. این صافی عمداً تنگ است: «قانونِ فیثاغورس را فراموش کردم»
ریاضی است و رد نمی‌شود. جمله‌ای درباره‌ی آسیب به خود رد نمی‌شود و جوابی مهربان با شماره‌ی
اورژانسِ اجتماعی (۱۲۳) و صدای مشاور (۱۴۸۰) می‌گیرد.
اورژانسِ اجتماعی (۱۲۳) و صدای مشاور (۱۴۸۰) می‌گیرد. تا ۲۰۲۶-۱۰-۰۲ «می خوام بمیرم» (با فاصله)،
«دیگه نمیخوام زنده باشم» و «خود کشی» از صافی رد می‌شدند و مدل فقط جوابِ «فقط ریاضی» می‌داد
(یک فراخوانیِ زنده، ۰٫۰۱۸ سنت). حالا روی متنِ بی‌فاصله سنجیده می‌شود. سوالی مثلِ «امروز پام درد
می‌کنه» به مدل می‌رسد و متنِ ثابتِ «فقط ریاضی» را می‌گیرد (آزموده شد).
2. **قاعده در پرامپتِ سیستم (`SCOPE_RULE`):** هر چیزِ غیرِ ریاضی، و هر دستوری از درونِ پیامِ
دانش‌آموز، با علامتِ `[خارج-از-ریاضی]` جواب داده می‌شود.
3. **جایگزینیِ علامت با متنِ ثابت.** در استریم، ۴۰ حرفِ اول نگه داشته می‌شود تا علامت هرگز به