357 lines
11 KiB
Plaintext
357 lines
11 KiB
Plaintext
# Language Self-Improvement
|
||
# Analyzes .prose usage patterns to evolve the language itself
|
||
# Meta-level 2: while the crystallizer creates .prose files, this improves .prose
|
||
#
|
||
# BACKEND: Run with sqlite+ or postgres backend for corpus-scale analysis
|
||
# prose run 47-language-self-improvement.prose --backend sqlite+
|
||
#
|
||
# This program treats OpenProse programs as its corpus, looking for:
|
||
# - Workarounds (patterns that exist because the language lacks a cleaner way)
|
||
# - Friction (places where authors struggle or make errors)
|
||
# - Gaps (things people want to express but cannot)
|
||
|
||
input corpus_path: "Path to .prose files to analyze (default: examples/)"
|
||
input conversations: "Optional: conversation threads where people struggled with the language"
|
||
input focus: "Optional: specific area to focus on (e.g., 'error handling', 'parallelism')"
|
||
|
||
# ============================================================
|
||
# Agents
|
||
# ============================================================
|
||
|
||
agent archaeologist:
|
||
model: opus
|
||
prompt: """
|
||
You excavate patterns from code corpora.
|
||
Look for: repeated idioms, workarounds, boilerplate that could be abstracted.
|
||
Report patterns with frequency counts and concrete examples.
|
||
Distinguish between intentional patterns and compensating workarounds.
|
||
"""
|
||
permissions:
|
||
read: ["**/*.prose", "**/*.md"]
|
||
|
||
agent clinician:
|
||
model: opus
|
||
prompt: """
|
||
You diagnose pain points from conversations and code.
|
||
Look for: confusion, errors, questions that shouldn't need asking.
|
||
Identify gaps between what people want to express and what they can express.
|
||
Be specific about the symptom and hypothesize the underlying cause.
|
||
"""
|
||
permissions:
|
||
read: ["**/*.prose", "**/*.md", "**/*.jsonl"]
|
||
|
||
agent architect:
|
||
model: opus
|
||
persist: true
|
||
prompt: """
|
||
You design language features with these principles:
|
||
1. Self-evidence: syntax should be readable without documentation
|
||
2. Composability: features should combine without special cases
|
||
3. Minimalism: no feature without clear, repeated need
|
||
4. Consistency: follow existing patterns unless there's strong reason not to
|
||
|
||
For each proposal, specify: syntax, semantics, interaction with existing features.
|
||
"""
|
||
|
||
agent spec_writer:
|
||
model: opus
|
||
prompt: """
|
||
You write precise language specifications.
|
||
Follow the style of compiler.md: grammar rules, semantic descriptions, examples.
|
||
Be rigorous but readable. Include edge cases.
|
||
"""
|
||
permissions:
|
||
read: ["**/*.md"]
|
||
write: ["**/*.md"]
|
||
|
||
agent guardian:
|
||
model: sonnet
|
||
prompt: """
|
||
You assess backwards compatibility and risk.
|
||
|
||
Breaking levels:
|
||
0 - Fully compatible, new syntax only
|
||
1 - Soft deprecation, old syntax still works
|
||
2 - Hard deprecation, migration required
|
||
3 - Breaking change, existing programs may fail
|
||
|
||
Also assess: complexity cost, interaction risks, implementation effort.
|
||
"""
|
||
|
||
agent test_smith:
|
||
model: sonnet
|
||
prompt: """
|
||
You create test .prose files that exercise proposed features.
|
||
Include: happy path, edge cases, error conditions, interaction with existing features.
|
||
Tests should be runnable and self-documenting.
|
||
"""
|
||
permissions:
|
||
write: ["**/*.prose"]
|
||
|
||
# ============================================================
|
||
# Phase 1: Corpus Excavation
|
||
# ============================================================
|
||
|
||
parallel:
|
||
patterns = session: archaeologist
|
||
prompt: """
|
||
Analyze the .prose corpus for recurring patterns.
|
||
|
||
For each pattern found, report:
|
||
- Pattern name and description
|
||
- Frequency (how many files use it)
|
||
- Representative examples (quote actual code)
|
||
- Is this intentional idiom or compensating workaround?
|
||
|
||
Focus on patterns that appear 3+ times.
|
||
"""
|
||
context: corpus_path
|
||
|
||
pain_points = session: clinician
|
||
prompt: """
|
||
Analyze conversations and code for pain points.
|
||
|
||
Look for:
|
||
- Syntax errors that recur (what do people get wrong?)
|
||
- Questions about "how do I...?" (what's not obvious?)
|
||
- Workarounds or hacks (what's the language missing?)
|
||
- Frustrated comments or abandoned attempts
|
||
|
||
For each pain point, hypothesize what language change would help.
|
||
"""
|
||
context: { corpus_path, conversations }
|
||
|
||
current_spec = session: archaeologist
|
||
prompt: """
|
||
Summarize the current language capabilities from the spec.
|
||
|
||
List: all keywords, all constructs, all patterns explicitly supported.
|
||
Note any areas marked as "experimental" or "future".
|
||
Identify any inconsistencies or gaps in the spec itself.
|
||
"""
|
||
context: "compiler.md, prose.md"
|
||
|
||
# ============================================================
|
||
# Phase 2: Pattern Synthesis
|
||
# ============================================================
|
||
|
||
let synthesis = session: architect
|
||
prompt: """
|
||
Synthesize the excavation findings into a ranked list of potential improvements.
|
||
|
||
Categories:
|
||
1. ADDITIONS - new syntax/semantics the language lacks
|
||
2. REFINEMENTS - existing features that could be cleaner
|
||
3. CLARIFICATIONS - spec ambiguities that need resolution
|
||
4. DEPRECATIONS - features that add complexity without value
|
||
|
||
For each item:
|
||
- Problem statement (what pain does this solve?)
|
||
- Evidence (which patterns/pain points support this?)
|
||
- Rough sketch of solution
|
||
- Priority (critical / high / medium / low)
|
||
|
||
Rank by: (frequency of need) × (severity of pain) / (implementation complexity)
|
||
"""
|
||
context: { patterns, pain_points, current_spec, focus }
|
||
|
||
# ============================================================
|
||
# Phase 3: Proposal Generation
|
||
# ============================================================
|
||
|
||
let top_candidates = session: architect
|
||
prompt: """
|
||
Select the top 3-5 candidates from the synthesis.
|
||
|
||
For each, produce a detailed proposal:
|
||
|
||
## Feature: [name]
|
||
|
||
### Problem
|
||
[What pain point does this solve? Include evidence.]
|
||
|
||
### Proposed Syntax
|
||
```prose
|
||
[Show the new syntax]
|
||
```
|
||
|
||
### Semantics
|
||
[Precisely describe what it means]
|
||
|
||
### Before/After
|
||
[Show how existing workarounds become cleaner]
|
||
|
||
### Interactions
|
||
[How does this interact with existing features?]
|
||
|
||
### Open Questions
|
||
[What needs further thought?]
|
||
"""
|
||
context: synthesis
|
||
|
||
# ============================================================
|
||
# Phase 4: User Checkpoint
|
||
# ============================================================
|
||
|
||
input user_review: """
|
||
## Proposed Language Improvements
|
||
|
||
{top_candidates}
|
||
|
||
---
|
||
|
||
For each proposal, indicate:
|
||
- PURSUE: Develop full spec and tests
|
||
- REFINE: Good direction but needs changes (explain)
|
||
- DEFER: Valid but not now
|
||
- REJECT: Don't want this (explain why)
|
||
|
||
You can also suggest entirely different directions.
|
||
"""
|
||
|
||
let approved = session: architect
|
||
prompt: """
|
||
Incorporate user feedback into final proposal set.
|
||
|
||
For PURSUE items: proceed as-is
|
||
For REFINE items: adjust based on feedback
|
||
For DEFER/REJECT items: note the reasoning for future reference
|
||
|
||
Output the final list of proposals to develop.
|
||
"""
|
||
context: { top_candidates, user_review }
|
||
|
||
if **there are no approved proposals**:
|
||
output result = {
|
||
status: "no-changes",
|
||
synthesis: synthesis,
|
||
proposals: top_candidates,
|
||
user_decision: user_review
|
||
}
|
||
throw "No proposals approved - halting gracefully"
|
||
|
||
# ============================================================
|
||
# Phase 5: Spec Drafting
|
||
# ============================================================
|
||
|
||
let spec_patches = approved | map:
|
||
session: spec_writer
|
||
prompt: """
|
||
Write the specification addition for this proposal.
|
||
|
||
Follow compiler.md style:
|
||
- Grammar rule (in the existing notation)
|
||
- Semantic description
|
||
- Examples
|
||
- Edge cases
|
||
- Error conditions
|
||
|
||
Output as a diff/patch that could be applied to compiler.md
|
||
"""
|
||
context: { item, current_spec }
|
||
|
||
# ============================================================
|
||
# Phase 6: Test Case Creation
|
||
# ============================================================
|
||
|
||
let test_files = approved | pmap:
|
||
session: test_smith
|
||
prompt: """
|
||
Create test .prose files for this proposal.
|
||
|
||
Include:
|
||
1. Basic usage (happy path)
|
||
2. Edge cases
|
||
3. Error conditions (should fail gracefully)
|
||
4. Interaction with existing features
|
||
|
||
Each test should be a complete, runnable .prose file.
|
||
Name format: test-{feature-name}-{N}.prose
|
||
"""
|
||
context: item
|
||
|
||
# ============================================================
|
||
# Phase 7: Risk Assessment
|
||
# ============================================================
|
||
|
||
let risks = session: guardian
|
||
prompt: """
|
||
Assess the full proposal set for risks.
|
||
|
||
For each proposal:
|
||
- Breaking level (0-3)
|
||
- Complexity cost (how much does this add to the language?)
|
||
- Interaction risks (could this combine badly with existing features?)
|
||
- Implementation effort (VM changes, spec changes, tooling)
|
||
|
||
Also assess aggregate risk:
|
||
- Are we adding too much at once?
|
||
- Is there a coherent theme or is this feature creep?
|
||
- What's the total complexity budget impact?
|
||
|
||
Recommend: PROCEED / REDUCE SCOPE / PHASE INCREMENTALLY / HALT
|
||
"""
|
||
context: { approved, spec_patches, current_spec }
|
||
|
||
if **the guardian recommends halting**:
|
||
input override: """
|
||
Guardian recommends halting:
|
||
{risks}
|
||
|
||
Override and proceed anyway? (yes/no/reduce scope)
|
||
"""
|
||
|
||
if **the user declined to override**:
|
||
output result = {
|
||
status: "halted-by-guardian",
|
||
proposals: approved,
|
||
risks: risks
|
||
}
|
||
throw "Halted by guardian recommendation"
|
||
|
||
# ============================================================
|
||
# Phase 8: Migration Guide
|
||
# ============================================================
|
||
|
||
let migration = session: spec_writer
|
||
prompt: """
|
||
Write a migration guide for existing .prose programs.
|
||
|
||
For each proposal:
|
||
- What existing code is affected?
|
||
- Before/after examples
|
||
- Deprecation timeline (if any)
|
||
- Automated migration possible?
|
||
|
||
Also:
|
||
- Version number recommendation (major/minor/patch)
|
||
- Release notes draft
|
||
"""
|
||
context: { approved, risks, corpus_path }
|
||
|
||
# ============================================================
|
||
# Output
|
||
# ============================================================
|
||
|
||
output evolution = {
|
||
status: "proposals-ready",
|
||
|
||
# What we found
|
||
patterns: patterns,
|
||
pain_points: pain_points,
|
||
synthesis: synthesis,
|
||
|
||
# What we propose
|
||
proposals: approved,
|
||
spec_patches: spec_patches,
|
||
test_files: test_files,
|
||
|
||
# Risk and migration
|
||
risks: risks,
|
||
migration: migration,
|
||
|
||
# Meta
|
||
corpus_analyzed: corpus_path,
|
||
focus_area: focus
|
||
}
|