| name | itut-drafting |
| description | ITU-T-specific contribution document drafting: template structure, header table fields, style-name mapping, equation conventions, and batch workflows. Use when preparing or editing ITU-T contribution .docx files (C-series or TD-series). Delegates formatting rules to sdo-docx-formatting and officecli operations to sdo-docx-operations. |
ITU-T Contribution Drafting
Use this skill for ITU-T-specific document structure, template conventions,
and concrete Word style names. For formatting rules (headings, enumerations,
notes, tables, figures, citations), see sdo-docx-formatting. For officecli
operations (tab-run injection, field codes, bookmarks), see
sdo-docx-operations.
Critical rules from delegated skills
These key constraints are inlined here to reduce cross-referencing:
From sdo-docx-formatting:
- Apply formatting through named styles from the template, never manual
overrides (bold, italic, font size, colour).
- Keep numbering update-safe — use SEQ fields and bookmarks, never
hard-coded numbers.
- Use non-breaking spaces (
\u00a0) for semantic units (number+unit,
Figure/Table+number).
- Use real tab runs (
<w:tab/>), never spaces, for structural tabs
(heading number+title, enumeration bullet+text, note label+text).
From sdo-docx-operations:
- Open in resident mode (
officecli open <doc>) before multi-step edits;
close at end.
- Prefer style/ordinal or explicit XPath targeting, not paraId targeting.
- Never use
raw-set --action replace with an empty XML payload.
- Always preserve non-breaking spaces and explicit tab runs.
- Validate with
officecli validate <doc> after every major batch update.
Assets
assets/template.docx -- canonical ITU-T contribution Word template with
all required styles and header structure (9-row header table, abstract
table, running header, footer). Copy or use as reference when starting a
new contribution. This is a user-provided template carrying ITU-T branding,
predefined styles, and placeholder content. Do not modify the original;
always work on a copy.
assets/itu-t-sg12-contribution-template.docx -- downloaded official ITU-T
contribution template (SG12 example) for reproducible offline use.
assets/itu-t-sg12-liaison-statement-template.docx -- downloaded official ITU-T
Liaison Statement template (SG12 example) for drafting outgoing LS documents.
../itut-recommendations/assets/itu-t-recommendation-skeleton.docx --
downloaded official ITU-T Recommendation skeleton for style-baseline checks.
Canonical ITU-T template sources (online)
These are the upstream sources for the downloaded assets above:
- Contribution template (example SG12):
https://www.itu.int/dms_pub/itu-t/oth/0A/0F/T0A0F00002F0012MSWE.docx
- Liaison Statement template (example SG12):
https://www.itu.int/dms_pub/itu-t/oth/0A/0F/T0A0F00000B0006MSWE.docx
- New Recommendation skeleton (latest Word styles baseline):
https://www.itu.int/en/ITU-T/studygroups/Documents/Doc-ITUT-Recs-Skelet.docx
Template selection rule
- For meeting contributions: start from
assets/itu-t-sg12-contribution-template.docx.
- For outgoing Liaison Statements: start from
assets/itu-t-sg12-liaison-statement-template.docx.
- For Recommendation drafting or style refresh checks: use
../itut-recommendations/assets/itu-t-recommendation-skeleton.docx
to confirm style definitions (including appendix and bibliography headings).
- Use the online URLs only to refresh these local files when needed.
ITU-T style-name mapping
Concrete Word style IDs for ITU-T documents. Use these when applying
formatting rules from sdo-docx-formatting.
Abstract name (sdo-docx-formatting) | ITU-T concrete style ID | Notes |
|---|
body-text | Body Text | If absent, fall back to Normal; verify with officecli get <doc> /styles |
heading-1 | Heading 1 | Section headings (numbered) |
heading-2 | Heading 2 | Subsection headings |
heading-3 | Heading 3 | Sub-subsection headings |
enum-1 | enumlev1 | First-level enumeration |
enum-2 | enumlev2 | Second-level enumeration |
enum-3 | enumlev3 | Third-level enumeration (if used) |
table-caption | Table_No & title | officecli styleId: TableNotitle |
table-header | Table_head | officecli styleId: Tablehead |
table-data | Table_text | officecli styleId: Tabletext |
table-note | (varies by template) | If not found in template, omit styling and add a TODO comment for manual review |
figure-para | Figure | Paragraph containing image |
figure-caption | Figure_No & title | Below figure |
figure-note | (varies by template) | If not found in template, omit styling and add a TODO comment for manual review |
note-main | Note | Last note in block |
note-continuation | (varies by template) | If not found in template, omit styling and add a TODO comment for manual review |
reference-entry | References | Each references entry (normative references and bibliography entries) |
appendix-heading | Appendix_No & title | Non-integral (informative) appendix headings |
bibliography-heading | Appendix_No & title | Bibliography clause heading (same style as appendix) |
code-text | Macro Text | officecli styleId: MacroText |
Additional ITU-T-specific styles (no abstract equivalent):
| Style ID | Purpose |
|---|
Equation | Display equation paragraph (centred equation + right-aligned label via tab stops) |
Equation_legend | officecli styleId: Equation_legend -- annotation paragraph following equation |
Headingb | Sub-headings within a proposed clause block (not auto-numbered) |
TSBHeaderSummary | Abstract table cell content |
Bibliography clause
The Bibliography is an optional, non-normative clause that lists
informative references. It appears as the very last element of a
Recommendation, after all integral and non-integral annexes.
Three mandatory rules — never drop any of them
-
Heading style — Use style Appendix_No & title (abstract:
bibliography-heading), not Heading 1. The Bibliography is a
non-integral appendix in ITU-T, so it shares the appendix heading style.
Write the heading text as Bibliography without a number prefix.
-
Page break before heading — Insert a page break immediately before
the Bibliography heading paragraph. Apply it as a paragraph property
(w:pageBreakBefore = true, or pageBreakBefore: true in the
officecli set command) on the heading paragraph itself — do not
insert a separate empty paragraph with a manual page break.
{ "command": "set",
"path": "/body/p[<bibliography-heading-ordinal>]",
"props": { "style": "Appendix_No & title",
"pageBreakBefore": true,
"text": "Bibliography" } }
-
Entry style — Each bibliography entry uses style References
(abstract: reference-entry) — the same style as normative
reference entries in clause 2. Do not use Body Text, Normal, or
any other style for bibliography entries.
Entry format
Format identical to normative references:
[N]\t<citation text>
- Square-bracket-wrapped
{SEQ Ref \* ARABIC} field (no hard-coded number).
- Real
<w:tab/> run between the bracket and the citation text.
- Bookmark
ref_<short_name> around the sequence field only.
- Style:
References on every entry paragraph.
Common agent failure modes
| Mistake | Correct behaviour |
|---|
Using Heading 1 for the Bibliography heading | Use Appendix_No & title |
| Omitting the page break before Bibliography | Set pageBreakBefore: true on the heading paragraph |
Styling entries with Body Text or Normal | Apply References style to every entry |
Hard-coding [1], [2] as plain text | Use {SEQ Ref \* ARABIC} field with bookmark |
Template structure
ITU-T contribution documents use a structured header table (not
paragraphs). This differs from 3GPP.
Header table (/body/tbl[1])
9 rows with the following cell layout:
| Row | Cell | Content |
|---|
| tr[1]/tc[3] | Document number | 3rd run is the highlighted placeholder; set text to 0xxx |
| tr[4]/tc[2] | Question(s) | e.g. Question 9/12 |
| tr[4]/tc[3] | Place and date | e.g. Geneva, 09-17 June 2026 |
| tr[6]/tc[2] | Source organization | e.g. HEAD acoustics GmbH |
| tr[7]/tc[2] | Title | Contribution title |
| tr[8]/tc[2] | Contact 1 | Tab-separated: Name\tOrganization\tCountry |
| tr[8]/tc[3]/p[1]/r[4] | Tel number | Highlighted run |
| tr[8]/tc[3]/p[1]/r[8] | E-mail | Highlighted run |
| tr[9] | Contact 2 | Clear with "" if unused |
Abstract table (/body/tbl[2])
1 row x 2 cells: "Abstract:" label (tc[1]) + content (tc[2]/p[1]).
Running header
/header[1]/p[@paraId=00100052]/r[4] -- document number (e.g. SG12-C0xxx).
Instruction paragraphs to delete
Remove all 8 yellow-highlighted instruction paragraphs (paraIds
0010003A through 00100048) using remove commands in a setup batch
before adding content.
Horizontal rule
/body/p[@paraId=0010004C] -- _______________________ separator.
First content paragraph
/body/p[@paraId=0010004E] -- empty paragraph after the rule; first
content goes after this.
Key finding: The ITU-T template may NOT contain a Body Text style.
If absent, use Normal for body paragraphs. Always verify with
officecli get <doc> /styles --depth 1 on any new template.
Liaison Statement template structure
The LS template (assets/itu-t-sg12-liaison-statement-template.docx) uses an
11-row header table. This differs from the contribution template above.
Header table (/body/tbl[1])
| Row | Cell | Content | Style |
|---|
| tr[1]/tc[2] | Question(s) | e.g. 4/12 | TSBHeaderQuestion |
| tr[1]/tc[4] | Meeting | e.g. Geneva, 9-17 June 2026 | VenueDate (right-aligned) |
| tr[2]/tc[2] | Study Group | e.g. 12 | Normal |
| tr[2]/tc[4] | Working Party | e.g. WP1/12 | Normal |
| tr[3]/tc[2] | Source | e.g. ITU-T Study Group 12 | TSBHeaderSource |
| tr[4]/tc[2] | Title | LS title | TSBHeaderTitle |
| tr[5] | "LIAISON STATEMENT" banner | merged across all 6 columns, centred | Normal + bold |
| tr[6]/tc[2] | For action to | e.g. ITU-T Q10/21 | LSForAction |
| tr[7]/tc[2] | For information to | e.g. ITU-T SG21 | LSForInfo |
| tr[8]/tc[2] | Approval | e.g. Q4/12 rapporteur group meeting... | LSApproval |
| tr[9]/tc[2] | Deadline | e.g. 1 September 2026 | LSDeadline |
| tr[10]/tc[2] | Contact 1 — Name/Org/Country | Tab-separated fields | Normal |
| tr[10]/tc[3] | Contact 1 — Tel/E-mail | Tab-separated with labels | Normal + tabs @ 794 twips |
| tr[11] | Contact 2 | Clear with "" if unused | Normal |
Note: The LS template has 6 table columns (not 2). Cells use colspan
and rowspan:
- tr[1]: 4 visible cells with colspans 1/2/2/1
- tr[3] onward: cells span across all 6 columns
Populate via officecli batch targeting the style names rather than paraIds:
[
{ "command": "set", "path": "/body/tbl[1]/tr[1]/tc[2]/p",
"props": { "text": "4/12" } },
{ "command": "set", "path": "/body/tbl[1]/tr[4]/tc[2]/p",
"props": { "text": "LS on ...", "style": "TSBHeaderTitle" } }
]
LS-specific fields
- Abstract is in a separate table (
/body/tbl[2]), same structure as
the contribution template.
- The LS body follows after the abstract table, with no instruction
paragraphs to delete (unlike the contribution template).
- The first body paragraph is at
/body/p[paraId=70FBDF66] in the template.
Equation conventions
Display equations (numbered, standalone)
Use a single paragraph with style Equation containing
\t[equation]\t(<SEQ EQ>). The Equation style has two tab stops:
first centred at 4820 (for the equation), second right-aligned at 9639
(for the label). This centres the equation and right-aligns the label
on the same line. Set paragraph alignment: left so the tab stops
(not paragraph justification) control positioning — left here means
"do not centre-justify the paragraph itself," not "left-align the
equation."
Target structure:
[p intro sentence]
[p style=Equation] <- \t + oMath + \t + (EQ_seq_result) -- one paragraph
[p style=Equation_legend] <- "where..." annotation paragraph
Numbering: Do NOT hard-code equation numbers. Use {SEQ EQ \* ARABIC}
for automatic numbering. Wrap the label (SEQ) in a bookmark named
EQ_<short_name> (e.g., EQ_MOSK, EQ_XPLUS). Cross-reference in body
text with {REF EQ_<short_name>}.
Build with officecli in order:
[
{ "command": "set", "path": "/body/p[@paraId=XXXX]",
"props": { "style": "Equation", "alignment": "left", "text": "\t" } },
{ "command": "add", "parent": "/body/p[@paraId=XXXX]", "type": "equation",
"props": { "mode": "inline", "formula": "..." } },
{ "command": "add", "parent": "/body/p[@paraId=XXXX]", "type": "run",
"props": { "text": "\t(" } },
{ "command": "add", "parent": "/body/p[@paraId=XXXX]", "type": "field",
"props": { "code": "SEQ EQ \\* ARABIC", "bookmark": "EQ_NAME" } },
{ "command": "add", "parent": "/body/p[@paraId=XXXX]", "type": "run",
"props": { "text": ")" } }
]
IMPORTANT: Do NOT combine ind.left with alignment in a single
add paragraph command. officecli emits w:ind AFTER w:jc in the
OOXML, violating the schema. Use a separate set call to add indentation
after creation.
Inline equations in body text
Rebuild paragraphs with mixed text + inline equations as a sequence of
set + add commands (run, equation, run, ...). Each JSON array
passed to officecli batch must contain at most 12 JSON command objects.
If more are needed, split into sequential batch calls.
Known KaTeX constraints
| Forbidden | Use instead |
|---|
\text{word} | \mathrm{word} |
\left(...\right) with sub/superscripts inside | plain (...) -- OMML auto-sizes |
\tag{label} | Put label in the same paragraph with tab |
\mathcal{L} | \mathit{L} |
Term formatting (clause 3 Definitions)
Terms in clause 3 (both 3.1 "Terms defined elsewhere" and
3.2 "Terms defined in this Recommendation") use pseudo-subclause
formatting:
-
Numbered like subclauses (3.1.1, 3.1.2, ...) but are NOT heading
paragraphs — they do NOT appear in the table of contents
-
Style: Normal (body-text style, fallback if Body Text absent)
-
Each term is a single paragraph in the format:
<bold>3.1.N\tTERM NAME</bold>: definition text
Run structure
| Run | Content | Format |
|---|
| r[1] | 3.1.N (number prefix) | bold |
| r[2] | <w:tab/> | bold (on run) |
| r[3] | term name | bold |
| r[4] | : + definition text | normal |
Tab stop
The ITU-T template's Normal style does not include a tab stop at
1.5 cm. Each term paragraph must have this added manually:
<w:pPr>
<w:tabs>
<w:tab w:val="left" w:pos="851"/>
</w:tabs>
</w:pPr>
851 twips = 1.5 cm. Use raw-set to inject this since officecli L2
set on a paragraph with revision marks does not create tracked
changes.
Creating terms with tracked changes
Since officecli L2 set/add does not create revision marks, terms
must be built via raw-set with the content wrapped in w:ins
elements:
<w:p xmlns:w="..." xmlns:w14="..." w14:paraId="PARAID">
<w:pPr>
<w:tabs>
<w:tab w:val="left" w:pos="851"/>
</w:tabs>
</w:pPr>
<w:ins w:author="Author Name" w:date="..." w:id="...">
<w:r>
<w:rPr><w:b/></w:rPr>
<w:t xml:space="preserve">3.1.N</w:t>
</w:r>
<w:r>
<w:rPr><w:b/></w:rPr>
<w:tab/>
</w:r>
<w:r>
<w:rPr><w:b/></w:rPr>
<w:t xml:space="preserve">TERM NAME</w:t>
</w:r>
<w:r>
<w:t xml:space="preserve">: definition text</w:t>
</w:r>
</w:ins>
</w:p>
Replace the target paragraph via:
officeli raw-set <doc> /document \
--xpath '//w:p[@w14:paraId="PARAID"]' \
--action replace \
--xml '<w:p>...</w:p>'
Notes attached to terms
A Note-style paragraph that belongs to a term (e.g., clarifying a
definition) stays after the term paragraph with style Note. These are
not pseudo-subclauses — use the standard note formatting convention.
Table and figure numbering (per-clause counters)
ITU-T Recommendations use per-clause SEQ field counters for tables
and figures. This differs from the generic sdo-docx-formatting convention
(global SEQ Figure / SEQ Table).
SEQ field naming
| Element | SEQ field name | Bookmark prefix | Caption style ID |
|---|
| Figures | FIG<N> where N = clause number | FIG_ | FigureNotitle0 (Figure_No & title) |
| Tables | TAB<N> where N = clause number | TAB_ | TableNoTitle (Table_No & title) |
Examples:
- Clause 6 figures:
SEQ FIG6, bookmarks FIG_EQUIPMENT_*
- Clause 8 tables:
SEQ TAB8, bookmarks TAB_SETUP_*
Caption structure
Figure\u00a0<N>-{SEQ FIG<N>}: caption text
Table\u00a0<N>-{SEQ TAB<N>}: caption text
- The clause-number prefix (
6-) is hardcoded text before the field
- The SEQ field provides the running number within the clause
- A non-breaking space separates "Figure"/"Table" from the number
- The bookmark wraps around the full compound number (
6-1, 6-2, etc.)
— start bookmark before the 6- run, end bookmark after the field end
Bookmark naming
Use FIG_ / TAB_ prefix followed by a short descriptive name in
UPPER_SNAKE_CASE. Follow the naming scheme already used in the document:
- Look at existing bookmarks in nearby clauses for the naming pattern
- Choose a 1–2 word description that fits the topic
- Examples:
FIG_EQUIPMENT_RRS_SP, TAB_SIGNALS_ACCURACYMEASUREMENTS
Run-level structure for a correct caption
r[1] run "Figure " (non-breaking space)
bookmark (around 6-N) name="FIG_xxx"
r[2] run "6-"
r[3] fieldChar begin
r[4] instrText " SEQ FIG6 "
r[5] fieldChar separate
r[6] run "N" (field result)
r[7] fieldChar end
bookmarkEnd
r[8] run ": caption text"
Cross-references
Body text references use REF fields pointing to the bookmark:
{ REF FIG_EQUIPMENT_RRS_SP \h }
{ REF TAB_SIGNALS_ACCURACYMEASUREMENTS \h }
Procedure: fix table/figure numbering in a clause
When asked to "fix table/figure numbers in clause N", follow this workflow:
-
Analyse: Scan all figure/table captions in the clause. For each,
check:
- Does it have a
SEQ FIG<N> / SEQ TAB<N> field?
- Does it have a bookmark with
FIG_ / TAB_ prefix?
- Is the number hardcoded (no field) or auto-numbered?
- Are there duplicate numbers?
-
Add missing SEQ fields: For captions with hardcoded numbers,
replace the hardcoded number with {SEQ FIG<N>} / {SEQ TAB<N>}.
-
Add missing bookmarks: For captions without bookmarks, add a
bookmark around the compound number (N-M). Choose a descriptive
name that fits the naming pattern of existing bookmarks in that
clause.
-
Fix duplicate numbers: If adding SEQ fields changes the sequence
order, the field results will auto-update. If a figure/table has a
duplicate hardcoded number, let the SEQ field resolve it — do not
assign numbers manually.
-
Check cross-references: Search the clause body text for REF
fields. Verify each references a bookmark that still exists with
the correct name. If a hardcoded reference (plain text "Figure 6-3")
is found, replace it with a {REF <bookmark> \h} field.
-
Rebuild captions: Use raw-set with --action replace targeting
//w:p[@w14:paraId="PARAID"] to replace each caption paragraph with
a correctly structured one. The replacement XML must include:
w:pPr with the correct style (FigureNotitle0 / TableNoTitle)
- Bookmark start/end around the number
- SEQ field (begin/instrText/separate/result/end)
- Caption text after the field
-
Refresh fields: Run officecli refresh <doc> to re-evaluate all
SEQ and REF fields.
-
Verify: Check field results in the raw XML:
officecli raw <doc> /document | grep -A1 'fldCharType="separate"'
Common pitfalls
| Problem | Cause | Fix |
|---|
| Duplicate figure/table numbers | Missing SEQ field, hardcoded number | Add SEQ field; let field auto-resolve |
| Cross-reference shows wrong number | REF bookmark name doesn't match caption bookmark | Update REF instruction to point to correct bookmark |
| Caption shows empty number | officecli refresh didn't update the field | Re-run officecli refresh; check raw XML for result |
| Bookmark name doesn't match nearby pattern | Newly invented name inconsistent with document | Review existing bookmarks in clause; match the naming scheme |
Heading conventions (ITU-T-specific)
- No hard-coded numbers in heading text. The template's heading styles
have automatic outline numbering. Write just the title:
"Introduction"
not "1\tIntroduction".
Headingb style is used for sub-headings within a proposed clause
block (e.g. "7.5.4 Maximum absolute prediction error (maxabs)",
subsection labels "a)\tUnconstrained least-squares fit"). These appear
in the TOC as Heading_b entries but do NOT get automatic numbering.
Batch workflow patterns
General workflow
- Start from template:
Copy-Item "docs\template.docx" -Destination "<output>.docx" -Force
- Resident mode:
officecli open <doc> before editing; officecli close <doc> at end.
- Batch mode: pipe JSON arrays to
officecli batch <doc>. Each JSON
array must contain at most 12 JSON command objects. If more are needed,
split into sequential batch calls.
- Validate frequently:
officecli validate <doc> after every major
batch update.
Common errors
| Error | Root Cause | Fix |
|---|
| Conclusion heading missing | Batch added heading + table together; table set commands failed (index didn't exist yet) | Split: add heading separately, then table, then fill with dedicated batch |
Paragraphs reversed in add with after | Each add with after: anchor inserts immediately after the anchor, pushing any previously added paragraphs down | Submit add commands in reverse reading order (last paragraph first, first paragraph last). The first add ends up furthest from the anchor, the last add ends up closest. |
\left\right with subscripts crashes equation | OMML parser limitation | Use plain ( ) delimiters |
| "Body Text" style not found | Template uses Normal as body style | Use Normal for body paragraphs |
| Running header shows placeholder | Header paragraph r[4] not updated | Target /header[1]/p[@paraId=00100052]/r[4] and set text |
ind.left + alignment in one command | Schema ordering bug in officecli | Split into separate add + set calls |
Indentation for proposed clause text
Text inside a proposed new/amended clause uses "ind.left":"720"
(720 twips = 0.5 inch). Sub-items use "ind.left":"1080".
Cross-references
sdo-project-setup -- common project bootstrap (layout, metadata sync, autodetection)
sdo-docx-formatting -- formatting rules (delegated; see mapping above)
sdo-docx-operations -- officecli guardrails for raw-set, field codes, bookmarks
sdo-writing-style -- prose quality rules
sdo-writing-conventions -- mechanical writing rules
itut-basics -- ITU-T organisation context
itut-contributions -- contribution types and numbering
itut-patents -- patent policy, IPR disclosure, licensing declarations
itut-recommendations -- Recommendation structure and approval