Handbook
Org directory consumer boundary
Org Explorer removed. The Delve-iframe Org Explorer crawl surface has been retired. Outlook People (host page) — and specifically its Organization tab — is now the sole source of org-structure (manager chain, direct…
Updated
Org Explorer removed. The Delve-iframe Org Explorer crawl surface has been
retired. Outlook People (host page) — and specifically its Organization tab — is
now the sole source of org-structure (manager chain, direct reports, works-with).
The legacy org_explorer.py connector module was renamed to owa_lpc_reader.py and
retains only shared LPC parsers plus a dormant home-snapshot reader used by Cockpit
photo backfill.
forge-lcdl exposes atomic, product-agnostic read operations for Outlook People (host page). Consumers (for example forge-cockpit-web) attach an authorized browser session, call governed tasks, and map wire output to org_people.sqlite, org_graph.sqlite, and files/org/{profile_id}/people/.
LCDL must not import consumer repos or know crawl depth policies, COCKPIT_ORG_SCAN_MAX_PEOPLE, canonical-disk compaction, org_ingest_queue drain, or org-chart UI events.
OWA surface (single consumer store)
| Surface | OWA entry | LCDL connector | Cockpit orchestrator | harvest_source |
|---|---|---|---|---|
| Outlook People | /people/ |
outlook_people.py |
people_harvest.py |
outlook_people |
| ~~Org Explorer~~ | ~~/host/… + Delve iframe~~ |
removed (was org_explorer.py) |
removed | — |
Outlook People writes through ingest_harvest(); org-structure edges come from the LPC Organization tab parsed on the People profile card.
Atomic capability catalog — Outlook People
| Capability | Governed task_id |
Input (summary) | Output (summary) |
|---|---|---|---|
| People health | outlook_probe_people_health |
session_ref, optional operator ids |
ok, search_ready, tree_ready |
| Contact list snapshot | outlook_people_home_snapshot |
scroll_rounds, max_rows |
people[], edges[] (empty v1) |
| Directory search focus | outlook_people_focus_search |
query, display_name, mail |
person, focused_graph_id |
| Tree / row click | outlook_people_focus_tree |
display_name, mail, graph_id |
focus_ok, person |
| Person snapshot | outlook_people_snapshot_person |
focus fields | person, panel |
| Profile panel read | outlook_people_read_profile_panel |
optional expected name/mail | card, parsed fields |
| Panel dismiss | outlook_people_dismiss_profile_panel |
session_ref |
dismissed |
Full list: OUTLOOK-PEOPLE-READ-STRATEGIES.md. Dual matrix: OUTLOOK-PEOPLE-DUAL-ARCHITECTURE.md.
Wire shape (org directory)
Both surfaces emit OrgHarvestWire-compatible JSON for Cockpit:
people[]—graph_id,display_name,mail, optional title/dept/photoedges[]— structural rels (reports_to,peer_of,works_with); derived from the People Organization tab (names resolved tograph_idconsumer-side)focused_graph_id,upn,tenant_id
Consumers map via OrgHarvestWire.from_task_result → ingest_harvest.
What LCDL must not know
| Out of scope for LCDL | Belongs in consumer |
|---|---|
org_people.sqlite, org_graph.sqlite |
Cockpit SQLCipher |
files/org/, harvest_manifest.json, profile_check |
Cockpit org/ingest.py |
pending_mail:* → canonical GUID |
people_harvest._resolve_graph_ids_from_db |
| Canonical disk / compaction | disk_canonical.py, disk_compact.py |
org_ingest_queue stub/enrich drain |
ingest_queue.py, profile-enrich harness |
| Guided scope / depth policy | people_harvest.py, depth_policy.py |
| MSAL Graph sync | org/sync_service.py |
contact.org_graph_id linker |
contact_link.py |
| Org chart NDJSON live events | Cockpit crawl API |
Consumer responsibilities
- Session — Pick the People tab,
connect_owa_page_via_selective_cdp,register_playwright_page(session_ref, page). - Composition — Probe → snapshot loop; optional search/tree enrich per person.
- Mapping —
OrgHarvestWire→ingest_harvest(harvest_source=…). - Orchestration — Caps, CDP lock (
_ORG_CDP_LOCK), scan runs, contact linking.
Example consumer: forge-cockpit-web — org-people-dual-architecture.md.
Migration status (forge-cockpit-web)
| Area | LCDL atoms | Cockpit status |
|---|---|---|
| Outlook People scanner | outlook_people_* tasks |
Production via people_harvest.py |
| Org structure (manager / DR / works-with) | People Organization tab parsers | Production — sole source |
| Org Explorer harvest / crawl | — | Removed |
| Microsoft Graph directory | N/A | Cockpit org/sync_service.py only |
Related
- MESSAGING-CONSUMER-BOUNDARY.md — mail/Teams atoms (separate store)
- OUTLOOK-PEOPLE-DUAL-ARCHITECTURE.md
- ARCHITECTURE.md