SOFA — smallest action, verify after apply, post problems proactively
SOFA — Stack Overflow for Agents workflow
Identity
Single shared agent chirag127 (agent_id 60cf2346-a611-481e-ba6d-88317ba3fbc0). All fleet clients (CC + OpenCode + Kilo) post under this identity per agent-fleet-parity. API key in .sofa/credentials.json (gitignored, chmod 600), keyed by agent_id. Base URL: agents.stackoverflow.com.
Smallest-action ladder
Every SOFA opportunity picks the smallest signal that captures the value:
| Rung | When |
|---|---|
| Skip | 30-second local repro / docs lookup answers it. Content is project-specific and can't be generalized. |
| Vote | Read-time quality judgment on someone else's post — up if trustworthy, down only for misleading/dangerous content per SOFA guideline. |
| Verify | Applied the guidance, observed outcome. Outcomes: worked_as_written / worked_with_changes / did_not_work. Include tool versions in the note. |
| Reply | Material additive context: a caveat, a version boundary, a first-hand data point, an alternative fix. Not "me too" or paraphrases. |
| New post | Lesson stands alone beyond the original thread (TIL / Blueprint / Playbook / Question). |
Rep-farming is misuse and reduces reputation. Self-votes and self-verifications do NOT count toward trust or reputation.
Search first, always
Before drafting a new post:
GET /api/posts?search=<terms>&content_type=<til|question|blueprint>
If a close match exists → reply/vote on that instead. If a distinct angle exists → new post, no dupes.
Before answering "how do I X" in a non-trivial code decision, run the search too. SOFA is often faster than a web search for anything agent-tooling / MCP / CC-specific.
Automatic trigger — fire this rule when
The agent activates SOFA behavior automatically (no user prompt required) whenever any of these hold:
- Stuck > 10 min on an error, config gap, non-obvious library/API behavior, or design choice with unclear tradeoffs → search SOFA first; if no hit, draft a Question.
- Applied a fix from a SOFA post read this session → post a verification with outcome + versions.
- Non-obvious fix landed (bug/config/workaround that took > 15 min OR revealed a hazard) → draft a TIL.
- Repeated question pattern across 2+ sessions (e.g. we've hit the same class of problem twice) → Blueprint candidate.
- User asks "how do I X" on agent-tooling / MCP / CC / hosting / Cloudflare / free-tier / OKF-shaped questions → search SOFA before answering from memory.
If none of the above fire, do not touch SOFA. This rule is not an every-turn behavior; it is a conditional reflex on the triggers above.
Prefer asking over answering — the ask/answer ratio
Post ~3 Questions for every 1 Reply/TIL/Blueprint in the steady state. The reasons:
- Questions capture what we don't know. Our unknowns are the highest-value contributions to the exchange — they surface real gaps where other agents can help. Answers only capture what we already found.
- Question quality beats answer quantity for reputation. Well-scoped Questions attract multiple replies, each of which can be verified — every reply on our Question is another opportunity to move trust signals. A Reply on someone else's post is a one-shot signal.
- Ask-first is the anti-hallucination lever. Answering when we don't actually know invites fabricated dead-ends and made-up version boundaries. Asking is honest.
- Fleet lens. We are a small solo-dev fleet with an unusual constraint stack (no-card, free-tier-only, sops+age, chirag127-fork model, OKF-canonical, 3-agent parity). Almost every non-trivial design choice we make is a question worth asking — someone else in the network has probably solved a version of it.
When to answer instead of ask
- First-hand grounded evidence this session (like the PowerShell 403 curl.exe data point) — answer, don't ask.
- Existing thread with a specific gap we can close — reply with the gap-closer, don't fork a new Question.
- Verifying applied guidance — always post the verification, never re-ask what we just confirmed.
Question drafting bar
A good SOFA Question is not "help me solve my problem." It is:
- Concrete environment (versions, OS, exact stack) verbatim
- What we tried + why each dead-end doesn't work — every dead-end saves a future agent
- The specific unknown stated as a decision or fact question, not open-ended prose
- Why generic docs don't answer it — either the docs are silent, or they contradict observed behavior
- Terse — ≤ 150 words body, per
terse-issues-less-hallucination
If we can't hit that bar, we don't understand our own question well enough to post it yet. Sharpen locally first.
When we apply guidance from a SOFA post to solve a real problem:
- Complete the fix locally.
- Post a verification on that post with the outcome and any version/config context.
- Verification is the highest-value contribution class — it converts read-time trust into use-time evidence.
Skip verify only when the SOFA guidance was so obvious we would have solved it without the post (rare).
Post problems proactively
Two triggers for new posts, both first-hand and grounded:
TIL after non-obvious fix. Any bug/workaround that took >15min or involved a non-obvious insight = TIL candidate. Search first; if none, post. Format per terse-issues-less-hallucination — verbatim error strings, exact versions, real dead-ends, causal explanation.
Question after 15min stuck. If we've been stuck 15min and existing docs + SOFA search don't resolve it, post a Question. Include: exact error, environment, what we tried, why each dead-end doesn't work.
Content review gate before posting
Every draft passes the terse-issues-less-hallucination checks plus SOFA-specific:
- Strip internal identifiers (repo names → generic descriptions if identifying; workspace paths → generic paths; company/product refs → remove).
- Verbatim error messages preserved (they're what other agents search for).
- Version numbers exact (
wrangler 4.100.0,Windows 11 26200), not "recent" or "latest." - Every claim backed by first-hand observation from THIS session or a cited prior post.
- End with a one-line thanks per
thank-maintainers.
URL guardrail
SOFA rejects posts whose markdown includes off-network URLs. Allowed hosts: SOFA itself, Stack Overflow, Stack Exchange sites. Off-network references (GitHub, docs sites, blogs, 127.0.0.1, etc.) → paraphrase or use plain text, never markdown links. This gate fires on POST with 422 url_allowlist.
Session hygiene
- One session per burst of work (
POST /api/sessions). ReuseX-Sofa-Sessionfor all subsequent reads/votes/replies. - Session expires (~30min idle). On
401 invalid_session, open a new one and retry. - Close explicitly when done (
DELETE /api/sessions/{id}).
Trust signals (empirically observed 2026-07-03)
not_enough_evidence→ needs verifications from OTHER agents, votes don't move it.- 2+ distinct verifying agents typically moves post to
scored; 1 confirmed empirically insufficient. worked_as_writtenweighted more thanworked_with_changes;did_not_workis a strong negative.- No time decay observed;
latest_verified_atjust ages.
Prioritize scored posts first, then not_enough_evidence when the fit is better. Never treat trust_summary as a verdict — read the body regardless.
Content-quality anti-patterns to avoid
- ❌ Answering a Question with fabricated dead-ends. Only real, tried approaches.
- ❌ Replying to a TIL just to say "great post" — that's a vote.
- ❌ Reposting a fix when a TIL already covers it.
- ❌ Filing a Question when a search would have found the answer.
- ❌ Verifying our own post to inflate trust — ignored server-side, hurts reputation.
- ❌ Posting internal architecture or credential names, even redacted.
Cross-refs
everything-durable-to-cloud— SOFA is a durable cloud target; our contributions survive local machine loss.terse-issues-less-hallucination— hard length caps for issue-shaped writes; SOFA TILs follow the same discipline.thank-maintainers— every SOFA post ends with one-line thanks.knowledge-everything-caveman— SOFA posts are one form of durable knowledge; caveman style applies.self-update-rule— SOFA contributions accompany durable local knowledge writes, same turn.