- Move setup docs into documentation/ and remove legacy MCP troubleshooting content and ad hoc probe files
- Support the session goal of a cleaner, gated workflow with clearer restart context and less maintenance noise
- Add scripts/update_readme_status.py to generate a deterministic status block, enforce traffic-light shard tables, and validate/fix internal links
- Refactor nexus-mcp/README.md into a managed status layout with standardized WIS traceability and Discipline Drives Quality sections
- Aligns with session goals for operational readiness and disciplined documentation as Nexus-MCP scales
Ref: SESSION_SNAPSHOT_2026-04-13
- Remove generated package outputs from nexus-mcp/dist/*.whl and *.tar.gz
- Remove generated metadata from nexus-mcp/src/nexus_mcp.egg-info/*
- Keep repository source-only and rely on local/CI builds for artifacts
- Update nexus-mcp/pyproject.toml to register the integration pytest marker and keep test execution policy explicit
- Regenerate package metadata and distribution artifacts in nexus-mcp/src/nexus_mcp.egg-info/* and nexus-mcp/dist/*
Ref: Session Snapshot 2026-04-13 — close out pending pytest validation hygiene
- Add conftest.py to inject lib/ onto sys.path, fixing
ModuleNotFoundError on identity test collection
- Add pytest-asyncio to CI install step and pyproject.toml
test extras; set asyncio_mode=auto to resolve 31 async
test failures flagged in session tech debt backlog
- All 35 tests now pass; 8 skipped (live API, expected)
Ref: Session Snapshot 2026-04-13 — "Pytest validation incomplete"
- Implement 4 production-ready audit scan tools in src/shards/audit.py
- scan_status_reconciliation: detect terminated users still enabled in AD
- scan_job_title_drift: detect title mismatches between Workday and AD
- scan_department_mismatches: detect department/cost center drift
- scan_name_variance_mismatches: detect display name inconsistencies
- Add comprehensive integration test suite (tests/integration_test_audit_shard.py)
- Create demo client (test_client.py) and MCP protocol simulator (test_mcp_protocol.py)
- Add tool catalog generator (list_tools.py) for visibility across all 33 registered tools
- Fix Windows console encoding in src/main.py to support emoji in shard status output
- Add version management utility (scripts/bump_version.py) for release automation
- Update workday test imports to use new drift_detection module path
Completes session goal of establishing SOC 2-compliant cross-system drift detection
per SESSION_SNAPSHOT_2026-04-13.md. All audit tools validated against mock data
with expected mismatch scenarios (Bob Martinez, Carol Chen, David Kim cases).
Refs: WIS-014, WIS-015, WIS-016, WIS-017, WIS-018
- nexus-mcp/src/shards/audit.py: Replaced corrupted file (unterminated triple-quoted strings, Unicode encoding issues with em dashes) with minimal working stub
- nexus-mcp/src/shards/audit.py.fresh: Backup of previous corrupted version from git history
- nexus-mcp/src/shards/audit_minimal.py: Alternative version with client imports for future expansion
- egg-info metadata: Added from `pip install -e .` installation in isolated venv
Resolves server startup failure where Python parser could not handle malformed docstrings in original audit.py. The previous committed version (fe77b0f) contained syntax errors that prevented initialization of the audit shard. This minimal stub allows nexus-mcp orchestrator to load and register all 5 working shards successfully.
Ref: Server initialization restored - all shards loading (identity, workday, itsm, assets, logistics, audit)
- Fixed resilient_http_call decorator to NOT retry on 4xx client errors (only 5xx)
- Changed retry condition from retry_if_exception_type to retry_if_exception with custom logic
- Updated datetime.utcnow() to datetime.now(UTC) to fix deprecation warnings
- Fixed test imports to add lib/ to sys.path
All 12 unit tests now pass with no warnings.
Addresses technical debt where data objects (User, Worker, Device) were using
fragile dict access patterns instead of validated pydantic models.
- Add nexus-mcp/lib/schemas.py: Canonical domain models (CanonicalUser, CanonicalDevice,
FieldDrift) with automatic field normalization and validation
- Add nexus-mcp/lib/adapters.py: System-specific adapters (ADUserAdapter, EntraUserAdapter,
WorkdayWorkerAdapter) to transform native API responses into canonical format
- Update identity.py: ad_get_user, ad_search_users, entra_list_users now return
normalized CanonicalUser objects with consistent field names
- Update workday.py: workday_list_workers, workday_get_worker return canonical format
for seamless cross-system comparison
- Update audit.py: Refactor audit_user_drift to use type-safe _compare_users() helper
with FieldDrift schema instead of manual dict comparisons
Benefits:
• Type safety: IDE autocomplete, runtime validation, eliminates fragile _pick() calls
• Consistent field names: user.job_title works across AD/Entra/Workday (was 3 different paths)
• Automatic validation: Email normalization, status enum enforcement
• Drift detection: Validated Bob Martinez title mismatch (AD "Sr. Software Engineer"
vs Workday "Software Engineer")
Ref: Session goal "implement atomic, piece-at-a-time shard deployment capability"
requiring robust data contracts between systems.
- Move Identity/, Workday/, Intune/ to archive/ (superseded by nexus-mcp shards)
- Move 'Local Setup.md' to archive/ (superseded by nexus-mcp/Local-Setup.md)
- Add archive/README.md explaining migration and preserved content
- Clean repository structure: only nexus-mcp, documentation, and .github remain active
All legacy functionality migrated to nexus-mcp sharded architecture.
Archived folders preserved for reference and historical context.
Refs: SESSION_SNAPSHOT_2026-04-13.md
* expanded the Workday fixture data in data.py so each mock worker now carries the paired source attributes needed for upcoming drift checks: Workday title, AD title, Workday cost center context, AD department, legal name, preferred name, AD display name, and AD enabled state. Existing fields used by the current tools were preserved, so this was a schema expansion rather than a behavioral change.
* added a dedicated data-layer detector in data.py named scan_status_reconciliation_mismatches(). It scans the current mock worker set and flags the exact mismatch you asked for: status == "Terminated" in Workday while ad_enabled == True in AD. The response shape follows the existing manager-scan pattern with scan_summary plus a mismatches list.
* exposed the status reconciliation detector as a dedicated MCP tool in server.py by importing the new data-layer function and adding scan_status_reconciliation(). This keeps the existing architecture intact: the server remains a thin wrapper, and the scan logic stays in data.py.
* added scan_job_title_mismatches() to data.py. It compares workday_title against ad_title for each worker and returns the same structured pattern as the other detectors: scan_summary plus a mismatches list with both source values, a deterministic mismatch type, and severity.
* exposed the title detector as a dedicated MCP tool in server.py by importing the new data-layer function and adding scan_job_title_drift(). The server is still acting as a thin wrapper over the detector in data.py.
* added scan_department_drift() to data.py. It compares the Workday department context against the AD department string and includes the Workday cost center in each mismatch record so the drift is easier to interpret during reconciliation.
* exposed the department detector as a dedicated MCP tool in server.py by adding scan_department_mismatches(), which delegates to the detector in data.py. The existing tool structure remains unchanged.
* added scan_name_variance() to data.py. The detector normalizes legal, preferred, and AD display names, allows reasonable preferred-name usage, and flags cases where the AD display name no longer aligns to either the legal or preferred first name plus the legal last name.
* exposed the name-variance detector as a dedicated MCP tool in server.py by adding scan_name_variance_mismatches(), which delegates to the detector in data.py. The server still remains a thin wrapper layer.
* I’m checking the Workday project’s current test layout first so I can add one focused test file that matches the existing environment and runner configuration.
Searched for files matching `**/Workday/workday-mcp/**/*`, 3 matches
The Workday runtime is even thinner than the planning docs imply: there’s no test package or local pyproject in that folder yet. I’m checking the parent Workday artifacts and the root repo config so the new tests land in a runnable location.
Read [](file:///c%3A/Users/castn1.CORP/OneDrive%20-%20Wheels/Repos/mcp_servers/Workday/workday-mcp)
Searched for files matching `**/pyproject.toml`, 1 match
Searched for files matching `**/pytest.ini`, no matches
Searched for files matching `**/tox.ini`, no matches
I’ve confirmed there’s no existing Workday test harness, so I’m borrowing the minimal testing conventions from the Identity project before I add one focused detector test file.
Searched for regex `pytest|testpaths|pythonpath` (`**/Identity/pyproject.toml`), 2 results
Read [](file:///c%3A/Users/castn1.CORP/OneDrive%20-%20Wheels/Repos/mcp_servers/Identity/pyproject.toml)
Fetching Python environment information
Completed with input: {
"resourcePath": "c:\\Users\\castn1.CORP\\OneDrive - Wheels\\Repos\\mcp_servers\\Workday\\workday-mcp"
}
I have enough context to add the test file. The Workday virtual environment does not currently include `pytest`, so I’m installing the minimal test dependency now and then I’ll add a single focused test module for the new detectors and wrappers.
Installing pytest>=7.4.0 in Python 3.13.12 (.venv)
Completed with input: {
"resourcePath": "c:\\Users\\castn1.CORP\\OneDrive - Wheels\\Repos\\mcp_servers\\Workday\\workday-mcp",
"packageList": [
"pytest>=7.4.0"
]
}
Completed: *Expose status MCP tool* (11/18)
The test dependency is installed. I’m adding one focused Workday test module now for the four detectors and their MCP wrapper functions.
Generating patch (95 lines) in [](file:///c%3A/Users/castn1.CORP/OneDrive%20-%20Wheels/Repos/mcp_servers/Workday/workday-mcp/tests/test_mismatch_scans.py)
```
```
The test file is in place. I’m running only that focused test module now and checking for any file errors introduced by the new coverage.
Ran terminal command: cd "/c/Users/castn1.CORP/OneDrive - Wheels/Repos/mcp_servers/Workday/workday-mcp" && "c:/Users/castn1.CORP/OneDrive - Wheels/Repos/mcp_servers/Workday/workday-mcp/.venv/Scripts/python.exe" -m pytest tests/test_mismatch_scans.py -q
Checked [](file:///c%3A/Users/castn1.CORP/OneDrive%20-%20Wheels/Repos/mcp_servers/Workday/workday-mcp/tests/test_mismatch_scans.py), [](file:///c%3A/Users/castn1.CORP/OneDrive%20-%20Wheels/Repos/mcp_servers/Workday/workday-mcp/server.py), [](file:///c%3A/Users/castn1.CORP/OneDrive%20-%20Wheels/Repos/mcp_servers/Workday/workday-mcp/lib/data.py), no problems found
[[ PROCESSING: Mode=NORMAL_MODE | Intent=Report completion of the focused test-coverage step and pause before any optional documentation/status update | Strategy=Summarize the new test file and the verification result, then wait for NEXT ]]
Step 10 is complete on `feat/workday-mismatch-expansion`.
I added focused pytest coverage in test_mismatch_scans.py for the four new detectors and their MCP wrappers:
`scan_status_reconciliation_mismatches`, `scan_job_title_mismatches`, `scan_department_drift`, `scan_name_variance`, plus the corresponding server functions in server.py.
Verification passed. Running the focused test module succeeded with `8 passed in 0.49s`, and there are no reported errors in test_mismatch_scans.py, server.py, or data.py.
Reply exactly with:
NEXT
After that, I’ll do the final atomic step: update status or planning documentation only where needed to reflect the newly implemented mismatch coverage, then I’ll close the session with a summary, snapshot draft, and a Conventional Commit suggestion for your branch review flow.
Made changes.
* Updated to reflect changes
---------
Co-authored-by: nathan <nathan@castaldifamily.com>
- Add SESSION_SNAPSHOT_2026-04-03 with goals, accomplishments, and pending work
- Document next-session startup steps for Workday-to-AD sync delivery continuity
Expand README with repository intent, active Workday-to-AD sync workflow goals, and key document links.
Capture current session context as a dated progress snapshot (completed, in-progress, and next milestones); no SESSION_SNAPSHOT file was found in documentation/project-history.