@olegkoval/agent-skills 1.30.0 → 1.32.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 (45) hide show
  1. package/.claude-plugin/plugin.json +4 -2
  2. package/.cursor-plugin/index.json +5 -0
  3. package/.grok-plugin/index.json +5 -0
  4. package/.kiro/steering/website-analytics-bootstrap.md +159 -0
  5. package/.kiro/steering/wikipedia-uk-editor.md +24 -3
  6. package/.windsurf/rules/website-analytics-bootstrap.md +158 -0
  7. package/.windsurf/rules/wikipedia-uk-editor.md +24 -3
  8. package/README.md +8 -6
  9. package/catalog/skills.json +42 -0
  10. package/collections/marketing.json +1 -1
  11. package/collections/software-development.json +2 -1
  12. package/package.json +1 -1
  13. package/packages/marketing/website-analytics-bootstrap/SKILL.md +171 -0
  14. package/packages/marketing/website-analytics-bootstrap/adapters/claude/plugin.json +5 -0
  15. package/packages/marketing/website-analytics-bootstrap/adapters/claude/skills/website-analytics-bootstrap/SKILL.md +172 -0
  16. package/packages/marketing/website-analytics-bootstrap/adapters/cursor/plugin.json +6 -0
  17. package/packages/marketing/website-analytics-bootstrap/adapters/cursor/skills/website-analytics-bootstrap/SKILL.md +172 -0
  18. package/packages/marketing/website-analytics-bootstrap/adapters/grok/plugin.json +6 -0
  19. package/packages/marketing/website-analytics-bootstrap/adapters/grok/skills/website-analytics-bootstrap/SKILL.md +172 -0
  20. package/packages/marketing/website-analytics-bootstrap/adapters/kiro/steering/website-analytics-bootstrap.md +159 -0
  21. package/packages/marketing/website-analytics-bootstrap/adapters/windsurf/rules/website-analytics-bootstrap.md +158 -0
  22. package/packages/software-development/shared-knowledge-artifact/SKILL.md +89 -0
  23. package/packages/software-development/shared-knowledge-artifact/adapters/claude/plugin.json +5 -0
  24. package/packages/software-development/shared-knowledge-artifact/adapters/claude/skills/shared-knowledge-artifact/SKILL.md +90 -0
  25. package/packages/software-development/shared-knowledge-artifact/adapters/claude/skills/shared-knowledge-artifact/references/prompt.txt +78 -0
  26. package/packages/software-development/shared-knowledge-artifact/references/prompt.txt +78 -0
  27. package/packages/software-development/wikipedia-uk-editor/SKILL.md +24 -3
  28. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/SKILL.md +24 -3
  29. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  30. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/references/strategy.md +10 -0
  31. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
  32. package/packages/software-development/wikipedia-uk-editor/adapters/codex/README.md +39 -9
  33. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/SKILL.md +24 -3
  34. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  35. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/references/strategy.md +10 -0
  36. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
  37. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/SKILL.md +24 -3
  38. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  39. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/references/strategy.md +10 -0
  40. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
  41. package/packages/software-development/wikipedia-uk-editor/adapters/kiro/steering/wikipedia-uk-editor.md +24 -3
  42. package/packages/software-development/wikipedia-uk-editor/adapters/windsurf/rules/wikipedia-uk-editor.md +24 -3
  43. package/packages/software-development/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  44. package/packages/software-development/wikipedia-uk-editor/references/strategy.md +10 -0
  45. package/packages/software-development/wikipedia-uk-editor/scripts/wiki.sh +58 -2
@@ -35,7 +35,7 @@ Turn a URL or article title into a complete, policy-compliant Ukrainian Wikipedi
35
35
  A single deliverable written to a scratch file and echoed in chat:
36
36
 
37
37
  - the **target page** (exact ukwiki title, and whether it exists)
38
- - the **wikitext** — full article, or an exact-replacement section, or a precise before/after diff for small fixes
38
+ - the **wikitext** — always the complete final article in one `.wiki` file, ready to paste over the whole edit box; never a diff, never a БУЛО/СТАЛО list of manual replacements
39
39
  - the **edit summary** in Ukrainian (≤ 200 chars)
40
40
  - the **source list** with the URL, publisher, and date actually fetched for each
41
41
  - **risk notes**: notability (ВП:ЗН) standing, anything a patroller will challenge, what still needs a human check
@@ -46,12 +46,15 @@ A single deliverable written to a scratch file and echoed in chat:
46
46
 
47
47
  | Input | Mode |
48
48
  |---|---|
49
+ | explicit newcomer task (tier + type, e.g. "Середні → Оновлювати статті") | mode set by task type — see below |
49
50
  | en.wikipedia.org URL, no uk equivalent | **Translate** — new uk article |
50
51
  | uk.wikipedia.org URL, stub or thin | **Expand** |
51
52
  | uk.wikipedia.org URL with `{{Без джерел}}` / `{{Джерело}}` | **Source** |
52
53
  | uk.wikipedia.org URL, prose/format problems | **Cleanup** |
53
54
  | "what should I edit next" | **Plan** — read `references/strategy.md`, propose a ranked list |
54
55
 
56
+ When a newcomer task type is given, it **overrides** the state-based guess above. The per-type scope contract in `references/newcomer-tasks.md` is binding — an assigned type is a ceiling on what the edit may touch, not a floor.
57
+
55
58
  Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft against the wrong title.
56
59
 
57
60
  ### 2. Read before writing
@@ -61,6 +64,7 @@ Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft aga
61
64
  ./scripts/wiki.sh get en "Title" # source-language wikitext
62
65
  ./scripts/wiki.sh langlink en "Title" uk # does a uk version already exist?
63
66
  ./scripts/wiki.sh check uk "Шаблон:Особа" # does this template/page exist?
67
+ ./scripts/wiki.sh tasks <type> [n] # list candidates for a newcomer task type: copyedit|links|references|update|expand
64
68
  ```
65
69
 
66
70
  Stop and report if:
@@ -95,21 +99,38 @@ Run every item. Report failures rather than hiding them.
95
99
  - [ ] No original synthesis (ВП:ОД)
96
100
  - [ ] Dates, numbers, and name transliterations are Ukrainian-correct
97
101
  - [ ] Edit summary written in Ukrainian and states what changed and why
102
+ - [ ] The edit stayed inside the assigned task type's allowed scope
103
+ - [ ] Any maintenance template removed was actually earned — the underlying problem is genuinely fixed
98
104
 
99
105
  ### 6. Deliver
100
106
 
101
- Write the draft to a scratch file (`.md` alongside the raw `.wiki` text so paste is clean), print the edit summary, and tell the human exactly where to paste it:
107
+ For Expand / Source / Cleanup: fetch the current wikitext, apply the changes programmatically (a small Python pass over the fetched file, asserting each anchor string matched exactly once), and write the whole resulting article out. Verify it before delivering — section list intact, every intended change landed, nothing else dropped.
108
+
109
+ Write the draft to a scratch file: the raw `.wiki` file contains nothing but article wikitext (the full final article, ready to paste over the whole edit box); the human-readable explanation of what changed goes in a separate `.md`. Print the edit summary, and tell the human exactly where to paste it:
102
110
 
103
111
  - new article → `https://uk.wikipedia.org/wiki/Тайтл?action=edit`
104
- - section replace → name the section and its exact current heading
112
+ - existing article → `https://uk.wikipedia.org/w/index.php?title=Тайтл&action=edit`, replace the whole edit box
105
113
  - test first → `Вікіпедія:Пісочниця` or the user's own `Користувач:Ім'я/Чернетка`
106
114
 
115
+ End the delivery with a copy-to-clipboard command in its own fenced block, using a quoted absolute path — quoted because scratchpad paths contain characters the shell will otherwise mangle — always the raw `.wiki` file, never the `.md`:
116
+
117
+ ```sh
118
+ pbcopy < "/absolute/path/to/slug.wiki"
119
+ ```
120
+
121
+ Add an optional second line when the edit summary is long enough to be worth copying:
122
+
123
+ ```sh
124
+ printf '%s' 'Опис редагування…' | pbcopy
125
+ ```
126
+
107
127
  Then stop. Do not offer to save it.
108
128
 
109
129
  ## References
110
130
 
111
131
  - `references/strategy.md` — the contribution strategy: what to farm, in what order, and how to build standing without getting flagged
112
132
  - `references/wikitext-uk.md` — verified uk templates, citation formats, article skeletons, policy shortcuts
133
+ - `references/newcomer-tasks.md` — the newcomer task tiers (Легкі/Середні/Важкі) and the binding scope contract for each task type
113
134
  - `scripts/wiki.sh` — read-only MediaWiki API helper
114
135
 
115
136
  ## Verification
@@ -0,0 +1,80 @@
1
+ # Ukrainian Wikipedia newcomer task types
2
+
3
+ Verified against the live `uk.wikipedia.org` API, 2026-08-20.
4
+
5
+ `MediaWiki:NewcomerTasks.json` is the authoritative GrowthExperiments "Suggested edits"
6
+ (Пропоновані редагування) task-type → maintenance-template map on ukwiki. The table below is
7
+ that map.
8
+
9
+ ## Task-type mapping
10
+
11
+ | ukwiki UI label | Tier | task type | Backing template(s) |
12
+ |---|---|---|---|
13
+ | Вичитувати | Легкі / easy | `copyedit` | `Шаблон:Мовні помилки` |
14
+ | (not offered in UI — structured) | easy | `link-recommendation` | none |
15
+ | (not offered in that UI list) | easy | `links` | `Шаблон:Упорядкувати`, `Шаблон:Брак посилань` |
16
+ | Шукати зовнішні посилання | Середні / medium | `references` | `Шаблон:Без джерел` |
17
+ | Оновлювати статті | Середні / medium | `update` | `Шаблон:Оновити` |
18
+ | (not offered — structured) | medium | `image-recommendation`, `section-image-recommendation` | none |
19
+ | Розширювати короткі статті | Важкі / hard | `expand` | `Шаблон:Доробити` |
20
+
21
+ All six templates confirmed EXISTS. `Шаблон:Доробити` is a REDIRECT to `Шаблон:Заготовка`
22
+ (see `references/wikitext-uk.md`).
23
+
24
+ ## Scope contract per task type
25
+
26
+ An assigned task type is a **ceiling**, not a suggestion — overreach on a young account is what
27
+ draws patrollers (see `references/strategy.md` Phase 1). Stay inside the type you picked.
28
+
29
+ ### `copyedit` — Вичитувати
30
+
31
+ - IS: language, grammar, punctuation, typography fixes only.
32
+ - NOT: no new facts, no new refs, no restructuring, no adding/removing/reordering sections.
33
+ - Remove `{{Мовні помилки}}` in the same edit only if the whole article was actually proofread.
34
+ - Edit summary shape: `Вичитка: виправлено [конкретні помилки]`.
35
+
36
+ ### `links` — Упорядкувати / Брак посилань
37
+
38
+ - IS: wikilinks and formatting only.
39
+ - NOT: no prose rewriting.
40
+ - Edit summary shape: `Впорядкування посилань: [що додано/виправлено]`.
41
+
42
+ ### `references` — Шукати зовнішні посилання
43
+
44
+ - IS: add inline `<ref>` to claims that are **already there**.
45
+ - NOT: never rewrite a claim to fit a source you happened to find. If no source supports it as
46
+ written, report it — do not reshape it.
47
+ - Remove `{{Без джерел}}` only when every substantive claim is cited.
48
+ - Edit summary shape: `Додано джерела: [що саме підтверджено]`.
49
+
50
+ ### `update` — Оновлювати статті
51
+
52
+ - IS: replace outdated values/dates/status with sourced current ones, plus the minimum prose the
53
+ change forces.
54
+ - NOT: no scope expansion, no new sections.
55
+ - Every updated number needs a source actually fetched this session — this is the highest
56
+ fabrication-risk type in the set and SKILL.md Hard Rule 2 applies with no exceptions.
57
+ - Edit summary shape: `Оновлено дані: [що змінено] за станом на [дата]`.
58
+
59
+ ### `expand` — Розширювати короткі статті
60
+
61
+ - IS: the **only** type permitted to add sections and substantial new sourced prose. Routes into
62
+ the existing **Expand** mode in SKILL.md.
63
+ - `{{Заготовка}}` comes off only when the article genuinely stops being a stub.
64
+ - Edit summary shape: `Розширено статтю: додано [розділи/теми], джерела`.
65
+
66
+ ## Out of scope: structured task types
67
+
68
+ `link-recommendation`, `image-recommendation`, and `section-image-recommendation` are served
69
+ through the Growth UI's own accept/reject widget on ukwiki, not by pasting wikitext. This skill
70
+ does not improvise a manual equivalent for them — say so plainly and decline rather than draft
71
+ around it.
72
+
73
+ ## Finding candidates
74
+
75
+ `action=query&list=growthtasks` requires login, so this read-only skill cannot use it. Find
76
+ candidate articles for a task type instead with:
77
+
78
+ ```sh
79
+ ./scripts/wiki.sh tasks <type> [n]
80
+ ```
@@ -31,6 +31,16 @@ Rules for this phase: one change per edit, always an edit summary in Ukrainian,
31
31
 
32
32
  Target: ~30–50 edits, **zero reverts**. A revert in this phase costs more than 50 edits gain.
33
33
 
34
+ ### Newcomer tasks as a ready-made Phase 1 queue
35
+
36
+ Ukrainian Wikipedia's own GrowthExperiments "Suggested edits" (Пропоновані редагування) tiers a
37
+ maintenance backlog into Легкі / Середні / Важкі — see `references/newcomer-tasks.md` for the
38
+ full mapping and per-type scope contract. Легкі (`copyedit`) and Середні (`references`, `update`)
39
+ are lower-risk, community-endorsed work for this phase, but they are not zero-revert-risk:
40
+ sourcing and fabrication risks still require verification. Pick candidates
41
+ with `./scripts/wiki.sh tasks <type>` and stay strictly inside the assigned scope. Важкі
42
+ (`expand`) is not Phase 1 work — it belongs in Phase 2 stream A/B, once autoconfirmed.
43
+
34
44
  ## Phase 2 — the volume engine (weeks 2–8)
35
45
 
36
46
  Four streams, run in parallel, roughly in this priority order. Value per unit of effort, highest first:
@@ -10,6 +10,7 @@
10
10
  # wiki.sh search <lang> <query> [n] search article titles
11
11
  # wiki.sh backlog <category> [n] list pages in a uk category (maintenance backlogs)
12
12
  # wiki.sh info <lang> <title> length, last edit, categories, templates used
13
+ # wiki.sh tasks <type> [n] candidate articles for a newcomer task type
13
14
  set -eu
14
15
 
15
16
  UA="wikipedia-uk-editor-skill/1.0 (https://github.com/oleg-koval/agent-skills)"
@@ -24,7 +25,7 @@ api() {
24
25
  jqp() { python3 -c "$1"; }
25
26
 
26
27
  cmd=${1:-}
27
- [ -n "$cmd" ] || { sed -n '2,14p' "$0"; exit 1; }
28
+ [ -n "$cmd" ] || { sed -n '2,13p' "$0"; exit 1; }
28
29
  shift
29
30
 
30
31
  case "$cmd" in
@@ -92,7 +93,62 @@ print('touched:',p.get('touched'))
92
93
  print('cats :', ', '.join(c['title'] for c in p.get('categories',[])) or '(none)')
93
94
  print('tmpls :', ', '.join(t['title'] for t in p.get('templates',[])) or '(none)')"
94
95
  ;;
96
+ tasks)
97
+ type=${1:-}
98
+ n=${2:-20}
99
+ case "$n" in
100
+ ''|*[!0-9]*) echo "Invalid task limit: '$n' (expected a non-negative integer)" >&2; exit 1 ;;
101
+ esac
102
+ case "$type" in
103
+ copyedit) templates="Шаблон:Мовні помилки" ;;
104
+ links) templates="Шаблон:Упорядкувати|Шаблон:Брак посилань" ;;
105
+ references) templates="Шаблон:Без джерел" ;;
106
+ update) templates="Шаблон:Оновити" ;;
107
+ expand) templates="Шаблон:Доробити" ;;
108
+ *)
109
+ echo "Unknown task type: '$type'. Valid types: copyedit, links, references, update, expand" >&2
110
+ exit 1
111
+ ;;
112
+ esac
113
+ [ "$n" -gt 0 ] || exit 0
114
+ results=$(mktemp)
115
+ trap 'rm -f "$results"' EXIT
116
+ oldifs=$IFS
117
+ IFS='|'
118
+ for tmpl in $templates; do
119
+ IFS=$oldifs
120
+ api uk --data-urlencode "action=query" --data-urlencode "list=embeddedin" \
121
+ --data-urlencode "eititle=$tmpl" --data-urlencode "einamespace=0" \
122
+ --data-urlencode "eilimit=$n" |
123
+ jqp "import json,sys
124
+ d=json.load(sys.stdin)
125
+ if 'error' in d: sys.exit('NOT FOUND: '+d['error'].get('info',''))
126
+ for m in d['query']['embeddedin']: print(m['title'])" |
127
+ while IFS= read -r title; do printf '%s\t%s\n' "$tmpl" "$title"; done >> "$results"
128
+ done
129
+ python3 - "$results" "$n" <<'PY'
130
+ import sys
131
+ from collections import OrderedDict
132
+
133
+ path, limit_text = sys.argv[1:]
134
+ limit = int(limit_text)
135
+ groups = OrderedDict()
136
+ seen = set()
137
+ with open(path, encoding="utf-8") as handle:
138
+ for line in handle:
139
+ template, title = line.rstrip("\n").split("\t", 1)
140
+ if title in seen:
141
+ continue
142
+ seen.add(title)
143
+ groups.setdefault(template, []).append(title)
144
+ if len(seen) == limit:
145
+ break
146
+ for template, titles in groups.items():
147
+ print(f"== {template} ==")
148
+ print("\n".join(titles))
149
+ PY
150
+ ;;
95
151
  *)
96
- sed -n '2,14p' "$0"; exit 1
152
+ sed -n '2,13p' "$0"; exit 1
97
153
  ;;
98
154
  esac
@@ -35,7 +35,7 @@ Turn a URL or article title into a complete, policy-compliant Ukrainian Wikipedi
35
35
  A single deliverable written to a scratch file and echoed in chat:
36
36
 
37
37
  - the **target page** (exact ukwiki title, and whether it exists)
38
- - the **wikitext** — full article, or an exact-replacement section, or a precise before/after diff for small fixes
38
+ - the **wikitext** — always the complete final article in one `.wiki` file, ready to paste over the whole edit box; never a diff, never a БУЛО/СТАЛО list of manual replacements
39
39
  - the **edit summary** in Ukrainian (≤ 200 chars)
40
40
  - the **source list** with the URL, publisher, and date actually fetched for each
41
41
  - **risk notes**: notability (ВП:ЗН) standing, anything a patroller will challenge, what still needs a human check
@@ -46,12 +46,15 @@ A single deliverable written to a scratch file and echoed in chat:
46
46
 
47
47
  | Input | Mode |
48
48
  |---|---|
49
+ | explicit newcomer task (tier + type, e.g. "Середні → Оновлювати статті") | mode set by task type — see below |
49
50
  | en.wikipedia.org URL, no uk equivalent | **Translate** — new uk article |
50
51
  | uk.wikipedia.org URL, stub or thin | **Expand** |
51
52
  | uk.wikipedia.org URL with `{{Без джерел}}` / `{{Джерело}}` | **Source** |
52
53
  | uk.wikipedia.org URL, prose/format problems | **Cleanup** |
53
54
  | "what should I edit next" | **Plan** — read `references/strategy.md`, propose a ranked list |
54
55
 
56
+ When a newcomer task type is given, it **overrides** the state-based guess above. The per-type scope contract in `references/newcomer-tasks.md` is binding — an assigned type is a ceiling on what the edit may touch, not a floor.
57
+
55
58
  Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft against the wrong title.
56
59
 
57
60
  ### 2. Read before writing
@@ -61,6 +64,7 @@ Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft aga
61
64
  ./scripts/wiki.sh get en "Title" # source-language wikitext
62
65
  ./scripts/wiki.sh langlink en "Title" uk # does a uk version already exist?
63
66
  ./scripts/wiki.sh check uk "Шаблон:Особа" # does this template/page exist?
67
+ ./scripts/wiki.sh tasks <type> [n] # list candidates for a newcomer task type: copyedit|links|references|update|expand
64
68
  ```
65
69
 
66
70
  Stop and report if:
@@ -95,21 +99,38 @@ Run every item. Report failures rather than hiding them.
95
99
  - [ ] No original synthesis (ВП:ОД)
96
100
  - [ ] Dates, numbers, and name transliterations are Ukrainian-correct
97
101
  - [ ] Edit summary written in Ukrainian and states what changed and why
102
+ - [ ] The edit stayed inside the assigned task type's allowed scope
103
+ - [ ] Any maintenance template removed was actually earned — the underlying problem is genuinely fixed
98
104
 
99
105
  ### 6. Deliver
100
106
 
101
- Write the draft to a scratch file (`.md` alongside the raw `.wiki` text so paste is clean), print the edit summary, and tell the human exactly where to paste it:
107
+ For Expand / Source / Cleanup: fetch the current wikitext, apply the changes programmatically (a small Python pass over the fetched file, asserting each anchor string matched exactly once), and write the whole resulting article out. Verify it before delivering — section list intact, every intended change landed, nothing else dropped.
108
+
109
+ Write the draft to a scratch file: the raw `.wiki` file contains nothing but article wikitext (the full final article, ready to paste over the whole edit box); the human-readable explanation of what changed goes in a separate `.md`. Print the edit summary, and tell the human exactly where to paste it:
102
110
 
103
111
  - new article → `https://uk.wikipedia.org/wiki/Тайтл?action=edit`
104
- - section replace → name the section and its exact current heading
112
+ - existing article → `https://uk.wikipedia.org/w/index.php?title=Тайтл&action=edit`, replace the whole edit box
105
113
  - test first → `Вікіпедія:Пісочниця` or the user's own `Користувач:Ім'я/Чернетка`
106
114
 
115
+ End the delivery with a copy-to-clipboard command in its own fenced block, using a quoted absolute path — quoted because scratchpad paths contain characters the shell will otherwise mangle — always the raw `.wiki` file, never the `.md`:
116
+
117
+ ```sh
118
+ pbcopy < "/absolute/path/to/slug.wiki"
119
+ ```
120
+
121
+ Add an optional second line when the edit summary is long enough to be worth copying:
122
+
123
+ ```sh
124
+ printf '%s' 'Опис редагування…' | pbcopy
125
+ ```
126
+
107
127
  Then stop. Do not offer to save it.
108
128
 
109
129
  ## References
110
130
 
111
131
  - `references/strategy.md` — the contribution strategy: what to farm, in what order, and how to build standing without getting flagged
112
132
  - `references/wikitext-uk.md` — verified uk templates, citation formats, article skeletons, policy shortcuts
133
+ - `references/newcomer-tasks.md` — the newcomer task tiers (Легкі/Середні/Важкі) and the binding scope contract for each task type
113
134
  - `scripts/wiki.sh` — read-only MediaWiki API helper
114
135
 
115
136
  ## Verification
@@ -0,0 +1,80 @@
1
+ # Ukrainian Wikipedia newcomer task types
2
+
3
+ Verified against the live `uk.wikipedia.org` API, 2026-08-20.
4
+
5
+ `MediaWiki:NewcomerTasks.json` is the authoritative GrowthExperiments "Suggested edits"
6
+ (Пропоновані редагування) task-type → maintenance-template map on ukwiki. The table below is
7
+ that map.
8
+
9
+ ## Task-type mapping
10
+
11
+ | ukwiki UI label | Tier | task type | Backing template(s) |
12
+ |---|---|---|---|
13
+ | Вичитувати | Легкі / easy | `copyedit` | `Шаблон:Мовні помилки` |
14
+ | (not offered in UI — structured) | easy | `link-recommendation` | none |
15
+ | (not offered in that UI list) | easy | `links` | `Шаблон:Упорядкувати`, `Шаблон:Брак посилань` |
16
+ | Шукати зовнішні посилання | Середні / medium | `references` | `Шаблон:Без джерел` |
17
+ | Оновлювати статті | Середні / medium | `update` | `Шаблон:Оновити` |
18
+ | (not offered — structured) | medium | `image-recommendation`, `section-image-recommendation` | none |
19
+ | Розширювати короткі статті | Важкі / hard | `expand` | `Шаблон:Доробити` |
20
+
21
+ All six templates confirmed EXISTS. `Шаблон:Доробити` is a REDIRECT to `Шаблон:Заготовка`
22
+ (see `references/wikitext-uk.md`).
23
+
24
+ ## Scope contract per task type
25
+
26
+ An assigned task type is a **ceiling**, not a suggestion — overreach on a young account is what
27
+ draws patrollers (see `references/strategy.md` Phase 1). Stay inside the type you picked.
28
+
29
+ ### `copyedit` — Вичитувати
30
+
31
+ - IS: language, grammar, punctuation, typography fixes only.
32
+ - NOT: no new facts, no new refs, no restructuring, no adding/removing/reordering sections.
33
+ - Remove `{{Мовні помилки}}` in the same edit only if the whole article was actually proofread.
34
+ - Edit summary shape: `Вичитка: виправлено [конкретні помилки]`.
35
+
36
+ ### `links` — Упорядкувати / Брак посилань
37
+
38
+ - IS: wikilinks and formatting only.
39
+ - NOT: no prose rewriting.
40
+ - Edit summary shape: `Впорядкування посилань: [що додано/виправлено]`.
41
+
42
+ ### `references` — Шукати зовнішні посилання
43
+
44
+ - IS: add inline `<ref>` to claims that are **already there**.
45
+ - NOT: never rewrite a claim to fit a source you happened to find. If no source supports it as
46
+ written, report it — do not reshape it.
47
+ - Remove `{{Без джерел}}` only when every substantive claim is cited.
48
+ - Edit summary shape: `Додано джерела: [що саме підтверджено]`.
49
+
50
+ ### `update` — Оновлювати статті
51
+
52
+ - IS: replace outdated values/dates/status with sourced current ones, plus the minimum prose the
53
+ change forces.
54
+ - NOT: no scope expansion, no new sections.
55
+ - Every updated number needs a source actually fetched this session — this is the highest
56
+ fabrication-risk type in the set and SKILL.md Hard Rule 2 applies with no exceptions.
57
+ - Edit summary shape: `Оновлено дані: [що змінено] за станом на [дата]`.
58
+
59
+ ### `expand` — Розширювати короткі статті
60
+
61
+ - IS: the **only** type permitted to add sections and substantial new sourced prose. Routes into
62
+ the existing **Expand** mode in SKILL.md.
63
+ - `{{Заготовка}}` comes off only when the article genuinely stops being a stub.
64
+ - Edit summary shape: `Розширено статтю: додано [розділи/теми], джерела`.
65
+
66
+ ## Out of scope: structured task types
67
+
68
+ `link-recommendation`, `image-recommendation`, and `section-image-recommendation` are served
69
+ through the Growth UI's own accept/reject widget on ukwiki, not by pasting wikitext. This skill
70
+ does not improvise a manual equivalent for them — say so plainly and decline rather than draft
71
+ around it.
72
+
73
+ ## Finding candidates
74
+
75
+ `action=query&list=growthtasks` requires login, so this read-only skill cannot use it. Find
76
+ candidate articles for a task type instead with:
77
+
78
+ ```sh
79
+ ./scripts/wiki.sh tasks <type> [n]
80
+ ```
@@ -31,6 +31,16 @@ Rules for this phase: one change per edit, always an edit summary in Ukrainian,
31
31
 
32
32
  Target: ~30–50 edits, **zero reverts**. A revert in this phase costs more than 50 edits gain.
33
33
 
34
+ ### Newcomer tasks as a ready-made Phase 1 queue
35
+
36
+ Ukrainian Wikipedia's own GrowthExperiments "Suggested edits" (Пропоновані редагування) tiers a
37
+ maintenance backlog into Легкі / Середні / Важкі — see `references/newcomer-tasks.md` for the
38
+ full mapping and per-type scope contract. Легкі (`copyedit`) and Середні (`references`, `update`)
39
+ are lower-risk, community-endorsed work for this phase, but they are not zero-revert-risk:
40
+ sourcing and fabrication risks still require verification. Pick candidates
41
+ with `./scripts/wiki.sh tasks <type>` and stay strictly inside the assigned scope. Важкі
42
+ (`expand`) is not Phase 1 work — it belongs in Phase 2 stream A/B, once autoconfirmed.
43
+
34
44
  ## Phase 2 — the volume engine (weeks 2–8)
35
45
 
36
46
  Four streams, run in parallel, roughly in this priority order. Value per unit of effort, highest first:
@@ -10,6 +10,7 @@
10
10
  # wiki.sh search <lang> <query> [n] search article titles
11
11
  # wiki.sh backlog <category> [n] list pages in a uk category (maintenance backlogs)
12
12
  # wiki.sh info <lang> <title> length, last edit, categories, templates used
13
+ # wiki.sh tasks <type> [n] candidate articles for a newcomer task type
13
14
  set -eu
14
15
 
15
16
  UA="wikipedia-uk-editor-skill/1.0 (https://github.com/oleg-koval/agent-skills)"
@@ -24,7 +25,7 @@ api() {
24
25
  jqp() { python3 -c "$1"; }
25
26
 
26
27
  cmd=${1:-}
27
- [ -n "$cmd" ] || { sed -n '2,14p' "$0"; exit 1; }
28
+ [ -n "$cmd" ] || { sed -n '2,13p' "$0"; exit 1; }
28
29
  shift
29
30
 
30
31
  case "$cmd" in
@@ -92,7 +93,62 @@ print('touched:',p.get('touched'))
92
93
  print('cats :', ', '.join(c['title'] for c in p.get('categories',[])) or '(none)')
93
94
  print('tmpls :', ', '.join(t['title'] for t in p.get('templates',[])) or '(none)')"
94
95
  ;;
96
+ tasks)
97
+ type=${1:-}
98
+ n=${2:-20}
99
+ case "$n" in
100
+ ''|*[!0-9]*) echo "Invalid task limit: '$n' (expected a non-negative integer)" >&2; exit 1 ;;
101
+ esac
102
+ case "$type" in
103
+ copyedit) templates="Шаблон:Мовні помилки" ;;
104
+ links) templates="Шаблон:Упорядкувати|Шаблон:Брак посилань" ;;
105
+ references) templates="Шаблон:Без джерел" ;;
106
+ update) templates="Шаблон:Оновити" ;;
107
+ expand) templates="Шаблон:Доробити" ;;
108
+ *)
109
+ echo "Unknown task type: '$type'. Valid types: copyedit, links, references, update, expand" >&2
110
+ exit 1
111
+ ;;
112
+ esac
113
+ [ "$n" -gt 0 ] || exit 0
114
+ results=$(mktemp)
115
+ trap 'rm -f "$results"' EXIT
116
+ oldifs=$IFS
117
+ IFS='|'
118
+ for tmpl in $templates; do
119
+ IFS=$oldifs
120
+ api uk --data-urlencode "action=query" --data-urlencode "list=embeddedin" \
121
+ --data-urlencode "eititle=$tmpl" --data-urlencode "einamespace=0" \
122
+ --data-urlencode "eilimit=$n" |
123
+ jqp "import json,sys
124
+ d=json.load(sys.stdin)
125
+ if 'error' in d: sys.exit('NOT FOUND: '+d['error'].get('info',''))
126
+ for m in d['query']['embeddedin']: print(m['title'])" |
127
+ while IFS= read -r title; do printf '%s\t%s\n' "$tmpl" "$title"; done >> "$results"
128
+ done
129
+ python3 - "$results" "$n" <<'PY'
130
+ import sys
131
+ from collections import OrderedDict
132
+
133
+ path, limit_text = sys.argv[1:]
134
+ limit = int(limit_text)
135
+ groups = OrderedDict()
136
+ seen = set()
137
+ with open(path, encoding="utf-8") as handle:
138
+ for line in handle:
139
+ template, title = line.rstrip("\n").split("\t", 1)
140
+ if title in seen:
141
+ continue
142
+ seen.add(title)
143
+ groups.setdefault(template, []).append(title)
144
+ if len(seen) == limit:
145
+ break
146
+ for template, titles in groups.items():
147
+ print(f"== {template} ==")
148
+ print("\n".join(titles))
149
+ PY
150
+ ;;
95
151
  *)
96
- sed -n '2,14p' "$0"; exit 1
152
+ sed -n '2,13p' "$0"; exit 1
97
153
  ;;
98
154
  esac
@@ -23,7 +23,7 @@ Turn a URL or article title into a complete, policy-compliant Ukrainian Wikipedi
23
23
  A single deliverable written to a scratch file and echoed in chat:
24
24
 
25
25
  - the **target page** (exact ukwiki title, and whether it exists)
26
- - the **wikitext** — full article, or an exact-replacement section, or a precise before/after diff for small fixes
26
+ - the **wikitext** — always the complete final article in one `.wiki` file, ready to paste over the whole edit box; never a diff, never a БУЛО/СТАЛО list of manual replacements
27
27
  - the **edit summary** in Ukrainian (≤ 200 chars)
28
28
  - the **source list** with the URL, publisher, and date actually fetched for each
29
29
  - **risk notes**: notability (ВП:ЗН) standing, anything a patroller will challenge, what still needs a human check
@@ -34,12 +34,15 @@ A single deliverable written to a scratch file and echoed in chat:
34
34
 
35
35
  | Input | Mode |
36
36
  |---|---|
37
+ | explicit newcomer task (tier + type, e.g. "Середні → Оновлювати статті") | mode set by task type — see below |
37
38
  | en.wikipedia.org URL, no uk equivalent | **Translate** — new uk article |
38
39
  | uk.wikipedia.org URL, stub or thin | **Expand** |
39
40
  | uk.wikipedia.org URL with `{{Без джерел}}` / `{{Джерело}}` | **Source** |
40
41
  | uk.wikipedia.org URL, prose/format problems | **Cleanup** |
41
42
  | "what should I edit next" | **Plan** — read `references/strategy.md`, propose a ranked list |
42
43
 
44
+ When a newcomer task type is given, it **overrides** the state-based guess above. The per-type scope contract in `references/newcomer-tasks.md` is binding — an assigned type is a ceiling on what the edit may touch, not a floor.
45
+
43
46
  Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft against the wrong title.
44
47
 
45
48
  ### 2. Read before writing
@@ -49,6 +52,7 @@ Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft aga
49
52
  ./scripts/wiki.sh get en "Title" # source-language wikitext
50
53
  ./scripts/wiki.sh langlink en "Title" uk # does a uk version already exist?
51
54
  ./scripts/wiki.sh check uk "Шаблон:Особа" # does this template/page exist?
55
+ ./scripts/wiki.sh tasks <type> [n] # list candidates for a newcomer task type: copyedit|links|references|update|expand
52
56
  ```
53
57
 
54
58
  Stop and report if:
@@ -83,21 +87,38 @@ Run every item. Report failures rather than hiding them.
83
87
  - [ ] No original synthesis (ВП:ОД)
84
88
  - [ ] Dates, numbers, and name transliterations are Ukrainian-correct
85
89
  - [ ] Edit summary written in Ukrainian and states what changed and why
90
+ - [ ] The edit stayed inside the assigned task type's allowed scope
91
+ - [ ] Any maintenance template removed was actually earned — the underlying problem is genuinely fixed
86
92
 
87
93
  ### 6. Deliver
88
94
 
89
- Write the draft to a scratch file (`.md` alongside the raw `.wiki` text so paste is clean), print the edit summary, and tell the human exactly where to paste it:
95
+ For Expand / Source / Cleanup: fetch the current wikitext, apply the changes programmatically (a small Python pass over the fetched file, asserting each anchor string matched exactly once), and write the whole resulting article out. Verify it before delivering — section list intact, every intended change landed, nothing else dropped.
96
+
97
+ Write the draft to a scratch file: the raw `.wiki` file contains nothing but article wikitext (the full final article, ready to paste over the whole edit box); the human-readable explanation of what changed goes in a separate `.md`. Print the edit summary, and tell the human exactly where to paste it:
90
98
 
91
99
  - new article → `https://uk.wikipedia.org/wiki/Тайтл?action=edit`
92
- - section replace → name the section and its exact current heading
100
+ - existing article → `https://uk.wikipedia.org/w/index.php?title=Тайтл&action=edit`, replace the whole edit box
93
101
  - test first → `Вікіпедія:Пісочниця` or the user's own `Користувач:Ім'я/Чернетка`
94
102
 
103
+ End the delivery with a copy-to-clipboard command in its own fenced block, using a quoted absolute path — quoted because scratchpad paths contain characters the shell will otherwise mangle — always the raw `.wiki` file, never the `.md`:
104
+
105
+ ```sh
106
+ pbcopy < "/absolute/path/to/slug.wiki"
107
+ ```
108
+
109
+ Add an optional second line when the edit summary is long enough to be worth copying:
110
+
111
+ ```sh
112
+ printf '%s' 'Опис редагування…' | pbcopy
113
+ ```
114
+
95
115
  Then stop. Do not offer to save it.
96
116
 
97
117
  ## References
98
118
 
99
119
  - `references/strategy.md` — the contribution strategy: what to farm, in what order, and how to build standing without getting flagged
100
120
  - `references/wikitext-uk.md` — verified uk templates, citation formats, article skeletons, policy shortcuts
121
+ - `references/newcomer-tasks.md` — the newcomer task tiers (Легкі/Середні/Важкі) and the binding scope contract for each task type
101
122
  - `scripts/wiki.sh` — read-only MediaWiki API helper
102
123
 
103
124
  ## Verification