@smartytalent/mcp-tools 0.9.55 → 0.9.57
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/dist/tools.json +96 -13
- package/package.json +1 -1
package/dist/tools.json
CHANGED
|
@@ -5371,6 +5371,19 @@
|
|
|
5371
5371
|
"maximum": 1000,
|
|
5372
5372
|
"description": "Stage 3 (2026-10-06): how many people the job hires (brief.intakeContext.headcount). Written by the job build (copied); PATCH-able (an integer from 1 to 1000); null clears it."
|
|
5373
5373
|
},
|
|
5374
|
+
"workingTime": {
|
|
5375
|
+
"type": "array",
|
|
5376
|
+
"items": {
|
|
5377
|
+
"type": "string",
|
|
5378
|
+
"enum": [
|
|
5379
|
+
"1/4",
|
|
5380
|
+
"1/2",
|
|
5381
|
+
"3/4",
|
|
5382
|
+
"full-time"
|
|
5383
|
+
]
|
|
5384
|
+
},
|
|
5385
|
+
"description": "The strict first gate (S.K. 2026-10-07): the working-time fractions the hiring manager's contract offers, read off brief.employmentType by the job build (code, never a model: '1/2, 3/4 or full-time' -> the three tokens; a text naming no fraction leaves the field absent). The application form asks 'which working time?' with the four fractions and rejects a choice the job does not offer - only when the job offers a part-time fraction or several fractions (a full-time-only job keeps the minimum of fields). Not PATCH-able: a rebuild of the job reads it again."
|
|
5386
|
+
},
|
|
5374
5387
|
"languageCode": {
|
|
5375
5388
|
"type": "string",
|
|
5376
5389
|
"description": "Primary language code for the job posting (e.g. en-US, pl-PL)"
|
|
@@ -5838,7 +5851,7 @@
|
|
|
5838
5851
|
},
|
|
5839
5852
|
"surveys": {
|
|
5840
5853
|
"type": "string",
|
|
5841
|
-
"description": "auto | manual | off. cNPS surveys: auto = Boe sends the survey invitation after a hire and rejection e-mails carry the survey link; manual (2026-10-06) = Boe sends no survey: one board task
|
|
5854
|
+
"description": "auto | manual | off. cNPS surveys: auto = Boe sends the survey invitation after a hire and rejection e-mails carry the survey link; manual (2026-10-06) = Boe sends no survey itself: after a hire the survey invitation is minted and one board task carries its link for RecOps to send (no e-mail is composed); rejection e-mails carry no survey link; off = no survey invitation after a hire and no survey link in rejection e-mails."
|
|
5842
5855
|
},
|
|
5843
5856
|
"feedback": {
|
|
5844
5857
|
"type": "string",
|
|
@@ -6351,6 +6364,19 @@
|
|
|
6351
6364
|
"maximum": 1000,
|
|
6352
6365
|
"description": "Stage 3 (2026-10-06): how many people the job hires (brief.intakeContext.headcount). Written by the job build (copied); PATCH-able (an integer from 1 to 1000); null clears it."
|
|
6353
6366
|
},
|
|
6367
|
+
"workingTime": {
|
|
6368
|
+
"type": "array",
|
|
6369
|
+
"items": {
|
|
6370
|
+
"type": "string",
|
|
6371
|
+
"enum": [
|
|
6372
|
+
"1/4",
|
|
6373
|
+
"1/2",
|
|
6374
|
+
"3/4",
|
|
6375
|
+
"full-time"
|
|
6376
|
+
]
|
|
6377
|
+
},
|
|
6378
|
+
"description": "The strict first gate (S.K. 2026-10-07): the working-time fractions the hiring manager's contract offers, read off brief.employmentType by the job build (code, never a model: '1/2, 3/4 or full-time' -> the three tokens; a text naming no fraction leaves the field absent). The application form asks 'which working time?' with the four fractions and rejects a choice the job does not offer - only when the job offers a part-time fraction or several fractions (a full-time-only job keeps the minimum of fields). Not PATCH-able: a rebuild of the job reads it again."
|
|
6379
|
+
},
|
|
6354
6380
|
"languageCode": {
|
|
6355
6381
|
"type": "string",
|
|
6356
6382
|
"description": "Primary language code for the job posting (e.g. en-US, pl-PL)"
|
|
@@ -6818,7 +6844,7 @@
|
|
|
6818
6844
|
},
|
|
6819
6845
|
"surveys": {
|
|
6820
6846
|
"type": "string",
|
|
6821
|
-
"description": "auto | manual | off. cNPS surveys: auto = Boe sends the survey invitation after a hire and rejection e-mails carry the survey link; manual (2026-10-06) = Boe sends no survey: one board task
|
|
6847
|
+
"description": "auto | manual | off. cNPS surveys: auto = Boe sends the survey invitation after a hire and rejection e-mails carry the survey link; manual (2026-10-06) = Boe sends no survey itself: after a hire the survey invitation is minted and one board task carries its link for RecOps to send (no e-mail is composed); rejection e-mails carry no survey link; off = no survey invitation after a hire and no survey link in rejection e-mails."
|
|
6822
6848
|
},
|
|
6823
6849
|
"feedback": {
|
|
6824
6850
|
"type": "string",
|
|
@@ -7439,7 +7465,8 @@
|
|
|
7439
7465
|
},
|
|
7440
7466
|
"meta": {
|
|
7441
7467
|
"type": "object",
|
|
7442
|
-
"additionalProperties": true
|
|
7468
|
+
"additionalProperties": true,
|
|
7469
|
+
"description": "The analysis' record on the row. `verdict` (verdict-v1): band, code, the must outcomes (`must.met[]` with `reason: formDeclared | declaredOnly`, `must.failed[]`, `must.unverified[]`, `must.toClarify[]` = the salary without a figure), and - the screening package A, 2026-10-07 - the card's flags `verdict.declaredOnly[]` (musts met on the application form's word alone), `verdict.noReadableDocument` (the document gave the extraction nothing), `verdict.salaryToClarify` (no salary figure on the candidate's side, or the salary scale's 3: 5-20% above the ceiling or more than 5% below the floor), `verdict.formSetAside[]` (the criteria whose application-form answer RecOps set aside when it ordered the analysis past the knockout - the CV decided them; `must.unverified[]` entries with `reason: formSetAside` where the CV said nothing about the requirement; the answers and the reason are in `knockoutReleased`). `knockoutFailure.failures[]` (a row the form rejected: `fieldId`, `verifies`, `expected`, `actual`; package B adds `label`, `answerLabel`, `expectedLabel` in the job's language - the reason RecOps reads). `knockoutReleased` (package B: RecOps' candidates:analyze past the form's knockout - `by`, `at`, `taskId`, `reason`, `knockout {failures, band}`, `submissionId` = the application released; kept after the analysis, while `decision` reads `analyzeAnyway` only until the verdict's decision replaces it; a later re-application keeps the key, so the current application was analysed past the knockout only when `submissionId` equals `lastSubmissionId`). `decision`, `mandatoryCheck`, `provenance`, `lastSubmissionId` and the arc keys as before."
|
|
7443
7470
|
}
|
|
7444
7471
|
}
|
|
7445
7472
|
},
|
|
@@ -7498,6 +7525,26 @@
|
|
|
7498
7525
|
},
|
|
7499
7526
|
"id": {
|
|
7500
7527
|
"type": "string"
|
|
7528
|
+
},
|
|
7529
|
+
"meta": {
|
|
7530
|
+
"title": "CandidateFileLinkMetaSchema",
|
|
7531
|
+
"type": "object",
|
|
7532
|
+
"description": "Plan #2 (S.K. 2026-10-08): the state of this file OF THE APPLICATION - every file of it is linked, read or not; its type is the file's own `type`. Absent on links written before.",
|
|
7533
|
+
"properties": {
|
|
7534
|
+
"status": {
|
|
7535
|
+
"type": "string",
|
|
7536
|
+
"enum": [
|
|
7537
|
+
"read",
|
|
7538
|
+
"notRead",
|
|
7539
|
+
"failed"
|
|
7540
|
+
],
|
|
7541
|
+
"description": "read = the CV, or an evidence document the document reader read; notRead = typed, not read for facts; failed = the file failed or was refused."
|
|
7542
|
+
},
|
|
7543
|
+
"reason": {
|
|
7544
|
+
"type": "string",
|
|
7545
|
+
"description": "notRead: limit (an evidence document past the reader's 5) | secondCv | identityDocument | noFactSource (a cover letter, references, the rest); failed: the file's error code (DOCUMENT_TOO_LARGE, UNSUPPORTED_FORMAT, CONVERSION_FAILED, DOCUMENT_UNREADABLE, FILE_ANALYSIS_FAILED)."
|
|
7546
|
+
}
|
|
7547
|
+
}
|
|
7501
7548
|
}
|
|
7502
7549
|
}
|
|
7503
7550
|
}
|
|
@@ -8086,7 +8133,8 @@
|
|
|
8086
8133
|
},
|
|
8087
8134
|
"meta": {
|
|
8088
8135
|
"type": "object",
|
|
8089
|
-
"additionalProperties": true
|
|
8136
|
+
"additionalProperties": true,
|
|
8137
|
+
"description": "The analysis' record on the row. `verdict` (verdict-v1): band, code, the must outcomes (`must.met[]` with `reason: formDeclared | declaredOnly`, `must.failed[]`, `must.unverified[]`, `must.toClarify[]` = the salary without a figure), and - the screening package A, 2026-10-07 - the card's flags `verdict.declaredOnly[]` (musts met on the application form's word alone), `verdict.noReadableDocument` (the document gave the extraction nothing), `verdict.salaryToClarify` (no salary figure on the candidate's side, or the salary scale's 3: 5-20% above the ceiling or more than 5% below the floor), `verdict.formSetAside[]` (the criteria whose application-form answer RecOps set aside when it ordered the analysis past the knockout - the CV decided them; `must.unverified[]` entries with `reason: formSetAside` where the CV said nothing about the requirement; the answers and the reason are in `knockoutReleased`). `knockoutFailure.failures[]` (a row the form rejected: `fieldId`, `verifies`, `expected`, `actual`; package B adds `label`, `answerLabel`, `expectedLabel` in the job's language - the reason RecOps reads). `knockoutReleased` (package B: RecOps' candidates:analyze past the form's knockout - `by`, `at`, `taskId`, `reason`, `knockout {failures, band}`, `submissionId` = the application released; kept after the analysis, while `decision` reads `analyzeAnyway` only until the verdict's decision replaces it; a later re-application keeps the key, so the current application was analysed past the knockout only when `submissionId` equals `lastSubmissionId`). `decision`, `mandatoryCheck`, `provenance`, `lastSubmissionId` and the arc keys as before."
|
|
8090
8138
|
}
|
|
8091
8139
|
}
|
|
8092
8140
|
},
|
|
@@ -8145,6 +8193,26 @@
|
|
|
8145
8193
|
},
|
|
8146
8194
|
"id": {
|
|
8147
8195
|
"type": "string"
|
|
8196
|
+
},
|
|
8197
|
+
"meta": {
|
|
8198
|
+
"title": "CandidateFileLinkMetaSchema",
|
|
8199
|
+
"type": "object",
|
|
8200
|
+
"description": "Plan #2 (S.K. 2026-10-08): the state of this file OF THE APPLICATION - every file of it is linked, read or not; its type is the file's own `type`. Absent on links written before.",
|
|
8201
|
+
"properties": {
|
|
8202
|
+
"status": {
|
|
8203
|
+
"type": "string",
|
|
8204
|
+
"enum": [
|
|
8205
|
+
"read",
|
|
8206
|
+
"notRead",
|
|
8207
|
+
"failed"
|
|
8208
|
+
],
|
|
8209
|
+
"description": "read = the CV, or an evidence document the document reader read; notRead = typed, not read for facts; failed = the file failed or was refused."
|
|
8210
|
+
},
|
|
8211
|
+
"reason": {
|
|
8212
|
+
"type": "string",
|
|
8213
|
+
"description": "notRead: limit (an evidence document past the reader's 5) | secondCv | identityDocument | noFactSource (a cover letter, references, the rest); failed: the file's error code (DOCUMENT_TOO_LARGE, UNSUPPORTED_FORMAT, CONVERSION_FAILED, DOCUMENT_UNREADABLE, FILE_ANALYSIS_FAILED)."
|
|
8214
|
+
}
|
|
8215
|
+
}
|
|
8148
8216
|
}
|
|
8149
8217
|
}
|
|
8150
8218
|
}
|
|
@@ -8504,7 +8572,8 @@
|
|
|
8504
8572
|
"type": "string"
|
|
8505
8573
|
},
|
|
8506
8574
|
"status": {
|
|
8507
|
-
"type": "string"
|
|
8575
|
+
"type": "string",
|
|
8576
|
+
"description": "pending | uploaded | success | failed | archived. `failed` = the conversion or the analysis failed, or the file was REFUSED at intake (plan #2 P2: too large / an unsupported format) - meta.failure says which."
|
|
8508
8577
|
},
|
|
8509
8578
|
"extension": {
|
|
8510
8579
|
"type": "string"
|
|
@@ -8519,7 +8588,8 @@
|
|
|
8519
8588
|
"type": "string"
|
|
8520
8589
|
},
|
|
8521
8590
|
"type": {
|
|
8522
|
-
"type": "string"
|
|
8591
|
+
"type": "string",
|
|
8592
|
+
"description": "The document's type as the file reader classified it (plan #2): resume, coverLetter, certificate (diplomas included), licence (a driving licence, a driver card), identityDocument (an ID card, a passport, a residence card), referenceLetter, portfolio, assessmentResult, jobBrief, jobDescription, document (anything else); videoRecording / audioRecording for media; undefined before the reader ran. Not an enum: rows written earlier may carry other values."
|
|
8523
8593
|
},
|
|
8524
8594
|
"kind": {
|
|
8525
8595
|
"type": "string",
|
|
@@ -8739,7 +8809,8 @@
|
|
|
8739
8809
|
"type": "string"
|
|
8740
8810
|
},
|
|
8741
8811
|
"status": {
|
|
8742
|
-
"type": "string"
|
|
8812
|
+
"type": "string",
|
|
8813
|
+
"description": "pending | uploaded | success | failed | archived. `failed` = the conversion or the analysis failed, or the file was REFUSED at intake (plan #2 P2: too large / an unsupported format) - meta.failure says which."
|
|
8743
8814
|
},
|
|
8744
8815
|
"extension": {
|
|
8745
8816
|
"type": "string"
|
|
@@ -8754,7 +8825,8 @@
|
|
|
8754
8825
|
"type": "string"
|
|
8755
8826
|
},
|
|
8756
8827
|
"type": {
|
|
8757
|
-
"type": "string"
|
|
8828
|
+
"type": "string",
|
|
8829
|
+
"description": "The document's type as the file reader classified it (plan #2): resume, coverLetter, certificate (diplomas included), licence (a driving licence, a driver card), identityDocument (an ID card, a passport, a residence card), referenceLetter, portfolio, assessmentResult, jobBrief, jobDescription, document (anything else); videoRecording / audioRecording for media; undefined before the reader ran. Not an enum: rows written earlier may carry other values."
|
|
8758
8830
|
},
|
|
8759
8831
|
"kind": {
|
|
8760
8832
|
"type": "string",
|
|
@@ -8837,7 +8909,16 @@
|
|
|
8837
8909
|
"description": "Delete File",
|
|
8838
8910
|
"inputSchema": {
|
|
8839
8911
|
"type": "object",
|
|
8840
|
-
"properties": {
|
|
8912
|
+
"properties": {
|
|
8913
|
+
"permanentDelete": {
|
|
8914
|
+
"type": "string",
|
|
8915
|
+
"description": "Set to true to remove the row and every stored object of the file irreversibly. Defaults to false (archive).",
|
|
8916
|
+
"enum": [
|
|
8917
|
+
"true",
|
|
8918
|
+
"false"
|
|
8919
|
+
]
|
|
8920
|
+
}
|
|
8921
|
+
}
|
|
8841
8922
|
},
|
|
8842
8923
|
"_meta": {
|
|
8843
8924
|
"method": "DELETE",
|
|
@@ -9982,7 +10063,7 @@
|
|
|
9982
10063
|
},
|
|
9983
10064
|
"content": {
|
|
9984
10065
|
"type": "string",
|
|
9985
|
-
"description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label.\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
|
|
10066
|
+
"description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label. A `file` field may take several files: `multiple:\ntrue` and `maxFiles` (the apply form's CV field: 6 - the CV + 5\ndocuments; plan #2, S.K. 2026-10-08: no separate field, the CV is\nfound by its type).\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select; since the strict first gate\nof 2026-10-07 it may be an ARRAY of option values - any of them\npasses: the weekends select 0-4 gating at the job's minimum, the\nworking-time select 1/4 / 1/2 / 3/4 / full-time gating on the\nfractions the job offers; the experience select gates on\n`{N}-years-or-more` aligned to the job's minimum). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
|
|
9986
10067
|
},
|
|
9987
10068
|
"publish": {
|
|
9988
10069
|
"type": "boolean",
|
|
@@ -10125,7 +10206,7 @@
|
|
|
10125
10206
|
},
|
|
10126
10207
|
"content": {
|
|
10127
10208
|
"type": "string",
|
|
10128
|
-
"description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label.\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
|
|
10209
|
+
"description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label. A `file` field may take several files: `multiple:\ntrue` and `maxFiles` (the apply form's CV field: 6 - the CV + 5\ndocuments; plan #2, S.K. 2026-10-08: no separate field, the CV is\nfound by its type).\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select; since the strict first gate\nof 2026-10-07 it may be an ARRAY of option values - any of them\npasses: the weekends select 0-4 gating at the job's minimum, the\nworking-time select 1/4 / 1/2 / 3/4 / full-time gating on the\nfractions the job offers; the experience select gates on\n`{N}-years-or-more` aligned to the job's minimum). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
|
|
10129
10210
|
},
|
|
10130
10211
|
"publish": {
|
|
10131
10212
|
"type": "boolean",
|
|
@@ -13871,6 +13952,8 @@
|
|
|
13871
13952
|
},
|
|
13872
13953
|
"files": {
|
|
13873
13954
|
"type": "array",
|
|
13955
|
+
"maxItems": 10,
|
|
13956
|
+
"description": "The application's files (at most 10; each fileKey one the form's upload door issued - #66). The CV is found by its type (plan #2), not by its position.",
|
|
13874
13957
|
"items": {
|
|
13875
13958
|
"type": "object",
|
|
13876
13959
|
"properties": {
|
|
@@ -18795,7 +18878,7 @@
|
|
|
18795
18878
|
"route": {
|
|
18796
18879
|
"type": "string",
|
|
18797
18880
|
"maxLength": 64,
|
|
18798
|
-
"description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row."
|
|
18881
|
+
"description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row. The RecOps doors on a candidate ride the same key with the candidate in `relationships.candidates` and their order in `meta`: `candidates:opinion` (`meta.override`, see the criterion's `override`), `candidates:stage` (`meta.stage`), and - the screening package B, 2026-10-07 - `candidates:analyze` (`meta.analyze {reason}`: analyse a candidate the application form knocked out; the action clears the knockout, keeps it in `meta.decision` history and runs the analysis on the pointed submission; the task closes `done`, or `failed` with the reason when the row is not a knockout)."
|
|
18799
18882
|
},
|
|
18800
18883
|
"kind": {
|
|
18801
18884
|
"type": "string",
|
|
@@ -19104,7 +19187,7 @@
|
|
|
19104
19187
|
"route": {
|
|
19105
19188
|
"type": "string",
|
|
19106
19189
|
"maxLength": 64,
|
|
19107
|
-
"description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row."
|
|
19190
|
+
"description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row. The RecOps doors on a candidate ride the same key with the candidate in `relationships.candidates` and their order in `meta`: `candidates:opinion` (`meta.override`, see the criterion's `override`), `candidates:stage` (`meta.stage`), and - the screening package B, 2026-10-07 - `candidates:analyze` (`meta.analyze {reason}`: analyse a candidate the application form knocked out; the action clears the knockout, keeps it in `meta.decision` history and runs the analysis on the pointed submission; the task closes `done`, or `failed` with the reason when the row is not a knockout)."
|
|
19108
19191
|
},
|
|
19109
19192
|
"kind": {
|
|
19110
19193
|
"type": "string",
|