Track 2.0 reference extension gaps
This commit is contained in:
@@ -86,6 +86,30 @@ def build_item(
|
||||
}
|
||||
|
||||
|
||||
def build_extension_track(
|
||||
*,
|
||||
key: str,
|
||||
label: str,
|
||||
status: str,
|
||||
objective: str,
|
||||
current: str,
|
||||
target: str,
|
||||
artifact_paths: list[str],
|
||||
next_action: str,
|
||||
skill_dir: Path,
|
||||
) -> dict[str, Any]:
|
||||
return {
|
||||
"key": key,
|
||||
"label": label,
|
||||
"status": status,
|
||||
"objective": objective,
|
||||
"current": current,
|
||||
"target": target,
|
||||
"evidence": evidence(skill_dir, artifact_paths),
|
||||
"next_action": next_action,
|
||||
}
|
||||
|
||||
|
||||
def summary_value(payload: dict[str, Any], key: str, default: Any = 0) -> Any:
|
||||
summary = payload.get("summary", {})
|
||||
return summary.get(key, default) if isinstance(summary, dict) else default
|
||||
@@ -273,6 +297,51 @@ def build_coverage(skill_dir: Path, generated_at: str) -> dict[str, Any]:
|
||||
for key, path_a, path_b, path_c, condition, current in recommended_prs
|
||||
]
|
||||
|
||||
extension_tracks = [
|
||||
build_extension_track(
|
||||
key="skill-interpretation-report",
|
||||
label="Skill Interpretation Report",
|
||||
status="partial",
|
||||
objective="User-facing deep interpretation report explains use cases, triggers, inputs, outputs, workflow, principles, boundaries, quality gates, examples, and next iterations.",
|
||||
current="Skill Overview v2 already covers much of the explainer experience, but dedicated skill-interpretation JSON/MD/HTML artifacts are not first-class yet.",
|
||||
target="Either keep skill-overview as the canonical interpretation report with an explicit contract, or split a dedicated reports/skill-interpretation.* renderer and tests.",
|
||||
artifact_paths=[
|
||||
"reports/skill-overview.html",
|
||||
"reports/skill-overview.json",
|
||||
"scripts/render_skill_overview.py",
|
||||
"scripts/render_skill_interpretation.py",
|
||||
"schemas/skill-interpretation.schema.json",
|
||||
"tests/verify_skill_interpretation.py",
|
||||
],
|
||||
next_action="Decide whether overview v2 is the canonical interpretation surface; if not, add a dedicated schema, renderer, and CJK/path-safety tests.",
|
||||
skill_dir=skill_dir,
|
||||
),
|
||||
build_extension_track(
|
||||
key="adaptive-self-iteration",
|
||||
label="Adaptive Self-Iteration",
|
||||
status="planned",
|
||||
objective="Local-first preference memory, repeated-signal extraction, adaptation proposals, approval, patch application, regression evidence, and rollback.",
|
||||
current="The repo has feedback, iteration, telemetry, and review artifacts, but no adapt-scan/adapt-propose/adapt-apply approval loop and no user-memory policy.",
|
||||
target="Proposal-only adaptation with explicit input source, redaction, allowlisted write targets, approval ledger, regression report, and rollback plan.",
|
||||
artifact_paths=[
|
||||
"references/autonomous-adaptation.md",
|
||||
"references/user-memory-policy.md",
|
||||
"schemas/adaptation-proposal.schema.json",
|
||||
"scripts/summarize_user_signals.py",
|
||||
"scripts/propose_adaptation.py",
|
||||
"scripts/apply_adaptation.py",
|
||||
"tests/verify_adaptation_safety.py",
|
||||
"reports/iteration-directions.md",
|
||||
"reports/adoption_drift_report.md",
|
||||
],
|
||||
next_action="Start with policy and read-only scan tests; do not read shell history or private logs unless the user provides an explicit source path.",
|
||||
skill_dir=skill_dir,
|
||||
),
|
||||
]
|
||||
extension_counts: dict[str, int] = {}
|
||||
for item in extension_tracks:
|
||||
extension_counts[item["status"]] = extension_counts.get(item["status"], 0) + 1
|
||||
|
||||
items = modules + pr_items
|
||||
counts: dict[str, int] = {"pass": 0, "warn": 0, "missing": 0}
|
||||
for item in items:
|
||||
@@ -287,6 +356,11 @@ def build_coverage(skill_dir: Path, generated_at: str) -> dict[str, Any]:
|
||||
"pass_count": counts.get("pass", 0),
|
||||
"warn_count": counts.get("warn", 0),
|
||||
"missing_count": counts.get("missing", 0),
|
||||
"extension_track_count": len(extension_tracks),
|
||||
"extension_partial_count": extension_counts.get("partial", 0),
|
||||
"extension_planned_count": extension_counts.get("planned", 0),
|
||||
"extension_covered_count": extension_counts.get("covered", 0),
|
||||
"adaptive_extension_ready": extension_counts.get("planned", 0) == 0,
|
||||
"local_blueprint_ready": local_ready,
|
||||
"public_world_class_ready": public_ready,
|
||||
"world_class_evidence_pending_count": pending_world_class,
|
||||
@@ -299,16 +373,25 @@ def build_coverage(skill_dir: Path, generated_at: str) -> dict[str, Any]:
|
||||
"skill_dir": rel_path(skill_dir, ROOT),
|
||||
"summary": summary,
|
||||
"status_counts": counts,
|
||||
"extension_status_counts": extension_counts,
|
||||
"modules": modules,
|
||||
"recommended_prs": pr_items,
|
||||
"reference_extension_tracks": extension_tracks,
|
||||
"next_highest_leverage": [
|
||||
"Close the four world-class evidence ledger entries with accepted human or external evidence.",
|
||||
"Clarify whether Skill Overview v2 is the canonical interpretation report or split a dedicated skill-interpretation renderer.",
|
||||
"Start adaptive self-iteration as explicit-source, proposal-only, approval-gated work; do not scan private logs by default.",
|
||||
"Keep the blueprint coverage report in CI so 2.0 plan drift is visible.",
|
||||
],
|
||||
"source_blueprint": {
|
||||
"title": "Skill Overview / Skill OS 2.0 upgrade plan",
|
||||
"core_module_count": 8,
|
||||
"recommended_pr_count": 12,
|
||||
"reference_extension_count": len(extension_tracks),
|
||||
"reference_extensions": [
|
||||
"Skill interpretation report",
|
||||
"Adaptive self-iteration with local preference memory and approval gates",
|
||||
],
|
||||
},
|
||||
"artifacts": {
|
||||
"json": "reports/skill_os2_coverage.json",
|
||||
@@ -351,6 +434,10 @@ def render_markdown(report: dict[str, Any]) -> str:
|
||||
f"- pass: `{summary['pass_count']}` / `{summary['item_count']}`",
|
||||
f"- missing: `{summary['missing_count']}`",
|
||||
f"- warn: `{summary['warn_count']}`",
|
||||
f"- reference extensions: `{summary['extension_track_count']}`",
|
||||
f"- extension partial: `{summary['extension_partial_count']}`",
|
||||
f"- extension planned: `{summary['extension_planned_count']}`",
|
||||
f"- adaptive extension ready: `{str(summary['adaptive_extension_ready']).lower()}`",
|
||||
f"- world-class evidence pending: `{summary['world_class_evidence_pending_count']}`",
|
||||
"",
|
||||
"This report maps the Skill OS 2.0 upgrade blueprint to concrete local artifacts, commands, and tests. It does not count pending human review, provider runs, metadata fallbacks, or planned work as public world-class evidence.",
|
||||
@@ -363,12 +450,37 @@ def render_markdown(report: dict[str, Any]) -> str:
|
||||
"",
|
||||
*render_table(report["recommended_prs"]),
|
||||
"",
|
||||
"## Reference Extension Tracks",
|
||||
"",
|
||||
"| Track | Status | Current | Target | Next action |",
|
||||
"| --- | --- | --- | --- | --- |",
|
||||
]
|
||||
for item in report["reference_extension_tracks"]:
|
||||
lines.append(
|
||||
"| "
|
||||
+ " | ".join(
|
||||
[
|
||||
item["label"].replace("|", "\\|"),
|
||||
f"`{item['status']}`",
|
||||
item["current"].replace("|", "\\|"),
|
||||
item["target"].replace("|", "\\|"),
|
||||
item["next_action"].replace("|", "\\|"),
|
||||
]
|
||||
)
|
||||
+ " |"
|
||||
)
|
||||
lines.extend(
|
||||
[
|
||||
"",
|
||||
"These extension tracks come from the user-supplied 2.0 reference plan. They are tracked separately from the formal Skill OS blueprint so the report can distinguish landed local architecture from planned explainer/adaptor evolution.",
|
||||
"",
|
||||
"## Next Highest-Leverage Moves",
|
||||
"",
|
||||
]
|
||||
]
|
||||
)
|
||||
lines.extend(f"- {item}" for item in report["next_highest_leverage"])
|
||||
lines.extend(["", "## Evidence Detail", ""])
|
||||
for item in report["modules"] + report["recommended_prs"]:
|
||||
for item in report["modules"] + report["recommended_prs"] + report["reference_extension_tracks"]:
|
||||
existing = [entry["path"] for entry in item["evidence"] if entry["exists"]]
|
||||
missing = [entry["path"] for entry in item["evidence"] if not entry["exists"]]
|
||||
lines.append(f"### {item['label']}")
|
||||
|
||||
Reference in New Issue
Block a user