feat(multi-tenant-saas): model a real HR SaaS with EU vs US tenants#54
Merged
Conversation
Replace the acme-corp/globex-financial placeholders with PeopleGraph, a fictional HR/people-analytics SaaS whose two tenants differ by genuine data processing agreement terms rather than by a flag. - metzler-eu (EU employer, enforcing): GDPR guardrails enforced - declared legal basis (Art. 6), EEA data residency (Art. 44-45), no special-category processing (Art. 9). - summit-us (US employer, advisory): permissive baseline; special-category access is flagged for review but not blocked. The same four calls (headcount, employee lookup, cross-region export, special-category lookup) run against both tenants: the EU tenant blocks the cross-border export and the special-category lookup, the US tenant allows the export and only logs the special-category flag. - New people_directory module holds employee fixtures and tool logic; the mock server serves from it. Responses are free of scanner-tripping PII patterns. - Add unit tests and a CI job; update the smoke matrix for the new tenants. - Regenerate one signed TRACE record per tenant from real runs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Replaces the
acme-corp/globex-financialplaceholders with PeopleGraph, a fictional HR/people-analytics SaaS whose two tenants differ by genuine data processing agreement terms, not just an enforcement flag. Second of three per-example realism PRs (financial-services is #53; healthcare to follow).Why
The old example used the two most generic placeholder company names in existence, three generic tools, and tenants that differed only by workflow gating. It read as a toy.
Changes
metzler-eu(EU employer,enforcing): GDPR guardrails enforced — declared legal basis (Art. 6), EEA data residency (Art. 44–45), no special-category processing (Art. 9).summit-us(US employer,advisory): permissive baseline; special-category access flagged for review but not blocked.us-east-1) and the special-category lookup, while the US tenant allows the export and only logs the special-category flag.people_directory.pyholds employee fixtures + tool logic; the mock server serves from it. Responses are free of PII patterns that would trip the runtime's response scanner.tests/test_people_directory.pyand a CI job; the smoke matrix updated for the new tenant names.Verification
python -m unittest discover -s tests -v→ 5 passcmcp verifypasses schema, signature and audit chain on each record (hardware attestation fails in software-only dev mode, as expected)enforce); US record: 4 calls, 3 allowed, 1 advisory match (advisory)smokejobs stay greendefinition_hashvalues recomputed and self-checked🤖 Generated with Claude Code