trackly-cli 0.13.4 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -5
- package/bin/trackly +10 -6
- package/contracts/trackly-apply-contract-history.json +8 -1
- package/contracts/trackly-apply-tools.json +15 -4
- package/docs/trackly-tools.md +12 -0
- package/lib/agent.js +2 -2
- package/lib/apply-tab-set.js +124 -0
- package/lib/apply-upload.js +66 -0
- package/lib/client.js +194 -8
- package/mcp/analytics.js +903 -0
- package/mcp/apply-tools.js +322 -8
- package/mcp/server.js +123 -8
- package/npm-shrinkwrap.json +56 -3
- package/package.json +4 -2
- package/server.json +2 -2
- package/skills/trackly-apply/SKILL.md +12 -4
- package/skills/trackly-apply/references/batch-orchestration.md +34 -0
- package/skills/trackly-apply/references/browser-lifecycle.md +14 -0
- package/skills/trackly-apply/references/browser-upload.md +40 -8
- package/skills/trackly-apply/references/review-handoff.md +87 -0
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trackly-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "trackly-cli",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.14.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
13
|
+
"@posthog/mcp": "0.11.0",
|
|
13
14
|
"fast-uri": "3.1.5",
|
|
14
15
|
"hono": "4.13.0",
|
|
15
16
|
"ip-address": "10.4.0",
|
|
17
|
+
"posthog-node": "5.48.1",
|
|
16
18
|
"zod": "^3.23.0"
|
|
17
19
|
},
|
|
18
20
|
"bin": {
|
|
@@ -23,7 +25,7 @@
|
|
|
23
25
|
"acorn": "8.18.0"
|
|
24
26
|
},
|
|
25
27
|
"engines": {
|
|
26
|
-
"node": ">=
|
|
28
|
+
"node": "^20.20.0 || >=22.22.0"
|
|
27
29
|
}
|
|
28
30
|
},
|
|
29
31
|
"node_modules/@babel/helper-string-parser": {
|
|
@@ -128,6 +130,37 @@
|
|
|
128
130
|
}
|
|
129
131
|
}
|
|
130
132
|
},
|
|
133
|
+
"node_modules/@posthog/core": {
|
|
134
|
+
"version": "1.46.9",
|
|
135
|
+
"resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.46.9.tgz",
|
|
136
|
+
"integrity": "sha512-EXO6y5ih+jBkTCpUCuYgQmajuDZuvy6vMvflkub6pLQyi0GPlCPWVSvZZkOeQw9e2MxoD5GteeGCt9R8+UJ/yQ==",
|
|
137
|
+
"license": "MIT",
|
|
138
|
+
"dependencies": {
|
|
139
|
+
"@posthog/types": "^1.402.2"
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"node_modules/@posthog/mcp": {
|
|
143
|
+
"version": "0.11.0",
|
|
144
|
+
"resolved": "https://registry.npmjs.org/@posthog/mcp/-/mcp-0.11.0.tgz",
|
|
145
|
+
"integrity": "sha512-wxvIvx2/MuXqDH9Zy99hqop6Hyhymn8aoh7e7wYOH3AUdeohZhom2W8E2UDgBO63eR/vm8QGH/fidyA6H+KNyA==",
|
|
146
|
+
"license": "MIT",
|
|
147
|
+
"dependencies": {
|
|
148
|
+
"@posthog/core": "^1.46.9"
|
|
149
|
+
},
|
|
150
|
+
"engines": {
|
|
151
|
+
"node": "^20.20.0 || >=22.22.0"
|
|
152
|
+
},
|
|
153
|
+
"peerDependencies": {
|
|
154
|
+
"@modelcontextprotocol/sdk": ">=1.26.0",
|
|
155
|
+
"posthog-node": "^5.0.0"
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"node_modules/@posthog/types": {
|
|
159
|
+
"version": "1.402.2",
|
|
160
|
+
"resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.402.2.tgz",
|
|
161
|
+
"integrity": "sha512-ZZTiS4dLwF4/D0YTzS3gGSLFnhuNOY5yu4d9VGS9trGe5GW6FjIXo20p18K5BPW2RZSYSld8sdnSAY3AUXleUQ==",
|
|
162
|
+
"license": "MIT"
|
|
163
|
+
},
|
|
131
164
|
"node_modules/accepts": {
|
|
132
165
|
"version": "2.0.0",
|
|
133
166
|
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
|
|
@@ -909,6 +942,26 @@
|
|
|
909
942
|
"node": ">=16.20.0"
|
|
910
943
|
}
|
|
911
944
|
},
|
|
945
|
+
"node_modules/posthog-node": {
|
|
946
|
+
"version": "5.48.1",
|
|
947
|
+
"resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.48.1.tgz",
|
|
948
|
+
"integrity": "sha512-BxLX2SqGEQhPqCPTalpyo0RRv1NMbf7UaN7q9d/ED77ksD6XOmE7ko2vIKO8F0zPL1NtKxIi+DYXap9lvR0RaA==",
|
|
949
|
+
"license": "MIT",
|
|
950
|
+
"dependencies": {
|
|
951
|
+
"@posthog/core": "^1.46.9"
|
|
952
|
+
},
|
|
953
|
+
"engines": {
|
|
954
|
+
"node": "^20.20.0 || >=22.22.0"
|
|
955
|
+
},
|
|
956
|
+
"peerDependencies": {
|
|
957
|
+
"rxjs": "^7.0.0"
|
|
958
|
+
},
|
|
959
|
+
"peerDependenciesMeta": {
|
|
960
|
+
"rxjs": {
|
|
961
|
+
"optional": true
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
},
|
|
912
965
|
"node_modules/proxy-addr": {
|
|
913
966
|
"version": "2.0.7",
|
|
914
967
|
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trackly-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"mcpName": "io.github.trackly-app/trackly",
|
|
5
5
|
"description": "AI job search CLI + hosted MCP server with OAuth. 170K+ jobs, 3,800+ companies, 40+ ATS. Works with Claude, ChatGPT, Cursor, Windsurf, Codex via hosted streamable-http or local stdio.",
|
|
6
6
|
"bin": {
|
|
@@ -63,13 +63,15 @@
|
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
66
|
+
"@posthog/mcp": "0.11.0",
|
|
66
67
|
"fast-uri": "3.1.5",
|
|
67
68
|
"hono": "4.13.0",
|
|
68
69
|
"ip-address": "10.4.0",
|
|
70
|
+
"posthog-node": "5.48.1",
|
|
69
71
|
"zod": "^3.23.0"
|
|
70
72
|
},
|
|
71
73
|
"engines": {
|
|
72
|
-
"node": ">=
|
|
74
|
+
"node": "^20.20.0 || >=22.22.0"
|
|
73
75
|
},
|
|
74
76
|
"overrides": {
|
|
75
77
|
"@hono/node-server": "2.0.12",
|
package/server.json
CHANGED
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
]
|
|
18
18
|
}
|
|
19
19
|
],
|
|
20
|
-
"version": "0.
|
|
20
|
+
"version": "0.14.1",
|
|
21
21
|
"packages": [
|
|
22
22
|
{
|
|
23
23
|
"registryType": "npm",
|
|
24
24
|
"identifier": "trackly-cli",
|
|
25
|
-
"version": "0.
|
|
25
|
+
"version": "0.14.1",
|
|
26
26
|
"runtimeHint": "npx",
|
|
27
27
|
"runtimeArguments": [
|
|
28
28
|
{
|
|
@@ -27,7 +27,7 @@ references define the server-frozen batch, grouped-question, tab-reconciliation,
|
|
|
27
27
|
and missing-surface recovery contract; they are mandatory even for a one-job batch.
|
|
28
28
|
Read [references/legal-clarifications.md](references/legal-clarifications.md) when a form asks for a legal, regulatory, consent, or employer-relationship decision.
|
|
29
29
|
|
|
30
|
-
1. Call `trackly_get_apply_protocol`. Skill 4.
|
|
30
|
+
1. Call `trackly_get_apply_protocol`. Skill 4.5.0 requires protocol 3.6.0 or newer for new reliability work. Protocol 3.2 remains valid only for an already-active explicit legacy single run; an already-active explicit 3.2 single run may finish through its legacy path. Preserve the protocol's documented recovery paths for already-active older work. Require `compatibleSkillMajor: 4` and `compatibleSkillMinimumVersion` no newer than this installed skill. Reject an older or incompatible version for new work and report that the backend must finish updating or `trackly agent setup` must update the skill. Protocol 3.2 added exact-origin trust for jobs Trackly ingested directly from employer careers sources; do not recreate the retired ownership-timestamp gate in the client.
|
|
31
31
|
2. Call `trackly_get_profile_onboarding` or fetch both the profile schema and application profile. When present, render `schema.screens` in ascending `order` as one grouped question packet per screen. Within a screen, preserve category `order` and then field `order`; use each field's user-facing `rationale` when the user asks why it is needed. Ask only unknown or confirmation-needed fields and honor `consistencyRules` before submitting profile changes, resolving contradictions with the user instead of guessing. When `schema.screens` is absent on a legacy backend, fall back to the existing category-based onboarding behavior. Treat `completeness.percent` as required onboarding readiness only. Use `coverage.missingReusableKeys` to explain reusable optional gaps, while `coverage.contextualKeys` are intentionally asked only on the relevant employer form. Do not claim that 100% required completeness answers every possible application question.
|
|
32
32
|
3. Save answers with `trackly_update_application_profile`:
|
|
33
33
|
- Use `answered`, `intentionally_blank`, `declined`, or `unknown` exactly.
|
|
@@ -44,7 +44,9 @@ Read [references/legal-clarifications.md](references/legal-clarifications.md) wh
|
|
|
44
44
|
- Use `writing.em_dash_policy` and `writing.optional_question_policy` when the fetched schema exposes them. An unanswered em-dash policy fails closed to `forbid` for form writing.
|
|
45
45
|
- Infer a direct prior-employer answer of No only when the profile explicitly marks history complete, the target and backend-confirmed aliases are absent, and the question is limited to direct employment. Ask for subsidiary, affiliate, acquisition, contractor, or otherwise ambiguous relationships.
|
|
46
46
|
4. Require the one-time profile confirmation, complete education entries, and default-resume metadata before browser work. Do not prepare or upload the resume when the form has no attachment control.
|
|
47
|
-
5. For every protocol 3.4 or newer request, call `trackly_get_active_apply_execution` before legacy recovery. Resume execution work only when the response says `active: true`. A response with `preserved: true` and `active: false` exposes a stopped, closed, or otherwise terminal execution only for read-only reconciliation. Never fetch its compact snapshot, continue its wave, mutate its members, or interpret historical `currentlyFilling` or reservation counts as current work; require `progress.nextAction: none`. Only with protocol 3.5 or newer and an enabled compact-snapshot capability may an active recovery or new execution call `trackly_get_apply_execution_snapshot`, using only the current member IDs, profile keys needed by the visible forms, and actual browser surface. An already-active protocol 3.4 execution is read-only legacy recovery: use only its published get or stop operations, never call the 3.5-only snapshot, resume, approval, advance, or disposition tools, and never mutate its browser forms. For protocol 3.5 or newer, treat snapshot `mutable` and `allowedOperations` values as authoritative. Never mutate or reopen authentication, account-creation, OTP, pre-form-CAPTCHA, or manual-only members. Only an explicit user request may call `trackly_resume_parked_apply_member`; the returned member still requires a fresh non-mutating probe before private data or form mutation. Resume unresolved waves in ascending order only for `active: true` and obey the server `nextAction` and funnel. Never reconstruct progress or choose replacements locally.
|
|
47
|
+
5. For every protocol 3.4 or newer request, call `trackly_get_active_apply_execution` before legacy recovery. Resume execution work only when the response says `active: true`. A response with `preserved: true` and `active: false` exposes a stopped, closed, or otherwise terminal execution only for read-only reconciliation. Never fetch its compact snapshot, continue its wave, mutate its members, or interpret historical `currentlyFilling` or reservation counts as current work; require `progress.nextAction: none`. Only with protocol 3.5 or newer and an enabled compact-snapshot capability may an active recovery or new execution call `trackly_get_apply_execution_snapshot`, using only the current member IDs, profile keys needed by the visible forms, and actual browser surface. An already-active protocol 3.4 execution is read-only legacy recovery: use only its published get or stop operations, never call the 3.5-only snapshot, resume, approval, advance, or disposition tools, and never mutate its browser forms. For protocol 3.5 or newer, treat snapshot `mutable` and `allowedOperations` values as authoritative. Never mutate or reopen authentication, account-creation, OTP, pre-form-CAPTCHA, or manual-only members. Only an explicit user request may call `trackly_resume_parked_apply_member`; the returned member still requires a fresh non-mutating probe before private data or form mutation. Resume unresolved waves in ascending order only for `active: true` and obey the server `nextAction` and funnel. Never reconstruct progress or choose replacements locally. Treat backend `achievementCount`, target-capped `completed`, `targetReached`, and `nextAction` as authoritative. `durablyReviewReady` and `submitted` remain current operator projections and must never be added together by the client to reconstruct cumulative completion. Let the backend own reservations, capacity, attempted-job deduplication, immutable waves, and advancement. Continue until `targetReached`, `queueExhausted`, a blocking `nextAction`, or the user stops.
|
|
48
|
+
- After full local context loss with no active execution, call `trackly_list_recoverable_apply_executions`. For every distinct returned `jobId`, call `trackly_get_job`, bind that Trackly-owned job record to the returned `candidateId`, and show the user its company, role, requisition identity when available, and source-execution identity; do not identify candidates from chat, tab order, search results, or page copy. A missing or mismatched Trackly job record blocks confirmation. Require explicit confirmation of one exact candidate set, then call `trackly_recover_exact_apply_members` with that source execution, snapshot hash, and only those candidate IDs. Verify `assertedCandidateIds`, `eligibleCandidateIds`, and the eligibility candidate IDs each contain exactly the confirmed set with no duplicates. Never add substitutes, newly saved jobs, or merely similar roles.
|
|
49
|
+
- Exact recovery restores server lineage only. Treat tab restored, form state restored, and mutation authority restored as three independent receipts. Bind every recovered surface with a fresh recovery binding and inspection epoch, revalidate the full form, and preserve every user-edited or unknown non-empty value before any write. Earlier-epoch browser, field, upload, integrity, and submission evidence cannot authorize the recovered form.
|
|
48
50
|
- Every compact snapshot request must contain a non-empty list of only the current member IDs. Never request an empty or inferred all-members projection.
|
|
49
51
|
- Recover every entry in `execution.unresolvedWaves` in ascending `waveOrder`; `currentWave` identifies only the latest scheduling wave, not the complete recovery set.
|
|
50
52
|
- Immediately consume the start response's authoritative `progress` and `nextAction`; do not issue a speculative advance first.
|
|
@@ -69,7 +71,7 @@ Read [references/legal-clarifications.md](references/legal-clarifications.md) wh
|
|
|
69
71
|
- For each fixed batch member, preserve an explicit job ID -> application run ID -> browser tab mapping. Complete the full start -> conditional resume preparation/confirmation/verification when an upload control exists -> form completion -> `review_ready` lifecycle for every member. A review-ready run does not block the next member. Never submit any of them.
|
|
70
72
|
6. When the selected job or current fixed batch member has no `runId`, call `trackly_start_apply_run` with the complete `batchId`, `memberId`, `expectedMemberVersion`, `expectedInspectionEpoch`, and `leaseToken` returned by Trackly. This is the sanctioned idempotent lookup for a recovered member whose `runId` is absent; call it with the exact recovered binding and Trackly will reuse the bound active run. When the member already has a `runId`, do not call `trackly_start_apply_run` in this or any subsequent start step: reuse that exact run and bind or recover its browser surface through `trackly_bind_apply_surface` as required. Never create a replacement run because browser control was interrupted.
|
|
71
73
|
- If a bound start returns a transport failure, a non-access HTTP 5xx response, or an error explicitly marked `retryable: true`, preserve the frozen member and browser state. Refetch the active batch, renew its lease, and retry the same complete binding once. Classify the retry response independently with these same rules: route canonical `maintenance_mode` or legacy `planned_maintenance` directly through **Resume after maintenance**; surface controlled-access/request errors marked `retryable: false` and every other HTTP 4xx response unchanged; only a second transport failure, non-access HTTP 5xx response, or explicitly retryable error becomes `backend_run_start_unavailable`. Route maintenance on either attempt without consuming or relabeling the retry, and never relabel a permanent retry response as an outage. For `backend_run_start_unavailable`, continue other members and report a Trackly control-plane failure. Do not call `trackly_checkpoint_apply_batch` for this condition because start failure has not produced the required run ID. The unchanged frozen member is the durable resume point. Never switch that frozen member to an unbound legacy run or blame the employer form.
|
|
72
|
-
- Require `run.protocolVersion` to be 3.1.0 or newer and to share protocol major 3 with the fetched protocol. A new reliability execution member requires 3.
|
|
74
|
+
- Require `run.protocolVersion` to be 3.1.0 or newer and to share protocol major 3 with the fetched protocol. A new reliability execution member requires 3.6.0 or newer; already-active older work may use only the recovery path published by its fetched protocol. Never continue a pre-evidence 3.0.x run under skill 4.5.0. Preserve that run instead of starting a replacement, record it `blocked` with a value-free protocol-upgrade reason when possible, and tell the user the saved job can be retried only after the stale run is cleared through Trackly's supported lifecycle. Stop and refetch the protocol and active execution or batch if support level, execution mode, provider, required scenarios, authorized origin policy, member version, or inspection epoch changes after run creation.
|
|
73
75
|
- In guided mode, inspect the page before preparing any resume bytes. Confirm the employer, role, HTTPS origin, reachable review path, semantic controls, whether an attachment control exists, and absence of a credential, verification, CAPTCHA, or submit-only wall. A missing file input is not itself a blocker; skip the resume path when the application has no attachment control. Any other failed precondition is an execution blocker, not permission to improvise.
|
|
74
76
|
7. Pass the browser readiness gate before preparing resume bytes:
|
|
75
77
|
- Use semantic browser control through Codex in-app browser controls, Chrome MCP/extension browser control, or Claude in Chrome.
|
|
@@ -79,7 +81,7 @@ Read [references/legal-clarifications.md](references/legal-clarifications.md) wh
|
|
|
79
81
|
- After a handoff, context resume, or browser-control interruption, reclaim and re-verify every mapped tab before continuing.
|
|
80
82
|
- Report `observationType: browser_ready` for the current run with the exact current `batchId`, `memberId`, and `inspectionEpoch`, plus `scenarioCode: browser_reclaim`, the allowed `browserSurface`, `committed: true`, and that `browserBindingHash`. Do not call `trackly_prepare_resume` until this same-run attestation succeeds. When preparation is permitted, bind it to the exact run ID, browser surface, and browser binding hash. Accessibility may provide an independent verification signal, but coordinate-only clicking is forbidden for form completion.
|
|
81
83
|
- If the semantic browser bridge is unavailable, preserve every existing run and tab mapping, record the blocker when possible, and stop before any upload or form mutation.
|
|
82
|
-
8. If and only if the application offers or requires a resume attachment, read [references/browser-upload.md](references/browser-upload.md). For an accessible execution, call `trackly_approve_apply_execution_resume` once after the user approves the exact unchanged resume and original snapshot. Reuse only that content approval within the unchanged execution. For every run, still call `trackly_prepare_resume` with the exact run ID, browser surface, and binding hash and immediately verify the exact path, hash, size, and expiration before upload. If hosted MCP reports local preparation unavailable, use local Trackly MCP or manual upload. If no attachment control exists, skip steps 8–11 and do not report `resume_upload` as exercised.
|
|
84
|
+
8. If and only if the application offers or requires a resume attachment, read [references/browser-upload.md](references/browser-upload.md). For an accessible execution, call `trackly_approve_apply_execution_resume` once after the user approves the exact unchanged resume and original snapshot. Reuse only that content approval within the unchanged execution. For every run, still call `trackly_prepare_resume` with the exact run ID, browser surface, and binding hash and immediately verify the exact path, hash, size, and expiration before upload. Require the browser upload capability gate and the local `trackly_validate_apply_resume_upload` stage proof before claiming attachment success. If hosted MCP reports local preparation unavailable, use local Trackly MCP or manual upload. If no attachment control exists, skip steps 8–11 and do not report `resume_upload` as exercised.
|
|
83
85
|
9. Preserve the user’s filename returned by `trackly_prepare_resume`. Internal cache identifiers belong only in private parent directories and must never appear in the employer-facing upload filename.
|
|
84
86
|
10. Before any upload, let the user inspect the exact prepared file returned by `trackly_prepare_resume`:
|
|
85
87
|
- Prefer an inline visual preview. Otherwise open the exact local file in Quick Look or Preview.app.
|
|
@@ -138,6 +140,12 @@ Every required scenario and both universal evidence scenarios must have correspo
|
|
|
138
140
|
|
|
139
141
|
## Review handoff
|
|
140
142
|
|
|
143
|
+
After context loss, call `trackly_list_apply_review_handoffs` for the execution
|
|
144
|
+
before interpreting any grouped submission statement. Use the named receipt or
|
|
145
|
+
the sole active receipt returned by Trackly; if multiple receipts remain, ask
|
|
146
|
+
the user to identify the intended group. Never guess a receipt from tabs or
|
|
147
|
+
chat history.
|
|
148
|
+
|
|
141
149
|
After every conditional field is settled and all other review gates pass, bulk checkpoint every ready member with `review/manual_submit`, the current unchanged inspection epoch in both epoch fields, and any `resolvedActionIds`. Use the returned member versions and epochs; this checkpoint resolves the listed human actions and moves the durable member lifecycle to `review_ready` without invalidating current-epoch browser evidence or an unchanged resume-content approval. Do not wait for `needs_input` members: whenever at least one member is durably `review_ready`, ask for one explicit final truthfulness confirmation for the exact complete subset that is currently `review_ready`. If any form in that certified subset used a resume attachment, certify with `resumeDependency: approved` and the exact approved resume identity. If no form in the subset exposes a resume control, certify with `resumeDependency: not_applicable` and omit the resume ID and hash; do not invent an upload requirement. Then call `trackly_record_application_outcomes` once with every member in that certified subset using its exact current `runId`, `batchId`, `memberId`, `inspectionEpoch`, and `leaseToken`; every item must use the literal `outcome: review_ready`. Verify every recorded run returns `awaiting_manual_submit` before showing the review handoff. A member conflict does not invalidate successful siblings: preserve its tab, refresh that member once, and surface the returned stable conflict code instead of blindly replaying a different transition. A member that becomes ready later requires a fresh certification for the then-current complete `review_ready` subset; never reuse an older certification for it. Use singular `trackly_record_application_outcome` only for a legacy single run or an isolated post-review transition. Use the normal review block in [references/review-handoff.md](references/review-handoff.md) only after documented visibility proof for the exact review tab succeeds. If visibility is unverified, preserve the tab, use the separate visibility-unverified block, and do not tell the user to submit until the tab is reclaimed and visibly proven. For a single run, keep the browser on the final review state and stop. For a frozen batch, preserve every review-ready tab, hand off each certified review-ready subset without waiting on unrelated human actions, and continue the same lifecycle for the remaining mapped members. Members with unresolved actions stay frozen and resumable. Never submit any member. End with job ID -> run ID -> browser tab -> ATS -> status plus the actual scenario coverage for each run.
|
|
142
150
|
|
|
143
151
|
After the user submits manually:
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
# Batch orchestration
|
|
2
2
|
|
|
3
3
|
Protocol 3.4 adds a server-owned Apply execution above immutable child batches.
|
|
4
|
+
Protocol 3.6 adds exact-member recovery after local context loss and scoped
|
|
5
|
+
review-handoff reconciliation.
|
|
6
|
+
After context loss, rediscover active handoff receipts with
|
|
7
|
+
`trackly_list_apply_review_handoffs`; never reconstruct or guess a handoff ID
|
|
8
|
+
from chat history, tab order, or application similarity.
|
|
4
9
|
The execution is the target-completion ledger; each child batch remains the
|
|
5
10
|
auditable browser-work unit. Protocol 3.3 fixed batches and protocol 3.2 single
|
|
6
11
|
runs remain recovery-only compatibility paths.
|
|
@@ -57,6 +62,35 @@ its top-level `response.batchId`. Never guess across those response shapes. If
|
|
|
57
62
|
the applicable field is null or `unresolvedWaves` is empty, follow
|
|
58
63
|
`response.progress.nextAction` rather than guessing a prior batch.
|
|
59
64
|
|
|
65
|
+
## Exact recovery after local context loss
|
|
66
|
+
|
|
67
|
+
When no active execution exists but unfinished lineage may still be retained,
|
|
68
|
+
call `trackly_list_recoverable_apply_executions`. The returned source snapshot
|
|
69
|
+
and candidates are the complete bounded recovery menu. Resolve every distinct
|
|
70
|
+
returned `jobId` through `trackly_get_job`, bind that Trackly-owned record to
|
|
71
|
+
its `candidateId`, and present its company, role, requisition identity when
|
|
72
|
+
available, and source execution to the user. A missing or mismatched Trackly
|
|
73
|
+
job record blocks confirmation. Require explicit confirmation of the exact
|
|
74
|
+
candidate set. Never infer the set from browser tabs, conversation memory,
|
|
75
|
+
search results, page copy, employer similarity, or queue position.
|
|
76
|
+
|
|
77
|
+
Call `trackly_recover_exact_apply_members` with one source execution, its exact
|
|
78
|
+
snapshot hash, the confirmed candidate IDs, and a fresh idempotency key. The
|
|
79
|
+
response may never replace candidates. Verify that `assertedCandidateIds`,
|
|
80
|
+
`eligibleCandidateIds`, and the eligibility candidate IDs each contain exactly
|
|
81
|
+
the user-confirmed set with no duplicates before browser work.
|
|
82
|
+
|
|
83
|
+
Recovery has three independent proof dimensions:
|
|
84
|
+
|
|
85
|
+
1. the exact browser tab was restored;
|
|
86
|
+
2. the employer form state was restored or safely reconstructed; and
|
|
87
|
+
3. Trackly granted current mutation authority.
|
|
88
|
+
|
|
89
|
+
Never let one imply another. Rebind each recovered surface, accept the new
|
|
90
|
+
inspection epoch, inventory the form, preserve every user-edited and unknown
|
|
91
|
+
non-empty field, and rerun required integrity evidence. All prior-epoch
|
|
92
|
+
browser, upload, field, review, and submission evidence is stale.
|
|
93
|
+
|
|
60
94
|
## Replace an obsolete fixed batch
|
|
61
95
|
|
|
62
96
|
An active legacy fixed batch and a new accessible execution are mutually
|
|
@@ -92,6 +92,13 @@ Before resuming, handing off, or closing a tab:
|
|
|
92
92
|
5. Reclaim a matching tab only after employer, role, requisition, HTTPS origin,
|
|
93
93
|
ATS tenant when applicable, run ID, and browser binding all revalidate.
|
|
94
94
|
|
|
95
|
+
Immediately before a session-finalizer call, pass the complete expected and
|
|
96
|
+
keep sets plus complete controller and user inventories through
|
|
97
|
+
`trackly_validate_apply_tab_keep_set`. Continue only when it returns
|
|
98
|
+
`safeToFinalize: true`. This helper is a local validator, not a browser
|
|
99
|
+
controller: it does not discover, focus, close, hand off, or finalize tabs.
|
|
100
|
+
Unrelated tabs may remain in the inventories. Raw tab IDs stay local.
|
|
101
|
+
|
|
95
102
|
For every initial tab and every recovery, call `trackly_bind_apply_surface`
|
|
96
103
|
with the existing frozen member and run. Use `initial_binding` for the first
|
|
97
104
|
surface and `recovery_binding` after a missing tab or handoff. The returned URL
|
|
@@ -253,6 +260,13 @@ When an incomplete member's tab is missing:
|
|
|
253
260
|
revalidate the exact requisition before recording any outcome and never
|
|
254
261
|
activate Submit again.
|
|
255
262
|
|
|
263
|
+
When protocol 3.6 exact-member recovery created the current execution, prove
|
|
264
|
+
three facts separately in the operator receipt: whether the tab was restored,
|
|
265
|
+
whether the employer form state was restored or reconstructed, and whether
|
|
266
|
+
current mutation authority was reacquired. A recovered tab alone never grants
|
|
267
|
+
write authority. A recovered server member alone never proves the draft or tab
|
|
268
|
+
survived.
|
|
269
|
+
|
|
256
270
|
If the recovered origin or identity differs, semantic controls are
|
|
257
271
|
unobservable, or access is blocked by credentials or a pre-form challenge,
|
|
258
272
|
stop private-data mutation and create the appropriate human action. Continue
|
|
@@ -1,11 +1,43 @@
|
|
|
1
|
-
# Browser upload
|
|
1
|
+
# Browser upload
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Resume approval proves the content the user authorized. Attachment proof proves
|
|
4
|
+
that the browser committed that exact file. Neither fact substitutes for the
|
|
5
|
+
other.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
2. Open its file chooser through the browser adapter.
|
|
7
|
-
3. Use the adapter's advertised `setFiles` capability with the immediately verified local path.
|
|
8
|
-
4. Verify the employer-facing filename exactly matches the prepared user-facing filename and contains no cache identifier.
|
|
9
|
-
5. Recheck contact and parser-modified fields after the upload settles.
|
|
7
|
+
## Capability gate
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
Before opening a file chooser, require the active browser adapter to advertise
|
|
10
|
+
all five capabilities: semantic control discovery, chooser arming, file
|
|
11
|
+
attachment, committed-filename inspection, and parser-field recheck. If any is
|
|
12
|
+
missing, fail closed before opening the chooser and hand the upload to the user. Never
|
|
13
|
+
navigate to a `file://` URL or paste a local path into an ordinary text field.
|
|
14
|
+
|
|
15
|
+
Perform these stages in exact order:
|
|
16
|
+
|
|
17
|
+
1. identify the exact semantic Resume or CV control;
|
|
18
|
+
2. arm the file chooser before clicking that control;
|
|
19
|
+
3. prove the chooser opened;
|
|
20
|
+
4. run `trackly_verify_prepared_resume`, then immediately attach that verified
|
|
21
|
+
file through the adapter's documented file-setting primitive;
|
|
22
|
+
5. verify the employer-facing filename committed; and
|
|
23
|
+
6. recheck every contact, employment, education, and other field that resume
|
|
24
|
+
parsing may have changed.
|
|
25
|
+
|
|
26
|
+
Pass only the value-free stage outcomes to
|
|
27
|
+
`trackly_validate_apply_resume_upload`. Do not pass a filename, local path,
|
|
28
|
+
resume hash, form value, URL, page text, or tab identifier. Claim attachment
|
|
29
|
+
success only when it returns `safeToClaimAttachment: true`.
|
|
30
|
+
|
|
31
|
+
Stable failure codes include capability unavailable, ambiguous control,
|
|
32
|
+
chooser timeout, chooser opened without a commit, missing or expired file,
|
|
33
|
+
file-setting failure, uncommitted filename, unexpected file navigation,
|
|
34
|
+
unsettled parser, and parser-field regression. A failure is a handoff or retry
|
|
35
|
+
decision, never permission to guess another control or weaken verification.
|
|
36
|
+
|
|
37
|
+
Snapshot field provenance immediately before upload. Mark parser changes as
|
|
38
|
+
`parser_filled`; preserve a later user edit byte-for-byte. After ledger loss,
|
|
39
|
+
preserve every unknown non-empty value. Never let parser rechecks or the final
|
|
40
|
+
required-field sweep overwrite user-owned or unknown external values.
|
|
41
|
+
|
|
42
|
+
The employer-facing filename must remain the user's confirmed filename.
|
|
43
|
+
Random cache identifiers may appear only in private parent directories.
|
|
@@ -15,6 +15,53 @@ Funnel: target=; ready=; submitted=; filling=; awaitingAnswer=; authParked=; exc
|
|
|
15
15
|
|
|
16
16
|
Use the compact execution snapshot as authority. Give a bounded next-update estimate, not an invented overall completion time.
|
|
17
17
|
|
|
18
|
+
## Deterministic operator receipts
|
|
19
|
+
|
|
20
|
+
Every handoff names the browser surface and authoritative funnel. Use the
|
|
21
|
+
matching template; do not improvise internal routing language.
|
|
22
|
+
|
|
23
|
+
### Recovery
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
Recovery in progress — not submitted
|
|
27
|
+
Completed: exact Trackly source and user-confirmed candidate set recovered
|
|
28
|
+
Tab restored: yes/no
|
|
29
|
+
Form state restored: yes/no
|
|
30
|
+
Current mutation authority: yes/no
|
|
31
|
+
Unresolved:
|
|
32
|
+
Your next action: wait / inspect / answer
|
|
33
|
+
Resume: exact approved resume / no attachment / manual upload required
|
|
34
|
+
Browser surface:
|
|
35
|
+
Funnel:
|
|
36
|
+
My next action:
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Upload requires the user
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
Application preserved — resume upload requires you
|
|
43
|
+
Completed:
|
|
44
|
+
Unresolved: browser surface cannot prove the required attachment stages
|
|
45
|
+
Your next action: attach the exact approved resume and confirm the committed filename
|
|
46
|
+
Resume: exact approved resume
|
|
47
|
+
Browser surface:
|
|
48
|
+
Funnel:
|
|
49
|
+
My next action: recheck parser-modified fields, finish integrity sweep, stop at review
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Submission reconciled
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
Submission confirmed and reconciled
|
|
56
|
+
Completed: success evidence recorded; member=submitted; job=applied_confirmed
|
|
57
|
+
Unresolved: tab cleanup pending / none
|
|
58
|
+
Your next action: none
|
|
59
|
+
Resume: exact approved resume / no attachment
|
|
60
|
+
Browser surface:
|
|
61
|
+
Funnel:
|
|
62
|
+
My next action: verify authorized tab disposition only
|
|
63
|
+
```
|
|
64
|
+
|
|
18
65
|
## Approval scope receipt
|
|
19
66
|
|
|
20
67
|
Before persisting a broad statement such as “always,” show which separate categories it will update: personal facts, consent choices, writing preferences, resume approval, and truthfulness certification. Never let approval of one category authorize another. Consolidate genuinely unknown questions into one packet after filling everything already known. Explain legal terms in plain language using the protocol glossary; do not expose internal action codes or routing labels.
|
|
@@ -141,5 +188,45 @@ open for manual submission, and list remaining human actions separately.
|
|
|
141
188
|
Members that become ready later require a new certification for the exact
|
|
142
189
|
then-current `review_ready` subset.
|
|
143
190
|
|
|
191
|
+
## Group submission reconciliation
|
|
192
|
+
|
|
193
|
+
A broad statement such as “I submitted all of them” applies only to one
|
|
194
|
+
explicit review-handoff receipt. Call `trackly_list_apply_review_handoffs` for
|
|
195
|
+
the execution, then resolve it to the receipt the user names or to the sole
|
|
196
|
+
active receipt returned by Trackly. If multiple receipts could
|
|
197
|
+
match, ask the user to choose; never fan the statement across executions or
|
|
198
|
+
tabs.
|
|
199
|
+
|
|
200
|
+
Inspect every member in the selected receipt and classify exactly one of:
|
|
201
|
+
`detected`, `user_confirmed`, `unresolved`, or `contradictory`. Use
|
|
202
|
+
provider-positive evidence only:
|
|
203
|
+
|
|
204
|
+
- Greenhouse: a same-requisition thank-you page, confirmation route, or
|
|
205
|
+
semantic success state;
|
|
206
|
+
- Ashby: a same-requisition explicit application-success banner or page,
|
|
207
|
+
including when the route does not change; and
|
|
208
|
+
- Lever: a same-requisition confirmation redirect or semantic success state.
|
|
209
|
+
|
|
210
|
+
An unchanged URL or page title is never evidence that submission failed. Build
|
|
211
|
+
any local `DetectedSubmission` only from a versioned provider strategy, the
|
|
212
|
+
handoff/member identity, current inspection epoch, evidence type, confidence,
|
|
213
|
+
and a value-free fingerprint derived from those identifiers. Never hash DOM
|
|
214
|
+
text, URLs, local paths, or raw tab IDs into that record.
|
|
215
|
+
|
|
216
|
+
If a rediscovered receipt is `partially_reconciled`, preserve every member that
|
|
217
|
+
already has a stored reconciliation result and inspect only members whose
|
|
218
|
+
stored result remains `unresolved`. Do not replay the original claim with a
|
|
219
|
+
partial member list: the claim receipt is an immutable exact-set idempotency
|
|
220
|
+
record. Record later positive evidence and submitted outcomes through the
|
|
221
|
+
normal per-member outcome path, naming the receipt and only its unresolved
|
|
222
|
+
members in any follow-up confirmation.
|
|
223
|
+
|
|
224
|
+
Call `trackly_claim_apply_review_handoff` with the exact receipt and a
|
|
225
|
+
classification for every member. Write submission evidence and outcomes only
|
|
226
|
+
for `detected` and `user_confirmed`. Ask one consolidated question containing
|
|
227
|
+
only the `unresolved` members. Preserve every `contradictory` member and its
|
|
228
|
+
tab without an outcome. Refetch and require member `submitted` plus job
|
|
229
|
+
`applied_confirmed` before any authorized closure.
|
|
230
|
+
|
|
144
231
|
Do not include restricted answers in chat unless needed for the user’s review.
|
|
145
232
|
Never include credentials, an OTP, or a CAPTCHA response.
|