@airmark/quiver 0.33.0 → 0.35.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 (54) hide show
  1. package/README.md +18 -12
  2. package/package.json +7 -7
  3. package/quills/af4141/0.1.0/Quill.yaml +3 -12
  4. package/quills/af4141/0.1.0/example.md +53 -0
  5. package/quills/afmc_moa/0.0.1/Quill.yaml +29 -45
  6. package/quills/afmc_moa/0.0.1/example.md +114 -0
  7. package/quills/afmc_moa/0.0.1/packages/typst-afmc-moa/src/config.typ +1 -1
  8. package/quills/classic_resume/{0.0.1 → 0.1.0}/Quill.yaml +88 -168
  9. package/quills/classic_resume/0.1.0/example.md +111 -0
  10. package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/src/components.typ +77 -35
  11. package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/src/config.typ +23 -14
  12. package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/src/layout.typ +37 -7
  13. package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/src/lib.typ +1 -0
  14. package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/util.typ +50 -0
  15. package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/typst.toml +0 -5
  16. package/quills/classic_resume/{0.0.1 → 0.1.0}/plate.typ +63 -56
  17. package/quills/cyber_career_plan/0.1.0/Quill.yaml +328 -0
  18. package/quills/cyber_career_plan/0.1.0/example.md +55 -0
  19. package/quills/cyber_career_plan/0.1.0/plate.typ +681 -0
  20. package/quills/daf1206/0.1.0/Quill.yaml +14 -16
  21. package/quills/daf1206/0.1.0/example.md +55 -0
  22. package/quills/daf4392/0.1.0/Quill.yaml +1 -6
  23. package/quills/daf4392/0.1.0/example.md +51 -0
  24. package/quills/usaf_letter/0.1.0/Quill.yaml +7 -42
  25. package/quills/usaf_letter/0.1.0/example.md +35 -0
  26. package/quills/{usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE → usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/SpectralSC/OFL.txt} +2 -2
  27. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/SpectralSC/SpectralSC-Italic.ttf +0 -0
  28. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/SpectralSC/SpectralSC-Regular.ttf +0 -0
  29. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/src/frontmatter.typ +1 -1
  30. package/quills/usaf_letter/0.1.0/plate.typ +1 -4
  31. package/quills/usaf_memo/0.2.0/Quill.yaml +7 -40
  32. package/quills/usaf_memo/0.2.0/example.md +45 -0
  33. package/quills/usaf_memo/0.3.0/Quill.yaml +13 -50
  34. package/quills/usaf_memo/0.3.0/example.md +48 -0
  35. package/quills/{usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/Cinzel/LICENSE → usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/SpectralSC/OFL.txt} +2 -2
  36. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/SpectralSC/SpectralSC-Italic.ttf +0 -0
  37. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/SpectralSC/SpectralSC-Regular.ttf +0 -0
  38. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +1 -1
  39. package/quills/usaf_memo/0.3.0/plate.typ +1 -4
  40. package/templates/deros_extension.md +40 -0
  41. package/templates/templates.json +7 -0
  42. package/quills/classic_resume/0.0.1/packages/ttq-classic-resume/src/util.typ +0 -32
  43. package/quills/cyber_ribbon_chart/0.0.1/Quill.yaml +0 -320
  44. package/quills/cyber_ribbon_chart/0.0.1/plate.typ +0 -428
  45. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/Cinzel/Cinzel-Regular.ttf +0 -0
  46. package/quills/usaf_letter/0.1.0/packages/tonguetoquill-usaf-letter/fonts/CopperplateCC/CopperplateCC-Heavy.otf +0 -0
  47. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel-Regular.ttf +0 -0
  48. package/quills/usaf_memo/0.3.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/CopperplateCC-Heavy.otf +0 -0
  49. /package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/LICENSE +0 -0
  50. /package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-Bold.ttf +0 -0
  51. /package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-BoldItalic.ttf +0 -0
  52. /package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-Italic.ttf +0 -0
  53. /package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/fonts/EBGaramond/EBGaramond-Regular.ttf +0 -0
  54. /package/quills/classic_resume/{0.0.1 → 0.1.0}/packages/ttq-classic-resume/fonts/EBGaramond/OFL.txt +0 -0
@@ -8,27 +8,15 @@ typst:
8
8
  plate_file: plate.typ
9
9
 
10
10
  main:
11
+ description: "Top-level body paragraphs are numbered and nested bullets lettered automatically; do not number them by hand. Put lines that take no number, letter, or bullet, such as a roster of names or an address, in a block quote, typeset as written. End a line with a backslash to break it."
11
12
  ui:
12
13
  groups: [addressing, letterhead, classification, additional]
13
- body:
14
- example: |
15
- The first paragraph. Top-level paragraphs are auto-numbered; do not add manual numbering.
16
-
17
- - Nested bullets are automatically lettered.
18
-
19
- Lines that take no number, letter, or bullet — a roster of names, an address — go in a block quote, typeset as written. End a line with a backslash to break it.
20
-
21
- > MARY E. BROWN, Maj, USAF\
22
- > ROBERT L. JONES, Capt, USAF
23
14
  fields:
24
15
  memo_for:
25
16
  type: array
26
17
  items:
27
18
  type: plaintext
28
19
  inline: true
29
- example:
30
- - 123 OG/CC
31
- - 123 MXG/CC
32
20
  ui:
33
21
  group: addressing
34
22
  compact: true
@@ -40,10 +28,6 @@ main:
40
28
  type: plaintext
41
29
  inline: true
42
30
  default: []
43
- example:
44
- - 123 CS/SCX
45
- - 1 Example Way
46
- - Example AFB ST 12345-6789
47
31
  ui:
48
32
  group: addressing
49
33
  compact: true
@@ -52,7 +36,6 @@ main:
52
36
  subject:
53
37
  type: richtext
54
38
  inline: true
55
- example: "Annual Records Management Review (Suspense: 30 October 2026)"
56
39
  ui:
57
40
  group: addressing
58
41
  description: "Keep it brief. Capitalize the first letter of each word except articles, prepositions, and conjunctions. Put any suspense date in parentheses. Italicize publication titles with *asterisks*."
@@ -69,7 +52,6 @@ main:
69
52
  type: plaintext
70
53
  inline: true
71
54
  default: ""
72
- example: FOR THE COMMANDER
73
55
  ui:
74
56
  group: addressing
75
57
  compact: true
@@ -80,13 +62,10 @@ main:
80
62
  items:
81
63
  type: plaintext
82
64
  inline: true
83
- example:
84
- - "JOHN B. SMITH, Maj, USAF"
85
- - Director of Operations
86
65
  ui:
87
66
  group: addressing
88
67
  compact: true
89
- description: "Line 1: Name in UPPERCASE as signed, grade, and service. Line 2: Duty title."
68
+ description: "Line 1: Name in UPPERCASE as signed, grade, and service, as in 'FIRST M. LAST, Capt, USAF'. Line 2: Duty title."
90
69
 
91
70
  letterhead_title:
92
71
  type: array
@@ -95,9 +74,6 @@ main:
95
74
  inline: true
96
75
  default:
97
76
  - DEPARTMENT OF THE AIR FORCE
98
- example:
99
- - DEPARTMENT OF THE AIR FORCE
100
- - 123D COMMUNICATIONS SQUADRON
101
77
  ui:
102
78
  group: letterhead
103
79
  description: "Letterhead lines, top to bottom, all rendered in uppercase. The first is the department title, set larger than the rest. Change that line only for a Joint Command or a DoW agency. The lines below it are your unit's full organization name."
@@ -129,7 +105,7 @@ main:
129
105
  ui:
130
106
  group: letterhead
131
107
  compact: true
132
- description: "Organizational motto, centered in the footer of every page. Supports Markdown emphasis: *italics*, **bold**."
108
+ description: "Organizational motto, centered in the footer of every page in small caps. Supports *italics*; bold prints regular."
133
109
 
134
110
  classification:
135
111
  type: enum
@@ -149,13 +125,11 @@ main:
149
125
  controlled_by:
150
126
  type: plaintext
151
127
  inline: true
152
- example: SAF/AA
153
- description: "Office or organization that designated this information as CUI. Required by DoDM 5200.48."
128
+ description: "Office or organization that designated this information as CUI, such as 'SAF/AA'. Required by DoDM 5200.48."
154
129
  poc:
155
130
  type: plaintext
156
131
  inline: true
157
- example: "Capt J. Smith, DSN 555-1234, john.smith@us.af.mil"
158
- description: "Point of contact for CUI questions. Required by DoDM 5200.48."
132
+ description: "Point of contact for CUI questions, with phone and email, as in 'Capt J. Smith, DSN 555-1234, john.smith@us.af.mil'. Required by DoDM 5200.48."
159
133
  category:
160
134
  type: plaintext
161
135
  inline: true
@@ -182,9 +156,6 @@ main:
182
156
  type: richtext
183
157
  inline: true
184
158
  default: []
185
- example:
186
- - "AFMAN 33-326, 25 November 2011, *Preparing Official Communications*"
187
- - "AFI 33-360, *Publications and Forms Management*"
188
159
  ui:
189
160
  group: additional
190
161
  description: "Cite each reference by organization, type, date, and title. Two or more print as a References block lettered (a), (b), (c); a single one prints in parentheses after the subject, per AFH 33-337. Italicize publication titles with *asterisks*."
@@ -195,8 +166,6 @@ main:
195
166
  type: plaintext
196
167
  inline: true
197
168
  default: []
198
- example:
199
- - 123 WG/CCE
200
169
  ui:
201
170
  group: additional
202
171
  description: Offices or people receiving a courtesy copy, one per line.
@@ -207,11 +176,6 @@ main:
207
176
  type: plaintext
208
177
  inline: true
209
178
  default: []
210
- example:
211
- - 123 OG/CC
212
- - 123 MXG/CC
213
- - 123 MSG/CC
214
- - 123 MDG/CC
215
179
  ui:
216
180
  group: additional
217
181
  description: "Every recipient, listed here when 'SEE DISTRIBUTION' stands in the Memo For field."
@@ -222,11 +186,9 @@ main:
222
186
  type: richtext
223
187
  inline: true
224
188
  default: []
225
- example:
226
- - Records Management Self-Inspection Checklist, 1 September 2026
227
189
  ui:
228
190
  group: additional
229
- description: "Attachments in the order the memo mentions them. Describe each briefly; do not write 'as stated' or abbreviate. A lone attachment prints unnumbered, two or more are numbered. Italicize publication titles with *asterisks*."
191
+ description: "Attachments in the order the memo mentions them. Describe each briefly and give its date; do not write 'as stated' or abbreviate. A lone attachment prints unnumbered, two or more are numbered. Italicize publication titles with *asterisks*."
230
192
 
231
193
  memo_style:
232
194
  type: enum
@@ -253,11 +215,16 @@ card_kinds:
253
215
  description: "An endorsing official's response to the memo, or their forwarding of it onward. Indorsements are numbered in card order: 1st Ind, 2d Ind, 3d Ind."
254
216
  ui:
255
217
  groups: [addressing, additional]
218
+ seed:
219
+ from: ORG/SYMBOL
220
+ for: ORG/SYMBOL
221
+ signature_block:
222
+ - FIRST M. LAST, Rank, USAF
223
+ - Duty Title
256
224
  fields:
257
225
  from:
258
226
  type: plaintext
259
227
  inline: true
260
- example: 123 OG/CC
261
228
  ui:
262
229
  group: addressing
263
230
  compact: true
@@ -265,7 +232,6 @@ card_kinds:
265
232
  for:
266
233
  type: plaintext
267
234
  inline: true
268
- example: 123 CS/CC
269
235
  ui:
270
236
  group: addressing
271
237
  compact: true
@@ -290,13 +256,10 @@ card_kinds:
290
256
  items:
291
257
  type: plaintext
292
258
  inline: true
293
- example:
294
- - "RICHARD C. ROE, Col, USAF"
295
- - Commander
296
259
  ui:
297
260
  group: addressing
298
261
  compact: true
299
- description: "Line 1: Name in UPPERCASE as signed, grade, and service. Line 2: Duty title."
262
+ description: "Line 1: Name in UPPERCASE as signed, grade, and service, as in 'FIRST M. LAST, Capt, USAF'. Line 2: Duty title."
300
263
  format:
301
264
  type: enum
302
265
  values:
@@ -0,0 +1,48 @@
1
+ ~~~
2
+ $quill: usaf_memo
3
+ memo_for:
4
+ - 123 OG/CC
5
+ - 123 MXG/CC
6
+ - 123 MSG/CC
7
+ - 123 MDG/CC
8
+ memo_from:
9
+ - 123 CS/SCX
10
+ subject: "Annual Records Management Review (Suspense: 30 October 2026)"
11
+ date: 2026-09-15
12
+ authority_line: FOR THE COMMANDER
13
+ signature_block:
14
+ - JOHN B. SMITH, Maj, USAF
15
+ - Director of Operations
16
+ letterhead_title:
17
+ - DEPARTMENT OF THE AIR FORCE
18
+ - 123D COMMUNICATIONS SQUADRON
19
+ references:
20
+ - "AFMAN 33-326, 25 November 2011, *Preparing Official Communications*"
21
+ - "AFI 33-360, *Publications and Forms Management*"
22
+ cc:
23
+ - 123 WG/CCE
24
+ attachments:
25
+ - Records Management Self-Inspection Checklist, 1 September 2026
26
+ ~~~
27
+
28
+ Each group reviews every office of record it owns against references (a) and (b) by the suspense in the subject line. Group records custodians confirm two things for each office:
29
+
30
+ - The file plan lists every series the office keeps, with its disposition authority.
31
+ - Files past cutoff are staged for retirement or destruction.
32
+
33
+ Each group commander signs the checklist at the attachment and returns it to 123 CS/SCX. The base records staff below can walk any office through the review:
34
+
35
+ > MARY E. BROWN, Maj, USAF\
36
+ > ROBERT L. JONES, Capt, USAF
37
+
38
+ ~~~
39
+ $kind: indorsement
40
+ from: 123 OG/CC
41
+ for: 123 CS/SCX
42
+ date: 2026-10-22
43
+ signature_block:
44
+ - RICHARD C. ROE, Col, USAF
45
+ - Commander
46
+ ~~~
47
+
48
+ The 123 OG completed its review on 21 October 2026. All four squadron file plans are current, and 123 OSS retires its two cutoff series by 15 November 2026.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010, Toshi Omagari (tosche@mac.com)
1
+ Copyright 2017 The Spectral Project Authors (https://github.com/productiontype/Spectral)
2
2
 
3
3
  This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
4
  This license is copied below, and is also available with a FAQ at:
@@ -90,4 +90,4 @@ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
90
  INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
91
  DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
92
  FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
- OTHER DEALINGS IN THE FONT SOFTWARE.
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -142,7 +142,7 @@
142
142
  bottom + center,
143
143
  dy: -0.625in,
144
144
  align(center)[
145
- #text(fill: LETTERHEAD_COLOR, font: "cinzel", size: 15pt)[#footer-tag-line]
145
+ #text(fill: LETTERHEAD_COLOR, font: "Spectral SC", size: 15pt)[#footer-tag-line]
146
146
  ],
147
147
  )
148
148
  }
@@ -80,10 +80,7 @@
80
80
 
81
81
  ..if data.references.len() > 0 { (references: data.references) },
82
82
 
83
- // The package sets the tag line in Cinzel, which has no italic or bold face.
84
- // The body font set here, nearer the text, wins and carries real italics and
85
- // bold.
86
- footer-tag-line: text(font: "NimbusRomNo9L", data.tag_line),
83
+ footer-tag-line: data.tag_line,
87
84
 
88
85
  // The blank reads as no banner, which is what the package's own
89
86
  // `classification-level: none` default means.
@@ -0,0 +1,40 @@
1
+ ~~~
2
+ $quill: usaf_memo@0.3
3
+ $kind: main
4
+ letterhead_title:
5
+ - DEPARTMENT OF THE AIR FORCE
6
+ - YOUR SQUADRON HERE
7
+ memo_for:
8
+ - SQ/CC
9
+ - ORG FSS/FSPD
10
+ - AFPC ENLISTED DEROS MANAGEMENT
11
+ memo_from:
12
+ - ORG/SYMBOL
13
+ subject: Exception to Policy DEROS Extension Request (JOHN Q. SMITH, SSN)
14
+ signature_block:
15
+ - FIRST M. LAST, Rank, USAF
16
+ - Duty Title
17
+ tag_line: ""
18
+ ~~~
19
+
20
+ I am requesting an extension of my current DEROS from DD MMM YYYY to DD MMM YYYY. Why do you need this DEROS extension? What has caused the delay?
21
+
22
+ My original DEROS from insert base to insert base is *DD MMM YYYY* with a RNLTD of *DD MMM YYYY*
23
+
24
+ My personal information is as follows:
25
+
26
+ - Current DEROS: DD MMM YYYY
27
+
28
+ - Requested DEROS: DD MMM YYYY
29
+
30
+ For any questions or concerns you may contact me at *email* or DSN xxx-xxxx
31
+
32
+ ~~~
33
+ $kind: indorsement
34
+ from: ORG/CC
35
+ for: ORG FSS/FSPD
36
+ signature_block:
37
+ - FIRST M. LAST, Rank, USAF
38
+ - Commander
39
+ action: undecided
40
+ ~~~
@@ -54,5 +54,12 @@
54
54
  "description": "Appoint primary and alternate program managers with an appointee table",
55
55
  "file": "appointment_letter.md",
56
56
  "tags": ["appointment", "additional-duty", "air-force"]
57
+ },
58
+ {
59
+ "id": "deros-extension",
60
+ "name": "DEROS Extension Request",
61
+ "description": "Exception to policy DEROS extension request memorandum with commander indorsement",
62
+ "file": "deros_extension.md",
63
+ "tags": ["deros", "pcs", "assignments"]
57
64
  }
58
65
  ]
@@ -1,32 +0,0 @@
1
- // util.typ
2
- // Helpers shared by the components.
3
-
4
- // A contact line usually holds an email address, a profile link, a phone
5
- // number and a city. Only the first three are worth turning into a link, and
6
- // they are distinguishable by shape.
7
- #let _email = regex("^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$")
8
- #let _scheme = regex("^(https?://|www\\.)\\S+$")
9
- #let _domain = regex("^[\\w-]+(\\.[\\w-]+)*\\.[A-Za-z]{2,24}(/\\S*)?$")
10
- #let _phone = regex("^[+(\\d][\\d\\s()./+-]*\\d$")
11
- #let _digit = regex("\\d")
12
-
13
- // Turns a contact into a link when it looks like an email address, a web
14
- // address or a phone number, and returns it unchanged otherwise. A city or a
15
- // clearance level is therefore left alone, and so is anything that is already
16
- // content, so callers can always pass their own `link(..)` instead.
17
- #let auto-link(contact) = {
18
- if type(contact) != str {
19
- contact
20
- } else if contact.match(_email) != none {
21
- link("mailto:" + contact, contact)
22
- } else if contact.match(_scheme) != none {
23
- let href = if contact.starts-with("www.") { "https://" + contact } else { contact }
24
- link(href, contact)
25
- } else if contact.match(_domain) != none {
26
- link("https://" + contact, contact)
27
- } else if contact.match(_phone) != none and contact.matches(_digit).len() >= 7 {
28
- link("tel:" + contact.replace(regex("[^\\d+]"), ""), contact)
29
- } else {
30
- contact
31
- }
32
- }
@@ -1,320 +0,0 @@
1
- quill:
2
- name: cyber_ribbon_chart
3
- version: 0.0.1
4
- backend: typst
5
- description: 17X Cyber Operations Officer ribbon chart and career vector planner
6
-
7
- typst:
8
- plate_file: plate.typ
9
-
10
- # One landscape page an officer hands to a senior rater or a development team.
11
- # The top half is the plan — alternative assignment vectors laid over the years
12
- # the boards and schools fall in. The bottom half is the record that makes the
13
- # plan credible.
14
- main:
15
- ui:
16
- groups:
17
- officer: {}
18
- timeline: {}
19
- record: {}
20
- qualifications: { title: "Qualifications & experience" }
21
- # The chart's one piece of prose. It heads the notes area at the foot of the
22
- # page, above ruled lines a rater writes on during the discussion.
23
- body:
24
- example: |
25
- What you want out of this discussion, and anything that constrains it — a join-spouse, a degree finishing, a date you cannot move before.
26
- fields:
27
- name:
28
- # Read as `string` rather than `plaintext`: it reaches
29
- # `set document(author:)`, which takes no content.
30
- type: string
31
- example: Capt John A. Snuffy
32
- ui:
33
- group: officer
34
- description: "Grade and name as you want them read, set largest on the page. This is also the exported PDF's title and author, so it is written out rather than marked up."
35
-
36
- duty_title:
37
- type: plaintext
38
- inline: true
39
- default: ""
40
- example: 17S Instructor · 333 TRS, Keesler AFB
41
- ui:
42
- group: officer
43
- description: "Current duty title and unit, printed in one line under your name. Where you are today, not where you are going."
44
-
45
- commissioning_yg:
46
- type: integer
47
- example: 2022
48
- ui:
49
- group: officer
50
- compact: true
51
- description: "Commissioning year group. Every milestone on the timeline is counted from this year, so it is the one number that changes the whole chart — a board at YG+8 lands in this year plus eight."
52
-
53
- adjusted_yg:
54
- type: integer
55
- default: 0
56
- ui:
57
- group: officer
58
- compact: true
59
- description: "Adjusted year group, if a board or a break in service moved yours. Leave at 0 when it is unchanged; the chart then counts from your commissioning year group and prints nothing here."
60
-
61
- date_of_rank:
62
- type: date
63
- default: ""
64
- example: 2026-05-01
65
- ui:
66
- group: officer
67
- compact: true
68
- description: "Date of rank in your current grade, YYYY-MM-DD. Leave blank to print a dash."
69
-
70
- date_arrived_station:
71
- type: date
72
- default: ""
73
- example: 2025-06-15
74
- ui:
75
- group: officer
76
- compact: true
77
- description: "Date arrived station, YYYY-MM-DD. Read together with your first tour's length, it is what tells a rater when you are actually available to move."
78
-
79
- advanced_degree:
80
- type: plaintext
81
- inline: true
82
- default: ""
83
- example: MS Cyber Operations, AFIT
84
- ui:
85
- group: officer
86
- compact: true
87
- description: "Advanced academic degree, in hand or in progress. Leave blank if you hold none — the slot prints a dash rather than disappearing, because its absence is itself information to a board."
88
-
89
- timeline_start_year:
90
- type: integer
91
- example: 2026
92
- ui:
93
- group: timeline
94
- compact: true
95
- description: "First calendar year the timeline shows. Usually the current year: the chart is a plan, so it starts where you are, not where you commissioned."
96
-
97
- timeline_years:
98
- type: integer
99
- default: 12
100
- ui:
101
- group: timeline
102
- compact: true
103
- description: "How many years wide the timeline is. Twelve carries a Captain from today past the Lt Col board and is the comfortable reading width. The full milestone ladder runs to YG+17, so widening it toward eighteen brings the SDE looks into view at the cost of narrower columns; any milestone that falls outside the window is counted in a note rather than dropped."
104
-
105
- vectors:
106
- type: array
107
- max: 3
108
- items:
109
- type: object
110
- properties:
111
- label:
112
- type: plaintext
113
- inline: true
114
- default: ""
115
- example: Command track
116
- description: "Short name for the row, set in bold at the left of the timeline. Leave blank to print 'Vector 1', 'Vector 2' and so on in the order the rows stand."
117
- focus:
118
- type: plaintext
119
- inline: true
120
- default: ""
121
- example: Primary
122
- description: "What this vector is for, set small under the label — 'Primary', 'Alternate', 'Backup'. Leave blank where the label already says it."
123
- tours:
124
- type: array
125
- ui:
126
- layout: table
127
- items:
128
- type: object
129
- properties:
130
- title:
131
- type: plaintext
132
- inline: true
133
- example: 333 TRS Instructor
134
- title: Assignment
135
- description: "Assignment and unit, set in the block. Keep it to what fits — roughly twenty characters per year of length at the default width."
136
- duration:
137
- type: enum
138
- values: ["0.5", "1", "1.5", "2", "2.5", "3", "3.5", "4"]
139
- default: "2"
140
- title: Years
141
- description: "Length in years. The timeline is ruled in half-years, which is why the choices stop at the half."
142
- vml:
143
- type: enum
144
- values: [Summer, Winter]
145
- default: Summer
146
- title: VML
147
- description: "Which VML cycle you would move on. This places the tour rather than labelling it: a Summer tour starts in the second half of a year and a Winter tour in the first. Where that means waiting, the wait is added to the tour before it rather than left as a hole — you hold a job until you move — so a tour can print longer than the length you gave it."
148
- school:
149
- type: boolean
150
- default: false
151
- description: "Tick for a school you would move for — IDE or SDE in residence, Weapons School — rather than a duty assignment. It prints outlined instead of filled, so a year in a classroom does not read as a year in a job."
152
- description: "The assignments on this row, in the order you would serve them. Tours lay end to end from the start of the timeline, so there are no dates to keep in step."
153
- default:
154
- - { label: Vector 1, focus: Primary, tours: [] }
155
- - { label: Vector 2, focus: Alternate, tours: [] }
156
- - { label: Vector 3, focus: Backup, tours: [] }
157
- example:
158
- - label: Vector 1
159
- focus: Primary — command track
160
- tours:
161
- - { title: 333 TRS Instructor, duration: "4", vml: Summer }
162
- - { title: 333 TRS / DO, duration: "3.5", vml: Winter }
163
- - { title: IDE in residence, duration: "1", vml: Summer, school: true }
164
- - label: Vector 2
165
- focus: Alternate — staff depth
166
- tours:
167
- - { title: 17X CFM Staff, duration: "2.5", vml: Winter }
168
- - { title: MAJCOM A3 Division Chief, duration: "2", vml: Summer }
169
- - label: Vector 3
170
- focus: Backup — joint
171
- tours:
172
- - { title: Joint Staff J6, duration: "3", vml: Summer }
173
- - { title: USCYBERCOM JFHQ-C, duration: "2.5", vml: Winter }
174
- ui:
175
- group: timeline
176
- description: "One row per alternative career path. Three is the conventional chart and all the page holds — a primary, an alternate, and a backup. One is a plan; three is a conversation."
177
-
178
- stratifications:
179
- type: array
180
- ui:
181
- group: record
182
- layout: table
183
- items:
184
- type: object
185
- properties:
186
- year:
187
- type: plaintext
188
- inline: true
189
- example: "2026"
190
- description: "The reporting year."
191
- rater_strat:
192
- type: plaintext
193
- inline: true
194
- default: ""
195
- example: "#1/14 Capts"
196
- title: Rater
197
- description: "Your rater's stratification as it was written, such as '#1/14 Capts'."
198
- hlr_strat:
199
- type: plaintext
200
- inline: true
201
- default: ""
202
- example: "#1/45 Capts"
203
- title: Higher Level Reviewer
204
- description: "Your Higher Level Reviewer's stratification as it was written, such as '#1/45 Capts'. Leave blank where you drew none."
205
- default: []
206
- example:
207
- - { year: "2026", rater_strat: "#1/14 Capts", hlr_strat: "#1/45 Capts" }
208
- - { year: "2025", rater_strat: "#2/12 Capts", hlr_strat: "#3/40 Capts" }
209
- - { year: "2024", rater_strat: "#1/8 Lts, #2/40 Instructors", hlr_strat: "" }
210
- description: "Your last three years of stratifications, most recent first. Three is what the page is built for; more rows will set, and the section grows to hold them. Written out, a row is `{year: \"2026\", rater_strat: \"#1/14 Capts\", hlr_strat: \"#1/45 CGOs\"}`."
211
-
212
- awards:
213
- type: array
214
- items:
215
- type: plaintext
216
- inline: true
217
- default: []
218
- example:
219
- - Wing CGOQ ×2
220
- - HAF A2/6 CGOY 2025
221
- ui:
222
- group: record
223
- description: "Major awards, one per line, strongest first. Wing level and above earns a line; anything smaller costs more room than it wins."
224
-
225
- certifications:
226
- type: array
227
- items:
228
- type: plaintext
229
- inline: true
230
- default: []
231
- example:
232
- - SANS FOR577 (GLIR)
233
- - CISSP
234
- - Security+
235
- ui:
236
- group: record
237
- description: "Certifications and courses, one per line. Name the certification a board would recognize rather than every course you have sat."
238
-
239
- deployments:
240
- type: array
241
- items:
242
- type: plaintext
243
- inline: true
244
- default: []
245
- example:
246
- - 1× short tour — returned Jan 2024
247
- ui:
248
- group: record
249
- description: "Deployments and short tours, one per line. Include the return date: it is what a rater needs to work out when you are next eligible."
250
-
251
- # The page prints every member in four columns and marks the held ones, so
252
- # an empty box is as much of the chart as a filled one. A column is a
253
- # property here rather than a heading in the plate, so the partition is in
254
- # the value and the address as well as on the page.
255
- qualifications:
256
- type: object
257
- ui:
258
- group: qualifications
259
- description: "Tick what you hold. The page prints the whole 17X vocabulary and marks these — a rater reads the empty boxes as readily as the filled ones, so what you have not done yet is on the page whether you tick it or not. Written out, a tick is `flight_cc: true`, and a tick with its detail `flight_cc: {held: true, detail: 333 TRS/DO}`."
260
- properties:
261
- command:
262
- type: matrix
263
- title: Leadership & Command
264
- ui:
265
- compact: true
266
- members:
267
- sq_cc_candidate: Sq/CC Candidate
268
- do_det_cc_candidate: DO / Det CC Candidate
269
- flight_cc: Flight CC
270
- director_of_operations: Director of Operations
271
- detachment_cc: Detachment CC
272
- squadron_cc: Squadron CC
273
- properties: &detail
274
- detail:
275
- type: plaintext
276
- inline: true
277
- default: ""
278
- example: "2025"
279
- description: "The unit, course, or year that proves it, set in italics under the label. Leave blank where the label says enough on its own."
280
- operations:
281
- type: matrix
282
- ui:
283
- compact: true
284
- members:
285
- dodin_ops: DODIN Ops
286
- dco: DCO (Defensive)
287
- oco: OCO (Offensive)
288
- crew_cc: Crew CC
289
- cyber_engineer: Cyber Engineer
290
- team_lead: Team Lead (MDT / CPT)
291
- expeditionary_comms: Expeditionary Comms
292
- mission_cc: Mission CC
293
- properties: *detail
294
- staff:
295
- type: matrix
296
- title: Staff & Functional
297
- ui:
298
- compact: true
299
- members:
300
- exec_aide_cag: Exec / Aide / CAG
301
- haf_staff: HAF Staff
302
- majcom_naf_staff: MAJCOM / NAF Staff
303
- joint_staff: Joint Staff
304
- instructor: Instructor
305
- jqo: Joint Qualified Officer (JQO)
306
- properties: *detail
307
- education:
308
- type: matrix
309
- title: Education & PME
310
- ui:
311
- compact: true
312
- members:
313
- commissioning_dg: Commissioning Source DG
314
- sos_dg: SOS DG / Top Third
315
- cyber_200: Cyber 200
316
- cyber_300: Cyber 300
317
- ide: IDE Candidate / Graduate
318
- sde: SDE Candidate / Graduate
319
- weapons_school: Weapons School / WIC DG
320
- properties: *detail