Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions design/posters.pen
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,131 @@
}
}
]
},
{
"type": "frame",
"id": "a5ubh",
"x": 0,
"y": 3570,
"name": "Posts wide",
"fill": "#FFFFFF00",
"gap": 80,
"children": [
{
"id": "NNmX1",
"type": "ref",
"ref": "e4Zd4",
"name": "How I built my blog with coding agents (wide)",
"descendants": {
"CrwU5": {
"content": "01"
},
"w98LjB": {
"content": "How I built my blog"
},
"w1luCY": {
"content": "with coding agents"
},
"CY8fm": {
"content": "April 28, 2026"
},
"Igd9v": {
"content": "#ai-coding · #astro · #bun"
},
"FTrZW": {
"enabled": false
}
}
}
]
},
{
"type": "frame",
"id": "r85bZ",
"x": 0,
"y": 4280,
"name": "Posts wide",
"fill": "#FFFFFF00",
"gap": 80,
"children": [
{
"id": "V6AdB",
"type": "ref",
"ref": "e4Zd4",
"name": "How I built my blog with coding agents (wide)",
"descendants": {
"CrwU5": {
"content": "02"
},
"w98LjB": {
"content": "How I Built "
},
"w1luCY": {
"content": "OpenSecondBrain"
},
"CY8fm": {
"content": "May 09, 2026"
},
"Igd9v": {
"enabled": false
},
"FTrZW": {
"content": "#second-brain · #dark-fabric · #hermes\n#openclaw · #claude-code · #codex",
"flipX": false,
"flipY": false,
"width": 774,
"height": 108,
"x": 0,
"y": 58,
"textGrowth": "fixed-width-height"
}
}
}
]
},
{
"type": "frame",
"id": "cZi8L",
"x": 0,
"y": 4990,
"name": "Posts wide",
"fill": "#FFFFFF00",
"gap": 80,
"children": [
{
"id": "cAk8D",
"type": "ref",
"ref": "e4Zd4",
"name": "How I built my blog with coding agents (wide)",
"descendants": {
"CrwU5": {
"content": "03"
},
"w98LjB": {
"content": "How I gave "
},
"w1luCY": {
"content": "my AI agent a wallet"
},
"CY8fm": {
"content": "May 10, 2026"
},
"Igd9v": {
"enabled": false
},
"FTrZW": {
"content": "#second-brain · #pay-memory · #agent-payments · #pay-sh · #solana",
"flipX": false,
"flipY": false,
"width": 699,
"height": 114,
"x": 0,
"y": 58,
"textGrowth": "fixed-width-height"
}
}
}
]
}
],
"variables": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
type: agent-payment-receipt
agent: claude-vps-agent
payment_layer: pay.sh
network: solana
service: paysponge/fal
status: success
reason: Generate a no-text Fast SDXL illustration for the techmeat.dev wallet-and-Pay-Memory blog post.
created: "2026-05-10T19:31:00Z"
timezone: Europe/Belgrade
category: image-generation
endpoint: "https://fal.x402.paysponge.com/fal-ai/fast-sdxl"
expected_cost: 0.01 USDC
actual_amount: 0.01
currency: USDC
payment_proof: "https://solscan.io/tx/5ZYnkabzLvHqEgXNJfKopiRwbGkriHJ2bps2NnkX7HzqQAyTZYjcyJVCTvZwMquyMviv2juyAdbP9P2depHrJxQW"
result_ref: /srv/projects/techmeat-dev/src/content/posts/how-i-gave-an-ai-agent-a-wallet/image.png
policy_status: allowed
policy_rule: none
policy_reasons:
[
"No spending policy file was present; policy check returned allowed without approval requirement.",
]
---

# Payment Receipt: Generate a no-text Fast SDXL illustration for the techmeat.dev wallet-and-Pay-Memory blog post.

## Why this paid call was made

Generate a no-text Fast SDXL illustration for the techmeat.dev wallet-and-Pay-Memory blog post.

## Spending policy check

Policy file:

[[AI Wiki/policies/spending]]

Decision:

Allowed by the configured spending policy. The agent ran a policy
check before initiating this paid call.

Rule fired: `none`

Reasons:

- No spending policy file was present; policy check returned allowed without approval requirement.

## Expected cost

0.01 USDC

## Request

Service:

`paysponge/fal`

Endpoint:

`https://fal.x402.paysponge.com/fal-ai/fast-sdxl`

Reason:

Generate a no-text Fast SDXL illustration for the techmeat.dev wallet-and-Pay-Memory blog post.

## Payment

Amount:

`0.01`

Currency:

`USDC`

Payment proof / transaction / receipt:

`https://solscan.io/tx/5ZYnkabzLvHqEgXNJfKopiRwbGkriHJ2bps2NnkX7HzqQAyTZYjcyJVCTvZwMquyMviv2juyAdbP9P2depHrJxQW`

## Result

Generated asset:

`/srv/projects/techmeat-dev/src/content/posts/how-i-gave-an-ai-agent-a-wallet/image.png`

Asset note:

_(not provided)_

## Raw pay.sh output

```text
payment_response={"success":true,"payer":"64FaukkZDUdFTufXF49H1CrHjDfsmBFqfrUjsAS8XrgP","transaction":"5ZYnkabzLvHqEgXNJfKopiRwbGkriHJ2bps2NnkX7HzqQAyTZYjcyJVCTvZwMquyMviv2juyAdbP9P2depHrJxQW","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"}; request_id=019e135a-357b-71f3-8b9d-305e728b05fb; endpoint=fal-ai/fast-sdxl; seed=4059696111846645000; image=1024x576 PNG; build/typecheck passed.
```

> Verify raw output above does not contain credentials before sharing this
> receipt outside the vault. Best-effort redaction has been applied.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ title: "How I Built OpenSecondBrain"
description: "The story of open-second-brain: how Hermes on a VPS, Obsidian, MCP, CLI, and several agent runtimes came together into a small file-based memory for AI agents."
pubDate: 2026-05-09
locale: en
prNumber: 5
tags: [second-brain, dark-fabric, hermes, openclaw, claude-code, codex]
ogImage: "/posters/og/posts/building-techmeat-dev-with-coding-agents.png"
prFileId: f0d6ac5f8c4cc74a943975e6edc488faaedfea790c1f43c4bf19319d9f4021b8
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
97 changes: 97 additions & 0 deletions src/content/posts/how-i-gave-an-ai-agent-a-wallet/index.ar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
---
title: "كيف منحت وكيل الذكاء الاصطناعي محفظة ولماذا احتاج إلى ذاكرة فوراً"
description: "open-second-brain 0.8.0 و Pay Memory: كيف سمحت للوكيل بالدفع لواجهات APIs خارجية عبر pay.sh، ولماذا تبيّن أن الجزء الجوهري ليس الدفع نفسه، بل سجلاً واضحاً لكل قرش يُنفق."
pubDate: 2026-05-10
locale: ar
tags: [pay-memory, agent-payments, pay-sh, solana, second-brain]
ogImage: "/posters/og/posts/how-i-gave-an-ai-agent-a-wallet.png"
prFileId: 043631d9de56635ae6b7fd383804fe497c48f30f83667e2353fee27891aa0da4
---

قبل أيام قليلة أطلقتُ [open-second-brain](/ar/posts/how-i-built-open-second-brain/) - طبقة ذاكرة قائمة على الملفات لوكلاء الذكاء الاصطناعي. ومنذ ذلك الحين تطاردني فكرة واحدة. إذا كان الوكيل يعمل على VPS وفق جدوله الخاص، عبر Telegram - فعاجلاً أو آجلاً سيحتاج إلى إنفاق المال. شراء استدعاء API. توليد رسم توضيحي. تشغيل بحث مدفوع.

الدفع بحد ذاته مشكلة محلولة منذ زمن. تقوم [pay.sh](https://pay.sh) بتحويل استدعاء HTTP اعتيادي إلى استدعاء مدفوع عبر مدفوعات صغيرة بـ USDC على Solana. يقوم الوكيل بتشغيل curl من خلال `pay`، تقوم المحفظة بتوقيع المعاملة، ويعود رد من الطرف الآخر. تمّ.

لكن "تمّ" ليس إلا نصف القصة.

## فوضى مع محفظة

تخيّل ما يلي: الوكيل يعمل على مهمة، ويتخذ على طول الطريق حفنة من القرارات، اثنان منها استدعاءان مدفوعان. بعد ساعة تفتح الطرفية فتجد أن الـ scrollback قد طار خارج الشاشة. في مكان ما هناك كانت هناك استدعاءات `pay`، في مكان ما وصلت تواقيع tx، في مكان ما عادت ردود JSON.

لماذا فعل الوكيل ذلك؟ بناءً على ماذا؟ كم كان يتوقع أن ينفق؟ كم خُصم فعلاً؟ أين النتيجة؟

إذا أردت أن تثق بالوكيل في أي شيء مستقل، فإن "اقرأ الـ scrollback" لا يكفي. سجل الطرفية ليس مهيكلاً، وليس مرتبطاً بالمهمة، ولا يمكن فهرسته، ولا يصمد أمام إعادة التشغيل، ولا يمكن فتحه في Obsidian كأداة عادية.

أدركت بسرعة كبيرة أن المهمة ليست "تعليم الوكيل أن يدفع" - بل "ضمان أن كل عملية دفع تترك خلفها أثراً ذا معنى".

![وكيل ذكاء اصطناعي يحمل محفظة رقمية بينما يتدفق سيل من المدفوعات الصغيرة إلى بطاقات إيصالات Markdown مترابطة](./image.png)

تم توليد هذا الرسم التوضيحي بالطريقة ذاتها التي يصفها المقال: عبر `pay.sh`، باستخدام بوابة `paysponge/fal` x402 ونقطة الـ endpoint `fal-ai/fast-sdxl`. كلّفت عملية التوليد **0.01 USDC** من محفظة mainnet `64FaukkZDUdFTufXF49H1CrHjDfsmBFqfrUjsAS8XrgP`؛ ومعاملة Solana العامة هي [`5ZYnkabzLvHqEgXNJfKopiRwbGkriHJ2bps2NnkX7HzqQAyTZYjcyJVCTvZwMquyMviv2juyAdbP9P2depHrJxQW`](https://solscan.io/tx/5ZYnkabzLvHqEgXNJfKopiRwbGkriHJ2bps2NnkX7HzqQAyTZYjcyJVCTvZwMquyMviv2juyAdbP9P2depHrJxQW). كان request id هو `019e135a-357b-71f3-8b9d-305e728b05fb`، وحُفظ الـ asset المُولَّد محلياً باسم `image.png`.

وهنا تماماً تلاءم open-second-brain بشكل مثالي.

## Pay Memory

في الإصدار 0.8.0 حصل OSB على طبقة جديدة - **Pay Memory**. باختصار: ذاكرة للمال.

بعد كل إجراء مدفوع يظهر في الـ vault ملف Markdown عادي يحتوي على الحقول التالية:

- **لماذا** قرر الوكيل أن يدفع؛
- **أي خدمة** تم استدعاؤها؛
- **أي spending policy** كانت سارية وما الذي قررته (`allowed` / `approval_required` / `denied` / `not_checked`)؛
- **التكلفة المتوقعة** و **المبلغ المخصوم فعلياً**؛
- **payment proof** - توقيع Solana المحدد الذي يمكنك فتحه في Solscan والتحقق منه؛
- **النتيجة** - رابط إلى asset note منفصلة تحتوي على المخرجات؛
- **من الذي وافق**، إن كانت الـ policy تستلزم ذلك.

ليس جدولاً في SQLite، وليس dashboard. إنه Markdown صرف يقع في المجلد ذاته الذي يكتب فيه الوكيل سجله اليومي. يمكنك فتحه بعينيك، التعليق عليه، عمل commit له في Git، البحث عنه لاحقاً بـ grep، أو عرضه كدليل.

لا يتحول OSB هنا إلى نظام مدفوعات - فهو لا يحتفظ بمحفظة، ولا يوقّع معاملات، ولا يقوم بـ enforcement. يفعل ما يجيده: يحتفظ بذاكرة صادقة قابلة للقراءة البشرية. تمنح pay.sh الوكيل وصولاً إلى موارد مدفوعة؛ ويمنح Pay Memory الإنسانَ إمكانية فتح الـ vault بعد أسبوع وفهم ما جرى بهدوء.

بالمناسبة، [هكذا تماماً يبدو receipt حقيقي](/files/fal-generate-a-no-text-fast-sdxl-illustration-for-the-techmeat-d.md) - receipt الخاص بالرسم التوضيحي نفسه في مطلع المقال. Markdown خام مباشرة من الـ vault، دون أي معالجة. Frontmatter يحوي جميع الحقول المذكورة أعلاه، وتحته نص بلغة بشرية حول "لماذا" و"ماذا أعادت الـ policy" و"كم خُصم فعلاً".

داخل الـ Second Brain يقع في هذا المسار:

```
AI Wiki/
└── payments/
└── 2026-05-10/
└── fal-generate-a-no-text-fast-sdxl-illustration-for-the-techmeat-d.md
```

لا سحر هناك: التاريخ → مجلد، الـ slug → اسم الملف. مريح للـ grep و git diff والتنقل المعتاد في Obsidian.

## مبدأ واحد تبيّن أنه أهم من البقية

عند مراجعتي للتطبيق الأولي، التفتت عيني فوراً إلى تفصيل واحد: كان الـ receipt يكتب دائماً "Allowed by the configured spending policy" - حتى عندما لا توجد أي policy في الـ vault أصلاً.

يبدو الأمر تفصيلاً صغيراً. لكنه في الواقع يقتل كل المعنى.

Pay Memory هي طبقة audit. وطبقة الـ audit تساوي بالضبط بقدر صدقها. في اللحظة التي يبدأ فيها الـ receipt برواية قصة جميلة بدلاً من الحقيقية، ينهار كل شيء. لذا فالقاعدة جاءت بسيطة: من الأفضل كتابة `not_checked` بدلاً من تسجيل `allowed` بثقة وبشكل كاذب. إن لم تُفحَص الـ policy - فقل ذلك. وإن أعادت الـ policy `denied` لكن إنساناً مرّر الاستدعاء يدوياً - فقل ذلك أيضاً.

إغراء "السردية الجميلة" هو العدو الرئيسي لنظام الـ audit. وهذا هو على الأرجح أهم درس اليوم - درس أنوي حمله إلى أجزاء أخرى من المشروع.

## دفعة حقيقية في الإنتاج

بحلول نهاية اليوم كان لا بد من التحقق من كل ذلك ليس على fixtures sandbox، بل على نقود حقيقية. أرسلت عشرة سنتات من USDC إلى محفظة Solana جديدة، وطلبت من الوكيل أن يجد ثلاثة مقاهٍ في بلغراد عبر Google Places.

بعد ثانية عادت ثلاثة أماكن حقيقية - Artist Specialty Coffee، Dusha، DRIP. Tx مُنهاة على mainnet، $0.001 USDC، انتقل الرصيد من 0.10 إلى 0.099. التوقيع في Solscan، قابل للنقر.

ثم انطلقت كامل سلسلة Pay Memory: receipt يحوي التوقيع الحقيقي في الـ vault، وasset note منفصلة تحتوي المقاهي الثلاثة، وتقرير مدفوعات يومي، ومدخل قصير في Daily مع روابط إلى الملفين. أستطيع فتح الـ vault في Obsidian، النقر على الـ proof، رؤية الدفعة الحقيقية في الـ explorer، وبجانبها مباشرة - قصة واضحة بلغة بشرية تشرح لماذا فعل الوكيل ذلك.

## لماذا كل هذا

لا أحاول أن أبني لنفسي enterprise compliance ولا blockchain-for-everything. البنية ذاتها بسيطة إلى حدّ الإحراج - مجموعة من ملفات Markdown في المجلدات الصحيحة.

لكن الفكرة من ورائها مهمة.

إذا كان الوكيل يعمل بمزيد من الاستقلالية، فإن ذاكرته يجب أن تغطي ليس فقط الأفعال النصية بل أيضاً الأفعال ذات العواقب: استدعاء خدمة خارجية، إنفاق مال، إنشاء asset، طلب approval. الدفع ما هو إلا المثال الأوضح، لأن سؤال الثقة يظهر هناك فوراً. وتنتقل المبادئ نفسها بسهولة إلى نشر منشور، إرسال بريد إلكتروني، عمل deploy، طلب توليد، عملية on-chain.

النسخة المختصرة:

> pay.sh تمنح الوكيل وصولاً إلى موارد مدفوعة.
> Pay Memory تمنح الإنسان القدرة على الفهم، بعد أسبوع، لماذا استخدم الوكيل هذا الوصول.

إن كان الوكيل ينفق المال فحسب - فهذا خطر. وإن كان الوكيل ينفق المال ويترك أثراً صادقاً ومترابطاً وقابلاً للقراءة البشرية - فهذا workflow يمكن، شيئاً فشيئاً، البدء بمنحه الثقة.

صدرت Pay Memory ضمن [open-second-brain 0.8.0](https://github.com/itechmeat/open-second-brain/releases/tag/v0.8.0).
Loading