paperlint 11.0.0 → 11.1.0

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.
Files changed (76) hide show
  1. package/dist/adapters/hotcrp/index.d.ts +1 -1
  2. package/dist/adapters/hotcrp/index.d.ts.map +1 -1
  3. package/dist/adapters/hotcrp/index.js +1 -1
  4. package/dist/adapters/hotcrp/index.js.map +1 -1
  5. package/dist/adapters/hotcrp/portal.io.d.ts.map +1 -1
  6. package/dist/adapters/hotcrp/portal.io.js +17 -2
  7. package/dist/adapters/hotcrp/portal.io.js.map +1 -1
  8. package/dist/adapters/hotcrp/response.d.ts +7 -1
  9. package/dist/adapters/hotcrp/response.d.ts.map +1 -1
  10. package/dist/adapters/hotcrp/response.js +35 -3
  11. package/dist/adapters/hotcrp/response.js.map +1 -1
  12. package/dist/adapters/hotcrp/site.d.ts +1 -1
  13. package/dist/adapters/hotcrp/site.d.ts.map +1 -1
  14. package/dist/adapters/hotcrp/site.js +1 -2
  15. package/dist/adapters/hotcrp/site.js.map +1 -1
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/cli.js +6 -1
  18. package/dist/cli.js.map +1 -1
  19. package/dist/domain/submission-fields.d.ts +77 -0
  20. package/dist/domain/submission-fields.d.ts.map +1 -0
  21. package/dist/domain/submission-fields.js +127 -0
  22. package/dist/domain/submission-fields.js.map +1 -0
  23. package/dist/domain/submission.d.ts +10 -0
  24. package/dist/domain/submission.d.ts.map +1 -1
  25. package/dist/domain/submission.js.map +1 -1
  26. package/dist/lib/paper-config.d.ts.map +1 -1
  27. package/dist/lib/paper-config.js +2 -0
  28. package/dist/lib/paper-config.js.map +1 -1
  29. package/dist/paper-settings.d.ts +5 -0
  30. package/dist/paper-settings.d.ts.map +1 -1
  31. package/dist/paper-settings.js +5 -2
  32. package/dist/paper-settings.js.map +1 -1
  33. package/dist/ports/submission-portal.d.ts +3 -1
  34. package/dist/ports/submission-portal.d.ts.map +1 -1
  35. package/dist/presets.d.ts +3 -0
  36. package/dist/presets.d.ts.map +1 -1
  37. package/dist/presets.js +3 -1
  38. package/dist/presets.js.map +1 -1
  39. package/dist/submission.d.ts +24 -5
  40. package/dist/submission.d.ts.map +1 -1
  41. package/dist/submission.js +140 -50
  42. package/dist/submission.js.map +1 -1
  43. package/dist/tex-requirements.d.ts +3 -0
  44. package/dist/tex-requirements.d.ts.map +1 -1
  45. package/dist/tex-requirements.js +30 -2
  46. package/dist/tex-requirements.js.map +1 -1
  47. package/docs/submission.md +29 -6
  48. package/lib/paper-config.ts +3 -0
  49. package/package.json +1 -1
  50. package/presets/msr.jsonc +66 -0
  51. package/presets/venue-profile.schema.json +41 -0
  52. package/skills/submission-portal/SKILL.md +51 -20
  53. package/skills/submission-portal/SKILL.md.spec.ts +50 -19
  54. package/src/adapters/hotcrp/cassette/README.md +7 -6
  55. package/src/adapters/hotcrp/cassette/get-searchcompletion.json +100 -0
  56. package/src/adapters/hotcrp/index.ts +1 -0
  57. package/src/adapters/hotcrp/portal.io.ts +22 -2
  58. package/src/adapters/hotcrp/portal.test.ts +103 -2
  59. package/src/adapters/hotcrp/response.ts +45 -4
  60. package/src/adapters/hotcrp/site.ts +2 -3
  61. package/src/cli.ts +6 -1
  62. package/src/domain/submission-fields.test.ts +183 -0
  63. package/src/domain/submission-fields.ts +190 -0
  64. package/src/domain/submission.ts +11 -0
  65. package/src/new-paper.test.ts +1 -0
  66. package/src/paper-settings.test.ts +6 -0
  67. package/src/paper-settings.ts +11 -3
  68. package/src/ports/submission-portal.ts +3 -0
  69. package/src/presets.ts +12 -2
  70. package/src/submission-fields-run.test.ts +247 -0
  71. package/src/submission-new.test.ts +4 -4
  72. package/src/submission-update.test.ts +7 -1
  73. package/src/submission.test.ts +1 -1
  74. package/src/submission.ts +207 -54
  75. package/src/tex-requirements.test.ts +21 -0
  76. package/src/tex-requirements.ts +67 -2
@@ -29,6 +29,7 @@ import { presetsDir } from "./package-dirs.js";
29
29
  import { CONFIG_FILE } from "#lib/paper-config";
30
30
  import { fieldOf } from "./domain/record.js";
31
31
  import { venueTalkOf, } from "./domain/talk.js";
32
+ import { RESERVED_FIELD_KEYS, reservedKey, } from "./domain/submission-fields.js";
32
33
  /** The profile every paper gets, and the only one a paper with an unknown venue gets. */
33
34
  export const BASE_PROFILE = "tex-base.jsonc";
34
35
  export const SCHEMA_FILE = "venue-profile.schema.json";
@@ -86,6 +87,28 @@ export const NO_FORMAT = {
86
87
  appendixInBody: null,
87
88
  kinds: new Map(),
88
89
  };
90
+ /** A preset's `submission_fields`, or null when it records none; a reserved field name is refused. */
91
+ function submissionFieldsOf(j, file) {
92
+ if (j === undefined)
93
+ return null;
94
+ const reserved = reservedKey(Object.keys(j.fields));
95
+ if (reserved !== null)
96
+ throw new Error(`${file}: "submission_fields" names "${reserved}", which paperlint sends itself (${RESERVED_FIELD_KEYS.join(", ")}) — a field of that name would overwrite it`);
97
+ return {
98
+ source: j.source,
99
+ url: j.url,
100
+ read: j.read,
101
+ fields: Object.fromEntries(Object.entries(j.fields).map(([key, f]) => [
102
+ key,
103
+ {
104
+ kind: f.kind,
105
+ required: f.required ?? false,
106
+ label: f.label ?? null,
107
+ options: f.options ?? [],
108
+ },
109
+ ])),
110
+ };
111
+ }
89
112
  /** An optional field as the typed preset holds it: absent is null. */
90
113
  const orNull = (v) => (v === undefined ? null : v);
91
114
  function kindsOf(k) {
@@ -185,6 +208,12 @@ function deadlinesOf(d, file) {
185
208
  read,
186
209
  }));
187
210
  }
211
+ /** A preset's blocks about its portal: where, the deadlines read there, the form's own fields. */
212
+ const portalBlocks = (j, file) => ({
213
+ portal: portalOf(j.portal),
214
+ deadlines: deadlinesOf(j.deadlines, file),
215
+ submissionFields: submissionFieldsOf(j.submission_fields, file),
216
+ });
188
217
  /**
189
218
  * The text of one preset file → the typed file, or an Error naming every problem. The ONE parser
190
219
  * of a preset: the toolchain reads its `tex`, the venue rules its `format`, the config its `rules`.
@@ -213,8 +242,7 @@ export function parsePreset(text, file, dir = presetsDir()) {
213
242
  rules: j.rules ?? {},
214
243
  registerAnchors: anchorsOf(j.register),
215
244
  talk: j.talk === undefined ? null : venueTalkOf(j.talk),
216
- portal: portalOf(j.portal),
217
- deadlines: deadlinesOf(j.deadlines, file),
245
+ ...portalBlocks(j, file),
218
246
  };
219
247
  }
220
248
  /** The text of one preset → the TeX requirements it declares itself (none without a `tex` block). */
@@ -1 +1 @@
1
- {"version":3,"file":"tex-requirements.js","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tex-requirements.js","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"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"}
@@ -41,12 +41,34 @@ Creates the submission and sends four things, printing them first — the abstra
41
41
  read without guessing stops the command with the macro and its line; then pass
42
42
  `--abstract <file>`, plain text;
43
43
  - **the authors** — from `"authors"`; without it, `new` stops and names the key;
44
- - **the PDF** — the paper's own, or `--pdf <file>`.
44
+ - **the PDF** — the paper's own, or `--pdf <file>`;
45
+ - **the fields** — from `"fields"`: the paper's answers to the venue's own form fields.
45
46
 
46
47
  Without `--save` it is a dry run. With `--save` the new id is written into `paperlint.json` (the
47
- open cycle, with `cycles`), and the next command is `show`. Every run prints what is left to do on
48
- the site (conflicts, topics, the venue's own fields). `new` is refused when the paper already has a
49
- submission id.
48
+ open cycle, with `cycles`), and the next command is `show`. Every run prints what is left to do: the
49
+ venue's fields the paper did not answer, and what only the site takes. `new` is refused when the
50
+ paper already has a submission id.
51
+
52
+ ## The venue's own fields
53
+
54
+ A venue preset records its form's own fields in `"submission_fields"`, as read (`source`, `url`,
55
+ `read`), each by the API's key with a kind: `checkboxes` (with its `options`), `text`, `email`,
56
+ `pc_conflicts`. The paper answers them in `"fields"`:
57
+
58
+ ```json
59
+ "fields": {
60
+ "topics": ["SE Topic: AI for software engineering"],
61
+ "pc_conflicts": { "someone@example.org": "collaborator" },
62
+ "ACMCorAut": "you@example.org"
63
+ }
64
+ ```
65
+
66
+ They are checked against the preset before anything is sent: a key the form does not ask, a topic it
67
+ does not offer, a missing required one, each stops the command with exit 2. HotCRP keeps a topic it
68
+ does not know as nothing, without an error (a bare `"AI for software engineering"`, without its
69
+ group, is one), so after the portal answers, a topic list it did not take prints `NOT TAKEN` and
70
+ exits 1. `paperlint submission topics` reads the topics the portal offers and marks each against
71
+ the preset.
50
72
 
51
73
  ## `show`
52
74
 
@@ -57,7 +79,8 @@ deadlines in force for the current attempt, each with when and where it was read
57
79
 
58
80
  ## `update`
59
81
 
60
- Sends the PDF and, when asked, a new abstract (`--abstract <file>`) and "submitted" (`--submit`).
82
+ Sends the PDF, the paper's `"fields"`, and, when asked, a new abstract (`--abstract <file>`) and
83
+ "submitted" (`--submit`).
61
84
  Without `--save` it is a dry run. It prints the portal's verdict and its messages; exit 1 when the
62
85
  portal would not take the change. Before sending, it asks you to open that exact PDF and check it
63
86
  against the venue's call for papers.
@@ -67,6 +90,6 @@ until it says `match yes`. Every `--save` comes after the author has read the dr
67
90
 
68
91
  ## What it does not do
69
92
 
70
- - It does not set conflicts, topics or the venue's other fields, change the authors after `new`, or
93
+ - It does not set a field the venue preset does not record, change the authors after `new`, or
71
94
  upload supplementary files.
72
95
  - It does not check the PDF against the venue; that is `paperlint lint`.
@@ -143,6 +143,8 @@ export const SETTINGS_KEYS: Readonly<Record<string, string>> = Object.freeze({
143
143
  "which submission on the venue's portal is this paper's: { \"id\": <number> } — paperlint submission, with the preset's \"portal\". Set only in a paper's own paperlint.json; in the root paperlint.json it is an error",
144
144
  authors:
145
145
  'the authors as the venue\'s portal should record them, in order: [{ "name", "email", "affiliation"? }] — paperlint submission new. Set only in a paper\'s own paperlint.json; in the root paperlint.json it is an error',
146
+ fields:
147
+ 'the paper\'s answers to the venue\'s own form fields, keyed as the preset\'s "submission_fields" names them: { "topics": ["<an option>"], "pc_conflicts": { "<pc email>": "<conflict type>" }, … } — checked against those fields, then sent by paperlint submission new and update. Set only in a paper\'s own paperlint.json; in the root paperlint.json it is an error',
146
148
  cycles:
147
149
  "the paper's attempts at venues, oldest first: [{ id, venue, kind, opened, phase?, deadlines, submission?, outcome }] — extends, kind and submission are then the current attempt's, and the cycle/ rules judge the record. Set only in a paper's own paperlint.json; in the root paperlint.json it is an error",
148
150
  scripts: "how skill prose names the scripts — consumer.mjs",
@@ -158,6 +160,7 @@ export const PAPER_ONLY_KEYS: readonly string[] = Object.freeze([
158
160
  "talk",
159
161
  "submission",
160
162
  "authors",
163
+ "fields",
161
164
  "cycles",
162
165
  ]);
163
166
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paperlint",
3
- "version": "11.0.0",
3
+ "version": "11.1.0",
4
4
  "description": "A linter for scientific papers written in LaTeX: catches mistakes before you submit to a conference or journal.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/presets/msr.jsonc CHANGED
@@ -60,6 +60,72 @@
60
60
  },
61
61
  ],
62
62
 
63
+ // The fields msr2027's submission form asks beyond title, abstract, authors and the PDF, read
64
+ // 2026-10-20. The topics through the portal's API: `GET /api/searchcompletion` with an author's
65
+ // token lists 45 `topic:"…"` completions — these 41 and the 4 group names (DS/ML/AI Technique,
66
+ // Research Method, SE Topic, Software repository), which a submission cannot carry. Each of the 41
67
+ // was sent alone in a dry run of `POST /api/paper` and taken (`change_list` names `topics`); the
68
+ // bare subtopic «AI for software engineering» and the group «SE Topic» were dropped without an
69
+ // error. The form says «Select at least one topic». «ACM corresponding author» (`ACMCorAut`, listed
70
+ // by `/api/displayfields`) is a selector of the authors in the form; the API takes an author's
71
+ // email (a dry run with a name: «Format error»). `paperlint submission topics` re-reads the list.
72
+ "submission_fields": {
73
+ "source": "portal",
74
+ "url": "https://msr2027.hotcrp.com/api/searchcompletion",
75
+ "read": "2026-10-20",
76
+ "fields": {
77
+ "topics": {
78
+ "kind": "checkboxes",
79
+ "required": true,
80
+ "options": [
81
+ "DS/ML/AI Technique: Classical machine learning (e.g., regression, SVMs, nearest neighbour, decision trees, PCA, naive Bayes classifier, and k-means clustering)",
82
+ "DS/ML/AI Technique: Convolutional neural networks",
83
+ "DS/ML/AI Technique: LLM or other foundation models (e.g., large vision model)",
84
+ "DS/ML/AI Technique: Reinforcement learning",
85
+ "DS/ML/AI Technique: Transformers",
86
+ "Performance analysis and testing",
87
+ "Research Method: Controlled experiments with human subjects (e.g., A/B tests, lab studies)",
88
+ "Research Method: Qualitative analysis (e.g., thematic analysis, grounded theory)",
89
+ "Research Method: Statistical analysis and modelling",
90
+ "Research Method: Survey design and analysis",
91
+ "SE Topic: AI for software engineering",
92
+ "SE Topic: API design and evolution",
93
+ "SE Topic: App store analysis",
94
+ "SE Topic: Cloud-based and distributed systems",
95
+ "SE Topic: Debugging, fault localization, and fault prediction",
96
+ "SE Topic: DevOps and release engineering",
97
+ "SE Topic: Distributed and collaborative software engineering",
98
+ "SE Topic: Energy profiling",
99
+ "SE Topic: Ethical concerns (bias, fairness, explainability, etc.)",
100
+ "SE Topic: Human aspects",
101
+ "SE Topic: Legal aspects (licenses, copyright, etc.)",
102
+ "SE Topic: Privacy and security",
103
+ "SE Topic: Program comprehension",
104
+ "SE Topic: Recommender systems",
105
+ "SE Topic: Software development processes",
106
+ "SE Topic: Software ecosystems",
107
+ "SE Topic: Software engineering for AI",
108
+ "SE Topic: Software maintenance and evolution",
109
+ "SE Topic: Software measurement and analytics",
110
+ "SE Topic: Software quality assurance",
111
+ "SE Topic: Source / test code",
112
+ "SE Topic: Version control history logs",
113
+ "Software repository: App stores",
114
+ "Software repository: Archived communications (mailing lists, Gitter/Slack/Discord channels, etc.)",
115
+ "Software repository: Build / CI logs",
116
+ "Software repository: Code reviews",
117
+ "Software repository: Execution traces and logs",
118
+ "Software repository: Human interaction data",
119
+ "Software repository: Issue trackers / defect repositories",
120
+ "Software repository: Package registries / software releases",
121
+ "Software repository: Q&A websites",
122
+ ],
123
+ },
124
+ "pc_conflicts": { "kind": "pc_conflicts" },
125
+ "ACMCorAut": { "kind": "email", "label": "ACM corresponding author" },
126
+ },
127
+ },
128
+
63
129
  // What the venue is called in a paper's text (tex/venue-leftover) — and only beside a year
64
130
  // («MSR 2027», «MSR'27»): «MSR» is also Microsoft Research, and an acronym papers define for
65
131
  // themselves («Manual Speech Recognition (MSR)», in an accepted ACSAC paper of
@@ -117,6 +117,47 @@
117
117
  }
118
118
  }
119
119
  },
120
+ "submission_fields": {
121
+ "description": "The fields the edition's submission form asks beyond the title, the abstract, the authors and the PDF, as READ — where (`source`: `portal`, through the portal's API; `form`, copied from the form), from which page and on which day. Read by `paperlint submission`: a paper answers them in its paperlint.json `fields`, checked against these before anything is sent, so an option the form does not offer is refused here instead of dropped by the portal without a word. `fields` maps the portal API's key to its kind: `checkboxes` (a list of `options`, HotCRP's topics spelled \"Group: Topic\"), `text`, `email`, `pc_conflicts` (PC member's email → conflict type). `required`: the form does not complete without it. A child's value replaces its parent's.",
122
+ "type": "object",
123
+ "additionalProperties": false,
124
+ "required": ["source", "url", "read", "fields"],
125
+ "properties": {
126
+ "source": { "type": "string", "enum": ["portal", "form"] },
127
+ "url": { "type": "string", "pattern": "^https?://[^\\s/]+[^\\s]*$" },
128
+ "read": {
129
+ "description": "The day the fields were read, YYYY-MM-DD.",
130
+ "type": "string",
131
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
132
+ },
133
+ "fields": {
134
+ "type": "object",
135
+ "minProperties": 1,
136
+ "additionalProperties": {
137
+ "type": "object",
138
+ "additionalProperties": false,
139
+ "required": ["kind"],
140
+ "properties": {
141
+ "kind": {
142
+ "type": "string",
143
+ "enum": ["checkboxes", "text", "email", "pc_conflicts"]
144
+ },
145
+ "required": { "type": "boolean" },
146
+ "label": { "type": "string", "minLength": 1 },
147
+ "options": {
148
+ "type": "array",
149
+ "minItems": 1,
150
+ "uniqueItems": true,
151
+ "items": { "type": "string", "minLength": 1 }
152
+ }
153
+ },
154
+ "if": { "properties": { "kind": { "const": "checkboxes" } } },
155
+ "then": { "required": ["options"] },
156
+ "else": { "not": { "required": ["options"] } }
157
+ }
158
+ }
159
+ }
160
+ },
120
161
  "required_sections": {
121
162
  "description": "Sections the venue requires, read by `tex/required-section`. Each is a `\\section` or `\\section*` whose title equals `title` once whitespace is collapsed. `position: \"last\"`: after every section of the body (the ones before the appendix and the bibliography); it may stand after the bibliography. A child preset's list replaces its parent's.",
122
163
  "type": "array",
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: submission-portal
3
- description: "Create, read or change a paper's submission on the venue's HotCRP portal via `paperlint submission new|show|update`: register the paper, replace the PDF or abstract, mark it submitted, and verify by sha256 that the portal holds the latest build. Use when the paper is not yet on HotCRP, when its PDF or abstract there needs replacing, when asked whether it is truly submitted, or before a deadline. Composes with submit-paper (what to submit)."
4
- allowed-tools: [Read, Grep, Glob, Bash]
3
+ description: "Create, read or change a paper's submission on the venue's HotCRP portal via `paperlint submission new|show|update|topics`: register the paper, choose its topics and PC conflicts, replace the PDF or abstract, mark it submitted, and verify by sha256 that the portal holds the latest build. Use when the paper is not yet on HotCRP, when its topics or conflicts are unset, when its PDF or abstract there needs replacing, when asked whether it is truly submitted, or before a deadline. Composes with submit-paper (what to submit)."
4
+ allowed-tools: [Read, Grep, Glob, Bash, Edit, AskUserQuestion]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:03bc35623dbd7911 compiled from skills/submission-portal/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:fce320c54b6c3a92 compiled from skills/submission-portal/SKILL.md.spec.ts -->
8
8
 
9
9
  # submission-portal — create, read and update the submission on the portal, then prove it landed
10
10
 
@@ -13,9 +13,13 @@ Only HotCRP is supported; for any other portal the command says so and the uploa
13
13
 
14
14
  ## What the command does, and what stays on the site
15
15
 
16
- `submission new` creates the submission with the title, the abstract, the authors and the PDF.
17
- Everything else — conflicts, topics, the venue's own fields — is done on the site by the author: the
18
- command prints that list, with the submission's page, after every run.
16
+ `submission new` creates the submission with the title, the abstract, the authors and the PDF;
17
+ `new` and `update` also send the paper's `"fields"` — its answers to the venue's own form
18
+ fields (topics, PC conflicts, a corresponding author …), which the venue preset records in
19
+ `"submission_fields"` (`paperlint:msr` does). A value the form does not offer is refused before
20
+ anything is sent; a topic the portal did not take prints `NOT TAKEN` and fails the command. What
21
+ the preset records no field for stays on the site: the command prints that list, with the
22
+ submission's page, after `new`.
19
23
 
20
24
  ## Token
21
25
 
@@ -34,6 +38,10 @@ their own environment.
34
38
  "affiliation" }]`, every author in the paper's order. The author writes this list; never fill it
35
39
  in from the paper, a profile or memory.
36
40
  - **For `show` and `update`: `"submission": { "id": <number> }`** — `new --save` writes it.
41
+ - **`"fields"` in the paper's `paperlint.json`**, keyed as the preset's `"submission_fields"`
42
+ names them: `{ "topics": ["<an option, spelled as listed>"], "pc_conflicts": { "<pc email>":
43
+ "<conflict type>" }, "ACMCorAut": "<an author's email>" }`. Written only with the author's
44
+ choices, below.
37
45
 
38
46
  A missing key or token stops the command with exit 2 and a line naming what to set — fix exactly that.
39
47
 
@@ -41,26 +49,42 @@ A missing key or token stops the command with exit 2 and a line naming what to s
41
49
 
42
50
  `papers/my-paper` stands for the paper's folder.
43
51
 
44
- 0. **Create it, once — only while the paper has no `submission` id.**
52
+ 0. **Topics, chosen with the author.** `npx paperlint submission topics papers/my-paper` reads the
53
+ topics the portal offers and marks each against the preset (exit 1 when they differ — then the
54
+ preset is stale: say so, and record the portal's list). Read the paper's abstract and
55
+ contribution, pick the topics that fit, and **ask with `AskUserQuestion`** (`multiSelect: true`,
56
+ your proposed topics first, each with one line on why it fits; the author may pick others).
57
+ Write only the chosen ones into `"fields": { "topics": [...] }`, spelled exactly as listed.
58
+ The same for every other field the preset records (`ACMCorAut`: ask which author).
59
+ 1. **Create it, once — only while the paper has no `submission` id.**
45
60
  `npx paperlint submission new papers/my-paper` is a dry run: the portal checks it and keeps
46
- nothing. It prints the title, the authors and the whole abstract (read from the source's
47
- `\begin{abstract}`). Read them with the author; an abstract the command cannot read, or one
48
- that reads wrong, is given as a plain-text file with `--abstract <file>`.
49
- 1. **Ask the author** for an explicit yes, then `npx paperlint submission new papers/my-paper --save`,
50
- and do the printed "on the site" list with the author.
51
- 2. **Read it.** `npx paperlint submission show papers/my-paper` — status, the PDF the portal holds,
61
+ nothing. It prints the title, the authors, the whole abstract (read from the source's
62
+ `\begin{abstract}`) and each `field` it sends. Read them with the author; an abstract the
63
+ command cannot read, or one that reads wrong, is given as a plain-text file with
64
+ `--abstract <file>`.
65
+ 2. **Ask with `AskUserQuestion`** before the real send, the question showing exactly what goes
66
+ (title, authors, the abstract's first sentence and word count, each field): yes, or no. Only on
67
+ yes: `npx paperlint submission new papers/my-paper --save`, then the printed "still to do" list
68
+ with the author.
69
+ 3. **Read it.** `npx paperlint submission show papers/my-paper` — status, the PDF the portal holds,
52
70
  and `match`: whether it is the local build. Rebuild first if the local PDF is stale.
53
- 3. **Dry run the change.** `npx paperlint submission update papers/my-paper` (`--abstract <file>`,
54
- `--submit` to mark it submitted). Exit 1 means the portal would refuse it — report why, stop.
55
- 4. **Ask the author** for an explicit yes, then the same command with `--save`.
56
- 5. **Prove it landed.** `show` again: `match` must read `yes — the portal holds this build`, and
71
+ 4. **Dry run the change.** `npx paperlint submission update papers/my-paper` (`--abstract <file>`,
72
+ `--submit` to mark it submitted); it sends the paper's `"fields"` too. Exit 1 means the portal
73
+ would refuse it, or did not take a topic — report why, stop.
74
+ 5. **Ask with `AskUserQuestion`** before every real send — each `--save`, and `--submit` above
75
+ all — the question showing what changes (the PDF and its sha256, the abstract, each field,
76
+ "submitted"). Only on yes: the same command with `--save`. A dry run needs no question.
77
+ 6. **Prove it landed.** `show` again: `match` must read `yes — the portal holds this build`, and
57
78
  the status must be what was intended. Anything else is not done — say so.
58
79
 
59
80
  🔴 `--save` creates or changes a real submission that reviewers will see: never without the
60
- author's yes in this conversation, never "to test", never because a dry run passed.
81
+ author's yes to an `AskUserQuestion` in this conversation, never "to test", never because a dry run
82
+ passed.
61
83
 
62
84
  ```bash
63
85
  npx paperlint build papers/my-paper
86
+ npx paperlint submission topics papers/my-paper
87
+ # … AskUserQuestion: which topics; the chosen ones into "fields" …
64
88
  # only while the paper has no submission id:
65
89
  npx paperlint submission new papers/my-paper
66
90
  # … the author reads the dry run and says yes …
@@ -77,9 +101,16 @@ npx paperlint submission show papers/my-paper
77
101
  - `match yes` is the only proof the reviewers get the local build; `submitted` alone says nothing
78
102
  about WHICH PDF.
79
103
  - `portal says: …` lines are the portal's own words; quote them.
104
+ - `portal says: pc_conflicts: You may have missed conflicts of interest with …` — HotCRP guesses
105
+ these from the authors' and the PC's profiles, chiefly an affiliation string they share (two
106
+ "Independent Researcher"s are flagged though they are strangers). Show each name to the author with
107
+ that explanation and ask; **never** mark a conflict from the warning alone. A real conflict goes
108
+ into `"fields": { "pc_conflicts": { "<their email>": "<type>" } }` with the author's word.
109
+ - `NOT TAKEN` — the portal kept none of that field's options: the spelling is not the portal's.
110
+ Run `submission topics` and fix the value.
80
111
  - `SAVE WITHHELD` or `NOTHING CREATED` — the portal saved nothing.
81
112
 
82
113
  ## What this skill does not do
83
114
 
84
- It does not decide whether the paper is ready (`harden-paper`), anonymize it, or set the portal's
85
- other fields — see `submit-paper`.
115
+ It does not decide whether the paper is ready (`harden-paper`), anonymize it, or set the fields the
116
+ venue preset does not record — see `submit-paper`.
@@ -4,8 +4,8 @@ import { experimental_skill } from "vigiles/spec";
4
4
  export default experimental_skill({
5
5
  name: "submission-portal",
6
6
  description:
7
- "Create, read or change a paper's submission on the venue's HotCRP portal via `paperlint submission new|show|update`: register the paper, replace the PDF or abstract, mark it submitted, and verify by sha256 that the portal holds the latest build. Use when the paper is not yet on HotCRP, when its PDF or abstract there needs replacing, when asked whether it is truly submitted, or before a deadline. Composes with submit-paper (what to submit).",
8
- tools: ["Read", "Grep", "Glob", "Bash"],
7
+ "Create, read or change a paper's submission on the venue's HotCRP portal via `paperlint submission new|show|update|topics`: register the paper, choose its topics and PC conflicts, replace the PDF or abstract, mark it submitted, and verify by sha256 that the portal holds the latest build. Use when the paper is not yet on HotCRP, when its topics or conflicts are unset, when its PDF or abstract there needs replacing, when asked whether it is truly submitted, or before a deadline. Composes with submit-paper (what to submit).",
8
+ tools: ["Read", "Grep", "Glob", "Bash", "Edit", "AskUserQuestion"],
9
9
  // The `npx paperlint submission …` commands in the body are not verified at compile time until
10
10
  // zernie/vigiles#395 (cmd() for the package's own CLI): keep them in step with src/cli.ts by hand.
11
11
  // Do not re-add a test that re-parses the compiled SKILL.md — that check belongs in vigiles.
@@ -17,9 +17,13 @@ Only HotCRP is supported; for any other portal the command says so and the uploa
17
17
 
18
18
  ## What the command does, and what stays on the site
19
19
 
20
- \`submission new\` creates the submission with the title, the abstract, the authors and the PDF.
21
- Everything else — conflicts, topics, the venue's own fields — is done on the site by the author: the
22
- command prints that list, with the submission's page, after every run.
20
+ \`submission new\` creates the submission with the title, the abstract, the authors and the PDF;
21
+ \`new\` and \`update\` also send the paper's \`"fields"\` — its answers to the venue's own form
22
+ fields (topics, PC conflicts, a corresponding author …), which the venue preset records in
23
+ \`"submission_fields"\` (\`paperlint:msr\` does). A value the form does not offer is refused before
24
+ anything is sent; a topic the portal did not take prints \`NOT TAKEN\` and fails the command. What
25
+ the preset records no field for stays on the site: the command prints that list, with the
26
+ submission's page, after \`new\`.
23
27
 
24
28
  ## Token
25
29
 
@@ -38,6 +42,10 @@ their own environment.
38
42
  "affiliation" }]\`, every author in the paper's order. The author writes this list; never fill it
39
43
  in from the paper, a profile or memory.
40
44
  - **For \`show\` and \`update\`: \`"submission": { "id": <number> }\`** — \`new --save\` writes it.
45
+ - **\`"fields"\` in the paper's \`paperlint.json\`**, keyed as the preset's \`"submission_fields"\`
46
+ names them: \`{ "topics": ["<an option, spelled as listed>"], "pc_conflicts": { "<pc email>":
47
+ "<conflict type>" }, "ACMCorAut": "<an author's email>" }\`. Written only with the author's
48
+ choices, below.
41
49
 
42
50
  A missing key or token stops the command with exit 2 and a line naming what to set — fix exactly that.
43
51
 
@@ -45,26 +53,42 @@ A missing key or token stops the command with exit 2 and a line naming what to s
45
53
 
46
54
  \`papers/my-paper\` stands for the paper's folder.
47
55
 
48
- 0. **Create it, once — only while the paper has no \`submission\` id.**
56
+ 0. **Topics, chosen with the author.** \`npx paperlint submission topics papers/my-paper\` reads the
57
+ topics the portal offers and marks each against the preset (exit 1 when they differ — then the
58
+ preset is stale: say so, and record the portal's list). Read the paper's abstract and
59
+ contribution, pick the topics that fit, and **ask with \`AskUserQuestion\`** (\`multiSelect: true\`,
60
+ your proposed topics first, each with one line on why it fits; the author may pick others).
61
+ Write only the chosen ones into \`"fields": { "topics": [...] }\`, spelled exactly as listed.
62
+ The same for every other field the preset records (\`ACMCorAut\`: ask which author).
63
+ 1. **Create it, once — only while the paper has no \`submission\` id.**
49
64
  \`npx paperlint submission new papers/my-paper\` is a dry run: the portal checks it and keeps
50
- nothing. It prints the title, the authors and the whole abstract (read from the source's
51
- \`\\begin{abstract}\`). Read them with the author; an abstract the command cannot read, or one
52
- that reads wrong, is given as a plain-text file with \`--abstract <file>\`.
53
- 1. **Ask the author** for an explicit yes, then \`npx paperlint submission new papers/my-paper --save\`,
54
- and do the printed "on the site" list with the author.
55
- 2. **Read it.** \`npx paperlint submission show papers/my-paper\` — status, the PDF the portal holds,
65
+ nothing. It prints the title, the authors, the whole abstract (read from the source's
66
+ \`\\begin{abstract}\`) and each \`field\` it sends. Read them with the author; an abstract the
67
+ command cannot read, or one that reads wrong, is given as a plain-text file with
68
+ \`--abstract <file>\`.
69
+ 2. **Ask with \`AskUserQuestion\`** before the real send, the question showing exactly what goes
70
+ (title, authors, the abstract's first sentence and word count, each field): yes, or no. Only on
71
+ yes: \`npx paperlint submission new papers/my-paper --save\`, then the printed "still to do" list
72
+ with the author.
73
+ 3. **Read it.** \`npx paperlint submission show papers/my-paper\` — status, the PDF the portal holds,
56
74
  and \`match\`: whether it is the local build. Rebuild first if the local PDF is stale.
57
- 3. **Dry run the change.** \`npx paperlint submission update papers/my-paper\` (\`--abstract <file>\`,
58
- \`--submit\` to mark it submitted). Exit 1 means the portal would refuse it — report why, stop.
59
- 4. **Ask the author** for an explicit yes, then the same command with \`--save\`.
60
- 5. **Prove it landed.** \`show\` again: \`match\` must read \`yes — the portal holds this build\`, and
75
+ 4. **Dry run the change.** \`npx paperlint submission update papers/my-paper\` (\`--abstract <file>\`,
76
+ \`--submit\` to mark it submitted); it sends the paper's \`"fields"\` too. Exit 1 means the portal
77
+ would refuse it, or did not take a topic — report why, stop.
78
+ 5. **Ask with \`AskUserQuestion\`** before every real send — each \`--save\`, and \`--submit\` above
79
+ all — the question showing what changes (the PDF and its sha256, the abstract, each field,
80
+ "submitted"). Only on yes: the same command with \`--save\`. A dry run needs no question.
81
+ 6. **Prove it landed.** \`show\` again: \`match\` must read \`yes — the portal holds this build\`, and
61
82
  the status must be what was intended. Anything else is not done — say so.
62
83
 
63
84
  🔴 \`--save\` creates or changes a real submission that reviewers will see: never without the
64
- author's yes in this conversation, never "to test", never because a dry run passed.
85
+ author's yes to an \`AskUserQuestion\` in this conversation, never "to test", never because a dry run
86
+ passed.
65
87
 
66
88
  \`\`\`bash
67
89
  npx paperlint build papers/my-paper
90
+ npx paperlint submission topics papers/my-paper
91
+ # … AskUserQuestion: which topics; the chosen ones into "fields" …
68
92
  # only while the paper has no submission id:
69
93
  npx paperlint submission new papers/my-paper
70
94
  # … the author reads the dry run and says yes …
@@ -81,10 +105,17 @@ npx paperlint submission show papers/my-paper
81
105
  - \`match yes\` is the only proof the reviewers get the local build; \`submitted\` alone says nothing
82
106
  about WHICH PDF.
83
107
  - \`portal says: …\` lines are the portal's own words; quote them.
108
+ - \`portal says: pc_conflicts: You may have missed conflicts of interest with …\` — HotCRP guesses
109
+ these from the authors' and the PC's profiles, chiefly an affiliation string they share (two
110
+ "Independent Researcher"s are flagged though they are strangers). Show each name to the author with
111
+ that explanation and ask; **never** mark a conflict from the warning alone. A real conflict goes
112
+ into \`"fields": { "pc_conflicts": { "<their email>": "<type>" } }\` with the author's word.
113
+ - \`NOT TAKEN\` — the portal kept none of that field's options: the spelling is not the portal's.
114
+ Run \`submission topics\` and fix the value.
84
115
  - \`SAVE WITHHELD\` or \`NOTHING CREATED\` — the portal saved nothing.
85
116
 
86
117
  ## What this skill does not do
87
118
 
88
- It does not decide whether the paper is ready (\`harden-paper\`), anonymize it, or set the portal's
89
- other fields — see \`submit-paper\`.`,
119
+ It does not decide whether the paper is ready (\`harden-paper\`), anonymize it, or set the fields the
120
+ venue preset does not record — see \`submit-paper\`.`,
90
121
  });
@@ -11,12 +11,13 @@ saved. Identifying values (the submission id, title, abstract, authors, topics,
11
11
  timestamps) are replaced with fakes; HotCRP's keys, value types, statuses and message texts are
12
12
  verbatim.
13
13
 
14
- | file | request | HTTP |
15
- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---: |
16
- | `get-paper.json` | `GET /api/paper?p=<id>&word_limit=hard` with a token | 200 |
17
- | `get-noauth.json` | the same without a token | 401 |
18
- | `post-dot.json` | `POST /api/paper?p=<id>&dry_run=1`, PDF part named `paper.pdf`, `content_file` the same — PHP renames the field to `paper_pdf`, so HotCRP finds no upload | 200 |
19
- | `post-ok.json` | the same with the part and `content_file` named `paperlint_pdf` | 200 |
14
+ | file | request | HTTP |
15
+ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---: |
16
+ | `get-paper.json` | `GET /api/paper?p=<id>&word_limit=hard` with a token | 200 |
17
+ | `get-noauth.json` | the same without a token | 401 |
18
+ | `post-dot.json` | `POST /api/paper?p=<id>&dry_run=1`, PDF part named `paper.pdf`, `content_file` the same — PHP renames the field to `paper_pdf`, so HotCRP finds no upload | 200 |
19
+ | `post-ok.json` | the same with the part and `content_file` named `paperlint_pdf` | 200 |
20
+ | `get-searchcompletion.json` | `GET /api/searchcompletion` on msr2027.hotcrp.com with an author's token, 2026-10-20 — the site's search completions, its topics among them; no personal data, nothing replaced | 200 |
20
21
 
21
22
  To re-record: run the same four requests with `curl` against a HotCRP site where you have a
22
23
  submission and a token (`Authorization: bearer $HOTCRP_TOKEN_<SITE>`), always with `dry_run=1` on a `POST`,