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.
@@ -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
- - A separate humanizer or writing skill may be used when available, but it is optional. This gate remains authoritative and self-contained.
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`. Build the complete local claim-reference packet and set `claimsComplete: true` only after checking the whole draft. Call `trackly_lint_application_text` and treat its deterministic lint as a blocking gate. Missing claim metadata is a failure, even for an apparently claim-free draft. Never enter text with a failed lint result. `allow_if_voice_sample` requires explicit saved evidence that the approved sample uses that punctuation.
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 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.
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; and
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