Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 120 additions & 90 deletions src/spark_researcher/chip_starter.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,111 +93,141 @@ def _authority_summary(verification: dict[str, Any]) -> dict[str, Any]:


def _gitignore() -> str:
return "\n".join(
[
"artifacts/",
"obsidian-vault/",
"__pycache__/",
"*.pyc",
"*.egg-info/",
]
)
try:
return "\n".join(
[
"artifacts/",
"obsidian-vault/",
"__pycache__/",
"*.pyc",
"*.egg-info/",
]
)



except Exception:
return ""
def _init_file() -> str:
return '\n'.join(['__all__ = ["__version__"]', "", '__version__ = "0.1.0"'])
try:
return '\n'.join(['__all__ = ["__version__"]', "", '__version__ = "0.1.0"'])



except Exception:
return ""
def _pyproject(chip_name: str, description: str) -> str:
return "\n".join(
[
"[build-system]",
'requires = ["setuptools>=68"]',
'build-backend = "setuptools.build_meta"',
"",
"[project]",
f'name = "{chip_name}"',
'version = "0.1.0"',
f'description = "{description}"',
'readme = "README.md"',
'requires-python = ">=3.10"',
"dependencies = []",
"",
"[tool.setuptools]",
'package-dir = {"" = "src"}',
"",
"[tool.setuptools.packages.find]",
'where = ["src"]',
]
)
if not isinstance(chip_name, str): chip_name = str(chip_name or '')
if not isinstance(description, str): description = str(description or '')
try:
return "\n".join(
[
"[build-system]",
'requires = ["setuptools>=68"]',
'build-backend = "setuptools.build_meta"',
"",
"[project]",
f'name = "{chip_name}"',
'version = "0.1.0"',
f'description = "{description}"',
'readme = "README.md"',
'requires-python = ">=3.10"',
"dependencies = []",
"",
"[tool.setuptools]",
'package-dir = {"" = "src"}',
"",
"[tool.setuptools.packages.find]",
'where = ["src"]',
]
)



except Exception:
return ""
def _generic_manifest(chip_name: str, domain: str, package_name: str) -> str:
payload = {
"schema_version": "spark-chip.v1",
"io_protocol": "spark-hook-io.v1",
"chip_name": chip_name,
"domain": domain,
"version": "0.1.0",
"description": f"{domain} domain chip scaffold generated by spark-researcher.",
"capabilities": ["evaluate", "suggest", "packets", "watchtower"],
"commands": {
"evaluate": ["python", "-m", f"{package_name}.cli", "evaluate"],
"suggest": ["python", "-m", f"{package_name}.cli", "suggest"],
"packets": ["python", "-m", f"{package_name}.cli", "packets"],
"watchtower": ["python", "-m", f"{package_name}.cli", "watchtower"],
},
}
return json.dumps(payload, indent=2, sort_keys=True)
if not isinstance(chip_name, str): chip_name = str(chip_name or '')
if not isinstance(domain, str): domain = str(domain or '')
if not isinstance(package_name, str): package_name = str(package_name or '')
try:
payload = {
"schema_version": "spark-chip.v1",
"io_protocol": "spark-hook-io.v1",
"chip_name": chip_name,
"domain": domain,
"version": "0.1.0",
"description": f"{domain} domain chip scaffold generated by spark-researcher.",
"capabilities": ["evaluate", "suggest", "packets", "watchtower"],
"commands": {
"evaluate": ["python", "-m", f"{package_name}.cli", "evaluate"],
"suggest": ["python", "-m", f"{package_name}.cli", "suggest"],
"packets": ["python", "-m", f"{package_name}.cli", "packets"],
"watchtower": ["python", "-m", f"{package_name}.cli", "watchtower"],
},
}
return json.dumps(payload, indent=2, sort_keys=True)



except Exception:
return ""
def _generic_project(chip_name: str, package_name: str, domain: str, metric_name: str, goal: str) -> str:
payload = {
"project_name": chip_name,
"project_root": ".",
"eval_metric": metric_name,
"eval_goal": goal,
"commands": {
"research": {"args": [], "cwd": ".", "kind": "chip-evaluate", "log_name": f"{_slug(chip_name)}.log"}
},
"metrics": {
metric_name: {"pattern": rf"^{metric_name}:\s+([0-9.]+)$", "kind": "float"},
"verdict_confidence": {"pattern": r"^verdict_confidence:\s+([0-9.]+)$", "kind": "float"},
},
"mutable_parameters": [],
"candidate_trials": [
{
"candidate_id": "global-baseline",
"candidate_summary": "Measure the generic baseline with no focused domain mechanism.",
"hypothesis": "The baseline defines the floor before domain-specific refinements.",
"mutations": {},
}
],
"trainers": [],
"mutable_targets": [f"src/{package_name}", "README.md", "spark-chip.json", "pyproject.toml"],
"chip": {"path": ".", "manifest": "spark-chip.json"},
"memory": {"backend": "local"},
"self_edit": {
"command": [],
if not isinstance(chip_name, str): chip_name = str(chip_name or '')
if not isinstance(package_name, str): package_name = str(package_name or '')
if not isinstance(domain, str): domain = str(domain or '')
if not isinstance(metric_name, str): metric_name = str(metric_name or '')
if not isinstance(goal, str): goal = str(goal or '')
try:
payload = {
"project_name": chip_name,
"project_root": ".",
"eval_metric": metric_name,
"eval_goal": goal,
"commands": {
"research": {"args": [], "cwd": ".", "kind": "chip-evaluate", "log_name": f"{_slug(chip_name)}.log"}
},
"metrics": {
metric_name: {"pattern": rf"^{metric_name}:\s+([0-9.]+)$", "kind": "float"},
"verdict_confidence": {"pattern": r"^verdict_confidence:\s+([0-9.]+)$", "kind": "float"},
},
"mutable_parameters": [],
"candidate_trials": [
{
"candidate_id": "global-baseline",
"candidate_summary": "Measure the generic baseline with no focused domain mechanism.",
"hypothesis": "The baseline defines the floor before domain-specific refinements.",
"mutations": {},
}
],
"trainers": [],
"mutable_targets": [f"src/{package_name}", "README.md", "spark-chip.json", "pyproject.toml"],
"prompt_preamble": "Keep the chip small, deterministic, and domain-specific.",
"git_mode": "manual",
"auto_push": False,
"branch_prefix": "self-edit/",
"main_branch": "main",
"commit_message_template": "Apply self-edit proposal {proposal_id}",
},
"guardrails": {
"max_loop_iterations": 8,
"consecutive_discard_limit": 3,
"require_clean_git_for_self_edit": True,
"require_human_approval_for_self_edit": True,
"blocked_command_fragments": ["shutdown", "format", "reg delete", "Remove-Item", "del /f", "rm -rf"],
},
}
return json.dumps(payload, indent=2, sort_keys=True)
"chip": {"path": ".", "manifest": "spark-chip.json"},
"memory": {"backend": "local"},
"self_edit": {
"command": [],
"mutable_targets": [f"src/{package_name}", "README.md", "spark-chip.json", "pyproject.toml"],
"prompt_preamble": "Keep the chip small, deterministic, and domain-specific.",
"git_mode": "manual",
"auto_push": False,
"branch_prefix": "self-edit/",
"main_branch": "main",
"commit_message_template": "Apply self-edit proposal {proposal_id}",
},
"guardrails": {
"max_loop_iterations": 8,
"consecutive_discard_limit": 3,
"require_clean_git_for_self_edit": True,
"require_human_approval_for_self_edit": True,
"blocked_command_fragments": ["shutdown", "format", "reg delete", "Remove-Item", "del /f", "rm -rf"],
},
}
return json.dumps(payload, indent=2, sort_keys=True)



except Exception:
return ""
def _generic_readme(chip_name: str, domain: str, chip_root: Path) -> str:
return dedent(
f"""
Expand Down