The Spiel Engine turns your actual build sessions into publishable content, so you don’t need to stop working to create posts
SaferSkills independently audited SpielOS (Agent Skill) and scored it 79/100 (yellow). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 5 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 5 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Turn real build sessions into publishable content automatically.
The Spiel Engine is a Session-as-Content system for technical founders. It converts what you already build, debug, decide, and ship into platform-native posts for X, LinkedIn, and blog without requiring a separate content workflow.
You do not create content. You extract it from work.
WORK SESSION → [Wiki Loop] → Knowledge Base → [Content Loop] → X / LinkedIn / BlogThe engine ships with skeleton strategy templates in concepts/. After running the setup prompt in SETUP.md, the 14-question session fills these with your real content strategy.
[!IMPORTANT] Want a white-glove install? DM @ShayanSpiel to get
a custom setup, voice-trained, and deployed within 10 days.
git clone https://github.com/ShayanSpiel/SpielEngine.git
cd TheSpielEngineOpen SETUP.md and paste the prompt into any LLM-powered agent (Cursor, Claude Code, opencode, Continue, ChatGPT, etc.). The agent will self-detect, install commands, and walk through the 14-question ICP/voice/brand setup automatically.
Requirements: Python 3, bash, git.
Two state machines run independently. The spiel shim drives every transition.
Ingests raw notes, extracts entities, reconciles into wiki pages, and links them — a compounding knowledge base that grows with every session.
IDLE → INGEST → ANALYZE → RECONCILE → LINK → INDEX → VALIDATE → COMPLETE → IDLETurns a session (or topic) into platform-native drafts through strategy classification, the 8-step Content Engine Compiler, drafting, banner generation, gating, queuing, and publishing.
IDLE → SESSION_CAPTURE → COMPILE → SELECT → FORMAT_WIZARD → DRAFTING → BANNER → GATE_CHECK → QUEUE → PUBLISHING → ARCHIVING → ANALYZE_POST → COMPLETE_POST → IDLEBoth loops are driven by the LLM for creative work (analyzing, drafting, gate-judging) and by scripts for mechanical work (transitions, file ops, API calls). See AGENTS.md for the full state machine.
After setup, your agent will have these commands available. Run them by typing /command in the chat. Every command ultimately invokes spiel (the path-independent entrypoint), so they work from any project cwd.
| Command | Action | |
|---|---|---|
/post [topic] | Start content pipeline (session or topic) | |
| `/publish [id\ | all]` | Queue to production (X / LinkedIn) |
/extract [file] | Ingest raw notes to wiki pages | |
/state | Show current state of wiki and content loops | |
/health | Wiki health check (orphans, links, frontmatter) | |
/queue | Show content queue grouped by platform | |
/optimize | Suggest tagging, linking, and pruning opportunities | |
/reconcile | Reconcile extracted content into wiki pages | |
/analyze | Run analysis step on pending items | |
/compact | Merge redundant or overlapping pages | |
/config | Show current engine configuration | |
/index | Display the wiki index | |
/log | Recent log entries | |
/prune | Identify and remove stale or low-confidence pages | |
/reject | Remove a draft from the queue | |
/relink | Scan and repair broken wikilinks | |
/schedule | Set publish timestamps for queued content | |
/help | Show all available commands |
spiel is a thin shell wrapper (at ~/.local/bin/spiel, also bundled at scripts/bin/spiel) that resolves the vault from ~/.config/opencode/.env and execs scripts/engine.py inside it. It is path-independent — invoke it from any project, any IDE, any shell.
spiel --version # print version + resolved vault path
spiel --where # print the resolved vault path
spiel status # engine: current state
spiel queue # engine: queue contents
spiel wiki extract # engine: start ingest
spiel content run # engine: full content pipeline (orchestrator)
spiel content publish # engine: publish queued drafts
spiel log --tail 20 # engine: recent log entriesThe shim resolves VAULT_DIR (first match wins):
$VAULT_DIR env var (inline override)<cwd>/.spiel-vault (project-local override file)~/.config/opencode/.env (the global source of truth)<vault>/scripts/bin/spielYou can also drive the engine directly:
# Wiki pipeline
spiel wiki extract notes/my-session.md
spiel wiki analyze
spiel wiki reconcile
spiel wiki index
spiel wiki validate
spiel wiki complete
# Content pipeline
spiel content post "topic"
spiel content run
spiel content compile-write ...
spiel content draft-write --file content/queue/<name>.md
spiel content draft-done
spiel content banner
spiel content gate
spiel content publish
# Or the bash wrappers (back-compat):
bash scripts/pipeline.sh wiki-extract notes/my-session.md
bash scripts/pipeline.sh post-start "topic"Every draft passes through a multi-layer gate system before publishing:
gates.py)(passes / total gates). Minimum threshold: 0.85. Configured in rules.yaml.
| File | Purpose |
|---|---|
rules.yaml | Posting mode, platform limits, gate thresholds, strategy |
assets/brand-config.json | Brand name, colors, voice keywords, platforms |
concepts/icp-offer.md | ICP demographics, psychographics, problem hierarchy |
concepts/voice-corpus.md | Canonical examples for voice matching |
concepts/funnel-and-matrix.md | Archetypes, verticals, CTA matrix |
.env | VAULT_DIR — vault root path |
TheSpielEngine/
├── AGENTS.md # State machines + governance rules
├── SETUP.md # Universal setup prompt (start here)
├── SCHEMA.md # Page and post frontmatter schemas
├── rules.yaml # Engine config (local, gitignored)
├── rules.yaml.example # Example config with defaults
├── .env # VAULT_DIR (local, gitignored)
│
├── concepts/ # Strategy + voice configuration
│ ├── icp-offer.md
│ ├── voice-corpus.md
│ ├── voice-and-gates.md
│ ├── funnel-and-matrix.md
│ └── session-as-content.md
│
├── scripts/ # Engine scripts (Python + Shell)
│ ├── engine.py # State machine controller + orchestrator
│ ├── pipeline.sh # CLI wrapper for all states
│ ├── engine_state.py # State machine + paths + validation
│ ├── engine_config.py # rules.yaml reader
│ ├── engine_health.py # Wiki health checks
│ ├── engine_serial.py # State serialization
│ ├── state_handlers.py # Wiki loop state handlers
│ ├── wizard.py # Format + publish wizards
│ ├── compiler.py # Compiler write
│ ├── publish_dispatcher.py # Publishing dispatcher
│ ├── template_ranker.py # Template scoring + curation
│ ├── ui.py # Terminal UI
│ ├── archive.py # Archive files
│ ├── analyze.py # Post-analyze (Buffer engagement)
│ ├── banner_tool.py # Banner image generator
│ ├── gates.py # Mechanical gate checks
│ ├── buffer_client.py # Buffer API client
│ ├── capture.py / classifier.py
│ ├── icp.py / selector.py / setup_buffer_channels.py
│ ├── publishers/ # Publishing backends
│ │ ├── buffer.py # Buffer (multi-platform)
│ │ ├── twitter.py # X direct API
│ │ └── linkedin.py # LinkedIn direct API
│ └── bin/spiel # Path-independent entrypoint
│
├── templates/ # Post frontmatter + structure templates
│ ├── x-post.md
│ ├── linkedin-post.md
│ ├── blog-post.md
│ └── session-log.md
│
├── assets/ # Brand, banners, screenshots, icons
│ ├── brand-config.json
│ ├── banners/
│ └── icons/
│
├── content/ # All generated content
│ ├── sessions/
│ ├── queue/
│ ├── posted/
│ └── rejected/
│
├── tests/ # Test suite
└── logs/ # JSONL activity logs (local, gitignored)paths. Set VAULT_DIR in .env or as an environment variable to override.
Code, opencode, Continue, ChatGPT, etc.
rules.yaml, .env, content/*, logs/*, assets/banners/*,assets/screenshots/* — local data stays local.
All state transitions are logged to logs/YYYY-MM-DD.jsonl (JSONL format). View with:
spiel log --days 7 --tail 20
spiel log --level ERRORISC
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.