trackly-cli 0.16.0 → 0.17.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/bin/trackly +2 -2
- package/contracts/trackly-apply-contract-history.json +9 -0
- package/contracts/trackly-apply-tools.json +16 -3
- package/lib/agent.js +1 -1
- package/lib/formatters.js +106 -2
- package/mcp/apply-tools.js +94 -22
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/trackly-apply/SKILL.md +18 -9
- package/skills/trackly-apply/references/access-probe.md +68 -0
- package/skills/trackly-apply/references/answer-resolution.md +25 -0
- package/skills/trackly-apply/references/application-writing.md +20 -2
- package/skills/trackly-apply/references/browser-upload.md +26 -8
- package/skills/trackly-apply/references/form-integrity.md +22 -0
- package/skills/trackly-apply/references/operational-checkpoints.md +319 -0
- package/skills/trackly-apply/references/performance-telemetry.md +61 -0
- package/skills/trackly-apply/references/review-handoff.md +21 -0
- package/skills/trackly-apply/scripts/validate-phase-checkpoint.js +1068 -0
|
@@ -32,6 +32,23 @@ revision, schema key, scope, authority class, derivation rule when any,
|
|
|
32
32
|
expected type, and committed-control receipt. Never send the answer value in
|
|
33
33
|
an observation.
|
|
34
34
|
|
|
35
|
+
## Typed answer-memory lookup
|
|
36
|
+
|
|
37
|
+
Before asking, query every applicable scope in this narrow-to-broad order:
|
|
38
|
+
run-only live choice, exact question and version, exact office, jurisdiction,
|
|
39
|
+
company, provider, then global. A candidate is reusable only when its canonical
|
|
40
|
+
intent, type, sensitivity, question version when applicable, and permitted
|
|
41
|
+
scope all match. The first compatible narrower answer wins; an answer never
|
|
42
|
+
flows to a broader scope without explicit user confirmation.
|
|
43
|
+
|
|
44
|
+
Question-ontology aliases, semantic retrieval, and form-schema history may
|
|
45
|
+
identify candidate canonical intents, but they are not answer authority. Exact
|
|
46
|
+
typed profile or contextual state must still resolve the value. Fail closed to
|
|
47
|
+
`missing_fact`, `live_consent`, or `forbidden_inference` when intent, type,
|
|
48
|
+
scope, version, or confidence is ambiguous. Record only per-scope counts and a
|
|
49
|
+
lowercase SHA-256 over value-free lookup inputs and decisions; never hash or
|
|
50
|
+
persist labels, answers, page text, or private values in the checkpoint.
|
|
51
|
+
|
|
35
52
|
## Source precedence
|
|
36
53
|
|
|
37
54
|
The current profile revision is the only reusable answer authority. A
|
|
@@ -40,6 +57,14 @@ or cached value is never authority. Resume parsing is a suggestion only: it may
|
|
|
40
57
|
help identify a schema key, but the parser never becomes authority and never
|
|
41
58
|
overwrites an answered profile value or a user-edited control.
|
|
42
59
|
|
|
60
|
+
For a frozen batch, distinguish its frozen profile revision (the audit and
|
|
61
|
+
certification baseline) from the current bounded snapshot projection used to
|
|
62
|
+
resolve visible answers. A later scoped answer may legitimately appear in the
|
|
63
|
+
current projection while the frozen baseline number remains unchanged. Do not
|
|
64
|
+
treat that difference as corruption, do not silently substitute the stale
|
|
65
|
+
baseline value, and do not mutate until the current work receipt authorizes the
|
|
66
|
+
projection and certification behavior.
|
|
67
|
+
|
|
43
68
|
Contact details and addresses must resolve from exact current profile keys.
|
|
44
69
|
Verify their live committed state even when the browser initially displays a
|
|
45
70
|
masked or formatted value.
|
|
@@ -8,7 +8,18 @@ Use this reference for free-text questions such as "Why this company?", motivati
|
|
|
8
8
|
- These fields never block an application run when they are unknown. The user can continue with the plain default style for the current run or use saved style instructions; asking the user to paste a sample is a fallback only when they explicitly want to calibrate before a completed run provides approved text.
|
|
9
9
|
- Only after durable submitted/applied reconciliation, offer once to save one to three of the user's approved free-text answers as the global `writing.voice_sample`. Show which answers would be included, require an explicit yes, and save nothing on silence or ambiguity. Because the field is sensitive, make the offer only with active sensitive-storage consent; otherwise ask for consent first or skip it. If the user chooses to decline a voice sample, save `writing.voice_sample` with state `declined` at global scope and no answer text so the offer is not repeated. The user may also choose intentionally blank style instructions.
|
|
10
10
|
- Treat the sample and preferences as private user data. Never copy them into the public skill, logs, observations, or another user's defaults.
|
|
11
|
-
-
|
|
11
|
+
- When the Humanizer skill is available, run it automatically for every
|
|
12
|
+
supported employer-specific draft before the anti-slop gate. Humanizer is
|
|
13
|
+
mandatory when available; do not wait for the user to remind you. The
|
|
14
|
+
self-contained anti-slop gate remains the mandatory fallback when Humanizer
|
|
15
|
+
is unavailable and the final authority in every environment. Mark Humanizer
|
|
16
|
+
`available` only when the current session exposes the `humanizer` skill and
|
|
17
|
+
its `SKILL.md` can be read. A matching file elsewhere on disk is not runtime
|
|
18
|
+
availability. If either check fails, record `unavailable` and use the fallback.
|
|
19
|
+
- After Humanizer returns, treat the result as a new draft. Discard any earlier
|
|
20
|
+
claim-reference packet, rebuild it against the exact final revision, and run
|
|
21
|
+
deterministic lint only on that same revision. Never reuse a pre-Humanizer
|
|
22
|
+
lint result or claim proof.
|
|
12
23
|
|
|
13
24
|
## Draft from evidence
|
|
14
25
|
|
|
@@ -30,7 +41,14 @@ Before entering the response:
|
|
|
30
41
|
|
|
31
42
|
1. Remove generic praise, inflated claims, vague transitions, boilerplate conclusions, and chatbot phrases.
|
|
32
43
|
2. Rewrite `not just X, but Y`, ornamental rule-of-three lists, and dangling `-ing` clauses unless the user's sample clearly uses them naturally.
|
|
33
|
-
3. Resolve `writing.em_dash_policy`; unanswered defaults to `forbid
|
|
44
|
+
3. Resolve `writing.em_dash_policy`; unanswered defaults to `forbid`, so the
|
|
45
|
+
default output contains no em dash. Build the complete local claim-reference
|
|
46
|
+
packet and set `claimsComplete: true` only after checking the whole draft.
|
|
47
|
+
Call `trackly_lint_application_text` and treat its deterministic lint as a
|
|
48
|
+
blocking gate. Missing claim metadata is a failure, even for an apparently
|
|
49
|
+
claim-free draft. Never enter text with a failed lint result or an unsupported
|
|
50
|
+
claim. `allow_if_voice_sample` requires explicit saved evidence that the
|
|
51
|
+
approved sample uses that punctuation.
|
|
34
52
|
4. Vary sentence length and structure. Avoid a sequence of equally sized, equally formal sentences.
|
|
35
53
|
5. Prefer active verbs, concrete nouns, real numbers, and named examples already supported by the profile.
|
|
36
54
|
6. Read the answer aloud. If it sounds like a press release, generic cover letter, or assistant response, rewrite it.
|
|
@@ -6,11 +6,24 @@ other.
|
|
|
6
6
|
|
|
7
7
|
## Capability gate
|
|
8
8
|
|
|
9
|
-
Before
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
Before an automated upload, require the active browser adapter to advertise all
|
|
10
|
+
five capabilities: semantic control discovery, chooser arming, file attachment,
|
|
11
|
+
committed-filename inspection, and parser-field recheck. If only chooser arming
|
|
12
|
+
or file attachment is unavailable, fail closed before opening the chooser and
|
|
13
|
+
hand the upload to the user only when semantic control discovery,
|
|
14
|
+
committed-filename inspection, and parser-field recheck remain available. If
|
|
15
|
+
any of those three verification capabilities is unavailable, stop the fill as
|
|
16
|
+
unverified; do not route it into `manual_unbound`, claim a passed audit, or
|
|
17
|
+
continue to review. Never navigate to a `file://` URL or paste a local path into
|
|
18
|
+
an ordinary text field.
|
|
19
|
+
|
|
20
|
+
When the user performs that handoff upload, keep it explicitly manual,
|
|
21
|
+
browser-local, and unbound. Record `resumeAudit.mode: manual_unbound`,
|
|
22
|
+
`approval: passed`, `preAttachVerification: not_applicable`, and
|
|
23
|
+
`attachmentCommit: user_confirmed` only for this genuine manual path; do not use
|
|
24
|
+
those values for an agent-performed upload or a failed verifier. Before
|
|
25
|
+
continuing, require `passed` filename verification and parser recheck, then
|
|
26
|
+
prove during the `passed` final sweep that the attachment and filename persist.
|
|
14
27
|
|
|
15
28
|
Perform these stages in exact order:
|
|
16
29
|
|
|
@@ -19,14 +32,19 @@ Perform these stages in exact order:
|
|
|
19
32
|
3. prove the chooser opened;
|
|
20
33
|
4. run `trackly_verify_prepared_resume`, then immediately attach that verified
|
|
21
34
|
file through the adapter's documented file-setting primitive;
|
|
22
|
-
5. verify the employer-facing filename committed;
|
|
35
|
+
5. verify the employer-facing filename committed;
|
|
23
36
|
6. recheck every contact, employment, education, and other field that resume
|
|
24
|
-
parsing may have changed
|
|
37
|
+
parsing may have changed; and
|
|
38
|
+
7. during the final sweep, prove the attachment is still committed and the
|
|
39
|
+
visible filename remains the approved employer-facing filename.
|
|
25
40
|
|
|
26
41
|
Pass only the value-free stage outcomes to
|
|
27
42
|
`trackly_validate_apply_resume_upload`. Do not pass a filename, local path,
|
|
28
43
|
resume hash, form value, URL, page text, or tab identifier. Claim attachment
|
|
29
|
-
success only when it returns `safeToClaimAttachment: true`.
|
|
44
|
+
success only when it returns `safeToClaimAttachment: true`. Record the six
|
|
45
|
+
audited outcomes separately: approval, pre-attach verification, attachment
|
|
46
|
+
commit, filename verification, parser recheck, and final-sweep persistence. A
|
|
47
|
+
single upload-success boolean cannot replace this chain.
|
|
30
48
|
|
|
31
49
|
Stable failure codes include capability unavailable, ambiguous control,
|
|
32
50
|
chooser timeout, chooser opened without a commit, missing or expired file,
|
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
Run this gate after each semantic selection and again across the entire form before review.
|
|
4
4
|
|
|
5
|
+
## Whole-form accounting
|
|
6
|
+
|
|
7
|
+
Create one accounting row for every visible control across every reachable
|
|
8
|
+
step, including optional, repeated, conditional, consent, and attachment
|
|
9
|
+
controls. Each row has one semantic fingerprint and exactly one disposition:
|
|
10
|
+
`filled_exact_profile`, `filled_safe_derivation`, `filled_supported_draft`,
|
|
11
|
+
`preserved_user_edit`, `missing_fact`, `live_consent`,
|
|
12
|
+
`authentication_blocker`, `unobservable_commit`, `unsupported_control`, or
|
|
13
|
+
`not_applicable`. The inventory count must equal committed plus typed
|
|
14
|
+
exceptions, and known omissions must be zero. Reinventory after navigation,
|
|
15
|
+
conditional reveal, resume parsing, validation, and rerender; an earlier
|
|
16
|
+
inventory cannot prove a later form complete.
|
|
17
|
+
|
|
18
|
+
Reconcile education and employment separately against all canonical eligible
|
|
19
|
+
records. Education entries and position-level employment records must be
|
|
20
|
+
accounted for in reverse chronological order. Multiple promotions at one
|
|
21
|
+
employer remain separate positions. Preserve user-owned rows, use only the date
|
|
22
|
+
precision actually stored, and ask when a form requires missing precision;
|
|
23
|
+
never accept a default month or invent promotion, start, or end precision. A
|
|
24
|
+
flattened employer summary or a “most recent roles” subset fails reconciliation.
|
|
25
|
+
Keep only value-free counts and fingerprints in the checkpoint.
|
|
26
|
+
|
|
5
27
|
## Local field ownership
|
|
6
28
|
|
|
7
29
|
Maintain a private local field ledger keyed by execution, run, inspection
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
# Operational checkpoints
|
|
2
|
+
|
|
3
|
+
Use this page as the run card. The detailed references define how to perform
|
|
4
|
+
each action; this page defines when a phase is allowed to advance.
|
|
5
|
+
|
|
6
|
+
## Invariant checklist
|
|
7
|
+
|
|
8
|
+
- Keep the latest explicit target as the hard target. An earlier target never
|
|
9
|
+
returns after the user changes it. A smaller interim wave is not completion;
|
|
10
|
+
continue replacements until the hard target is reached or the server proves
|
|
11
|
+
queue exhaustion.
|
|
12
|
+
- Prove access to genuine applicant fields before counting a job as accessible.
|
|
13
|
+
- Show the exact jobs and require them to be approved before any form mutation.
|
|
14
|
+
Approval to inspect or probe is not approval to fill.
|
|
15
|
+
- After job approval, inventory and fill every known value before producing one
|
|
16
|
+
grouped question packet containing only true gaps.
|
|
17
|
+
- Resolve education, employment, confirmed EEO, authorization, resume, and
|
|
18
|
+
supported writing from the current Trackly profile and evidence. Never infer
|
|
19
|
+
a restricted or jurisdiction-specific fact.
|
|
20
|
+
- Run Humanizer for every supported employer-specific draft when that skill is
|
|
21
|
+
available. Always run the self-contained writing gate as the fallback and
|
|
22
|
+
final authority.
|
|
23
|
+
- Never activate Submit. The user owns the final submission action.
|
|
24
|
+
- Preserve every review-ready tab and unsaved draft across turns, handoffs, and
|
|
25
|
+
restarts.
|
|
26
|
+
- Reconcile positive submission evidence before changing Trackly state. Close a
|
|
27
|
+
completed tab only after durable `submitted` plus `applied_confirmed` proof and
|
|
28
|
+
the saved cleanup policy.
|
|
29
|
+
|
|
30
|
+
## Execution mode decision
|
|
31
|
+
|
|
32
|
+
| User intent | Mode | Required behavior |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| Fill or apply to the next N accessible jobs | `complete_next_n_accessible` | Recover the active execution first; retain the latest explicit target; replace typed blockers until target or exhaustion. |
|
|
35
|
+
| Inspect the next N queue records | Fixed inspection | Freeze exactly N records; do not replace or replenish them. |
|
|
36
|
+
| Continue after tab, app, or context loss | Active recovery | Restore exact server lineage, tab state, and mutation authority as three independent receipts. |
|
|
37
|
+
| Reconcile work the user already submitted | Terminal reconciliation | Record current-epoch positive evidence before outcomes; do not reopen or refill forms. |
|
|
38
|
+
|
|
39
|
+
Never use the fixed-batch approval endpoint for an accessible execution. Use the
|
|
40
|
+
execution-scoped resume approval required by the current protocol. Never create
|
|
41
|
+
a replacement run for a member that already has one or for a queued member whose
|
|
42
|
+
run start conflicts; preserve it and report the typed control-plane conflict.
|
|
43
|
+
|
|
44
|
+
## Two approval gates
|
|
45
|
+
|
|
46
|
+
1. **Job approval:** after non-mutating access probes prove the exact accessible
|
|
47
|
+
set, show company, role, requisition identity when available, and any shortfall
|
|
48
|
+
from the hard target. No application control may be changed before approval.
|
|
49
|
+
2. **Answer approval:** after approval, fill all deterministic controls first.
|
|
50
|
+
Ask once for only `missing_fact`, `live_consent`, or user-resolvable
|
|
51
|
+
`forbidden_inference` items that are visible now. A final truthfulness
|
|
52
|
+
certification remains per run.
|
|
53
|
+
|
|
54
|
+
## Phase receipts
|
|
55
|
+
|
|
56
|
+
Keep these receipts local and value-free. Never include labels, answers, names,
|
|
57
|
+
emails, phone numbers, URLs, resume paths, demographics, or free-text content.
|
|
58
|
+
Before claiming a phase complete, resolve `<skill-dir>` as the directory that
|
|
59
|
+
contains the loaded `SKILL.md`, then run from any working directory:
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
node "<skill-dir>/scripts/validate-phase-checkpoint.js" <phase>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Pass `{"receipt": {...}, "expectedContext": {...}}` on standard input. The
|
|
66
|
+
envelope permits those fields plus `priorFill` only for Review. `expectedContext` is required for every
|
|
67
|
+
phase. Build Trackly lineage, profile, lifecycle, and approval fields only from
|
|
68
|
+
the current authoritative work receipt. Build browser-surface fields such as
|
|
69
|
+
`formInventoryFingerprint`, `resumeControl`, and browser handoff evidence only
|
|
70
|
+
from the independently captured, value-free current browser baseline; never
|
|
71
|
+
present those fields as backend-returned facts. For selection, include
|
|
72
|
+
`workMode`, the authoritative `latestExplicitTarget`,
|
|
73
|
+
`batchId`, `queueExhausted`, and `selectableJobIds`: the access-proven job IDs
|
|
74
|
+
for an accessible execution or exact frozen member job IDs for a fixed
|
|
75
|
+
inspection. Include `executionId` only for an accessible execution. For access,
|
|
76
|
+
include the
|
|
77
|
+
exact current `waveJobIds`, including typed blockers. For later phases, include
|
|
78
|
+
the exact `approvedJobIds` from the validated selection or authoritative
|
|
79
|
+
recovered approval receipt. A nonzero exit means the
|
|
80
|
+
phase is not complete. The script accepts `selection`, `access`, `fill`,
|
|
81
|
+
`review`, `handoff`, and `reconciliation`. `handoff` is a reporting receipt,
|
|
82
|
+
not authority to claim review readiness; it exists so visibility-unverified
|
|
83
|
+
work can be represented without pretending that it is visible.
|
|
84
|
+
|
|
85
|
+
### Selection
|
|
86
|
+
|
|
87
|
+
Required fields:
|
|
88
|
+
|
|
89
|
+
- `workMode`: `accessible_execution` or `fixed_inspection`;
|
|
90
|
+
- positive safe-integer `batchId`, plus positive safe-integer `executionId` only
|
|
91
|
+
for an accessible execution;
|
|
92
|
+
- `latestExplicitTarget`: integer 1-20 for an accessible execution, or 1-100
|
|
93
|
+
for a fixed inspection, matching the public batch-size contract;
|
|
94
|
+
- `approvedJobIds`: unique positive safe-integer Trackly job IDs for the exact
|
|
95
|
+
approved set. This may be
|
|
96
|
+
empty only when the accessible queue is exhausted;
|
|
97
|
+
- `approvalRecorded: true`;
|
|
98
|
+
- `noFormMutationBeforeApproval: true`; and
|
|
99
|
+
- `queueExhausted`: boolean. A non-empty set smaller than the target is a valid
|
|
100
|
+
interim wave; only an empty set requires this to be true.
|
|
101
|
+
|
|
102
|
+
Every selection field must match `expectedContext`, and every approved job ID
|
|
103
|
+
must belong to `expectedContext.selectableJobIds`. The user's approval may
|
|
104
|
+
authorize a subset, but it can never introduce a job or shrink the hard target.
|
|
105
|
+
|
|
106
|
+
### Access
|
|
107
|
+
|
|
108
|
+
Required fields:
|
|
109
|
+
|
|
110
|
+
- the same mode-specific current work lineage used by Fill: `workMode`,
|
|
111
|
+
`batchId`, `memberId`, `jobId`, `runId`, and non-negative `inspectionEpoch`,
|
|
112
|
+
plus `executionId` only for `accessible_execution`; every value must match
|
|
113
|
+
the current `expectedContext`, and `jobId` must belong to its exact
|
|
114
|
+
`waveJobIds` set. This set includes terminal blockers so their required probe
|
|
115
|
+
receipts can validate before replacement scheduling;
|
|
116
|
+
- a terminal classification supported by the active durable disposition
|
|
117
|
+
contract. Under contract 3.7.3, locally observed `applicant_fields_reached`
|
|
118
|
+
uses durable `accessible`, while a locally observed `inactive` posting uses
|
|
119
|
+
conservative `unknown_unobservable`; never put either unsupported local state
|
|
120
|
+
name in the receipt or claim Trackly stored it;
|
|
121
|
+
- `exactRequisitionVerified`, `originPolicyVerified`, and
|
|
122
|
+
`nonMutatingProbe` all true;
|
|
123
|
+
- `privateDataEntered: false`; and
|
|
124
|
+
- `applicantControlsObserved: true` only for durable `accessible` and
|
|
125
|
+
`captcha_at_submit`.
|
|
126
|
+
|
|
127
|
+
### Fill
|
|
128
|
+
|
|
129
|
+
Required fields:
|
|
130
|
+
|
|
131
|
+
- `workMode`: `accessible_execution` or `fixed_inspection`;
|
|
132
|
+
- positive safe-integer `batchId`, `memberId`, `jobId`, and `runId`, plus a
|
|
133
|
+
non-negative safe-integer `inspectionEpoch`; every value must equal the same
|
|
134
|
+
field in `expectedContext`, and `jobId` must belong to
|
|
135
|
+
`expectedContext.approvedJobIds`;
|
|
136
|
+
- positive safe-integer `executionId` for `accessible_execution`, matching
|
|
137
|
+
`expectedContext`; omit it from both objects for `fixed_inspection`;
|
|
138
|
+
- bind the receipt to the independently captured form/profile baseline: the
|
|
139
|
+
same `profileRevision` must appear in both the receipt and `expectedContext`;
|
|
140
|
+
it is a non-negative safe integer for
|
|
141
|
+
`fixed_inspection` (so revision `0` is valid) and a positive safe integer for
|
|
142
|
+
`accessible_execution`; canonical education and employment-position counts
|
|
143
|
+
are non-negative safe integers; also include the exact value-free
|
|
144
|
+
`formInventoryFingerprint` and `resumeControl` (`required`, `optional`, or
|
|
145
|
+
`absent`);
|
|
146
|
+
- `visibleControlCount` is a safe integer of at least 1;
|
|
147
|
+
`committedControlCount` and `typedExceptionCount` are non-negative safe
|
|
148
|
+
integers, and committed plus exceptions equals visible;
|
|
149
|
+
- `controlAccounting`: one count for each allowed disposition
|
|
150
|
+
(`filledExactProfile`, `filledSafeDerivation`, `filledSupportedDraft`,
|
|
151
|
+
`preservedUserEdit`, `missingFact`, `liveConsent`,
|
|
152
|
+
`authenticationBlocker`, `unobservableCommit`, `unsupportedControl`, and
|
|
153
|
+
`notApplicable`). These counts must independently reconcile to the three
|
|
154
|
+
aggregate counts above;
|
|
155
|
+
- `formInventoryFingerprint`: a lowercase SHA-256 over only the ordered,
|
|
156
|
+
value-free semantic control fingerprints and their dispositions. Never hash
|
|
157
|
+
labels, values, page text, URLs, or local paths into it;
|
|
158
|
+
- `knownOmissionCount: 0`;
|
|
159
|
+
- `knownFieldsFilledBeforeQuestions: true`;
|
|
160
|
+
- `answerLookupCompleted: true`, plus typed counts in
|
|
161
|
+
`answerLookupScopeCounts` for `run`, `question`, `office`, `jurisdiction`,
|
|
162
|
+
`company`, `provider`, and `global`, and a value-free
|
|
163
|
+
`answerLookupFingerprint`. Query every applicable scope before asking;
|
|
164
|
+
- `parserSensitiveFieldsRechecked: true`;
|
|
165
|
+
- `educationAndEmploymentVerified: true`;
|
|
166
|
+
- `historyReconciliation`: canonical and accounted education-record counts,
|
|
167
|
+
using `canonicalEducationRecordCount` and
|
|
168
|
+
`accountedEducationRecordCount`; canonical and accounted employment-position
|
|
169
|
+
counts using `canonicalEmploymentPositionCount` and
|
|
170
|
+
`accountedEmploymentPositionCount`; reverse-chronological order proofs,
|
|
171
|
+
`datePrecisionInvented: false`, and value-free reconciliation fingerprints.
|
|
172
|
+
Positions, including promotions at one employer, are records; an employer
|
|
173
|
+
summary is not a position-level reconciliation;
|
|
174
|
+
- `resumeAudit`: `control` is `required`, `optional`, or `absent`, and `mode` is
|
|
175
|
+
`automated_verified`, `manual_unbound`, or `not_applicable`. An absent control
|
|
176
|
+
requires `mode: not_applicable` and `not_applicable` for every stage. A
|
|
177
|
+
required or optional automated upload requires `mode: automated_verified`
|
|
178
|
+
and `passed` for every stage. Use `mode: manual_unbound` only when the user
|
|
179
|
+
genuinely performs a browser-local upload that remains unbound; require
|
|
180
|
+
`approval: passed`, `preAttachVerification: not_applicable`,
|
|
181
|
+
`attachmentCommit: user_confirmed`, and `passed` for
|
|
182
|
+
`filenameVerification`, `parserRecheck`, and `finalSweep`. Never use the
|
|
183
|
+
manual mode for an agent-performed upload or a failed verifier;
|
|
184
|
+
- `writingPresent`: boolean;
|
|
185
|
+
- `localWritingGate`: `passed` when writing is present, otherwise
|
|
186
|
+
`not_applicable`;
|
|
187
|
+
- `humanizerAvailability`: `available`, `unavailable`, or `not_applicable`;
|
|
188
|
+
- `humanizerRan: true` when Humanizer is available;
|
|
189
|
+
- `humanizerFallbackUsed: true` only when writing is present and Humanizer is
|
|
190
|
+
unavailable. This names the fallback path; `localWritingGate` is the
|
|
191
|
+
always-run final authority; and
|
|
192
|
+
- `questionPacketTrueGapsOnly: true`.
|
|
193
|
+
|
|
194
|
+
The fill receipt fails when any known visible control lacks either a committed
|
|
195
|
+
receipt or a typed exception.
|
|
196
|
+
|
|
197
|
+
### Review
|
|
198
|
+
|
|
199
|
+
Required fields:
|
|
200
|
+
|
|
201
|
+
- the same mode-specific lineage as Fill: `workMode`, `batchId`, `memberId`,
|
|
202
|
+
`jobId`, `runId`, and non-negative `inspectionEpoch`, plus `executionId` only
|
|
203
|
+
for `accessible_execution`; every value must match the current
|
|
204
|
+
`expectedContext`, and `jobId` must remain in its approved set;
|
|
205
|
+
- the same positive `profileRevision` for `accessible_execution`, or non-negative
|
|
206
|
+
`profileRevision` for `fixed_inspection`, and lowercase SHA-256
|
|
207
|
+
`formInventoryFingerprint` from the final validated Fill receipt; both must
|
|
208
|
+
match the current `expectedContext`, so a profile change or form rerender
|
|
209
|
+
requires Fill to be validated again before review;
|
|
210
|
+
- a `priorFill` object containing only the complete value-free Fill `receipt`
|
|
211
|
+
and its `expectedContext`; Review reruns Fill validation and derives its
|
|
212
|
+
lineage, profile revision, and form inventory baseline from that receipt, so
|
|
213
|
+
matching caller-authored Review values alone cannot satisfy the gate. This
|
|
214
|
+
final Fill receipt must report zero `missingFact`, `liveConsent`,
|
|
215
|
+
`authenticationBlocker`, `unobservableCommit`, and `unsupportedControl`
|
|
216
|
+
dispositions; `notApplicable` controls may remain accounted. Resolve true
|
|
217
|
+
gaps and live decisions in the browser before producing this final receipt;
|
|
218
|
+
- `finalIntegrityPassed`, `truthConfirmationRecorded`,
|
|
219
|
+
`reviewTabPreserved`, and `userVisibleHandoffProven` all true. Bind the
|
|
220
|
+
receipt and authoritative `expectedContext` to the exact visible tab with
|
|
221
|
+
lowercase SHA-256 `browserBindingHash` and `handoffEvidenceFingerprint`, plus
|
|
222
|
+
`handoffEvidenceType` set to `visible_presentation_receipt` or
|
|
223
|
+
`user_visible_handoff_receipt`. Durable or inventory-only evidence is not
|
|
224
|
+
sufficient for the manual-submit Review gate. A bare truth
|
|
225
|
+
boolean is insufficient: bind `truthCertificationAttestationId`,
|
|
226
|
+
`truthCertificationDependencyHash`, `truthCertificationExpiresAt`, and
|
|
227
|
+
`truthCertificationRunSetHash`, and `truthCertificationStatus` (`recorded` or
|
|
228
|
+
`replayed`) in both the receipt and
|
|
229
|
+
authoritative `expectedContext` to the value-free backend certification
|
|
230
|
+
result. The certification expiry must still be later than local validation
|
|
231
|
+
time. Preserve the accepted value-free `truthCertificationMemberRuns`,
|
|
232
|
+
bind that exact member-run list into `expectedContext`, recompute the backend's
|
|
233
|
+
canonical run-set hash, and prove the current member, run, checkpoint version,
|
|
234
|
+
and inspection epoch occur exactly once in that certified subset. A receipt
|
|
235
|
+
must never replace or extend the authoritative certified member-run list; and
|
|
236
|
+
- bind `checkpointAction: review/manual_submit` and
|
|
237
|
+
`continuationAllowed: false` in both the receipt and `expectedContext` to the
|
|
238
|
+
exact backend-accepted action result; a
|
|
239
|
+
non-negative `resolvedActionCount`, and a value-free
|
|
240
|
+
`resolvedActionIdsFingerprint`. Both fields must match the authoritative
|
|
241
|
+
`expectedContext`; do not include raw action IDs;
|
|
242
|
+
- bind the receipt and `expectedContext` to the exact backend result:
|
|
243
|
+
`checkpointStatus` (`recorded` or `replayed`), positive
|
|
244
|
+
`checkpointMemberVersion`, non-negative `checkpointInspectionEpoch`,
|
|
245
|
+
`checkpointLifecycle: review_ready`, `checkpointActionCount: 1`, and
|
|
246
|
+
`checkpointActionIdsFingerprint`. Newly recorded checkpoint actions and
|
|
247
|
+
previously open actions resolved by the review are separate sets, so each
|
|
248
|
+
summary binds independently to `expectedContext` rather than being forced to
|
|
249
|
+
equal the other. The single checkpoint action must be
|
|
250
|
+
`checkpointAction: review/manual_submit`. `checkpointInspectionEpoch` must equal the receipt's current
|
|
251
|
+
`inspectionEpoch`. A rejected or malformed checkpoint
|
|
252
|
+
fails closed: refetch the current contract once, correct the payload only when
|
|
253
|
+
the current schema proves how, and never claim durable review readiness until
|
|
254
|
+
the backend accepts it; and
|
|
255
|
+
- `submitActivated: false`.
|
|
256
|
+
|
|
257
|
+
### Handoff state report
|
|
258
|
+
|
|
259
|
+
Use this receipt whenever reporting or transferring work, including when the
|
|
260
|
+
review tab cannot be proven visible. Report `employerApplicationState`,
|
|
261
|
+
`tracklyMemberState`, `tracklyJobState`, and `browserTabState` independently.
|
|
262
|
+
Set `handoffVisibility` to `verified` only for a visibly proven or exact
|
|
263
|
+
durably handed-off tab. Otherwise use `unverified` and
|
|
264
|
+
`reviewReadyClaimed: false`. When readiness is false, omit all checkpoint
|
|
265
|
+
authority fields. A state in one system never implies a state in
|
|
266
|
+
another, and a valid unverified handoff receipt never authorizes telling the
|
|
267
|
+
user to submit. `browserTabState: durable_handoff_proven` is invalid with
|
|
268
|
+
unverified visibility and requires a `durable_handoff_receipt`. A true
|
|
269
|
+
`reviewReadyClaimed` requires `checkpointStatus`,
|
|
270
|
+
`checkpointMemberVersion`, `checkpointInspectionEpoch`, and
|
|
271
|
+
`checkpointLifecycle`, plus `checkpointAction: review/manual_submit` and
|
|
272
|
+
`checkpointActionCount: 1`; the checkpoint epoch must equal the receipt's current
|
|
273
|
+
`inspectionEpoch`. The reported `employerApplicationState`,
|
|
274
|
+
`tracklyMemberState`, and `tracklyJobState` must match the current authoritative
|
|
275
|
+
`expectedContext` for every handoff, even when readiness is not claimed. The
|
|
276
|
+
checkpoint fields must also match when readiness is claimed. A true handoff is
|
|
277
|
+
valid only in the `awaiting_manual_submit` member state produced after the
|
|
278
|
+
certified review-ready outcome is recorded; the earlier durable `review_ready`
|
|
279
|
+
checkpoint state is not yet a user handoff. The current job state must still
|
|
280
|
+
be `check_later`; a revoked,
|
|
281
|
+
already-applied, or unknown job cannot be handed off as review-ready. A verified
|
|
282
|
+
handoff must bind the receipt and `expectedContext` to
|
|
283
|
+
the exact `browserBindingHash`, a value-free `handoffEvidenceFingerprint`, and
|
|
284
|
+
`handoffEvidenceType`. A visible tab requires either
|
|
285
|
+
`visible_presentation_receipt` from the adapter's exact-tab focus/reveal action
|
|
286
|
+
and verified visible state, or `user_visible_handoff_receipt` from an exact
|
|
287
|
+
current tab-bound user-visible handoff. Inventory membership alone is never
|
|
288
|
+
visibility proof. A durably handed-off tab requires
|
|
289
|
+
`durable_handoff_receipt`. Omit those evidence fields when visibility is
|
|
290
|
+
unverified.
|
|
291
|
+
|
|
292
|
+
### Reconciliation
|
|
293
|
+
|
|
294
|
+
Required fields:
|
|
295
|
+
|
|
296
|
+
- the same mode-specific current work lineage and approved-job binding required
|
|
297
|
+
by Review. Reconciliation stays bound to the submitted run even though it is
|
|
298
|
+
a post-submission phase;
|
|
299
|
+
- bind the receipt and `expectedContext` to the freshly refetched backend
|
|
300
|
+
result: `positiveSubmissionEvidenceRecorded: true`,
|
|
301
|
+
`memberLifecycle: submitted`, and `tracklyJobStatus: applied_confirmed`.
|
|
302
|
+
Self-authored terminal values are not authority; if the backend still reports
|
|
303
|
+
any nonterminal state, reconciliation and cleanup fail closed;
|
|
304
|
+
- `cleanupPreference`: `never`, `submitted_only`, or
|
|
305
|
+
`submitted_and_probe_blockers`;
|
|
306
|
+
- `browserTabStatus`: `open`, `missing`, `closure_unverified`, or
|
|
307
|
+
`closed_verified`; `missing` records a durable missing-tab observation but is
|
|
308
|
+
not closure proof; and
|
|
309
|
+
- for `closed_verified`, `completeTabInventoryRecorded`,
|
|
310
|
+
`closeReceiptRecorded`, and `postCloseUnionAbsenceProven` true.
|
|
311
|
+
|
|
312
|
+
`cleanupPreference: never` forbids `closed_verified`, even when closure evidence
|
|
313
|
+
exists, because evidence cannot override the user's saved no-close policy.
|
|
314
|
+
For `open`, `missing`, or `closure_unverified`, all three close-proof fields must
|
|
315
|
+
be false or omitted.
|
|
316
|
+
|
|
317
|
+
Every final report must state the application lifecycle, Trackly job status,
|
|
318
|
+
browser tab status, and whether absence is actually `closed_verified`. These
|
|
319
|
+
are separate facts and none implies another.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Performance and value-free telemetry
|
|
2
|
+
|
|
3
|
+
Improve speed only by reusing structure and batching requests. Never weaken
|
|
4
|
+
identity, consent, committed-control, preservation, or Submit-boundary gates.
|
|
5
|
+
|
|
6
|
+
## Value-free schema cache
|
|
7
|
+
|
|
8
|
+
Cache only normalized control fingerprints, allowlisted opaque semantic-label
|
|
9
|
+
codes, control types, requiredness, conditional dependencies,
|
|
10
|
+
provider/tenant/template identity, interaction strategy, commit-verification
|
|
11
|
+
strategy, parser/rerender risk flags, and cache version/expiry.
|
|
12
|
+
|
|
13
|
+
Never cache raw semantic-label text, raw answers, contact values, demographic
|
|
14
|
+
values, resume text or paths, credentials, URLs, employer-form free text, or
|
|
15
|
+
any label code outside the allowlist.
|
|
16
|
+
|
|
17
|
+
Invalidate on a profile revision, form schema fingerprint, inspection epoch,
|
|
18
|
+
meaningful wording change, provider/tenant mismatch, or cache expiry. A cache hit
|
|
19
|
+
skips structural rediscovery only; reread and verify every committed live value.
|
|
20
|
+
|
|
21
|
+
## Batch resolver and template grouping
|
|
22
|
+
|
|
23
|
+
- Fetch the current profile once per stable revision and request only keys
|
|
24
|
+
required by visible forms.
|
|
25
|
+
- Resolve a shared question once only when scope, expected type, employer,
|
|
26
|
+
office, jurisdiction, and wording semantics all match.
|
|
27
|
+
- Group same-tenant forms with identical normalized control fingerprints into
|
|
28
|
+
one structural fill plan.
|
|
29
|
+
- Apply that plan independently to every exact run and tab. Keep requisition
|
|
30
|
+
identity, provenance, committed-value verification, and browser bindings
|
|
31
|
+
separate.
|
|
32
|
+
- Deduplicate missing questions, not committed-control receipts.
|
|
33
|
+
- Preserve bounded bulk dispositions, observations, checkpoints, and outcomes.
|
|
34
|
+
After a bulk 5xx, refetch before deciding whether to retry or split.
|
|
35
|
+
|
|
36
|
+
## Events
|
|
37
|
+
|
|
38
|
+
Emit these only when the current protocol or analytics surface explicitly
|
|
39
|
+
supports them:
|
|
40
|
+
|
|
41
|
+
- `apply_probe_stage_reached`
|
|
42
|
+
- `apply_access_disposition_committed`
|
|
43
|
+
- `apply_member_run_start_conflict`
|
|
44
|
+
- `apply_form_schema_cache_hit`
|
|
45
|
+
- `apply_form_schema_cache_miss`
|
|
46
|
+
- `apply_profile_resolution_completed`
|
|
47
|
+
- `apply_known_field_omitted`
|
|
48
|
+
- `apply_control_commit_corrected`
|
|
49
|
+
- `apply_resume_parser_repair`
|
|
50
|
+
- `apply_question_packet_generated`
|
|
51
|
+
- `apply_free_text_humanized`
|
|
52
|
+
- `apply_handoff_receipt_committed`
|
|
53
|
+
- `apply_submission_evidence_committed`
|
|
54
|
+
- `apply_outcome_reconciled`
|
|
55
|
+
- `apply_tab_closed_verified`
|
|
56
|
+
|
|
57
|
+
Use only provider/support level, scenario code, opaque execution/member/run IDs,
|
|
58
|
+
inspection epoch/version, cache hit or miss, phase elapsed time, typed error code,
|
|
59
|
+
and counts by resolver class. Never include raw labels, answers, URLs, names,
|
|
60
|
+
emails, phone numbers, resume paths, demographics, or free-text content. Never
|
|
61
|
+
invent an event or field that the active protocol does not expose.
|
|
@@ -20,6 +20,27 @@ Use the compact execution snapshot as authority. Give a bounded next-update esti
|
|
|
20
20
|
Every handoff names the browser surface and authoritative funnel. Use the
|
|
21
21
|
matching template; do not improvise internal routing language.
|
|
22
22
|
|
|
23
|
+
Every operator update also reports three independent state lines:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
Employer application state: not opened / access probed / form reached / partially filled / needs answers / review state prepared / manually submitted / ATS success observed / blocked
|
|
27
|
+
Trackly state: execution + batch + member lifecycle + job state + inspection epoch + profile revision + resume/truth/submission receipts
|
|
28
|
+
Browser state: no known tab / controller-owned / user inventory / visible / durable handoff proven / missing / closure unverified / closed verified
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
No state in one system implies a state in another. In particular, a Trackly
|
|
32
|
+
`review_ready` member does not prove the employer draft is visible, and a
|
|
33
|
+
visible form does not prove a durable checkpoint. When visibility is
|
|
34
|
+
unverified, say so, preserve the exact binding, and do not claim a review-ready
|
|
35
|
+
handoff or tell the user to submit.
|
|
36
|
+
|
|
37
|
+
A verified handoff receipt must carry the exact browser-binding hash, a
|
|
38
|
+
value-free evidence fingerprint, and whether the proof came from the adapter's
|
|
39
|
+
exact-tab presentation action, an exact tab-bound user-visible handoff receipt,
|
|
40
|
+
or a durable handoff receipt. A complete tab inventory proves reachability, not
|
|
41
|
+
visibility. Bind those same fields into the validator's expected context; never
|
|
42
|
+
substitute a self-asserted visibility boolean.
|
|
43
|
+
|
|
23
44
|
### Recovery
|
|
24
45
|
|
|
25
46
|
```text
|