Begin Handshake CLI checkpoint - #4
Draft
isomorphisms wants to merge 14 commits into
Draft
Conversation
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.
Purpose
Start a small read-only Handshake command-line client in Idriç without confusing Handshake's authenticated web application with its documented APIs.
The first analytical target is the relationship between a job posting and Handshake's attached job-role-group classification, so the first two EDU API resources are deliberately kept as separate raw tables keyed by
job_id:/jobs/job_role_groupsThe public job-detail URL is exposed separately and is not treated as the EDU API.
Surface reconciliation
The initial draft named seven holes. Six are resolvable with surfaces already present in current Idriç or small client-local logic:
String/pack/unpackSystem.File.readFile/jobsJSON decodingLanguage.JSON.parse,JSON,lookup/job_role_groupsJSON decodingSystem.getEnv : ... → Maybe StringHANDSHAKE_EDU_API_KEYx-api-keyx-api-keyredirect semanticsIdriç #67 is separately restoring the stricter project-level
environment_valuehelper after the source-layout change. Handshake does not need to block on it because currentSystem.getEnvalready supplies the requiredMaybe Stringresult for this one fixed valid variable name.JSON boundary
Current Idriç already ships
Language.JSONin contrib, so this PR does not carry a private JSON grammar.Language.JSON.parseproduces structural JSON values (JNull,JBoolean,JNumber,JString,JArray,JObject) and object lookup is already public.Only fields needed for the two raw output tables are decoded into Handshake records. Unrelated fields remain parsed JSON and are ignored rather than searched textually.
Language.JSONrepresents JSON numbers asDouble. Required identifier fields are accepted only when the parsed number converts back to the same integral value. If Handshake ever emits identifiers beyond that surface's exactly representable integer range, that is a genuine decoding-surface limitation and should stay explicit rather than be hidden here.Synthetic fixtures only; no private payloads are committed.
Genuine remaining network dependency
Current merged ICU/Idric-Net does not expose the combined caller-header + captured-response path this client needs.
The pending ICU stack is closer than that sentence alone suggests:
fetch_to_files_with_headers.So header construction and response capture are not missing inventions anymore.
The remaining blocker is credential semantics on redirects. ICU #13 intentionally strips
AuthorizationandCookiewhen a redirect changes scheme, host, or port, while preserving unrelated custom headers. Current Idric-Net'sclassify_headermakes the same name-based distinction. Handshake's credential is namedx-api-key, so using that pending generic path as-is could forward the EDU key to a cross-origin redirect target.That gap is tracked as
dilapidated-shed/icu#19: allow a caller to declare an arbitrary header credential-sensitive (or provide an equivalent policy), so same-origin redirects may retain it while cross-origin redirects strip it.edu_icu_gettherefore remains an explicit fail-closed boundary. It does not substitute curl, Python, browser cookies, or a Handshake-specific socket path.Commands
The two fixture commands are offline acceptance paths.
jobsandrolesrequireHANDSHAKE_EDU_API_KEY; missing and empty keys are separate refusal cases. A present key currently reaches the explicit ICU credential-policy dependency boundary.Acceptance
checkpoints/handshake/checkcompiles an executable and checks:.github/workflows/handshake-idric.ymlruns that checkpoint against the currentisomorphisms/IdricIdriçbranch and exposes the current contrib TTC path forLanguage.JSON.Intentional limits
/jobsand/job_role_groupsobservations stay separate;