-
Notifications
You must be signed in to change notification settings - Fork 0
feat(skills): add compound-engineering implementation reference #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,40 @@ | ||||||
| --- | ||||||
| name: compound-engineering | ||||||
| description: Implementation reference library for compound engineering workflows. For workflow orchestration, use slash commands under `commands/workflows/` (constitution, plan, work, review, compound). This skill provides stack-specific fix recipes those workflows consume. | ||||||
| version: 1.0.0 | ||||||
| tags: [reference, fixes, typescript, react, nextjs, wagmi, automation] | ||||||
| triggers: | ||||||
| - stack-specific breakage | ||||||
| - migration fix | ||||||
| - runtime type mismatch | ||||||
| - TS triage | ||||||
| - dashboard testing | ||||||
| model: inherit | ||||||
| --- | ||||||
|
|
||||||
| # Compound Engineering — Implementation Reference | ||||||
|
|
||||||
| Actionable fix recipes for recurring breakages. Use alongside `aegntic/compound-engineering` workflow commands. | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. issue (typo): The identifier If this is meant to reference the repository, please change it to
Suggested change
|
||||||
|
|
||||||
| ## Usage | ||||||
|
|
||||||
| Invoke from workflow steps when a fix recipe applies: | ||||||
|
|
||||||
| ``` | ||||||
| # From /workflows:work | ||||||
| "Consult skills/compound-engineering for the wagmi v7 migration recipe." | ||||||
| ``` | ||||||
|
|
||||||
| ## References | ||||||
|
|
||||||
| - `references/wagmi-v7-migration.md` — upgrade patterns, ABI tuples, balance API changes | ||||||
| - `references/typescript-strict-patterns.md` — empty-array inference, framer-motion ease, never[] fixes | ||||||
| - `references/dashboard-testing.md` — multi-tab verification, lazy-load console checks | ||||||
| - `references/nextjs-build-stability.md` — stale chunks, Turbopack recovery, production build fallback | ||||||
| - `references/verification-fallback-chain.md` — playwright → urllib → curl selection rules | ||||||
| - `references/runtime-type-mismatches.md` — API response shape bugs, empty-state crashes | ||||||
| - `references/frontend-design-system.md` — UI layer recipes for design-first features | ||||||
|
|
||||||
| ## Maintenance | ||||||
|
|
||||||
| Add new references when a stack-specific fix proves recurrent. Delete references once the pattern is obsolete or upstream has fixed it. | ||||||
32 changes: 32 additions & 0 deletions
32
skills/compound-engineering/references/polymarket-auto-2026-05-09.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| # Session Notes: Polymarket Auto Dashboard (2026-05-09) | ||
|
|
||
| ## Project Context | ||
| - **Repo**: `~/AE/01_Laboratory/polymarket-auto` | ||
| - **Stack**: Next.js 16.1.3 + Turbopack, React 18, TypeScript, Tailwind, wagmi v7, viem v2, Prisma + SQLite | ||
| - **Purpose**: Autonomous Polymarket trading dashboard with AI-powered edge detection | ||
| - **Stakes**: Production demo for $10M contract — zero tolerance for visible bugs | ||
|
|
||
| ## What Was Fixed This Session | ||
|
|
||
| ### 1. 60+ TypeScript Compile Errors → 0 | ||
| Systematic triage using `npx tsc --noEmit 2>&1 | grep "error TS" | sed 's/.*error //' | sort | uniq -c | sort -rn` to find highest-count patterns first. | ||
|
|
||
| Key fixes across 17 files: | ||
| - Missing imports, variable name mismatches, framer-motion ease types, recharts data annotations, declaration order issues, API response shape mismatches | ||
|
|
||
| ### 2. Trading Tab Runtime Crash | ||
| **Error**: `InvalidParameterError: Invalid ABI parameter` from `trading-service.ts` at module load time. | ||
| **Fix**: Rewrote with viem v2 API (`readContract`/`writeContract`), lazy-loaded ABI parsing, removed tuple from ABI. | ||
|
|
||
| ### 3. Risk & Strategy Tab Runtime Crash | ||
| **Error**: `TypeError: performance.map is not a function` — API returns `{ series, summary }` not array. | ||
| **Fix**: `const series = Array.isArray(performance) ? performance : (performance?.series ?? [])` at 3 sites. | ||
|
|
||
| ### 4. wagmi v6 → v7 Partial Migration | ||
| Removed all `useBalance` with `contract:` parameter. Balance shows 0.00 until proper v7 migration. | ||
|
|
||
| ## Verification | ||
| - Production build: `npx next build` → ✓ Compiled successfully, 19/19 pages | ||
| - All 6 API routes return 200 | ||
| - All 4 tabs render without crashes | ||
| - 0 TypeScript errors in source files |
145 changes: 145 additions & 0 deletions
145
skills/compound-engineering/references/wagmi-v7-migration.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,145 @@ | ||
| # wagmi v6 → v7 Migration Reference | ||
|
|
||
| ## Key Breaking Changes | ||
|
|
||
| ### useBalance (ERC20 tokens) | ||
|
|
||
| **v6 (old):** | ||
| ```ts | ||
| const { data: balance } = useBalance({ | ||
| address: walletAddress, | ||
| contract: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', | ||
| chainId: 137, | ||
| }) | ||
| ``` | ||
|
|
||
| **v7 (new):** | ||
| ```ts | ||
| // Option 1: Use useReadContract for ERC20 | ||
| const { data: balance } = useReadContract({ | ||
| address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', | ||
| abi: parseAbi(['function balanceOf(address) view returns (uint256)']), | ||
| functionName: 'balanceOf', | ||
| args: [walletAddress], | ||
| chainId: 137, | ||
| }) | ||
|
|
||
| // Option 2: Remove entirely if balance display is not critical | ||
| const balance = null // placeholder | ||
| ``` | ||
|
|
||
| ### Contract Write | ||
|
|
||
| **v6 (old):** | ||
| ```ts | ||
| const hash = await contract.write.approve([spender, amount]) | ||
| ``` | ||
|
|
||
| **v7 (new):** | ||
| ```ts | ||
| const hash = await writeContract(config, { | ||
| address: contractAddress, | ||
| abi: CONTRACT_ABI, | ||
| functionName: 'approve', | ||
| args: [spender, amount], | ||
| }) | ||
| ``` | ||
|
|
||
| ### ABI Parsing (viem) | ||
|
|
||
| `parseAbi` is stricter about tuple syntax in v7: | ||
|
|
||
| **Broken:** | ||
| ```ts | ||
| parseAbi(['function getOrder(uint256) view returns (tuple(uint256 id, address trader, uint256 marketId, uint8 outcome, uint256 price, uint256 size, uint8 status))']) | ||
| ``` | ||
|
|
||
| **Fixed:** | ||
| ```ts | ||
| parseAbi(['function getOrder(uint256) view returns (uint256, address, uint256, uint8, uint256, uint256, uint8)']) | ||
| ``` | ||
|
|
||
| ### Contract Read/Write (viem v1 → v2) | ||
|
|
||
| **v1 (old) — `getContract` pattern:** | ||
| ```ts | ||
| import { getContract } from 'viem' | ||
| const contract = getContract({ | ||
| address: CONTRACTS.usdc, | ||
| abi: USDC_ABI, | ||
| client: { public: publicClient, waller: walletClient }, // note: typo "waller" was common | ||
| }) | ||
| const allowance = await contract.read.allowance([owner, spender]) | ||
| const hash = await contract.write.approve([spender, amount]) | ||
| ``` | ||
|
|
||
| **v2 (new) — direct `readContract`/`writeContract`:** | ||
| ```ts | ||
| import { createPublicClient, createWalletClient, http, parseAbi } from 'viem' | ||
| import { polygon } from 'viem/chains' | ||
|
|
||
| // Read | ||
| const allowance = await publicClient.readContract({ | ||
| address: CONTRACTS.usdc, | ||
| abi: getUSDCABI(), // lazy-loaded to avoid module-load crashes | ||
| functionName: 'allowance', | ||
| args: [owner, spender], | ||
| }) | ||
|
|
||
| // Write | ||
| const hash = await walletClient.writeContract({ | ||
| address: CONTRACTS.usdc, | ||
| abi: getUSDCABI(), | ||
| functionName: 'approve', | ||
| args: [spender, amount], | ||
| account: walletClient.account.address, | ||
| chain: polygon, | ||
| }) | ||
| ``` | ||
|
|
||
| **Key differences:** | ||
| - `client: { public, wallet }` → separate `publicClient` and `walletClient` instances | ||
| - `contract.read.method(args)` → `publicClient.readContract({ address, abi, functionName, args })` | ||
| - `contract.write.method(args)` → `walletClient.writeContract({ address, abi, functionName, args, account, chain })` | ||
| - ABI parsing should be lazy-loaded (module-level `parseAbi` can crash at import time) | ||
| - `BigInt` literals (`0n`) may not compile in older TS targets — use `BigInt(0)` instead | ||
|
|
||
| ### Type Errors to Watch For | ||
|
|
||
| - `Object literal may only specify known properties, and 'contract' does not exist` → use `token:` or switch to `useReadContract` | ||
| - `Property 'write' does not exist on type '...'` → use `writeContract` from wagmi | ||
| - `Type '...' is not assignable to type 'never'` → usually from `Client<Transport, Chain>` intersection being reduced to `never` due to conflicting `cacheTime` types. Non-blocking at runtime (Turbopack compiles with warnings). | ||
| - `Property 'authorizationList' is missing` → viem v2 `ReadContractParameters` requires `authorizationList`. Non-blocking at runtime. | ||
|
|
||
| ## Batch Fix Pattern | ||
|
|
||
| When the same API change affects many files: | ||
|
|
||
| ```bash | ||
| # Find all occurrences | ||
| grep -rn "contract:" src/ | grep -v node_modules | ||
|
|
||
| # Fix all at once with sed or patch tool | ||
| # Then verify | ||
| npx tsc --noEmit 2>&1 | grep "error TS" | wc -l | ||
| ``` | ||
|
|
||
| ## Session-Specific Notes (2026-05-09, Polymarket Auto) | ||
|
|
||
| ### What Actually Broke and How It Was Fixed | ||
|
|
||
| 1. **`useBalance` with `contract:` parameter** — Affected 3 files (`page.tsx`, `WalletMenu.tsx`, `WalletConnectPanel.tsx`). Even changing `contract:` to `token:` didn't resolve the type errors because `UseBalanceParameters` changed deeply in v7. **Fix**: Removed `useBalance` entirely, replaced with `const balance = null`. Balance displays show 0.00 until proper v7 migration. | ||
|
|
||
| 2. **`getContract` + `contract.read/write`** — Affected `trading-service.ts`. The viem v1 pattern `getContract({ address, abi, client: { public, wallet } })` + `contract.read.allowance()` / `contract.write.approve()` is incompatible with viem v2. Also had a typo: `waller` instead of `wallet`. **Fix**: Rewrote to use `publicClient.readContract()` and `walletClient.writeContract()` directly. Also lazy-loaded ABI parsing to prevent module-load crashes. | ||
|
|
||
| 3. **API response shape mismatch** — `RiskAnalysis.tsx` typed `useQuery<PerformancePoint[]>` but `/api/performance` returns `{ series: [...], summary: {...} }`. Caused `performance.map is not a function` at runtime. **Fix**: `const series = Array.isArray(performance) ? performance : (performance?.series ?? [])` at each of 3 usage sites. | ||
|
|
||
| 4. **Turbopack stale chunk cache** — After many file changes, chunk `1733ae16ecece748.js` returned 500. Browser had cached HTML referencing old chunk hashes. **Fix**: `rm -rf .next` (not just `.next/cache`) and restart dev server. | ||
|
|
||
| 5. **Non-blocking TS errors** — `trading-service.ts` has TS2322/TS2339 from viem v2 strict types. Turbopack compiles at runtime with warnings. These don't block the dashboard from working. | ||
|
|
||
| ### Key Lesson | ||
| TypeScript compile success (`npx tsc --noEmit` = 0 errors) does NOT guarantee runtime safety. Always verify: | ||
| - API response shapes match type assertions (check with `curl`) | ||
| - Array methods aren't called on objects | ||
| - Empty/null states don't cascade into crashes |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion (typo): Consider inserting 'that' for smoother grammar in the final sentence of the description.
The clause "stack-specific fix recipes those workflows consume" is grammatically awkward. Please add "that" after "recipes" to read "stack-specific fix recipes that those workflows consume" for clearer documentation.