Skip to content

Commit d560867

Browse files
rayketchamclaude
andcommitted
docs(README): bring through v0.14c — manual promote, issue-sync, card UX
User ask: "make sure the Web GH page is accurate and properly demonstrates what we're doing here". Walked the README against everything that shipped in this session and patched the gaps. Corrections: - Test count badge 1100+ → 1280+ (suite actually runs 1281 cases) - Version badge 0.14.0 → 0.14c - Headline blurb: dropped "auto-promote weekly" (autonomous cadence was removed in v0.14b) → "one click promotes the top money-bot to a GitHub issue". - Added "autonomous, human-driven" operating-philosophy callout to make the gate model explicit: nothing autonomous touches GitHub. New material: - Pipeline table row: "Manual promote (v0.14b)" replaces the old "Auto-promote" row; new "Issue sync (v0.14c)" row underneath. - Dashboard section: new "Card UX (v0.14c)" subsection — hover tooltip, in-window modal, per-card Reject button, Churn Now and Promote buttons each described with what they do and what they cost. - API table: added GET /api/ideas/{id}, POST /api/promote/{id}, GET /api/backend-info; marked the rate-limited ingest/scaffold paths (v0.14b fix). - Cadence env table: added FORGE_ISSUE_SYNC_INTERVAL_HOURS, removed FORGE_AUTO_PROMOTE_INTERVAL_HOURS. - Cadence listing block (the in-process multi-cadence scheduler section): added issue_sync 1h, removed auto_promote 168h, plus a paragraph explaining the cadence removal and where the runner code lives now. - Money-flipper config subsection retitled "v0.14b — manual" with a one-line explanation of the change. - Architecture src/ tree: noted auto_promote_runner.py is now called from the manual endpoint; added issue_sync_runner.py. - Status section: explicit list of which cadences are autonomous (none touch GitHub state) and pointer to ROADMAP.md's top-3 next builds. GitHub repo metadata (via gh repo edit): - Description rewritten to highlight LLM-first + fundability + one-click promotion + cost ($2-3/mo on Haiku, $0 on Pro Max CLI). - Topics added: monetization, fundability, llm, haiku, sqlite-wal, dashboard. The repo is now searchable on the relevant facets. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 709cd4a commit d560867

1 file changed

Lines changed: 39 additions & 15 deletions

File tree

README.md

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# Project Forge
22

3-
![Version](https://img.shields.io/badge/version-0.14.0-blue) ![Python](https://img.shields.io/badge/python-3.12+-3776AB?logo=python&logoColor=white) ![License](https://img.shields.io/badge/license-MIT-green) ![CI](https://github.com/rayketcham-lab/project-forge/actions/workflows/ci.yml/badge.svg) ![Tests](https://img.shields.io/badge/tests-1100+-passing?color=brightgreen)
3+
![Version](https://img.shields.io/badge/version-0.14c-blue) ![Python](https://img.shields.io/badge/python-3.12+-3776AB?logo=python&logoColor=white) ![License](https://img.shields.io/badge/license-MIT-green) ![CI](https://github.com/rayketcham-lab/project-forge/actions/workflows/ci.yml/badge.svg) ![Tests](https://img.shields.io/badge/tests-1280+-passing?color=brightgreen)
44

5-
An autonomous project idea generator. It runs an in-process scheduler inside the FastAPI app, calls an LLM (or falls back to deterministic heuristics), scores ideas for both feasibility and **fundability**, deduplicates aggressively, and stores everything in SQLite. A web dashboard lets a human review, approve, and optionally scaffold approved ideas into GitHub repos. As of v0.14, the engine can also auto-promote its top monetizable idea each week into a real GitHub issue with a full MVP spec — closing the loop from "idea factory" to "weekly MVP candidate shipper."
5+
An autonomous project idea generator. It runs an in-process scheduler inside the FastAPI app, calls an LLM (or falls back to deterministic heuristics), scores ideas for both feasibility and **fundability**, deduplicates aggressively, and stores everything in SQLite. A web dashboard lets a human review, approve, and — with a single click — promote the top money-bot idea into a real GitHub issue with a full MVP spec. **Promotion is human-gated**: the engine ranks and surfaces, you approve.
6+
7+
> Operating philosophy: **autonomous, human-driven**. The engine generates, scores, dedups, sweeps, and audits itself on a schedule. Anything that touches external state (GitHub issues, repos) is one click away — never autonomous. The v0.14 weekly auto-promote cadence was removed in v0.14b after a uvicorn-reload bug fired it three times. Today, the Money Bots page exposes a Promote ➤ button per card; nothing else can flip an idea to `approved` without an operator.
68
79
This is a personal project that's been running for several months. It's open-sourced because some of the patterns (LLM backend abstraction, multi-stage dedup, persona-driven generation, fundability scoring, in-process multi-cadence scheduling) might be useful to others. It is not a product — there's no support, no roadmap commitment, and no SLA.
810

@@ -28,7 +30,8 @@ This is a personal project that's been running for several months. It's open-sou
2830
| **Compare** | Token-overlap (Jaccard) between an idea and a GitHub repo's README + topics + description. Returns a verdict (new / enhance / duplicate). |
2931
| **Approval check (v0.11)** | When a human flips an idea to `approved`, a non-blocking think-tank coherence checker runs: empty tech stack? mvp scope drifting from description? super-idea components with no shared theme? fake-perfect feasibility score? Results land in `approval_checks` and surface as a banner on the idea detail page. |
3032
| **Verdict audit (v0.11)** | A "who watches the watcher" cadence samples recent LLM verdicts (challenge / review) and re-runs them with a flipped tone. Divergences land in `verdict_audits` for inspection. |
31-
| **Auto-promote (v0.14)** | Weekly money-flipper cadence. Picks the top-`fundability_score` idea in money categories that hasn't been promoted, files a full GitHub issue (MVP spec + market analysis + tech stack), flips it to `approved`, and stamps `auto_promoted_at` so it never fires twice on the same idea. |
33+
| **Manual promote (v0.14b)** | One click on /money-bots → POST `/api/promote/{id}``gh issue create` with the full MVP spec + market analysis + tech stack → idea flips to `approved` and stamps `auto_promoted_at` so re-clicks return the existing issue. The autonomous weekly cadence was removed after a uvicorn-reload bug fired it three times — promotion is human-gated now. |
34+
| **Issue sync (v0.14c)** | Hourly cadence. Pulls live GitHub state for every approved + promoted idea via `gh issue view --json state,stateReason`. CLOSED + COMPLETED → `contributed`. CLOSED + NOT_PLANNED → `archived`. OPEN → leave alone. Keeps the dashboard honest after an operator closes an issue. |
3235
| **Scaffold** | Calls `gh repo create`, pushes a language-appropriate template tree (Python / Rust / Go / Node), opens 3–5 starter issues from the idea's MVP scope, applies labels. |
3336

3437
---
@@ -40,7 +43,7 @@ git clone https://github.com/rayketcham-lab/project-forge.git
4043
cd project-forge
4144
pip install -e ".[dev,test]"
4245

43-
# Run tests (~1100 tests, ~50s)
46+
# Run tests (~1280 tests, ~50s)
4447
pytest tests/ -v
4548

4649
# Start dashboard — the in-process scheduler boots with it
@@ -76,6 +79,16 @@ The "Add Idea" tab has three independent paths:
7679
- **Text — Quick** — paste a fragment, one LLM call, get an idea.
7780
- **5-Phase Wizard** — Discover → Differentiate → Audience → Constraints → Synthesize. Each phase asks 2–3 follow-up questions based on prior answers. Final phase produces a draft you can edit before saving.
7881

82+
### Card UX (v0.14c)
83+
84+
Every idea card across the dashboard, money-bots, super-ideas, and explore pages carries the same triage UX:
85+
86+
- **Hover tooltip** — 220 ms after mouse-over, a floating panel shows name + tagline + feasibility / fundability / mode pills + the first 280 chars of the description. Reads from `data-*` attributes for an instant first paint, then lazy-fetches `/api/ideas/{id}` to fill the description. Move off the card and it disappears.
87+
- **In-window modal** — click anywhere on a card (not on a link/button) and the full idea opens in place: description, market, MVP scope, tech-stack chips, the GitHub issue if promoted, a Reject button, and a "Full page ↗" escape hatch. Backdrop / × / ESC all close. No more page navigations for just-peek-at-an-idea.
88+
- **Per-card Reject button** — a small red × top-right of every card, invisible until you hover. Confirms via dialog, posts to `/ideas/{id}/reject`, removes the card from the DOM.
89+
- **Churn Now button** (on /money-bots) — fires `/api/churn` for the current category filter. New idea appears in the grid after a 1.5 s reload. ~$0.003/click at Haiku.
90+
- **Promote ➤ button** (on /money-bots, only for un-promoted ideas) — confirms, posts to `/api/promote/{id}`, files the GitHub issue, flips status to `approved`. The only path that touches GitHub state.
91+
7992
---
8093

8194
## API
@@ -88,16 +101,19 @@ A subset of the routes exposed by `web/routes.py`. There are more — see the `@
88101
| `GET` | `/api/stats` | Aggregate counts |
89102
| `GET` | `/api/categories` | Category counts + average score |
90103
| `GET` | `/api/ideas` | Paginated list |
104+
| `GET` | `/api/ideas/{id}` | JSON detail + recent challenges + 4 related ideas. Powers the hover tooltip and in-window modal (v0.14c) |
91105
| `GET` | `/api/money-bots/top` | Top monetizable ideas (v0.14) |
92106
| `POST` | `/api/churn` | On-demand idea generation for the money pipeline (v0.14) |
107+
| `POST` | `/api/promote/{id}` | Manual promote → GH issue (v0.14b — replaces the removed auto-promote cadence) |
108+
| `GET` | `/api/backend-info` | Diagnostic: which LLM backend is in use + censored view of the API-key env vars seen by the running process |
93109
| `POST` | `/api/ideas/{id}/compare` | Compare to a repo |
94-
| `POST` | `/api/ideas/from-url` | Ingest from URL |
95-
| `POST` | `/api/ideas/from-text` | Ingest from text fragment |
110+
| `POST` | `/api/ideas/from-url` | Ingest from URL (rate-limited) |
111+
| `POST` | `/api/ideas/from-text` | Ingest from text fragment (rate-limited) |
96112
| `POST` | `/api/ideas/builder/step` | One step of the wizard |
97113
| `POST` | `/api/ideas/builder/save` | Save the wizard's final draft |
98114
| `POST` | `/ideas/{id}/approve` | Move to approved (triggers the approval-check) |
99115
| `POST` | `/ideas/{id}/reject` | Move to rejected |
100-
| `POST` | `/ideas/{id}/scaffold` | Scaffold to GitHub |
116+
| `POST` | `/ideas/{id}/scaffold` | Scaffold to GitHub (rate-limited) |
101117
| `GET` | `/api/ideas/{id}/approval-check` | Read back the coherence-check result |
102118

103119
Non-read methods require a Bearer token when `FORGE_API_TOKEN` is set. The dashboard uses an ephemeral per-process token rendered into the page meta tag — see `web/auth.py`.
@@ -133,17 +149,19 @@ All in hours. The in-process scheduler owns these — no systemd timers required
133149
| `FORGE_VERDICT_AUDIT_INTERVAL_HOURS` | 24 | Verdict meta-audit ("who watches the watcher") |
134150
| `FORGE_FEED_REFRESH_INTERVAL_HOURS` | 24 | NVD / arXiv / IETF cache refresh |
135151
| `FORGE_FUNDABILITY_INTERVAL_HOURS` | 24 | Score recent ideas for monetization viability |
136-
| `FORGE_AUTO_PROMOTE_INTERVAL_HOURS` | 168 | Weekly money-flipper |
152+
| `FORGE_ISSUE_SYNC_INTERVAL_HOURS` | 1 | v0.14c. Sync `auto_promoted_at` ideas with their live GH issue state |
137153
| `FORGE_CHALLENGE_INTERVAL_HOURS` | 168 | Autonomous adversarial pass on top unchallenged ideas |
138154
| `FORGE_SCHED_INITIAL_DELAY_SEC` | 60 | Boot grace period before the first tick |
139155
| `FORGE_FEEDS_DIR` | `<db_dir>/feeds` | Where the NVD / arXiv / IETF caches live |
140156

141-
### Money-flipper (v0.14)
157+
### Money-flipper (v0.14b — manual)
158+
159+
These knobs gate the **manual** Promote ➤ button on /money-bots and the underlying `/api/promote/{id}` endpoint. The cadence that used to read them autonomously was removed in v0.14b.
142160

143161
| Variable | Default | Purpose |
144162
|----------|---------|---------|
145-
| `FORGE_PROMOTE_CATEGORIES` | `automation-income,creator-tools,consumer-app,productivity` | Comma-separated category whitelist for auto-promotion |
146-
| `FORGE_PROMOTE_MIN_SCORE` | `0.55` | Minimum `fundability_score` to be eligible |
163+
| `FORGE_PROMOTE_CATEGORIES` | `automation-income,creator-tools,consumer-app,productivity` | Comma-separated category whitelist — only ideas in these categories surface on /money-bots |
164+
| `FORGE_PROMOTE_MIN_SCORE` | `0.55` | Minimum `fundability_score` for the candidate-picker to consider the idea promotable |
147165
| `FORGE_PROMOTE_REPO` | `<owner>/<repo>` | Where the promotion issue gets filed. Set this to a dedicated "money-bot board" repo if you want them off your main forge backlog. |
148166

149167
---
@@ -208,7 +226,9 @@ src/project_forge/
208226
review_runner.py Idea-quality review cycle
209227
challenge_runner.py Autonomous adversarial pass
210228
verdict_audit_runner.py v0.11. Verdict meta-audit
211-
auto_promote_runner.py v0.14. Money-flipper loop
229+
auto_promote_runner.py v0.14. Money-flipper logic. The cadence was removed in v0.14b;
230+
still used by POST /api/promote/{id} for the manual button.
231+
issue_sync_runner.py v0.14c. Pulls live GH issue state for promoted ideas → DB.
212232
scaffold/
213233
builder.py Project structure
214234
github.py gh CLI wrapper
@@ -224,17 +244,19 @@ There's no systemd. The original deployment shipped one timer per cron-driven cy
224244
The defaults are tuned so a single host can run the full engine on roughly **$2–3/month** of LLM spend at Haiku 4.5 prices:
225245

226246
```
227-
expand 1h cross-category + super idea generation
247+
expand 1h cross-category + super idea generation (LLM-first)
248+
issue_sync 1h pull live GH state for promoted ideas → DB
228249
review 12h auto-archive sweeps over aged ideas
229250
self_improve 6h GitHub ci-queue → PR loop
230251
introspect 24h self-improvement idea proposals
231252
verdict_audit 24h "who watches the watcher" — samples recent LLM verdicts
232253
feed_refresh 24h NVD / arXiv / IETF cache refresh
233254
fundability 24h score recent ideas for monetization viability
234-
auto_promote 168h weekly money-flipper
235255
challenge 168h autonomous adversarial pass on top unchallenged ideas
236256
```
237257

258+
There is no `auto_promote` cadence anymore. The weekly money-flipper was removed in v0.14b after a uvicorn-reload bug fired it three times in one session. The runner code at `cron/auto_promote_runner.py` stays — it's invoked by the manual `/api/promote/{id}` endpoint that the Promote ➤ button on /money-bots POSTs to.
259+
238260
Each cadence is overridable via env (see the table above). The scheduler honours per-cadence watermarks (e.g. `expand` consults `MAX(generated_at)` so a manual `forge-generate` resets the clock), so frequent restarts don't double-fire.
239261

240262
---
@@ -341,7 +363,9 @@ CI runs the same on a self-hosted runner.
341363

342364
## Status
343365

344-
Active. The in-process scheduler fires generation hourly, fundability scoring + verdict audits daily, and the money-flipper weekly. The dashboard at the operator's host shows live activity. Issues / PRs welcome but not necessarily merged on any timeline — see `CONTRIBUTING.md` and `SECURITY.md`.
366+
Active. The in-process scheduler fires generation hourly, issue-sync hourly, fundability scoring + verdict audits + feed refresh daily, and the autonomous challenge cadence weekly. Promotion to GitHub is human-gated via the Promote ➤ button on /money-bots. Issues / PRs welcome but not necessarily merged on any timeline — see `CONTRIBUTING.md` and `SECURITY.md`.
367+
368+
See `ROADMAP.md` for the v0.15+ plan — top three: Stripe revenue webhook (so the engine learns which categories actually convert), an edge-finder pre-pass (Haiku-derived "fresh angles" injected as anti-tropes before each generation), and auto-scaffold of the promoted idea into a real starter repo (close the loop from "approved" → "running MVP" without an operator click).
345369

346370
---
347371

0 commit comments

Comments
 (0)