Skip to content
Merged
Show file tree
Hide file tree
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
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ frontmatter o README manuali. Oggi consuma:
|---|---|---|
| `source-observatory` | `data/radar/radar_summary.json` | health complessivo delle fonti nel registry |
| `source-observatory` | `data/catalog/catalog_signals.json` | drift/inventory per singola fonte |
| `source-observatory` | `data/portal_scout/discovered_portals_summary.json` | nuovi portali PA scoperti da portal-scout |
| `dataset-incubator` | `registry/pipeline_signals.json` | stato operativo dei dataset candidate |
| `dataset-incubator` | `registry/clean_catalog.json` | dataset clean/queryable disponibili |

Expand Down
6 changes: 2 additions & 4 deletions schemas/workspace_triage.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ Contiene stato incrociato di PR, issue, discussion, git e segnali operativi.
"radar": { "generated_at": "...", "green": 20, "yellow": 2, "red": 0, "unhealthy": [] },
"source_health": { "captured_at": "...", "alerts": [] },
"pipeline_state": { "generated_at": "...", "actionable": [] },
"dataset_catalog": { "schema_version": "1", "updated_at": "...", "clean_ready": [] },
"portal_scout": { "generated_at": "...", "new_candidates": 0, "new_structured": [] }
"dataset_catalog": { "schema_version": "1", "updated_at": "...", "clean_ready": [] }
}
```

Expand All @@ -66,7 +65,6 @@ Contiene stato incrociato di PR, issue, discussion, git e segnali operativi.
| `source_health` | object \| null | Segnali drift/inventory da `catalog_signals.json` |
| `pipeline_state` | object \| null | Stato candidati da `pipeline_signals.json` |
| `dataset_catalog` | object \| null | Dataset clean-ready da `clean_catalog.json` |
| `portal_scout` | object \| null | Portali scoperti da `discovered_portals_summary.json` |

## `git_state[repo]`

Expand All @@ -82,5 +80,5 @@ Contiene stato incrociato di PR, issue, discussion, git e segnali operativi.
## Valori null

I campi `open_prs`, `open_issues`, `open_discussions` sono `null` in caso di errore fetch.
Le sezioni `radar`, `source_health`, `pipeline_state`, `dataset_catalog`, `portal_scout`
Le sezioni `radar`, `source_health`, `pipeline_state`, `dataset_catalog`
sono `null` se l'artifact upstream non è disponibile o non è stato ancora prodotto.
23 changes: 1 addition & 22 deletions src/agent_context_builder/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@
from .sources.di import DatasetIncubatorFetcher
from .sources.so import SourceObservatoryFetcher
from .signals import (
DICleanCatalog,
PortalScoutSummary,
RadarSummary,
RepoSignals,
SourceObservatorySignals,
)
from .triage import build_workspace_triage
Expand Down Expand Up @@ -65,8 +62,7 @@ def render_session_bootstrap(self) -> str:
# ── SCOUTING ────────────────────────────────────────────────────
radar = self._fetch_radar_summary()
so = self._fetch_source_observatory_signals()
scout = self._fetch_portal_scout()
has_scouting = radar is not None or so is not None or scout is not None
has_scouting = radar is not None or so is not None

if has_scouting:
lines.append("## 🔍 SCOUTING")
Expand Down Expand Up @@ -107,19 +103,6 @@ def render_session_bootstrap(self) -> str:
f"({so.sources_checked} sources checked)"
)

# Portal scout
if scout is not None:
lines.append(
f"**Portal Scout**: {scout.total_portals} portali · "
f"{scout.new_candidates} nuovi candidati · "
f"{scout.new_confirmed_protocol} strutturati"
)
if scout.new_structured:
domains = [c.domain for c in scout.new_structured[:3]]
extra = f" + {len(scout.new_structured) - 3} altri" if len(scout.new_structured) > 3 else ""
lines.append(f" · **Nuovi CKAN**: {', '.join(domains)}{extra}")
else:
lines.append("**Portal Scout**: unavailable")
lines.append("")

# ── INTAKE ────────────────────────────────────────────────────────
Expand Down Expand Up @@ -224,10 +207,6 @@ def _fetch_radar_summary(self) -> RadarSummary | None:
return self._so_fetcher.fetch_radar_summary()


def _fetch_portal_scout(self) -> PortalScoutSummary | None:
return self._so_fetcher.fetch_portal_scout()


def _fetch_source_observatory_signals(self) -> SourceObservatorySignals | None:
return self._so_fetcher.fetch_catalog_signals()

Expand Down
51 changes: 0 additions & 51 deletions src/agent_context_builder/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -352,54 +352,3 @@ def parse_radar_summary(raw: str) -> RadarSummary:
persistent_red=data.get("persistent_red", 0),
sources=sources,
)


@dataclass
class PortalCandidate:
"""Single portal candidate from discovered_portals_summary.json."""

domain: str
protocol: str
probe_url: str


@dataclass
class PortalScoutSummary:
"""Portal discovery summary from source-observatory discovered_portals_summary.json."""

generated_at: str
total_portals: int
new_candidates: int
new_confirmed_protocol: int
known_registry_seen: int
by_protocol: dict[str, int]
new_structured: list[PortalCandidate] = field(default_factory=list)
known_registry_healthcheck: list[PortalCandidate] = field(default_factory=list)


def parse_portal_scout_summary(raw: str) -> PortalScoutSummary:
try:
data: dict[str, Any] = json.loads(raw)
except json.JSONDecodeError as exc:
raise ValueError(f"Invalid JSON: {exc}") from exc

def _parse_candidates(items: list[dict[str, Any]]) -> list[PortalCandidate]:
return [
PortalCandidate(
domain=c.get("domain", ""),
protocol=c.get("protocol", ""),
probe_url=c.get("probe_url", ""),
)
for c in items
]

return PortalScoutSummary(
generated_at=data.get("generated_at", "unknown"),
total_portals=data.get("total_portals", 0),
new_candidates=data.get("new_candidates", 0),
new_confirmed_protocol=data.get("new_confirmed_protocol", 0),
known_registry_seen=data.get("known_registry_seen", 0),
by_protocol=data.get("by_protocol", {}),
new_structured=_parse_candidates(data.get("new_structured", [])),
known_registry_healthcheck=_parse_candidates(data.get("known_registry_healthcheck", [])),
)
22 changes: 0 additions & 22 deletions src/agent_context_builder/sources/so.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@

from ..github import GitHubCollector
from ..signals import (
PortalScoutSummary,
RadarSummary,
SourceObservatorySignals,
parse_portal_scout_summary,
parse_radar_summary,
parse_source_observatory_signals,
)
Expand All @@ -21,7 +19,6 @@ class SourceObservatoryData:

radar: RadarSummary | None
catalog_signals: SourceObservatorySignals | None
portal_scout: PortalScoutSummary | None


class SourceObservatoryFetcher:
Expand All @@ -31,14 +28,12 @@ def __init__(self, collector: GitHubCollector):
self.collector = collector
self._radar_cache: RadarSummary | None | object = _UNSET
self._catalog_signals_cache: SourceObservatorySignals | None | object = _UNSET
self._portal_scout_cache: PortalScoutSummary | None | object = _UNSET

def fetch(self) -> SourceObservatoryData:
"""Fetch all source-observatory artifacts."""
return SourceObservatoryData(
radar=self.fetch_radar_summary(),
catalog_signals=self.fetch_catalog_signals(),
portal_scout=self.fetch_portal_scout(),
)

def fetch_radar_summary(self) -> RadarSummary | None:
Expand Down Expand Up @@ -71,23 +66,6 @@ def fetch_catalog_signals(self) -> SourceObservatorySignals | None:
self._catalog_signals_cache = result
return result

def fetch_portal_scout(self) -> PortalScoutSummary | None:
if self._portal_scout_cache is not _UNSET:
return self._portal_scout_cache # type: ignore[return-value]
raw = self.collector.get_raw_file(
"source-observatory", "data/portal_scout/discovered_portals_summary.json"
)
if raw is None:
self._portal_scout_cache = None
return None
try:
result = parse_portal_scout_summary(raw)
except ValueError as exc:
self.collector.fetch_errors["source-observatory:portal_scout"] = str(exc)
result = None
self._portal_scout_cache = result
return result


class _Unset:
pass
Expand Down
18 changes: 0 additions & 18 deletions src/agent_context_builder/triage.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ def build_workspace_triage(
"source_health": _build_source_health_dict(so_fetcher, github_collector),
"pipeline_state": _build_pipeline_state_dict(di_fetcher, github_collector),
"dataset_catalog": _build_dataset_catalog_dict(di_fetcher, github_collector),
"portal_scout": _build_portal_scout_dict(so_fetcher),
}


Expand Down Expand Up @@ -221,23 +220,6 @@ def _build_dataset_catalog_dict(
}


def _build_portal_scout_dict(fetcher: SourceObservatoryFetcher) -> dict[str, Any]:
scout = fetcher.fetch_portal_scout()
if scout is None:
return {"available": False}
return {
"available": True,
"generated_at": scout.generated_at,
"total_portals": scout.total_portals,
"new_candidates": scout.new_candidates,
"new_confirmed_protocol": scout.new_confirmed_protocol,
"by_protocol": scout.by_protocol,
"new_structured": [
{"domain": c.domain, "protocol": c.protocol} for c in scout.new_structured
],
}


def _collect_warnings(
github_collector: GitHubCollector,
prs: list[PR],
Expand Down
5 changes: 2 additions & 3 deletions tests/test_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -398,14 +398,13 @@ def _raw_file_side_effect(repo, path, ref="main"):
renderer.render_session_bootstrap()
renderer.render_workspace_triage()

# Five distinct files fetched once each
assert gh.get_raw_file.call_count == 5
# Four distinct files fetched once each (portal_scout removed — SO no longer produces it)
assert gh.get_raw_file.call_count == 4
paths_fetched = [call.args[1] for call in gh.get_raw_file.call_args_list]
assert "data/radar/radar_summary.json" in paths_fetched
assert "data/catalog/catalog_signals.json" in paths_fetched
assert "registry/pipeline_signals.json" in paths_fetched
assert "registry/clean_catalog.json" in paths_fetched
assert "data/portal_scout/discovered_portals_summary.json" in paths_fetched


def test_render_topic_index():
Expand Down