v0.3.0: Gap-to-Draft pipeline, Living Standards Observatory, blog series
Gap-to-Draft Pipeline (ietf pipeline): - Context builder assembles ideas, RFC foundations, similar drafts, ecosystem vision - Generator produces outlines + sections using rich context with Claude - Quality gates: novelty (embedding similarity), references, format, self-rating - Family coordinator generates 5-draft ecosystem (AEM/ATD/HITL/AEPB/APAE) - I-D formatter with proper headers, references, 72-char wrapping Living Standards Observatory (ietf observatory): - Source abstraction with IETF + W3C fetchers - 7-step update pipeline: snapshot, fetch, analyze, embed, ideas, gaps, record - Static GitHub Pages dashboard (explorer, gap tracker, timeline) - Weekly CI/CD automation via GitHub Actions Also includes: - 361 drafts (expanded from 260 with 6 new keywords), 403 authors, 1,262 ideas, 12 gaps - Blog series (8 posts planned), reports, arXiv paper figures - Agent team infrastructure (CLAUDE.md, scripts, dev journal) - 5 new DB tables, schema migration, ~15 new query methods Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -77,7 +77,7 @@ Abstract: {abstract}
|
||||
|
||||
{text_excerpt}
|
||||
|
||||
Return 3-8 ideas. Focus on CONCRETE technical contributions, not general statements.
|
||||
Return 0-8 ideas. Only include CONCRETE, NOVEL technical contributions — not restatements of the abstract or general goals. If the draft has no substantive technical ideas (e.g. it is a problem statement, administrative document, or off-topic), return an empty array [].
|
||||
JSON array only, no fences."""
|
||||
|
||||
BATCH_IDEAS_PROMPT = """\
|
||||
@@ -86,7 +86,7 @@ Per idea: {{"title":"short name","description":"1 sentence","type":"mechanism|pr
|
||||
|
||||
{drafts_block}
|
||||
|
||||
3-8 ideas per draft. CONCRETE technical contributions only.
|
||||
0-8 ideas per draft. Only include CONCRETE, NOVEL technical contributions. If a draft has no substantive ideas, map it to an empty array. Do not pad with restatements of the abstract.
|
||||
Return ONLY a JSON object like {{"draft-name":[...], ...}}, no fences."""
|
||||
|
||||
GAP_ANALYSIS_PROMPT = """\
|
||||
@@ -397,16 +397,16 @@ class Analyzer:
|
||||
count = 0
|
||||
for d in drafts:
|
||||
ideas = results.get(d.name, [])
|
||||
if not isinstance(ideas, list):
|
||||
ideas = [ideas] if ideas else []
|
||||
self.db.cache_response(
|
||||
d.name, _prompt_hash(f"batch-ideas-{phash}-{d.name}"),
|
||||
self.config.claude_model_cheap if cheap else self.config.claude_model,
|
||||
f"batch-ideas[{d.name}]", json.dumps(ideas),
|
||||
in_tok // len(drafts), out_tok // len(drafts),
|
||||
)
|
||||
self.db.insert_ideas(d.name, ideas)
|
||||
if ideas:
|
||||
if not isinstance(ideas, list):
|
||||
ideas = [ideas]
|
||||
self.db.cache_response(
|
||||
d.name, _prompt_hash(f"batch-ideas-{phash}-{d.name}"),
|
||||
self.config.claude_model_cheap if cheap else self.config.claude_model,
|
||||
f"batch-ideas[{d.name}]", json.dumps(ideas),
|
||||
in_tok // len(drafts), out_tok // len(drafts),
|
||||
)
|
||||
self.db.insert_ideas(d.name, ideas)
|
||||
count += 1
|
||||
return count
|
||||
except (json.JSONDecodeError, anthropic.APIError) as e:
|
||||
|
||||
Reference in New Issue
Block a user