Skip to content

feat: handle multiple organisation per resource#577

Merged
tombrooks248 merged 7 commits into
mainfrom
feat/multi-org-lookup-fanout
Jul 16, 2026
Merged

feat: handle multiple organisation per resource#577
tombrooks248 merged 7 commits into
mainfrom
feat/multi-org-lookup-fanout

Conversation

@tombrooks248

@tombrooks248 tombrooks248 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

What type of PR is this? (check all applicable)

  • Refactor
  • Feature
  • Bug Fix
  • Optimization
  • Documentation Update

Description

Changing the way the pipeline generates entities from a resource in a situation where multiple endpoints from different organisations provide identical data and therefore produce the same resource.

Before - No entities are produced from resources with multiple orgs.
After - now generate entities per organisation per resource.

Why

Because we are currently missing entities in our data and this is causing a bunch of problems particularly for local-plan data.

How the bug works

A resource is identified only by the hash of its contents. When two organisations publish the same URL, they produce identical bytes, so the collection merges them into a single resource that carries both organisation codes.

To generate entities, the pipeline stamps a default organisation onto every row of a resource (most data files don't say which authority they belong to). But it only does this when there is exactly one organisation:

if len(organisations) == 1:
    default_values["organisation"] = organisations[0]

Worked example — South & Vale Joint Local Plan 2045

South Oxfordshire and Vale of White Horse jointly published one local plan timetable at a single URL:

https://www.southandvale.gov.uk/app/uploads/2026/06/Local-Plan-Timetable-CSV.csv

In source.csv that one endpoint was attributed to both authorities:

organisation dataset
local-authority:SOX plan-timetable
local-authority:VAL plan-timetable

lookup.csv already defines separate entities for each authority against the same references, for example:

dataset reference SOX entity VAL entity
plan-timetable Joint-Local-Plan-2045-scoping-consultation-start 5110200 5110188

Before: the resource carries two organisations, the guard is skipped, and neither authority's entities are created — both show zero records supplied.

After: entity lookup resolves the reference once per organisation and emits a row per distinct entity, so both authorities get their entities.

Related Tickets & Documents

QA Instructions, Screenshots, Recordings

Tested in DEV

DEV's collected resource.csv has 4 active multi-org resources (organisations column containing ;). I tested by looking at this one:

- -
Resource ae8f59326ef53ede176817221ff512c00d3bc860874e8b8add2fb84dbc06e1f5
Organisations local-authority:ADU;local-authority:WOT (Adur + Worthing)
Endpoint ea98ea4d156ee47f…
Dataset brownfield-land

Adur and Worthing publish a single shared brownfield-land CSV.

Result — the fix works

  • 743 fact rows, 45 distinct entities, 0 blank-entity rows
  • local-authority:ADU — 23 entities
  • local-authority:WOT — 22 entities
  • all rows priority=2 (authoritative)

Before the change this file was empty — no organisation meant no entity, and every row was pruned. Both councils showed zero records supplied. Both councils' data is now created from the single shared resource.

Why this is safer than it first looks

Changing how resources map to organisations sounds like it touches a core assumption, but the pipeline is already entity-centric below the resource level — facts, dataset assembly and tasks are all keyed on the entity, not the resource. So "process a resource once per organisation" fits the existing model rather than fighting it: each organisation resolves to its own entity, and from that point on everything treats the two organisations exactly as if they'd come from separate resources.

The load-bearing detail is that a fact's identity is a hash of entity : field : value, so two organisations producing identical rows still create distinct facts (different entities → different hashes). That's why nothing collapses or overwrites. I also confirmed the resource-level logs are set, not accumulated, so nothing double-counts.

The change is also naturally bounded: resources with one organisation (or none) follow exactly the same path as before — only resources with two or more organisations hit the new behaviour. Which is a relatively small subset of the total data.

Impact on issues generated

an unknown-entity issue is raised only when no organisation resolves an entity

Added/updated tests?

We encourage you to keep the code coverage percentage at 80% and above. Please refer to the Digital Land Testing Guidance for more information.

  • Yes
  • No, and this is why: please replace this line with details on why tests
    have not been included
  • I need help with writing tests

[optional] Are there any post deployment tasks we need to perform?

[optional] Are there any dependencies on other PRs or Work?

Summary by CodeRabbit

Summary of changes

  • New Features

    • Entity lookups can now fan out across multiple organisations, stamping the resolved organisation onto both the output row and block.
    • If an input row already specifies its organisation, lookups respect it without fan-out.
  • Bug Fixes

    • Duplicate reference detection is now evaluated separately per entity, and duplicate reports include the correct entity context.
    • “Unknown entity” handling is more consistent, including missing-reference cases, with only one issue raised when no organisations resolve.
  • Documentation

    • Updated pipeline documentation to clarify how multi-organisation lookup behaves.
  • Tests

    • Added unit coverage for multi-organisation fan-out, deduplication, and unknown-match scenarios, plus an extra duplicate-reference case.

@tombrooks248 tombrooks248 changed the title feat: handle multiple organisation pser resource feat: handle multiple organisation per resource Jul 13, 2026
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Changes

The changes partition duplicate-reference detection by entity and add organisation-aware entity resolution, including multi-organisation fan-out, deduplication, issue logging, pipeline wiring, and unit tests.

Duplicate reference partitioning

Layer / File(s) Summary
Partition duplicate references by entity
digital_land/check.py, tests/unit/test_check.py
Duplicate references are grouped separately for each entity, entity values are included when logging issues, and tests cover identical references belonging to different entities.

Organisation-aware entity lookup

Layer / File(s) Summary
Resolve entities per organisation
digital_land/phase/lookup.py
Entity lookup accepts an optional organisation, supports multi-organisation fan-out, deduplicates results, applies redirects, stamps organisation metadata, and logs missing entities.
Wire and validate organisation-aware lookup
digital_land/pipeline/main.py, tests/unit/phase/test_lookup.py
The pipeline passes configured organisations to the lookup phase, with tests covering fan-out, deduplication, missing entities, and single-organisation behaviour.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Pipeline
  participant EntityLookupPhase
  participant LookupPhase
  Pipeline->>EntityLookupPhase: pass configured organisations
  EntityLookupPhase->>LookupPhase: resolve each block for each organisation
  LookupPhase-->>EntityLookupPhase: return entity or missing reference
  EntityLookupPhase-->>Pipeline: emit deduplicated organisation-stamped blocks
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarises the main change: supporting multiple organisations per resource.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/multi-org-lookup-fanout

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
digital_land/phase/lookup.py (2)

219-223: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Mutable default arguments flagged by Ruff B006.

lookups={}, redirect_lookups={}, and entity_range=[] are mutable defaults. This follows the existing pattern in LookupPhase.__init__, but the static analyser flags it. Consider using None and initialising inside the body if you want to address the lint warnings.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@digital_land/phase/lookup.py` around lines 219 - 223, Update the affected
initializer signature, including LookupPhase.__init__, to replace mutable
defaults for lookups, redirect_lookups, and entity_range with None. Initialize
each value inside the function body while preserving the existing behavior and
avoiding shared mutable state.

Source: Linters/SAST tools


184-206: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use _log_unknown_entity in LookupPhase.process to eliminate duplication.

The newly added _log_unknown_entity method faithfully extracts the inline logging at lines 184–206 but is only called from _process_multi_org. Refactoring LookupPhase.process to call it as well would remove ~20 lines of duplicated logic and ensure both paths stay in sync.

♻️ Proposed refactor
             if prefix:
                 if not row.get(self.entity_field, ""):
                     row[self.entity_field] = self.get_entity(block)

                     if not row[self.entity_field]:
-                        if self.issues:
-                            if not reference:
-                                self.issues.log_issue(
-                                    "entity",
-                                    "unknown entity - missing reference",
-                                    curie,
-                                    line_number=line_number,
-                                )
-                            else:
-                                self.issues.log_issue(
-                                    "entity",
-                                    "unknown entity",
-                                    curie,
-                                    line_number=line_number,
-                                )
-                                if self.operational_issues:
-                                    self.operational_issues.log_issue(
-                                        "entity",
-                                        "unknown entity",
-                                        curie,
-                                        line_number=line_number,
-                                    )
+                        self._log_unknown_entity(reference, curie, line_number)
                     else:
                         row[self.entity_field] = self.redirect_entity(
                             row[self.entity_field]
                         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@digital_land/phase/lookup.py` around lines 184 - 206, Update
LookupPhase.process to replace the duplicated missing/unknown entity
issue-logging block with a call to the existing _log_unknown_entity method,
passing the same relevant values such as curie, reference, and line_number.
Preserve the current behavior for missing references and operational_issues
while ensuring both process paths use the shared helper.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@digital_land/check.py`:
- Around line 25-29: Update the duplicate-processing flow after the query
grouped by "entity" so the subsequent issues.log_issue(...) call passes
entity=row["entity"]. Preserve the existing issue fields and use the
IssueLog.log_issue entity parameter to retain entity attribution.

In `@digital_land/phase/lookup.py`:
- Around line 247-249: Update the single-organization call to
issues.record_entity_map in LookupPhase.process to access the entity value
defensively with the same row.get(self.entity_field, "") pattern used by the
multi-organization path, preserving an empty-string fallback when the field is
absent.
- Around line 289-290: Update the issue-recording flow in apply_entity_map to
preserve the resolved entity or organisation directly on each issue row. Do not
use issues.record_entity_map with the shared entry-number map for
multi-organisation entries; ensure each issue receives its own attribution so
later issues for the same entry-number are not overwritten by the first entity.

---

Nitpick comments:
In `@digital_land/phase/lookup.py`:
- Around line 219-223: Update the affected initializer signature, including
LookupPhase.__init__, to replace mutable defaults for lookups, redirect_lookups,
and entity_range with None. Initialize each value inside the function body while
preserving the existing behavior and avoiding shared mutable state.
- Around line 184-206: Update LookupPhase.process to replace the duplicated
missing/unknown entity issue-logging block with a call to the existing
_log_unknown_entity method, passing the same relevant values such as curie,
reference, and line_number. Preserve the current behavior for missing references
and operational_issues while ensuring both process paths use the shared helper.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 41b2cdb5-7171-4c8c-b9c4-6a5c614b0642

📥 Commits

Reviewing files that changed from the base of the PR and between fa6580a and 6edfdd6.

📒 Files selected for processing (5)
  • digital_land/check.py
  • digital_land/phase/lookup.py
  • digital_land/pipeline/main.py
  • tests/unit/phase/test_lookup.py
  • tests/unit/test_check.py

Comment thread digital_land/check.py
Comment thread digital_land/phase/lookup.py Outdated
Comment thread digital_land/phase/lookup.py Outdated
@tombrooks248
tombrooks248 force-pushed the feat/multi-org-lookup-fanout branch from 6edfdd6 to b2c9449 Compare July 13, 2026 14:25
@tombrooks248
tombrooks248 force-pushed the feat/multi-org-lookup-fanout branch from b2c9449 to 11c327b Compare July 15, 2026 07:49

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
digital_land/phase/lookup.py (1)

247-252: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Fix potential KeyError on block["row"]["entity"] in the single-organisation path.

When LookupPhase.process processes a row with no prefix, it yields the block without setting row[self.entity_field]. Accessing block["row"]["entity"] directly here will cause a KeyError and crash the pipeline.

Use the same defensive access pattern .get(self.entity_field, "") that is successfully used in the multi-organisation path.

🔧 Proposed fix
         for block in super().process(stream):
             if self.issues:
                 self.issues.record_entity_map(
-                    block["entry-number"], block["row"]["entity"]
+                    block["entry-number"], block["row"].get(self.entity_field, "")
                 )
             yield block
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@digital_land/phase/lookup.py` around lines 247 - 252, Update the entity
lookup in LookupPhase.process to use the row’s defensive .get(self.entity_field,
"") access when recording the entity map, matching the multi-organisation path
and allowing rows without a prefix to proceed without KeyError.
🧹 Nitpick comments (1)
digital_land/phase/lookup.py (1)

146-170: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Reuse _log_unknown_entity to eliminate duplicated logic.

This centralises the issue-logging perfectly. You can also reuse this new method inside LookupPhase.process to eliminate the remaining duplicated logic.

You can apply the following clean-up to LookupPhase.process (around line 184):

                    if not row[self.entity_field]:
                        self._log_unknown_entity(reference, curie, line_number)
                    else:
                        row[self.entity_field] = self.redirect_entity(
                            row[self.entity_field]
                        )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@digital_land/phase/lookup.py` around lines 146 - 170, Update
LookupPhase.process to call _log_unknown_entity(reference, curie, line_number)
when the entity field is missing, replacing its duplicated issue-logging branch;
retain the existing redirect_entity assignment for rows with an entity value.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@digital_land/phase/lookup.py`:
- Around line 217-236: Update the __init__ method’s mutable parameters—lookups,
redirect_lookups, and entity_range—to default to None, then initialize each to a
fresh empty dictionary or list before passing them to super().__init__. Preserve
the existing organisations fallback and behavior for explicitly supplied values.

---

Duplicate comments:
In `@digital_land/phase/lookup.py`:
- Around line 247-252: Update the entity lookup in LookupPhase.process to use
the row’s defensive .get(self.entity_field, "") access when recording the entity
map, matching the multi-organisation path and allowing rows without a prefix to
proceed without KeyError.

---

Nitpick comments:
In `@digital_land/phase/lookup.py`:
- Around line 146-170: Update LookupPhase.process to call
_log_unknown_entity(reference, curie, line_number) when the entity field is
missing, replacing its duplicated issue-logging branch; retain the existing
redirect_entity assignment for rows with an entity value.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: aa5f039a-83c7-4c38-bf4f-402852cdb9d1

📥 Commits

Reviewing files that changed from the base of the PR and between 6edfdd6 and 11c327b.

📒 Files selected for processing (5)
  • digital_land/check.py
  • digital_land/phase/lookup.py
  • digital_land/pipeline/main.py
  • tests/unit/phase/test_lookup.py
  • tests/unit/test_check.py
🚧 Files skipped from review as they are similar to previous changes (4)
  • tests/unit/test_check.py
  • digital_land/pipeline/main.py
  • digital_land/check.py
  • tests/unit/phase/test_lookup.py

Comment thread digital_land/phase/lookup.py
@tombrooks248
tombrooks248 marked this pull request as ready for review July 15, 2026 09:55
Comment thread digital_land/phase/lookup.py
Comment thread digital_land/phase/lookup.py Outdated
Comment thread digital_land/phase/lookup.py Outdated
Comment thread digital_land/phase/lookup.py
Comment thread digital_land/phase/lookup.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
digital_land/phase/lookup.py (1)

198-220: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use _log_unknown_entity to remove duplicated logic.

The newly introduced _log_unknown_entity helper (lines 159-184) duplicates this exact logic. You can use it here to keep the issue logging centralised and DRY.

♻️ Proposed refactor
-                    if not row[self.entity_field]:
-                        if self.issues:
-                            if not reference:
-                                self.issues.log_issue(
-                                    "entity",
-                                    "unknown entity - missing reference",
-                                    curie,
-                                    line_number=line_number,
-                                )
-                            else:
-                                self.issues.log_issue(
-                                    "entity",
-                                    "unknown entity",
-                                    curie,
-                                    line_number=line_number,
-                                )
-                                if self.operational_issues:
-                                    self.operational_issues.log_issue(
-                                        "entity",
-                                        "unknown entity",
-                                        curie,
-                                        line_number=line_number,
-                                    )
+                    if not row[self.entity_field]:
+                        self._log_unknown_entity(reference, curie, line_number)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@digital_land/phase/lookup.py` around lines 198 - 220, Replace the duplicated
missing-reference and unknown-entity logging block in the row-processing flow
with a call to the existing _log_unknown_entity helper. Pass the same entity
identifier, reference, and line number so issue and operational-issue logging
behavior remains unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@digital_land/phase/lookup.py`:
- Around line 198-220: Replace the duplicated missing-reference and
unknown-entity logging block in the row-processing flow with a call to the
existing _log_unknown_entity helper. Pass the same entity identifier, reference,
and line number so issue and operational-issue logging behavior remains
unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 62e67758-20c7-4056-ba63-4f5f7d44ddb1

📥 Commits

Reviewing files that changed from the base of the PR and between 27ecdf9 and d4ff0fc.

📒 Files selected for processing (3)
  • digital_land/phase/lookup.py
  • digital_land/pipeline/main.py
  • tests/unit/phase/test_lookup.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • digital_land/pipeline/main.py
  • tests/unit/phase/test_lookup.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
digital_land/phase/lookup.py (1)

159-184: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Pass the current entry number into unknown-entity logging. In digital_land/phase/lookup.py#L159-L184 and #L364-L367, _log_unknown_entity(...) falls back to IssueLog.entry_number, so the fan-out path can record the issue against the wrong entry. Thread block["entry-number"] through and assert "entry-number": 1 in tests/unit/phase/test_lookup.py#L414-L438.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@digital_land/phase/lookup.py` around lines 159 - 184, Update
_log_unknown_entity and its call site in digital_land/phase/lookup.py:159-184
and 364-367 to accept and pass the current block["entry-number"] explicitly,
ensuring both issue logs use that entry instead of falling back to
IssueLog.entry_number. In tests/unit/phase/test_lookup.py:435-438, assert the
fan-out result records "entry-number": 1.
🧹 Nitpick comments (1)
tests/unit/phase/test_lookup.py (1)

435-438: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Assert the unknown issue’s entry attribution.

Also verify issues.rows[0]["entry-number"] == 1. This currently exposes whether the multi-provider path correctly propagates the block’s entry number when logging the issue.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unit/phase/test_lookup.py` around lines 435 - 438, Extend the
assertions in the unknown-entity test to verify that the single issue row has an
entry-number of 1, alongside the existing issue-type assertion. This should
validate entry attribution for the multi-provider lookup path without changing
the output or issue-count expectations.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@digital_land/phase/lookup.py`:
- Around line 159-184: Update _log_unknown_entity and its call site in
digital_land/phase/lookup.py:159-184 and 364-367 to accept and pass the current
block["entry-number"] explicitly, ensuring both issue logs use that entry
instead of falling back to IssueLog.entry_number. In
tests/unit/phase/test_lookup.py:435-438, assert the fan-out result records
"entry-number": 1.

---

Nitpick comments:
In `@tests/unit/phase/test_lookup.py`:
- Around line 435-438: Extend the assertions in the unknown-entity test to
verify that the single issue row has an entry-number of 1, alongside the
existing issue-type assertion. This should validate entry attribution for the
multi-provider lookup path without changing the output or issue-count
expectations.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b574fcec-a820-4e78-9e1e-678e8ba2c718

📥 Commits

Reviewing files that changed from the base of the PR and between d4ff0fc and 3829748.

📒 Files selected for processing (2)
  • digital_land/phase/lookup.py
  • tests/unit/phase/test_lookup.py

eveleighoj
eveleighoj previously approved these changes Jul 16, 2026
@tombrooks248
tombrooks248 merged commit 9240853 into main Jul 16, 2026
6 checks passed
@tombrooks248
tombrooks248 deleted the feat/multi-org-lookup-fanout branch July 16, 2026 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants