Skip to content

Commit 02c7f62

Browse files
committed
reposition CaseForge as an implementation blueprint tool
1 parent 91aa07d commit 02c7f62

21 files changed

Lines changed: 492 additions & 368 deletions

CHANGELOG.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ Initial CaseForge Studio release.
66

77
Highlights:
88

9-
- deterministic dossier pipeline
9+
- deterministic blueprint pipeline
1010
- CLI for create, list, show, and serve
1111
- local web UI
1212
- preview endpoint
13-
- recent dossier listing
13+
- recent blueprint listing
1414
- comparison-friendly saved-run summaries
15-
- multi-run dossier comparison through `/api/dossiers/compare`
15+
- multi-run blueprint comparison through `/api/dossiers/compare`
1616
- optional OpenAI provider overlay with graceful fallback
1717
- release checklist
1818
- packaging/install guidance for local and distributable use
@@ -22,4 +22,4 @@ Highlights:
2222

2323
- live OpenAI happy-path validation with real credentials
2424
- comparison history beyond two runs
25-
- reviewer annotations on saved dossiers
25+
- annotation support on saved blueprints

README.md

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
# CaseForge Studio
22

3-
CaseForge Studio turns a rough product idea into an interview-ready dossier through a deterministic multi-stage pipeline. It ships with a local web app, CLI, local HTTP API, persisted run history, and an optional OpenAI overlay that refines the final dossier without becoming the only path through the product.
3+
CaseForge Studio turns a rough product idea into an implementation-ready project blueprint through a deterministic multi-stage pipeline. It ships with a local web app, CLI, local HTTP API, persisted run history, and an optional OpenAI overlay that refines the final blueprint without becoming the only path through the product.
44

5-
The core thesis is simple: a strong portfolio project should be explainable, scoped, and reviewable. CaseForge Studio helps turn vague ideas into artifacts that are easier to demo, compare, and improve.
5+
The core thesis is simple: a strong project idea should become explainable, scoped, reviewable, and ready for execution. CaseForge Studio helps turn vague ideas into artifacts that are easier to evaluate, compare, and improve.
66

77
## Why It Matters
88

9-
- Deterministic by default, so the product is demoable without external services.
10-
- Optional live-provider overlay for a stronger AI story when credentials are available.
9+
- Deterministic by default, so the product remains usable without external services.
10+
- Optional live-provider overlay for stronger AI-assisted refinement when credentials are available.
1111
- Multiple surfaces from one shared service layer: CLI, browser UI, and HTTP API.
1212
- Saved runs and comparison views make iteration visible instead of hand-wavy.
13-
- Fast to explain in an interview: brief in, dossier out, compare runs, choose the strongest artifact.
13+
- Fast to evaluate in a technical review: brief in, blueprint out, compare runs, choose the strongest implementation path.
1414

1515
## Feature Set
1616

17-
- Planner, architect, evaluator, and storyteller stages
17+
- Planner, architect, evaluator, and delivery-path stages
1818
- Markdown, JSON, and summary export under `outputs/` for persisted local runs
19-
- Local web app with dossier preview, saved-run browsing, and comparison
19+
- Local web app with blueprint preview, saved-run browsing, and comparison
2020
- Local HTTP API for generation, preview, retrieval, and compare flows
2121
- Optional OpenAI Responses API overlay with deterministic fallback
2222
- Standard-library-only backend runtime
@@ -30,12 +30,12 @@ Brief
3030
-> planner
3131
-> architect
3232
-> evaluator
33-
-> storyteller
34-
-> dossier export
33+
-> delivery path
34+
-> blueprint export
3535
-> optional OpenAI public-facing overlay
3636
```
3737

38-
The deterministic path is the primary product path. The live provider is an enhancement layer, not a dependency for the base demo.
38+
The deterministic path is the primary product path. The live provider is an enhancement layer, not a dependency for the base workflow.
3939

4040
## Quickstart
4141

@@ -45,16 +45,16 @@ From the `caseforge-studio` project root:
4545
python -m pip install -e .
4646
```
4747

48-
Generate a saved dossier:
48+
Generate a saved blueprint:
4949

5050
```powershell
51-
python -m caseforge create "Build an AI interview coach that turns a resume and job description into practice questions, STAR prompts, and a confidence score."
51+
python -m caseforge create "Build an AI operations copilot that turns incident notes, service metrics, and follow-up tasks into a release-ready action plan."
5252
```
5353

54-
Preview a dossier without persistence:
54+
Preview a blueprint without persistence:
5555

5656
```powershell
57-
python -m caseforge create "Build an AI interview coach." --preset ml --preview --json
57+
python -m caseforge create "Build an AI operations copilot." --preset ml --preview --json
5858
```
5959

6060
Run the local web app:
@@ -85,7 +85,7 @@ The live provider path is optional. Without credentials, the app falls back to t
8585
```powershell
8686
$env:OPENAI_API_KEY="your-key"
8787
$env:OPENAI_MODEL="gpt-5-mini"
88-
python -m caseforge create "Build an AI interview coach." --preset ml --provider openai --preview --json
88+
python -m caseforge create "Build an AI operations copilot." --preset ml --provider openai --preview --json
8989
```
9090

9191
Supported environment variables:
@@ -107,16 +107,16 @@ python -m caseforge create "Design an operations copilot that summarizes inciden
107107
Create from a file:
108108

109109
```powershell
110-
python -m caseforge create --brief-file examples/briefs/ai-interview-coach.md --goal "Show AI judgment"
110+
python -m caseforge create --brief-file examples/briefs/ai-ops-copilot.md --mode "AI workflow product" --goal "Emphasize shipping discipline" --preset full-stack
111111
```
112112

113-
List recent dossiers:
113+
List recent blueprints:
114114

115115
```powershell
116116
python -m caseforge list
117117
```
118118

119-
Show a persisted record:
119+
Open a persisted record:
120120

121121
```powershell
122122
python -m caseforge show <slug>
@@ -136,22 +136,22 @@ Example request:
136136

137137
```json
138138
{
139-
"brief": "Build an AI interview coach that turns a resume and job description into mock questions and rehearsal plans.",
140-
"audience": "Hiring manager",
139+
"brief": "Build an AI operations copilot that turns incident notes, service metrics, and follow-up tasks into a release-ready action plan.",
140+
"audience": "Technical stakeholders",
141141
"mode": "AI assistant",
142-
"goal": "Show AI judgment",
142+
"goal": "Emphasize AI decisioning",
143143
"preset": "ml",
144144
"provider": "openai",
145145
"provider_model": "gpt-5-mini"
146146
}
147147
```
148148

149-
## Demo Flow
149+
## Usage Flow
150150

151151
1. Start the web app and paste a rough project idea into the brief box.
152-
2. Generate a dossier and show the score, architecture section, and interview story.
153-
3. Open the committed sample dossier at `examples/sample-dossier.md` or a locally generated artifact under `outputs/<slug>/dossier.md`.
154-
4. Compare two runs to show score movement, provider path, and recommendation changes.
152+
2. Generate a blueprint and review the score, architecture section, and delivery path.
153+
3. Open the committed sample blueprint at `examples/sample-blueprint.md` or a locally generated artifact under `outputs/<slug>/dossier.md`.
154+
4. Compare two runs to review score movement, provider path, and recommendation changes.
155155
5. Explain why the deterministic path is the default and when the live provider is worth using.
156156
6. Close with the test suite and release checklist.
157157

@@ -161,8 +161,8 @@ Example request:
161161
- `python -m build`
162162
- smoke-test `GET /health`
163163
- smoke-test `GET /`
164-
- generate one dossier through the CLI
165-
- generate one dossier through the web UI
164+
- generate one blueprint through the CLI
165+
- generate one blueprint through the web UI
166166

167167
## Project Layout
168168

@@ -171,15 +171,15 @@ caseforge-studio/
171171
|-- .github/
172172
|-- caseforge/
173173
|-- examples/
174-
| |-- sample-dossier.md
174+
| |-- sample-blueprint.md
175175
| `-- briefs/
176176
|-- tests/
177177
|-- CHANGELOG.md
178178
|-- RELEASE_CHECKLIST.md
179179
`-- README.md
180180
```
181181

182-
`outputs/` is generated locally at runtime and is intentionally kept out of version control. The committed public sample dossier lives at `examples/sample-dossier.md`.
182+
`outputs/` is generated locally at runtime and is intentionally kept out of version control. The committed public sample blueprint lives at `examples/sample-blueprint.md`.
183183

184184
## Release And Security
185185

@@ -192,12 +192,12 @@ caseforge-studio/
192192

193193
- The server is local-first and single-tenant.
194194
- There is no built-in authentication or multi-user access control.
195-
- The OpenAI overlay path should be demonstrated only with deliberate credential handling.
195+
- The OpenAI overlay path should be used only with deliberate credential handling.
196196
- The default runtime is still a local stdlib HTTP server, not a multi-tenant hosted deployment stack.
197197

198198
## Next Steps
199199

200200
- Add a clean deployment wrapper around the local server path
201-
- Capture one intentional live-provider demo artifact
201+
- Capture one intentional live-provider blueprint artifact
202202
- Add stronger browser-level regression coverage
203-
- Promote the best saved dossier flow into a tighter public release
203+
- Promote the best saved blueprint flow into a tighter public release

RELEASE_CHECKLIST.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,44 @@
11
# Release Checklist
22

3-
Use this before calling a CaseForge Studio version ready to demo or share.
3+
Use this before calling a CaseForge Studio version ready to use or share.
44

55
## Product
66

77
- The web app loads without console-breaking behavior.
8-
- `POST /api/dossiers` works and persists a dossier.
8+
- `POST /api/dossiers` works and persists a blueprint artifact.
99
- `POST /api/dossiers/preview` works without persistence.
1010
- `GET /api/dossiers` returns recent saved runs.
1111
- `GET /api/dossiers/compare` compares two saved runs.
12-
- `GET /api/dossiers/<slug>` returns a loadable dossier payload.
12+
- `GET /api/dossiers/<slug>` returns a loadable blueprint payload.
1313
- If `provider=openai` is requested without credentials, the app falls back cleanly.
1414
- If OpenAI credentials are configured, the live overlay path is explicitly tested.
15-
- If a public sample dossier is included, `examples/sample-dossier.md` is current and readable.
15+
- If a public sample blueprint is included, `examples/sample-blueprint.md` is current and readable.
1616

1717
## Verification
1818

1919
- Run `python -m unittest discover -s tests -v`
2020
- Smoke-test `GET /health`
2121
- Smoke-test `GET /`
22-
- Generate one dossier from the CLI
23-
- Generate one dossier from the UI
22+
- Generate one blueprint from the CLI
23+
- Generate one blueprint from the UI
2424

2525
## Documentation
2626

2727
- `README.md` reflects the current commands and endpoints.
2828
- `CHANGELOG.md` reflects completed unreleased work.
29-
- If a curated sample dossier is included for public demo, it is current and sanitized.
29+
- If a curated sample blueprint is included for public sharing, it is current and sanitized.
3030
- Any new behavior is described briefly and concretely.
3131

32-
## Interview Readiness
32+
## Industry Readiness
3333

34-
- The deterministic fallback story is still true.
35-
- The live product path is easy to explain in under two minutes.
34+
- The deterministic fallback and local-first story are still true.
35+
- The live product path is easy to explain in a quick handoff.
3636
- The strongest tradeoff is explicit.
3737
- The sample prompt and sample output both feel intentional.
3838

3939
## Cleanup
4040

41-
- Remove throwaway outputs that do not support the demo story.
42-
- Keep one strong sample dossier.
41+
- Remove throwaway outputs that do not support the current release story.
42+
- Keep one strong sample blueprint.
4343
- Do not leave stale claims about endpoints or features in docs or generated artifacts.
4444
- Confirm `.github/workflows/ci.yml` and `.github/workflows/release.yml` still match the packaging story.

SECURITY.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Scope
44

5-
CaseForge Studio is currently a local-first, single-tenant application. It is designed for workstation demos, product iteration, and portfolio presentation, not for untrusted multi-tenant deployment in its current form.
5+
CaseForge Studio is currently a local-first, single-tenant application. It is designed for local validation, product iteration, and technical review, not for untrusted multi-tenant deployment in its current form.
66

77
## Supported Surface
88

@@ -13,8 +13,8 @@ CaseForge Studio is currently a local-first, single-tenant application. It is de
1313
## Security Expectations
1414

1515
- Do not commit API keys, tokens, or `.env` files.
16-
- Treat persisted dossier content as local project data unless you intentionally sanitize it for sharing.
17-
- Use the deterministic provider path by default when recording demos or testing on untrusted environments.
16+
- Treat persisted blueprint content as local project data unless you intentionally sanitize it for sharing.
17+
- Use the deterministic provider path by default when capturing walkthroughs or testing on untrusted environments.
1818
- Do not expose the local server directly to the public internet without adding authentication, reverse-proxy controls, and deployment hardening.
1919

2020
## Reporting

caseforge/cli.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,41 +12,41 @@
1212
def build_parser() -> argparse.ArgumentParser:
1313
parser = argparse.ArgumentParser(
1414
prog="caseforge",
15-
description="Generate interview-ready project dossiers from rough ideas.",
15+
description="Generate implementation-ready project blueprints from rough ideas.",
1616
)
1717
subparsers = parser.add_subparsers(dest="command", required=True)
1818

19-
create_parser = subparsers.add_parser("create", help="generate a dossier from a brief")
19+
create_parser = subparsers.add_parser("create", help="generate a project blueprint from a brief")
2020
create_parser.add_argument("brief", nargs="?", help="raw project brief text")
2121
create_parser.add_argument("--brief-file", help="path to a markdown or text brief")
2222
create_parser.add_argument("--title")
23-
create_parser.add_argument("--audience", default="Hiring manager")
23+
create_parser.add_argument("--audience", default="Technical stakeholders")
2424
create_parser.add_argument("--mode", default="AI assistant")
25-
create_parser.add_argument("--goal", default="Show systems thinking")
25+
create_parser.add_argument("--goal", default="Drive implementation clarity")
2626
create_parser.add_argument(
2727
"--preset",
2828
default="general",
2929
choices=["general", "product", "ml", "full-stack", "founder"],
30-
help="evaluation preset for the dossier",
30+
help="evaluation preset for the generated blueprint",
3131
)
3232
create_parser.add_argument(
3333
"--provider",
3434
default="deterministic",
3535
choices=["deterministic", "openai"],
36-
help="generation provider; deterministic is the default safe demo path",
36+
help="generation provider; deterministic is the default safe local path",
3737
)
3838
create_parser.add_argument("--provider-model", help="optional live provider model override")
39-
create_parser.add_argument("--preview", action="store_true", help="generate a dossier without saving it")
39+
create_parser.add_argument("--preview", action="store_true", help="generate a blueprint without saving it")
4040
create_parser.add_argument("--json", action="store_true", help="print the public JSON payload")
4141

4242
serve_parser = subparsers.add_parser("serve", help="run the local web app")
4343
serve_parser.add_argument("--host", default="127.0.0.1")
4444
serve_parser.add_argument("--port", type=int, default=8127)
4545

46-
show_parser = subparsers.add_parser("show", help="show a persisted dossier record by slug")
46+
show_parser = subparsers.add_parser("show", help="open a persisted blueprint record by slug")
4747
show_parser.add_argument("slug")
4848

49-
list_parser = subparsers.add_parser("list", help="list recent dossiers")
49+
list_parser = subparsers.add_parser("list", help="list recent blueprints")
5050
list_parser.add_argument("--limit", type=int, default=10)
5151

5252
return parser
@@ -100,7 +100,7 @@ def main(argv: list[str] | None = None) -> int:
100100
if args.command == "list":
101101
records = service.list_records(limit=args.limit)
102102
if not records:
103-
print("No dossiers found.")
103+
print("No blueprints found.")
104104
return 0
105105
for record in records:
106106
print(f"{record['slug']}\t{record['title']}\t{record['score']}")

caseforge/markdown.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,15 @@ def render_markdown(
8282
"### Mitigations",
8383
*[f"- {item}" for item in evaluator.mitigations],
8484
"",
85-
"## Interview Pitch",
85+
"## Execution Briefing",
8686
storyteller.elevator_pitch,
8787
"",
88-
f"Hook: {storyteller.interviewer_hook}",
88+
f"Delivery hook: {storyteller.delivery_hook}",
8989
"",
90-
"### Demo Script",
90+
"### Execution Walkthrough",
9191
*[f"- {item}" for item in storyteller.demo_script],
9292
"",
93-
"### Talking Points",
93+
"### Key Points",
9494
*[f"- {item}" for item in storyteller.talking_points],
9595
"",
9696
]

caseforge/models.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
class ProjectBrief:
1010
brief: str
1111
title: str | None = None
12-
audience: str = "interview"
12+
audience: str = "Technical stakeholders"
1313
mode: str = "AI assistant"
14-
goal: str = "Show systems thinking"
14+
goal: str = "Drive implementation clarity"
1515
preset: str = "general"
1616
provider: str = "deterministic"
1717
provider_model: str | None = None
@@ -51,7 +51,7 @@ class EvaluatorResult:
5151
@dataclass(frozen=True, slots=True)
5252
class StorytellerResult:
5353
elevator_pitch: str
54-
interviewer_hook: str
54+
delivery_hook: str
5555
demo_script: tuple[str, ...]
5656
talking_points: tuple[str, ...]
5757

@@ -161,10 +161,10 @@ def sections(self) -> tuple[DossierSection, ...]:
161161
),
162162
DossierSection(
163163
label="Audience",
164-
title="Who the demo is aimed at",
164+
title="Who this blueprint is aimed at",
165165
body=(
166-
f"The dossier is optimized for {self.brief.audience.lower()} review and tuned to "
167-
f"show {self.brief.goal.lower()} through a {self.brief.mode.lower()} lens."
166+
f"The blueprint is optimized for {self.brief.audience.lower()} alignment, uses "
167+
f"{self.brief.mode.lower()} framing, and is designed to {self.brief.goal.lower()}."
168168
),
169169
),
170170
DossierSection(
@@ -186,9 +186,9 @@ def sections(self) -> tuple[DossierSection, ...]:
186186
),
187187
),
188188
DossierSection(
189-
label="Interview story",
190-
title="How to present it",
191-
body=self.storyteller.interviewer_hook,
189+
label="Delivery story",
190+
title="How to move it toward implementation",
191+
body=self.storyteller.delivery_hook,
192192
),
193193
)
194194

0 commit comments

Comments
 (0)