workday: ship the two reads that could be verified, and say why the rest are not here - #146
Merged
Merged
Conversation
…est are not here
Workday import, 2 of the area's 9 operations. CLI and MCP behind
internal/workday.
This is a smaller PR than the area deserves and the reason is the point:
the tenant probed has SIX directory integrations and none of them is
Workday, so almost nothing here could be checked against real data.
WHAT WAS VERIFIED, and is therefore what ships:
GET /workdays returns a BARE JSON ARRAY. Not {count}, not {results},
not {workdays} — an org with no integration returns []. Every sibling
area in this API returns an envelope, so this is the fact most likely
to be assumed wrong later, and it is the one pinned hardest.
A well-formed id that no integration has returns 404, and a malformed
one returns 400 "invalid object id". Workday behaves correctly here,
which is worth stating because the neighbouring Google EMM area does
not: there, a fake enterprise id returns an empty device list instead.
WHAT IS NOT HERE. The area also serves a workers listing and an import
results endpoint. Their response shapes have never been observed, so
implementing them would mean writing a parser for a response nobody has
seen. Given this area's list endpoint already breaks the pattern its
siblings follow, guessing would be a poor bet specifically here. Both are
recorded in workday.Unprobed with what to do first, and a test fails if
that map is emptied without the endpoints being implemented.
There is also no lookup by name, for the same reason: the record has
never been seen with data in it, so which field holds a display name — or
whether one exists — is not established. The id shape is checked locally
instead, so a typo reads as a typo.
WRITES ARE HELD BACK, and one deserves naming. POST /workdays/{id}/import
carries the users scope: it creates and updates real directory users from
HR data, and no dry run for it was found. That is not something to ship
against an integration nobody can test.
The spec names the path parameter {id} on some endpoints and {workday_id}
on others. Whether that is a real distinction could not be established —
with no integration there is nothing to address. Google EMM advertised
the same split and it was fiction, so the working assumption is one id,
written down in IsObjectID as an assumption rather than buried in a
resolver.
Live: the list returns [] from both surfaces, a malformed id is refused
locally with the same message from both, and a well-formed unknown id
reaches the API and 404s.
Refs KLA-485
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y2jW5Bj6eH38HMLG2noMym
Both conflicts were the same shape: #145 (Google EMM) and this branch each added a command group, so both sides appended to the same lists and bumped the same counts. Resolved additively rather than by taking a side — every conflict here was two independent areas registering themselves: root.go, tools.go both commands, both tool registrations classifications.go 8 google-emm leaves + 2 workday leaves schema_test.go 42 resources, list rebuilt sorted from the union of both sides rather than hand-merged mcp/tools_test.go 340 tools = 330 + 8 + 2, both tool blocks kept One thing worth recording, because the first attempt got it wrong: the classifications map deduped on the raw LINE, and gofmt aligns those differently on the two sides, so textually-different copies of the same key both survived and the build failed on duplicate map keys. Dedup on the map key, not the line. docs/site regenerated; verify-site clean. Full suite green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y2jW5Bj6eH38HMLG2noMym
jtaylorjc
approved these changes
Sep 17, 2026
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.
Workday import — 2 of the area's 9 operations. CLI and MCP behind
internal/workday.This is a smaller PR than the area deserves, and the reason is the point: the tenant probed has six directory integrations and none of them is Workday, so almost nothing here could be checked against real data.
What was verified, and is therefore what ships
GET /workdaysreturns a bare JSON array. Not{count}, not{results}, not{workdays}— an org with no integration returns[]. Every sibling area in this API returns an envelope, so this is the fact most likely to be assumed wrong later, and it's the one pinned hardest.The error shapes are correct. A well-formed id no integration has → 404. A malformed one → 400
invalid object id. Worth stating plainly, because the neighbouring Google EMM area (#145) does not behave this way: there, a fake enterprise id returns an empty device list.What is not here, and why
The area also serves a workers listing and an import-results endpoint. Their response shapes have never been observed, so implementing them means writing a parser for a response nobody has seen.
Given this area's list endpoint already breaks the pattern its siblings follow, guessing would be a poor bet specifically here. Both are recorded in
workday.Unprobedwith what to do first, and a test fails if that map is emptied without the endpoints being implemented.There is also no lookup by name — the record has never been seen with data in it, so which field holds a display name, or whether one exists, is not established. The id shape is checked locally instead, so a typo reads as a typo rather than as a server error.
The id question, recorded as an assumption
The spec names the path parameter
{id}on some endpoints and{workday_id}on others. Whether that's a real distinction could not be established — with no integration there is nothing to address.Google EMM advertised the same split and it turned out to be fiction, so the working assumption is one id. That assumption is written down in
IsObjectIDas an assumption, rather than buried inside a resolver where the next person would inherit it as fact.Writes held back, and one deserves naming
POST /workdays/{id}/importcarries theusersscope: it creates and updates real directory users from HR data, and no dry run for it was found. That is not something to ship against an integration nobody can test.Verification
go test ./...green,make verify-siteclean, tool census 332,workdayregistered in classifications and schema.Live: the list returns
[]from both surfaces; a malformed id is refused locally with the same message from both; a well-formed unknown id reaches the API and 404s.Refs KLA-485
🤖 Generated with Claude Code