Add fi-research-brief executor for Freedom Intelligence daily rhythm.

activity-core owns schedule and spawn; rein-aharness executes the research
brief via llm-connect, commits the artifact, and posts fi_daily_brief for
fi_brief_status idempotence — same layering as brief-daily for Binky.
This commit is contained in:
tegwick 2026-08-03 17:53:06 +02:00
parent 2ab33869f8
commit 877688b2e3
2 changed files with 492 additions and 0 deletions

View file

@ -260,6 +260,35 @@ def main(argv: list[str] | None = None) -> int:
help="Write brief file but do not git commit",
)
fi_brief = sub.add_parser(
"fi-research-brief",
help=(
"Freedom Intelligence research brief via llm-connect "
"(activity-core consumer; posts fi_daily_brief)"
),
)
fi_brief.add_argument(
"--target-repo",
required=True,
help="freedom-intelligence checkout path",
)
fi_brief.add_argument(
"--date",
default=None,
help="Brief date YYYY-MM-DD (default: today Europe/Berlin)",
)
fi_brief.add_argument(
"--force",
action="store_true",
help="Overwrite if today's brief already exists",
)
fi_brief.add_argument("--no-hub", action="store_true", help="Skip hub reporting")
fi_brief.add_argument(
"--no-commit",
action="store_true",
help="Write brief file but do not git commit",
)
validate = sub.add_parser(
"validate",
help="Validate instance manifest (.kaizen/schedule.yml + harness fields)",
@ -425,6 +454,40 @@ def main(argv: list[str] | None = None) -> int:
)
return 0 if brief_result.ok else 1
if args.command == "fi-research-brief":
from datetime import date as date_cls
from rein_aharness.fi_research_brief import run_fi_research_brief
day = None
if args.date:
day = date_cls.fromisoformat(args.date)
fi_result = run_fi_research_brief(
target_repo=Path(args.target_repo).expanduser(),
day=day,
force=bool(args.force),
report_to_hub=not args.no_hub,
commit=not args.no_commit,
)
print(
json.dumps(
{
"ok": fi_result.ok,
"date": fi_result.date,
"path": fi_result.path,
"wrote": fi_result.wrote,
"committed": fi_result.committed,
"skipped_existing": fi_result.skipped_existing,
"collection_candidates": fi_result.collection_candidates,
"head_after": fi_result.head_after,
"reason": fi_result.reason,
"model_meta": fi_result.model_meta,
},
indent=2,
)
)
return 0 if fi_result.ok else 1
if args.command == "mail-scan":
from rein_aharness.mailscan import run_mail_scan