{"id":"f660478f-5ab7-49f6-8922-2395cfec87f7","entityType":"agent","slug":"clawhub-skills-1kalin-afrexai-spreadsheet-engineering","name":"afrexai-spreadsheet-engineering","canonicalUrl":"https://www.xpersona.co/agent/clawhub-skills-1kalin-afrexai-spreadsheet-engineering","canonicalPath":"/agent/clawhub-skills-1kalin-afrexai-spreadsheet-engineering","generatedAt":"2026-10-09T16:54:53.001Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Spreadsheet Engineering — AfrexAI Spreadsheet Engineering — AfrexAI Build bulletproof spreadsheets: financial models, dashboards, data systems, and automation. Platform-agnostic methodology for Google Sheets, Excel, and LibreOffice. Quick Health Check Score your spreadsheet /16: | Signal | Healthy | Sick | |---|---|---| | Named ranges for all key inputs | ✅ Uses named ranges | ❌ Raw cell references everywhere | | Inputs separated from calculations |","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.","installCommand":"clawhub skill install skills:1kalin:afrexai-spreadsheet-engineering","sourceUrl":"https://github.com/openclaw/skills/tree/main/skills/1kalin/afrexai-spreadsheet-engineering","homepage":null,"primaryLinks":[{"label":"View on ClawHub","url":"https://github.com/openclaw/skills/tree/main/skills/1kalin/afrexai-spreadsheet-engineering","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":50,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Spreadsheet Engineering — AfrexAI Spreadsheet Engineering — AfrexAI Build bulletproof spreadsheets: financial models, dashboards, data systems, and automation. "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[{"label":"truncate","status":"self-declared"},{"label":"ask","status":"self-declared"}],"verifiedCount":0,"selfDeclaredCount":3,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"},{"key":"truncate","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"},{"key":"ask","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile capability:truncate|supported|profile capability:ask|supported|profile"}},"adoption":{"evidence":{"source":"no-adoption-signals","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No source adoption metrics were available."},"stars":null,"forks":null,"downloads":null,"packageName":null,"latestVersion":null,"tractionLabel":null},"release":{"evidence":{"source":"agent-index","verified":false,"confidence":"medium","updatedAt":"2026-02-25T05:52:47.559Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-25T05:52:47.559Z","lastIndexedAt":null,"nextCrawlAt":"2026-02-26T05:52:47.559Z","lastVerifiedAt":null,"highlights":[]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install skills:1kalin:afrexai-spreadsheet-engineering","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T16:54:53.001Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-spreadsheet-engineering/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"# Spreadsheet Engineering — AfrexAI\n\n> Build bulletproof spreadsheets: financial models, dashboards, data systems, and automation. Platform-agnostic methodology for Google Sheets, Excel, and LibreOffice.\n\n## Quick Health Check\n\nScore your spreadsheet /16:\n\n| Signal | Healthy | Sick |\n|---|---|---|\n| Named ranges for all key inputs | ✅ Uses named ranges | ❌ Raw cell references everywhere |\n| Inputs separated from calculations | ✅ Clear input section | ❌ Hardcoded values in formulas |\n| No circular references | ✅ Clean dependency chain | ❌ Iterative calculation warnings |\n| Documentation/comments exist | ✅ README sheet + cell notes | ❌ \"What does this formula do?\" |\n| Error handling in formulas | ✅ IFERROR/IFNA wrapping | ❌ #REF! #N/A scattered everywhere |\n| Consistent formatting | ✅ Style guide followed | ❌ Random fonts, colors, sizes |\n| Version history/backup | ✅ Named versions + changelog | ❌ \"Final_v3_REAL_final.xlsx\" |\n| Data validation on inputs | ✅ Dropdowns + range constraints | ❌ Free-text in structured fields |\n\n**Score:** 0-4 🔴 rebuild | 5-8 🟡 refactor | 9-12 🟢 optimize | 13-16 🔵 production-grade\n\n---\n\n## Phase 1: Architecture & Planning\n\n### Spreadsheet Strategy Brief\n\n```yaml\nspreadsheet_brief:\n  name: \"[Descriptive Name]\"\n  purpose: \"[What decision does this support?]\"\n  owner: \"[Who maintains this]\"\n  audience: \"[Who uses this — technical level]\"\n  update_frequency: \"[Real-time / Daily / Weekly / Monthly / Ad-hoc]\"\n  data_sources:\n    - source: \"[Where data comes from]\"\n      method: \"[Manual / Import / API / IMPORTRANGE / Power Query]\"\n      refresh: \"[How often]\"\n  outputs:\n    - \"[Dashboard / Report / Export / Decision support]\"\n  complexity_tier: \"[Simple / Standard / Complex / Enterprise]\"\n  platform: \"[Google Sheets / Excel / Both]\"\n  kill_criteria:\n    - \"If >50 users need simultaneous editing → move to database\"\n    - \"If >100K rows → move to database or BI tool\"\n    - \"If requires audit trail → move to proper system\"\n```\n\n### Complexity Tier Guide\n\n| Tier | Rows | Sheets | Users | Formulas | Example |\n|---|---|---|---|---|---|\n| Simple | <1K | 1-3 | 1-3 | Basic | Budget tracker, checklist |\n| Standard | 1K-10K | 3-8 | 3-10 | Intermediate | Financial model, project tracker |\n| Complex | 10K-50K | 8-15 | 10-30 | Advanced | Multi-dept dashboard, CRM |\n| Enterprise | 50K+ | 15+ | 30+ | Expert | Data warehouse substitute (🚩 migrate) |\n\n### When NOT to Use a Spreadsheet\n\n| Scenario | Better Tool |\n|---|---|\n| >100K rows of data | Database (PostgreSQL, SQLite) |\n| >10 concurrent editors | Web app or Airtable |\n| Complex relational data (3+ entity types) | Database + app |\n| Needs audit trail / compliance | Purpose-built system |\n| Real-time data processing | ETL pipeline + BI tool |\n| Version-controlled code logic | Actual code (Python, JS) |\n\n**Rule:** Spreadsheets are prototyping tools that become production systems by accident. Know when to graduate.\n\n---\n\n## Phase 2: Sheet Architecture\n\n### Recommended Structure\n\n```\n📊 Workbook\n├── 📋 README          — Purpose, instructions, changelog\n├── 📊 Dashboard       — Charts, KPIs, summary (output only)\n├── ⚙️ Config          — Settings, parameters, dropdowns\n├── 📥 Data_Input      — Raw data entry or imports\n├── 🔧 Calculations    — All formulas and transformations\n├── 📈 Analysis        — Pivot tables, scenarios, what-if\n├── 📤 Output          — Formatted reports for export/print\n└── 🗄️ Reference       — Lookup tables, constants, mappings\n```\n\n### 7 Architecture Rules\n\n1. **One direction of flow** — Data flows left→right or top→bottom. Never circular.\n2. **Inputs separate from calculations** — NEVER hardcode numbers in formulas. Use named ranges.\n3. **One fact in one place** — If a value is used in 3 places, define it once and reference it.\n4. **Color code by purpose** — Blue = input, Black = formula, Green = linked from other sheet, Red = warning.\n5. **Freeze panes on every data sheet** — Header row and label columns always visible.\n6. **Protect formula cells** — Lock everything except input cells. Prevent accidental overwrites.\n7. **README sheet is mandatory** — Every workbook starts with purpose, instructions, and changelog.\n\n### Naming Conventions\n\n```\nSheets:    PascalCase — Dashboard, Raw_Data, Config\nNamed Ranges: SCREAMING_SNAKE — TAX_RATE, START_DATE, REVENUE_TARGET\nTabs:      Prefix with emoji or number for sort order — 01_Dashboard, 02_Config\nFiles:     YYYY-MM-DD_Description_vX.xlsx\n```\n\n### Color Coding Standard\n\n| Color | Meaning | When to Use |\n|---|---|---|\n| 🔵 Light blue background | User input cell | Editable fields |\n| ⬛ Black text | Formula/calculated | Auto-populated cells |\n| 🟢 Green text | Linked from other sheet | Cross-sheet references |\n| 🔴 Red text/background | Warning/error | Validation failures, negative values |\n| 🟡 Yellow background | Assumption | Key assumptions that drive the model |\n| ⬜ Grey background | Reference/locked | Constants, lookup tables |\n\n---\n\n## Phase 3: Formula Engineering\n\n### Formula Complexity Levels\n\n| Level | Techniques | Example |\n|---|---|---|\n| L1 Basic | SUM, AVERAGE, COUNT, IF, CONCATENATE | `=SUM(B2:B100)` |\n| L2 Intermediate | VLOOKUP/XLOOKUP, SUMIFS, INDEX/MATCH, TEXT | `=XLOOKUP(A2,Ref!A:A,Ref!B:B)` |\n| L3 Advanced | ARRAYFORMULA, QUERY, INDIRECT, nested IFs | `=QUERY(Data!A:F,\"SELECT A,SUM(F) GROUP BY A\")` |\n| L4 Expert | LAMBDA, MAP/REDUCE, LET, dynamic arrays, MAKEARRAY | `=LET(data,A2:A100,filtered,FILTER(data,data>0),SORT(filtered))` |\n\n### Essential Formula Patterns\n\n#### Lookup — Always Prefer XLOOKUP/INDEX-MATCH Over VLOOKUP\n\n```\n❌ VLOOKUP (fragile — breaks when columns inserted):\n=VLOOKUP(A2, Data!A:D, 4, FALSE)\n\n✅ XLOOKUP (Excel 365 / Google Sheets):\n=XLOOKUP(A2, Data!A:A, Data!D:D, \"Not Found\")\n\n✅ INDEX/MATCH (universal — works everywhere):\n=INDEX(Data!D:D, MATCH(A2, Data!A:A, 0))\n```\n\n#### Multi-Criteria Lookup\n\n```\n=XLOOKUP(1, (Data!A:A=B2)*(Data!B:B=C2), Data!D:D, \"Not Found\")\n\nOr INDEX/MATCH array (Ctrl+Shift+Enter in older Excel):\n=INDEX(Data!D:D, MATCH(1, (Data!A:A=B2)*(Data!B:B=C2), 0))\n```\n\n#### Conditional Aggregation\n\n```\nSingle condition:\n=SUMIF(Category, \"Sales\", Amount)\n\nMultiple conditions:\n=SUMIFS(Amount, Category, \"Sales\", Region, \"US\", Date, \">=\"&DATE(2025,1,1))\n\nCount with conditions:\n=COUNTIFS(Status, \"Active\", Score, \">80\")\n\nAverage with conditions:\n=AVERAGEIFS(Score, Department, \"Engineering\", Status, \"Active\")\n```\n\n#### Date Calculations\n\n```\nWorking days between dates:\n=NETWORKDAYS(Start, End, Holidays)\n\nAdd working days:\n=WORKDAY(Start, 10, Holidays)\n\nMonth-end date:\n=EOMONTH(A2, 0)\n\nQuarter from date:\n=ROUNDUP(MONTH(A2)/3, 0)\n\nFiscal year (Apr-Mar):\n=IF(MONTH(A2)>=4, YEAR(A2), YEAR(A2)-1)\n```\n\n#### Text Manipulation\n\n```\nExtract domain from email:\n=MID(A2, FIND(\"@\",A2)+1, LEN(A2))\n\nProper case with exceptions:\n=PROPER(SUBSTITUTE(LOWER(A2),\" llc\",\" LLC\"))\n\nClean messy data:\n=TRIM(CLEAN(SUBSTITUTE(A2, CHAR(160), \" \")))\n```\n\n#### Dynamic Arrays (Excel 365 / Google Sheets)\n\n```\nFILTER:\n=FILTER(Data, Data[Status]=\"Active\", Data[Amount]>1000)\n\nSORT:\n=SORT(FILTER(Data, Data[Region]=\"US\"), 3, -1)\n\nUNIQUE:\n=UNIQUE(Data[Category])\n\nSEQUENCE:\n=SEQUENCE(12, 1, DATE(2025,1,1), 30)  — 12 monthly dates\n```\n\n#### Google Sheets QUERY (Power Feature)\n\n```\nBasic aggregation:\n=QUERY(Data!A:F, \"SELECT A, SUM(F) WHERE B='Active' GROUP BY A ORDER BY SUM(F) DESC LABEL SUM(F) 'Total Revenue'\")\n\nDate filtering:\n=QUERY(Data!A:F, \"SELECT A, B, F WHERE C >= date '\"&TEXT(B1,\"yyyy-MM-dd\")&\"' ORDER BY F DESC LIMIT 10\")\n\nPivot-style:\n=QUERY(Data!A:F, \"SELECT A, SUM(F) GROUP BY A PIVOT B\")\n```\n\n#### LET for Readable Complex Formulas\n\n```\n=LET(\n  revenue, SUMIFS(Sales!D:D, Sales!A:A, A2),\n  costs, SUMIFS(Costs!D:D, Costs!A:A, A2),\n  margin, (revenue - costs) / revenue,\n  IF(revenue=0, \"No Data\",\n    IF(margin > 0.3, \"✅ Healthy\",\n      IF(margin > 0.1, \"⚠️ Watch\", \"🔴 Critical\")))\n)\n```\n\n#### LAMBDA (Custom Functions)\n\n```\nNamed LAMBDA (define in Name Manager / named ranges):\nFISCAL_QUARTER = LAMBDA(date, \"FY\"&IF(MONTH(date)>=4,YEAR(date),YEAR(date)-1)&\" Q\"&ROUNDUP(MOD(MONTH(date)+8,12)/3,0))\n\nMAP with LAMBDA:\n=MAP(A2:A100, LAMBDA(x, PROPER(TRIM(x))))\n```\n\n### 10 Formula Rules\n\n1. **NEVER hardcode values** — Use named ranges or a Config sheet\n2. **Wrap external lookups in IFERROR** — `=IFERROR(XLOOKUP(...), \"Not Found\")`\n3. **Use LET for formulas >100 chars** — Readable, debuggable, faster\n4. **Prefer XLOOKUP over VLOOKUP** — More flexible, no column counting\n5. **One formula per cell** — Don't nest 5+ functions. Break into helper columns.\n6. **Comment complex formulas** — Use cell notes or a documentation column\n7. **Test with edge cases** — Empty cells, zeros, dates before 1900, text in number fields\n8. **Avoid INDIRECT for performance** — It's volatile (recalculates every time)\n9. **Use structured references in tables** — `=SUM(Table1[Amount])` not `=SUM(D:D)`\n10. **Keep formulas auditable** — Someone else (or future you) must understand them\n\n---\n\n## Phase 4: Data Validation & Quality\n\n### Input Validation Checklist\n\n| Data Type | Validation | Implementation |\n|---|---|---|\n| Date | Date range | Data validation: between START and END |\n| Currency | Number ≥ 0 | Data validation: decimal ≥ 0, format $#,##0.00 |\n| Percentage | 0-100 or 0-1 | Data validation: decimal between 0 and 1 |\n| Category | Dropdown list | Data validation: list from Reference sheet |\n| Email | Contains @ | Custom: `=ISNUMBER(FIND(\"@\",A2))` |\n| Phone | Length check | Custom: `=AND(LEN(A2)>=10, LEN(A2)<=15)` |\n| Required field | Not blank | Custom: `=LEN(TRIM(A2))>0` |\n| ID/Code | Unique + format | Custom: `=AND(COUNTIF(A:A,A2)=1, LEN(A2)=8)` |\n\n### Data Cleaning Pipeline\n\n```\nStep 1: Remove whitespace\n=TRIM(CLEAN(A2))\n\nStep 2: Standardize case\n=PROPER(A2) or =UPPER(A2)\n\nStep 3: Remove duplicates\nUse Remove Duplicates tool or UNIQUE()\n\nStep 4: Fix dates\n=DATEVALUE(TEXT(A2,\"YYYY-MM-DD\"))\n\nStep 5: Validate\n=IF(AND(A2>0, A2<1000000, ISNUMBER(A2)), \"✅\", \"❌ Check\")\n```\n\n### Conditional Formatting Rules (Priority Order)\n\n1. 🔴 **Errors** — Any cell with #REF!, #N/A, #VALUE! → Red background\n2. 🟡 **Warnings** — Values outside expected range → Yellow background\n3. 🟢 **Positive** — On-target metrics → Green text\n4. 📊 **Data bars** — Numeric ranges → Proportional bars\n5. 🎯 **Icons** — Status indicators → Traffic light icon sets\n\n---\n\n## Phase 5: Financial Modeling\n\n### Model Architecture\n\n```\n📊 Financial Model\n├── 📋 Cover          — Model name, version, date, author\n├── ⚙️ Assumptions    — ALL inputs here (blue cells), scenarios\n├── 📊 Revenue        — Revenue build-up by product/segment\n├── 📊 COGS           — Cost of goods/services\n├── 📊 OpEx           — Operating expenses by category\n├── 📊 P&L            — Income statement (auto-calculated)\n├── 📊 Balance_Sheet  — Assets, liabilities, equity\n├── 📊 Cash_Flow      — Operating, investing, financing\n├── 📈 DCF            — Discounted cash flow valuation\n├── 📈 Scenarios      — Bull/Base/Bear cases\n├── 📊 KPIs           — Key metrics dashboard\n└── 📊 Charts         — Visualizations\n```\n\n### Revenue Model Patterns\n\n```yaml\nsaas_revenue:\n  mrr_start: \"=PREVIOUS_MONTH_MRR\"\n  new_mrr: \"=NEW_CUSTOMERS * ARPU\"\n  expansion_mrr: \"=EXISTING * EXPANSION_RATE / 12\"\n  contraction_mrr: \"=EXISTING * CONTRACTION_RATE / 12\"\n  churn_mrr: \"=EXISTING * CHURN_RATE / 12\"\n  mrr_end: \"=MRR_START + NEW + EXPANSION - CONTRACTION - CHURN\"\n  arr: \"=MRR_END * 12\"\n\nunit_economics:\n  cac: \"=TOTAL_SALES_MARKETING / NEW_CUSTOMERS\"\n  ltv: \"=ARPU / MONTHLY_CHURN_RATE\"\n  ltv_cac_ratio: \"=LTV / CAC  # Target: >3.0\"\n  cac_payback_months: \"=CAC / ARPU  # Target: <12\"\n```\n\n### Scenario Analysis Template\n\n```\n=SWITCH(SCENARIO_SELECTOR,\n  \"Bull\", Assumptions!B2 * 1.3,\n  \"Base\", Assumptions!B2,\n  \"Bear\", Assumptions!B2 * 0.7,\n  Assumptions!B2)\n\nOr with CHOOSE:\n=CHOOSE(SCENARIO_INDEX, BEAR_VALUE, BASE_VALUE, BULL_VALUE)\n```\n\n### Sensitivity Analysis (Data Table)\n\n```\nTwo-variable data table:\n- Row input: Growth Rate (10%, 15%, 20%, 25%, 30%)\n- Column input: Churn Rate (2%, 3%, 5%, 7%, 10%)\n- Output cell: NPV or IRR\n- Select range → Data → What-If Analysis → Data Table\n```\n\n### Common Financial Formulas\n\n```\nNPV: =NPV(DISCOUNT_RATE, CF1:CF10) + INITIAL_INVESTMENT\nIRR: =IRR(CF_RANGE, guess)\nXIRR: =XIRR(CF_VALUES, CF_DATES)  — irregular cash flows\nPMT: =PMT(RATE/12, NPER*12, -PV)  — loan payment\nCompound growth: =FV * (1 + RATE)^YEARS\nCAGR: =(END_VALUE/START_VALUE)^(1/YEARS) - 1\nBreak-even units: =FIXED_COSTS / (PRICE - VARIABLE_COST)\n```\n\n---\n\n## Phase 6: Dashboard Design\n\n### Dashboard Layout\n\n```\n┌─────────────────────────────────────────────────┐\n│  📊 Dashboard Title              Period: [Dropdown] │\n│  Last Updated: [Auto]            Filter: [Dropdown] │\n├──────────┬──────────┬──────────┬──────────────────┤\n│  KPI 1   │  KPI 2   │  KPI 3   │  KPI 4           │\n│  $1.2M   │  45%     │  128     │  $47             │\n│  ▲ 12%   │  ▼ -3%   │  ▲ 8%   │  ● Flat          │\n├──────────┴──────────┴──────────┴──────────────────┤\n│                                                     │\n│  [Primary Chart — Revenue Trend]                   │\n│                                                     │\n├─────────────────────┬───────────────────────────────┤\n│  [Secondary Chart]  │  [Table / Top Items]          │\n│  [Category Split]   │  [Ranked List]                │\n└─────────────────────┴───────────────────────────────┘\n```\n\n### KPI Card Formula Pattern\n\n```\nCurrent value:  =SUMIFS(Data!E:E, Data!A:A, \">=\"&PERIOD_START, Data!A:A, \"<=\"&PERIOD_END)\nPrevious value: =SUMIFS(Data!E:E, Data!A:A, \">=\"&PREV_START, Data!A:A, \"<=\"&PREV_END)\nChange %:       =(CURRENT - PREVIOUS) / ABS(PREVIOUS)\nIndicator:      =IF(CHANGE>0.05, \"▲\", IF(CHANGE<-0.05, \"▼\", \"●\"))\nDisplay:        =INDICATOR & \" \" & TEXT(ABS(CHANGE), \"0.0%\")\n```\n\n### Chart Selection Guide\n\n| Data Pattern | Best Chart | Avoid |\n|---|---|---|\n| Trend over time | Line chart | Pie chart |\n| Part of whole | Stacked bar or donut | 3D pie |\n| Comparison | Horizontal bar | Radar chart |\n| Distribution | Histogram | Line chart |\n| Relationship | Scatter plot | Bar chart |\n| KPI vs target | Bullet chart or gauge | Complex chart |\n| Geographic | Heat map or filled map | Bar chart |\n\n### 7 Chart Rules\n\n1. **Title = Insight**, not description. \"Revenue grew 23% in Q3\" not \"Q3 Revenue Chart\"\n2. **Start Y-axis at zero** for bar charts. Line charts can truncate with clear labeling.\n3. **Max 5-7 data series** per chart. Use \"Other\" category for the rest.\n4. **Remove chartjunk** — No 3D effects, gradient fills, excessive gridlines.\n5. **Use consistent colors** — Same category = same color across all charts.\n6. **Label directly** on chart where possible. Minimize legend lookups.\n7. **Sort meaningfully** — By value (largest→smallest) or chronologically. Never alphabetically unless it's the only logical order.\n\n### Interactive Dashboard Controls\n\n```\nFilter by dropdown:\n1. Config sheet: Data validation dropdown for Region, Period, Category\n2. Dashboard formulas use dropdown value:\n   =SUMIFS(Data!E:E, Data!C:C, CONFIG_REGION, Data!A:A, \">=\"&CONFIG_START)\n\nSparklines (in-cell mini charts):\n=SPARKLINE(B2:M2, {\"charttype\",\"line\"; \"color\",\"#2563eb\"; \"linewidth\",2})\n```\n\n---\n\n## Phase 7: Data Import & Integration\n\n### Import Method Selection\n\n| Source | Method | Refresh |\n|---|---|---|\n| CSV/Excel file | Manual import / Power Query | Manual |\n| Google Sheets (other) | IMPORTRANGE | Auto (varies) |\n| Web page table | IMPORTHTML / Power Query | Auto / manual |\n| API / JSON | IMPORTDATA / Apps Script / Power Query | Scheduled |\n| Database | Power Query / ODBC | Scheduled |\n| Another sheet (same workbook) | Direct reference | Real-time |\n\n### Google Sheets Import Functions\n\n```\nFrom another spreadsheet:\n=IMPORTRANGE(\"spreadsheet_url\", \"Sheet1!A1:D100\")\n\nFrom web page (table):\n=IMPORTHTML(\"url\", \"table\", 1)\n\nFrom CSV:\n=IMPORTDATA(\"csv_url\")\n\nFrom XML/RSS:\n=IMPORTXML(\"url\", \"//item/title\")\n```\n\n### Excel Power Query Patterns\n\n```\n1. Data → Get Data → From [Source]\n2. Transform in Power Query Editor\n3. Close & Load (to table or connection only)\n\nEssential transforms:\n- Remove columns → Right-click header → Remove\n- Filter rows → Click filter arrow\n- Split column → Transform → Split Column\n- Unpivot → Select ID columns → Unpivot Other Columns\n- Merge queries → Home → Merge (= VLOOKUP but better)\n- Append queries → Home → Append (= UNION)\n```\n\n### IMPORTRANGE Best Practices\n\n```\nRules:\n1. Authorize on first use (one-time popup)\n2. Use named ranges in source spreadsheet\n3. Wrap in IFERROR for graceful failures\n4. Minimize imported range — don't import entire sheets\n5. Cache results if auto-refresh causes slowness\n\nPattern:\n=IFERROR(\n  IMPORTRANGE(SOURCE_URL, \"Data!A1:D\"&SOURCE_ROW_COUNT),\n  \"⚠️ Connection failed — check source spreadsheet access\"\n)\n```\n\n---\n\n## Phase 8: Automation & Scripts\n\n### Google Apps Script Essentials\n\n```javascript\n// Auto-populate timestamp on edit\nfunction onEdit(e) {\n  const sheet = e.source.getActiveSheet();\n  if (sheet.getName() === \"Data\" && e.range.getColumn() >= 2) {\n    sheet.getRange(e.range.getRow(), 1).setValue(new Date());\n  }\n}\n\n// Email report on schedule (set up trigger)\nfunction sendWeeklyReport() {\n  const ss = SpreadsheetApp.getActiveSpreadsheet();\n  const dashboard = ss.getSheetByName(\"Dashboard\");\n  const kpi1 = dashboard.getRange(\"B2\").getDisplayValue();\n  const kpi2 = dashboard.getRange(\"C2\").getDisplayValue();\n  \n  MailApp.sendEmail({\n    to: \"team@company.com\",\n    subject: `Weekly Report — ${Utilities.formatDate(new Date(), \"GMT\", \"MMM dd\")}`,\n    htmlBody: `<h2>Weekly KPIs</h2><p>Revenue: ${kpi1}</p><p>Growth: ${kpi2}</p>`\n  });\n}\n\n// Auto-archive rows older than 90 days\nfunction archiveOldRows() {\n  const ss = SpreadsheetApp.getActiveSpreadsheet();\n  const data = ss.getSheetByName(\"Data\");\n  const archive = ss.getSheetByName(\"Archive\");\n  const cutoff = new Date();\n  cutoff.setDate(cutoff.getDate() - 90);\n  \n  const rows = data.getDataRange().getValues();\n  for (let i = rows.length - 1; i >= 1; i--) {\n    if (rows[i][0] < cutoff) {\n      archive.appendRow(rows[i]);\n      data.deleteRow(i + 1);\n    }\n  }\n}\n```\n\n### Excel VBA Essentials\n\n```vba\n' Auto-format new entries\nPrivate Sub Worksheet_Change(ByVal Target As Range)\n    If Not Intersect(Target, Range(\"A:A\")) Is Nothing Then\n        Application.EnableEvents = False\n        Target.Offset(0, 5).Value = Now\n        Application.EnableEvents = True\n    End If\nEnd Sub\n\n' Refresh all Power Query connections\nSub RefreshAllData()\n    ThisWorkbook.RefreshAll\n    MsgBox \"All data refreshed at \" & Now\nEnd Sub\n```\n\n### Automation Decision Guide\n\n| Task | Google Sheets | Excel |\n|---|---|---|\n| On-edit timestamp | Apps Script onEdit | VBA Worksheet_Change |\n| Scheduled email | Apps Script + trigger | Power Automate |\n| Data refresh | Apps Script + trigger | Power Query + schedule |\n| PDF export | Apps Script | VBA + SaveAs |\n| Cross-system sync | Apps Script + API | Power Automate / VBA |\n| Custom functions | Apps Script CUSTOM_FUNCTION | VBA UDF or LAMBDA |\n\n---\n\n## Phase 9: Performance Optimization\n\n### Performance Killers (Ranked)\n\n| Issue | Impact | Fix |\n|---|---|---|\n| INDIRECT/OFFSET (volatile) | 🔴 Critical | Replace with INDEX/XLOOKUP |\n| Whole-column references (A:A) | 🔴 Critical | Use bounded ranges (A2:A1000) |\n| ARRAYFORMULA on huge ranges | 🟡 High | Limit range or use QUERY |\n| Excessive conditional formatting | 🟡 High | Reduce rules, use bounded ranges |\n| Too many IMPORTRANGE | 🟡 High | Consolidate, cache locally |\n| Unused sheets with formulas | 🟢 Medium | Delete or clear unused sheets |\n| Complex nested IFs | 🟢 Medium | Replace with SWITCH/IFS/XLOOKUP |\n| Heavy formatting (images, shapes) | 🟢 Medium | Minimize decorative elements |\n\n### Google Sheets Performance Rules\n\n1. Keep workbook under 5M cells (ideal: <500K)\n2. Limit IMPORTRANGE to <10 per workbook\n3. Use QUERY instead of multiple SUMIFS when possible\n4. Put ARRAYFORMULA results on a dedicated calc sheet\n5. Avoid NOW()/TODAY() in frequently-recalculated areas\n\n### Excel Performance Rules\n\n1. Use tables (Ctrl+T) for structured data — better performance than raw ranges\n2. Power Query > formulas for data transformation\n3. XLOOKUP > VLOOKUP > INDEX/MATCH for speed\n4. Turn off auto-calculation during bulk edits: `Application.Calculation = xlManual`\n5. Use Power Pivot for >100K rows instead of formulas\n\n---\n\n## Phase 10: Collaboration & Governance\n\n### Access Control Strategy\n\n| Role | Permissions | Implementation |\n|---|---|---|\n| Owner | Full control | Original creator |\n| Editor | Edit data, not structure | Share with edit, protect structure sheets |\n| Analyst | Edit inputs, view outputs | Protect all except input cells |\n| Viewer | View only | Share as viewer |\n| Commenter | View + comment | Share as commenter |\n\n### Sheet Protection Pattern\n\n```\n1. Protect entire workbook structure (prevent sheet add/delete/rename)\n2. Protect each sheet\n3. UNLOCK only input cells (blue-coded)\n4. Set password for admin overrides\n5. Document which cells are editable in README\n```\n\n### Version Control\n\n```\nNaming: YYYY-MM-DD_ModelName_vX.Y\n  X = major change (new section, restructure)\n  Y = minor change (formula fix, data update)\n\nChangelog (on README sheet):\n| Date | Version | Author | Change |\n|------|---------|--------|--------|\n| 2025-03-15 | 2.1 | Jane | Added Q2 actuals |\n| 2025-03-01 | 2.0 | John | Restructured revenue model |\n```\n\n### Collaboration Rules\n\n1. **Never edit someone else's model without telling them**\n2. **Use named versions** before major changes (Google Sheets: File → Version history → Name current version)\n3. **Comment on cells** — don't explain in chat, explain in the sheet\n4. **One editor at a time** for complex formula areas — use \"editing\" flag cell\n5. **Weekly review** — Check for broken references, stale data, unused sheets\n\n---\n\n## Phase 11: Common Templates\n\n### Budget Tracker Template\n\n```\nColumns: Month | Category | Subcategory | Budgeted | Actual | Variance | % Variance\nKPIs: Total Budget | Total Spent | Remaining | Burn Rate | Projected Year-End\nCharts: Budget vs Actual (bar), Spend by Category (donut), Monthly Trend (line)\nFormulas:\n  Variance: =Actual - Budgeted\n  % Variance: =IF(Budgeted=0, \"\", (Actual-Budgeted)/ABS(Budgeted))\n  Burn Rate: =SUMIFS(Actual, Month, \"<=\"&TODAY()) / (MONTH(TODAY()) * Total_Budget / 12)\n```\n\n### Project Tracker Template\n\n```\nColumns: Task | Owner | Status | Priority | Start | Due | Days Left | % Complete | Notes\nStatus: 🔴 Blocked | 🟡 In Progress | 🟢 Complete | ⚪ Not Started\nFormulas:\n  Days Left: =IF(Status=\"🟢 Complete\", \"✅\", MAX(0, Due-TODAY()))\n  Overdue flag: =IF(AND(Status<>\"🟢 Complete\", Due<TODAY()), \"⚠️ OVERDUE\", \"\")\n  Completion %: =COUNTIF(Status, \"🟢 Complete\") / COUNTA(Status)\nDashboard: Gantt-style with conditional formatting date bars\n```\n\n### Sales Pipeline Template\n\n```\nColumns: Deal | Company | Stage | Amount | Probability | Weighted | Owner | Close Date | Days in Stage | Next Action\nStages: Prospect (10%) | Qualified (25%) | Proposal (50%) | Negotiation (75%) | Closed Won (100%) | Lost (0%)\nFormulas:\n  Weighted: =Amount * Probability\n  Pipeline: =SUMIFS(Weighted, Stage, \"<>\"&\"Lost\", Stage, \"<>\"&\"Closed Won\")\n  Velocity: =AVERAGE(Days_to_Close_for_Won_Deals)\nDashboard: Pipeline by stage (funnel), Forecast vs quota, Win rate trend\n```\n\n### OKR Tracker Template\n\n```\nColumns: Objective | Key Result | Metric | Start | Current | Target | Score | Status\nScore: =MIN(1, (Current - Start) / (Target - Start))\nStatus: =IF(Score>=0.7, \"🟢\", IF(Score>=0.4, \"🟡\", \"🔴\"))\nOverall: =AVERAGE(Score) across all KRs per Objective\n```\n\n---\n\n## Phase 12: Quality & Maintenance\n\n### Spreadsheet Quality Rubric (0-100)\n\n| Dimension | Weight | Scoring |\n|---|---|---|\n| Architecture | 15% | Clear sheet structure, data flow direction, README |\n| Formula Quality | 20% | Named ranges, error handling, no hardcoding |\n| Data Validation | 15% | Input constraints, dropdowns, type checking |\n| Visual Design | 10% | Consistent formatting, color coding, readability |\n| Documentation | 15% | Cell notes, README, changelog, instructions |\n| Performance | 10% | No volatile functions, bounded ranges, fast recalc |\n| Error Handling | 10% | IFERROR wrappers, validation checks, no broken refs |\n| Maintainability | 5% | Protected structure, clear ownership, versioned |\n\n### Monthly Maintenance Checklist\n\n- [ ] Check for #REF! and #N/A errors across all sheets\n- [ ] Verify data source connections are refreshing\n- [ ] Review and update assumptions (Config sheet)\n- [ ] Remove unused sheets and named ranges\n- [ ] Check file size — if growing, archive old data\n- [ ] Test all dropdowns and validation rules\n- [ ] Update README with any changes made\n- [ ] Create named version snapshot\n\n### 10 Spreadsheet Killers\n\n| Mistake | Impact | Fix |\n|---|---|---|\n| Hardcoded numbers in formulas | Can't audit or update | Named ranges + Config sheet |\n| No error handling | #N/A cascades break everything | IFERROR on all lookups |\n| Whole-column references | Slow, crashes on large data | Bounded ranges |\n| Circular references | Unpredictable results | Redesign calculation flow |\n| No documentation | \"What does this formula do?\" | README + cell notes |\n| No data validation | Garbage in = garbage out | Dropdowns + constraints |\n| One mega-sheet | Unmaintainable, slow | Split by function |\n| No backup/versions | One mistake = lost work | Named versions + exports |\n| Copy-paste instead of formulas | Stale data, inconsistencies | Use references/IMPORTRANGE |\n| Manual processes that should be automated | Error-prone, time-wasting | Scripts or scheduled refreshes |\n\n---\n\n## Edge Cases\n\n### Migrating Excel ↔ Google Sheets\n\n- **XLOOKUP** works in both (Excel 365 + Google Sheets)\n- **QUERY** is Google Sheets only — replace with Power Query in Excel\n- **ARRAYFORMULA** is Google Sheets — Excel uses Ctrl+Shift+Enter or dynamic arrays\n- **Apps Script** → no Excel equivalent. Use VBA or Power Automate.\n- **Power Query / Power Pivot** → no Google Sheets equivalent. Use QUERY or BigQuery connector.\n- Test all formulas after migration. Named ranges may break.\n\n### Multi-Currency Spreadsheets\n\n```\n=Amount * XLOOKUP(Currency, FX_Rates!A:A, FX_Rates!B:B)\nOr with GOOGLEFINANCE:\n=Amount * GOOGLEFINANCE(\"CURRENCY:GBPUSD\")\n```\n\n### Large Dataset Workarounds (>100K rows)\n\n1. Split data across multiple sheets by time period\n2. Use pivot tables / QUERY instead of row-level formulas\n3. Import summarized data, not raw transactions\n4. Consider BigQuery + Connected Sheets (Google) or Power Pivot (Excel)\n5. If you need >500K rows, graduate to a database\n\n---\n\n## Natural Language Commands\n\nWhen working with spreadsheets, you can ask:\n- \"Audit this spreadsheet for quality issues\"\n- \"Design a financial model for [business type]\"\n- \"Create a dashboard layout for [metrics]\"\n- \"Write the formulas for [calculation]\"\n- \"Optimize this spreadsheet for performance\"\n- \"Build a data validation system for [input type]\"\n- \"Create an Apps Script to [automate task]\"\n- \"Design a template for [use case]\"\n- \"Review this formula and suggest improvements\"\n- \"Help me migrate this from Excel to Google Sheets\"\n- \"Set up a scenario analysis for [model]\"\n- \"Build a KPI tracker for [department]\"\n\n---\n\n## ⚡ Level Up — AfrexAI Context Packs\n\nThis skill covers spreadsheet engineering methodology. For **industry-specific financial models, dashboards, and templates**:\n\n- 💰 [**SaaS Context Pack**](https://afrexai-cto.github.io/context-packs/) — MRR/ARR models, SaaS metrics dashboards, cohort analysis templates\n- 🏦 [**Fintech Context Pack**](https://afrexai-cto.github.io/context-packs/) — Financial modeling, risk calculators, compliance trackers\n- 🏭 [**Manufacturing Context Pack**](https://afrexai-cto.github.io/context-packs/) — Production trackers, inventory models, cost analysis\n- 🏗️ [**Construction Context Pack**](https://afrexai-cto.github.io/context-packs/) — Project budgets, bid calculators, resource planning\n\n**$47 per pack** — Complete AI agent context for your industry.\n\nBrowse all packs: [**AfrexAI Storefront →**](https://afrexai-cto.github.io/context-packs/)\n\n---\n\n## 🔗 More Free Skills by AfrexAI\n\n- [afrexai-data-storytelling](https://clawhub.com/afrexai-cto/afrexai-data-storytelling) — Data visualization & dashboard design methodology\n- [afrexai-personal-finance](https://clawhub.com/afrexai-cto/afrexai-personal-finance) — Complete personal finance operating system\n- [afrexai-product-analytics](https://clawhub.com/afrexai-cto/afrexai-product-analytics) — Product metrics & analytics engineering\n- [afrexai-fpa-engine](https://clawhub.com/afrexai-cto/afrexai-fpa-engine) — Financial planning & analysis\n- [afrexai-automation-strategy](https://clawhub.com/afrexai-cto/afrexai-automation-strategy) — Workflow automation methodology\n\n---\n\n*Built by [AfrexAI](https://afrexai-cto.github.io/context-packs/) — AI agents that compound capital and code.*\n","readmeExcerpt":"Spreadsheet Engineering — AfrexAI Build bulletproof spreadsheets: financial models, dashboards, data systems, and automation. Platform-agnostic methodology for Google Sheets, Excel, and LibreOffice. Quick Health Check Score your spreadsheet /16: | Signal | Healthy | Sick | |---|---|---| | Named ranges for all key inputs | ✅ Uses named ranges | ❌ Raw cell references everywhere | | Inputs separated from calculations | ","codeSnippets":[],"executableExamples":[{"language":"yaml","snippet":"spreadsheet_brief:\n  name: \"[Descriptive Name]\"\n  purpose: \"[What decision does this support?]\"\n  owner: \"[Who maintains this]\"\n  audience: \"[Who uses this — technical level]\"\n  update_frequency: \"[Real-time / Daily / Weekly / Monthly / Ad-hoc]\"\n  data_sources:\n    - source: \"[Where data comes from]\"\n      method: \"[Manual / Import / API / IMPORTRANGE / Power Query]\"\n      refresh: \"[How often]\"\n  outputs:\n    - \"[Dashboard / Report / Export / Decision support]\"\n  complexity_tier: \"[Simple / Standard / Complex / Enterprise]\"\n  platform: \"[Google Sheets / Excel / Both]\"\n  kill_criteria:\n    - \"If >50 users need simultaneous editing → move to database\"\n    - \"If >100K rows → move to database or BI tool\"\n    - \"If requires audit trail → move to proper system\""},{"language":"text","snippet":"📊 Workbook\n├── 📋 README          — Purpose, instructions, changelog\n├── 📊 Dashboard       — Charts, KPIs, summary (output only)\n├── ⚙️ Config          — Settings, parameters, dropdowns\n├── 📥 Data_Input      — Raw data entry or imports\n├── 🔧 Calculations    — All formulas and transformations\n├── 📈 Analysis        — Pivot tables, scenarios, what-if\n├── 📤 Output          — Formatted reports for export/print\n└── 🗄️ Reference       — Lookup tables, constants, mappings"},{"language":"text","snippet":"Sheets:    PascalCase — Dashboard, Raw_Data, Config\nNamed Ranges: SCREAMING_SNAKE — TAX_RATE, START_DATE, REVENUE_TARGET\nTabs:      Prefix with emoji or number for sort order — 01_Dashboard, 02_Config\nFiles:     YYYY-MM-DD_Description_vX.xlsx"},{"language":"text","snippet":"❌ VLOOKUP (fragile — breaks when columns inserted):\n=VLOOKUP(A2, Data!A:D, 4, FALSE)\n\n✅ XLOOKUP (Excel 365 / Google Sheets):\n=XLOOKUP(A2, Data!A:A, Data!D:D, \"Not Found\")\n\n✅ INDEX/MATCH (universal — works everywhere):\n=INDEX(Data!D:D, MATCH(A2, Data!A:A, 0))"},{"language":"text","snippet":"=XLOOKUP(1, (Data!A:A=B2)*(Data!B:B=C2), Data!D:D, \"Not Found\")\n\nOr INDEX/MATCH array (Ctrl+Shift+Enter in older Excel):\n=INDEX(Data!D:D, MATCH(1, (Data!A:A=B2)*(Data!B:B=C2), 0))"},{"language":"text","snippet":"Single condition:\n=SUMIF(Category, \"Sales\", Amount)\n\nMultiple conditions:\n=SUMIFS(Amount, Category, \"Sales\", Region, \"US\", Date, \">=\"&DATE(2025,1,1))\n\nCount with conditions:\n=COUNTIFS(Status, \"Active\", Score, \">80\")\n\nAverage with conditions:\n=AVERAGEIFS(Score, Department, \"Engineering\", Status, \"Active\")"}],"parameters":{},"dependencies":[],"permissions":[],"extractedFiles":[],"languages":["typescript"],"docsSourceLabel":"CLAWHUB","editorialOverview":"Spreadsheet Engineering — AfrexAI Spreadsheet Engineering — AfrexAI Build bulletproof spreadsheets: financial models, dashboards, data systems, and automation. Platform-agnostic methodology for Google Sheets, Excel, and LibreOffice. Quick Health Check Score your spreadsheet /16: | Signal | Healthy | Sick | |---|---|---| | Named ranges for all key inputs | ✅ Uses named ranges | ❌ Raw cell references everywhere | | Inputs separated from calculations |","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":364,"uniquenessScore":68,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T16:54:53.001Z","emptyReason":null},"items":[{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}