kotonoha 0.2.0 → 0.4.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.
- package/CHANGELOG.md +36 -0
- package/README-ja.md +87 -21
- package/README.md +111 -20
- package/package.json +5 -2
- package/skills/consulting-analyst/SKILL.md +241 -0
- package/skills/consulting-analyst/assets/templates/analysis-brief.md +58 -0
- package/skills/consulting-analyst/assets/templates/decision-analysis.md +62 -0
- package/skills/consulting-analyst/assets/templates/hypothesis-evidence-ledger.md +48 -0
- package/skills/consulting-analyst/assets/templates/issue-tree.md +35 -0
- package/skills/consulting-analyst/assets/templates/synthesis-handoff.md +68 -0
- package/skills/consulting-analyst/references/evidence-and-hypotheses.md +80 -0
- package/skills/consulting-analyst/references/framework-selection.md +84 -0
- package/skills/consulting-analyst/references/handoff-contract.md +90 -0
- package/skills/japanese-prose/NOTICE.md +7 -1
- package/skills/japanese-prose/SKILL.md +48 -16
- package/skills/japanese-prose/references/review-workflow.md +57 -0
- package/skills/japanese-prose/references/scoring.md +6 -0
- package/skills/japanese-prose/scripts/core.py +6 -2
- package/skills/japanese-prose/scripts/invariants.py +182 -0
- package/skills/japanese-prose/scripts/lint.py +68 -3
- package/skills/japanese-prose/scripts/test_engine.py +168 -0
- package/skills/presentation-planner/SKILL.md +14 -0
- package/skills/tech-writer/SKILL.md +58 -24
- package/skills/tech-writer/assets/templates/blueprint.md +187 -0
- package/skills/tech-writer/assets/templates/white-paper.md +192 -0
- package/skills/tech-writer/references/doctypes/blueprint.md +81 -0
- package/skills/tech-writer/references/doctypes/white-paper.md +84 -0
- package/skills/tech-writer/references/japanese-prose-optimization.md +17 -8
- package/skills/tech-writer/references/style-constitution.md +10 -4
- package/skills/tech-writer/scripts/lint.py +10 -5
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
# "ginza>=5.2.0,<5.3",
|
|
6
6
|
# "ja-ginza>=5.2.0,<5.3",
|
|
7
7
|
# "spacy>=3.8.0,<4",
|
|
8
|
+
# "markdown-it-py>=3,<5",
|
|
8
9
|
# ]
|
|
9
10
|
# ///
|
|
10
11
|
"""Behavioral tests for kotonoha's original GiNZA diagnostics."""
|
|
@@ -12,6 +13,9 @@
|
|
|
12
13
|
from __future__ import annotations
|
|
13
14
|
|
|
14
15
|
import json
|
|
16
|
+
import hashlib
|
|
17
|
+
import subprocess
|
|
18
|
+
import sys
|
|
15
19
|
import tempfile
|
|
16
20
|
import unittest
|
|
17
21
|
from pathlib import Path
|
|
@@ -20,6 +24,7 @@ from core import strip_markdown_inline
|
|
|
20
24
|
from lint import analyze, compare_baseline
|
|
21
25
|
from outline import extract as extract_outline
|
|
22
26
|
from terms import extract as extract_terms
|
|
27
|
+
from invariants import SEMANTIC_CHECKS, check as check_invariants
|
|
23
28
|
|
|
24
29
|
|
|
25
30
|
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
@@ -27,6 +32,70 @@ FIXTURES = SCRIPT_DIR / "fixtures"
|
|
|
27
32
|
|
|
28
33
|
|
|
29
34
|
class DiagnosticTests(unittest.TestCase):
|
|
35
|
+
def analyze_text(self, text: str, reading_load: bool = False) -> dict:
|
|
36
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
37
|
+
path = Path(directory) / "sample.md"
|
|
38
|
+
path.write_text(text, encoding="utf-8")
|
|
39
|
+
return analyze(path, "tech", reading_load)
|
|
40
|
+
|
|
41
|
+
def test_proofreading_detects_adjacent_duplicates(self) -> None:
|
|
42
|
+
for text, category in (
|
|
43
|
+
("管理者が設定をを確認します。", "duplicate_particle"),
|
|
44
|
+
("管理者がが設定を確認します。", "duplicate_particle"),
|
|
45
|
+
("管理者にに通知します。", "duplicate_particle"),
|
|
46
|
+
("設定設定を保存します。", "duplicate_word"),
|
|
47
|
+
):
|
|
48
|
+
with self.subTest(text=text):
|
|
49
|
+
result = self.analyze_text(text)
|
|
50
|
+
self.assertIn(category, {item["category"] for item in result["findings"]})
|
|
51
|
+
self.assertNotIn(
|
|
52
|
+
category,
|
|
53
|
+
{item["category"] for item in self.analyze_text(text, True)["findings"]},
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
def test_proofreading_checks_brackets_and_paragraph_style(self) -> None:
|
|
57
|
+
for text, category in (
|
|
58
|
+
("設定(管理者向け))を保存します。", "unbalanced_brackets"),
|
|
59
|
+
("設定を保存します。変更はすぐに反映される。", "mixed_sentence_style"),
|
|
60
|
+
):
|
|
61
|
+
with self.subTest(text=text):
|
|
62
|
+
self.assertIn(category, {
|
|
63
|
+
item["category"] for item in self.analyze_text(text)["findings"]
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
def test_proofreading_preserves_names_code_and_deliberate_styles(self) -> None:
|
|
67
|
+
text = (
|
|
68
|
+
"ののさんは、ももを食べます。操作を確認してください。\n\n"
|
|
69
|
+
"「設定を保存する」と説明します。結果を確認します。\n\n"
|
|
70
|
+
"設定を保存する。\n\n設定を確認します。\n\n"
|
|
71
|
+
"`設定設定(`という識別子を使用します。\n\n"
|
|
72
|
+
"```text\n設定をを確認します(\n```\n"
|
|
73
|
+
)
|
|
74
|
+
categories = {item["category"] for item in self.analyze_text(text)["findings"]}
|
|
75
|
+
self.assertFalse(categories & {
|
|
76
|
+
"duplicate_particle", "duplicate_word", "unbalanced_brackets", "mixed_sentence_style",
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
def test_short_fences_and_fence_info_do_not_expose_code_as_prose(self) -> None:
|
|
80
|
+
for text in (
|
|
81
|
+
"````text\n```python\n設定設定(をを確認する。\n```\n````\n",
|
|
82
|
+
"```text\n```python\n設定設定(をを確認する。\n```\n",
|
|
83
|
+
):
|
|
84
|
+
with self.subTest(text=text):
|
|
85
|
+
self.assertEqual(self.analyze_text(text)["findings"], [])
|
|
86
|
+
|
|
87
|
+
def test_questions_and_obligations_are_not_style_errors(self) -> None:
|
|
88
|
+
for text in (
|
|
89
|
+
"この結果だけでは、安全だと言えるでしょうか。",
|
|
90
|
+
"この結果だけでは、安全だと言えるだろうか。",
|
|
91
|
+
"管理者は確認しなくてはならない。",
|
|
92
|
+
"この場合は停止せざるを得ない。",
|
|
93
|
+
):
|
|
94
|
+
with self.subTest(text=text):
|
|
95
|
+
categories = {item["category"] for item in self.analyze_text(text)["findings"]}
|
|
96
|
+
self.assertNotIn("formulaic_conclusion", categories)
|
|
97
|
+
self.assertNotIn("double_negative", categories)
|
|
98
|
+
|
|
30
99
|
def test_unnatural_fixture_scores_below_natural_fixture(self) -> None:
|
|
31
100
|
unnatural = analyze(FIXTURES / "unnatural.md", "tech", False)
|
|
32
101
|
natural = analyze(FIXTURES / "natural.md", "tech", False)
|
|
@@ -113,5 +182,104 @@ class DiagnosticTests(unittest.TestCase):
|
|
|
113
182
|
self.assertTrue(values.isdisjoint({"npm", "run", "build", "workspace", "core"}))
|
|
114
183
|
|
|
115
184
|
|
|
185
|
+
class InvariantTests(unittest.TestCase):
|
|
186
|
+
def test_protected_changes_cannot_be_approved_by_semantic_review(self) -> None:
|
|
187
|
+
original = (
|
|
188
|
+
"---\nowner: admin\n---\n# 概要\n\n"
|
|
189
|
+
"REQ-001ではAcmeが3回、30秒で確認します。帯域は3MB/sです。[仕様](https://example.com/spec)\n\n"
|
|
190
|
+
"`MAX_RETRY_COUNT`を使用します。\n\n"
|
|
191
|
+
"| 項目 | 値 |\n| --- | --- |\n| 上限 | 3 |\n\n"
|
|
192
|
+
"````text\n```python\nprint('old')\n```\n````\n"
|
|
193
|
+
)
|
|
194
|
+
changes = (
|
|
195
|
+
("3回、30秒", "30回、3秒", "numbers_in_order"),
|
|
196
|
+
("30秒", "30分", "quantities_in_order"),
|
|
197
|
+
("3MB/s", "3MB/min", "quantities_in_order"),
|
|
198
|
+
("REQ-001", "REQ-002", "identifiers_in_order"),
|
|
199
|
+
("https://example.com/spec", "https://example.com/new", "link_destinations"),
|
|
200
|
+
("MAX_RETRY_COUNT", "RETRY_COUNT", "inline_code"),
|
|
201
|
+
("| 上限 | 3 |", "| 上限 | 4 |", "protected_blocks"),
|
|
202
|
+
("owner: admin", "owner: user", "frontmatter"),
|
|
203
|
+
("# 概要", "## 概要", "heading_levels"),
|
|
204
|
+
("Acme", "Other", "protected_terms"),
|
|
205
|
+
("print('old')", "print('new')", "protected_blocks"),
|
|
206
|
+
)
|
|
207
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
208
|
+
before, after, review = (Path(directory) / name for name in ("before.md", "after.md", "review.json"))
|
|
209
|
+
before.write_text(original, encoding="utf-8")
|
|
210
|
+
for old, new, category in changes:
|
|
211
|
+
with self.subTest(category=category):
|
|
212
|
+
after.write_text(original.replace(old, new), encoding="utf-8")
|
|
213
|
+
self.write_review(before, after, review)
|
|
214
|
+
result = check_invariants(before, after, ["Acme"], review)
|
|
215
|
+
self.assertEqual(result["status"], "blocked")
|
|
216
|
+
self.assertIn(category, {
|
|
217
|
+
item["category"] for item in result["mechanical_violations"]
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
def write_review(self, before: Path, after: Path, review: Path) -> None:
|
|
221
|
+
review.write_text(json.dumps({
|
|
222
|
+
"before_sha256": hashlib.sha256(before.read_bytes()).hexdigest(),
|
|
223
|
+
"after_sha256": hashlib.sha256(after.read_bytes()).hexdigest(),
|
|
224
|
+
"reviewer": "test-reviewer",
|
|
225
|
+
"checks": {name: True for name in SEMANTIC_CHECKS},
|
|
226
|
+
}), encoding="utf-8")
|
|
227
|
+
|
|
228
|
+
def test_review_must_cover_exact_edits_and_all_semantic_checks(self) -> None:
|
|
229
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
230
|
+
before, after, review = (Path(directory) / name for name in ("before.md", "after.md", "review.json"))
|
|
231
|
+
before.write_text("管理者だけが設定を確認します。", encoding="utf-8")
|
|
232
|
+
after.write_text("設定を確認できるのは管理者だけです。", encoding="utf-8")
|
|
233
|
+
self.assertEqual(check_invariants(before, before)["status"], "passed")
|
|
234
|
+
self.assertEqual(check_invariants(before, after)["status"], "review_required")
|
|
235
|
+
self.write_review(before, after, review)
|
|
236
|
+
self.assertEqual(check_invariants(before, after, review_path=review)["status"], "passed")
|
|
237
|
+
after.write_text("誰でも設定を確認できます。", encoding="utf-8")
|
|
238
|
+
self.assertEqual(check_invariants(before, after, review_path=review)["status"], "review_required")
|
|
239
|
+
self.write_review(before, after, review)
|
|
240
|
+
value = json.loads(review.read_text(encoding="utf-8"))
|
|
241
|
+
value["checks"]["scope"] = False
|
|
242
|
+
review.write_text(json.dumps(value), encoding="utf-8")
|
|
243
|
+
self.assertEqual(check_invariants(before, after, review_path=review)["status"], "review_required")
|
|
244
|
+
|
|
245
|
+
def test_invariant_cli_exit_codes_and_input_errors(self) -> None:
|
|
246
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
247
|
+
before, after = (Path(directory) / name for name in ("before.md", "after.md"))
|
|
248
|
+
before.write_text("上限は3回です。", encoding="utf-8")
|
|
249
|
+
for text, code in (
|
|
250
|
+
("上限は3回です。", 0),
|
|
251
|
+
("上限は30回です。", 2),
|
|
252
|
+
("3回を上限とします。", 3),
|
|
253
|
+
):
|
|
254
|
+
with self.subTest(code=code):
|
|
255
|
+
after.write_text(text, encoding="utf-8")
|
|
256
|
+
process = subprocess.run(
|
|
257
|
+
[sys.executable, str(SCRIPT_DIR / "invariants.py"), str(before), str(after), "--json"],
|
|
258
|
+
capture_output=True, text=True,
|
|
259
|
+
)
|
|
260
|
+
self.assertEqual(process.returncode, code, process.stderr)
|
|
261
|
+
self.assertIn("status", json.loads(process.stdout))
|
|
262
|
+
process = subprocess.run(
|
|
263
|
+
[sys.executable, str(SCRIPT_DIR / "invariants.py"), str(before), str(Path(directory) / "missing.md")],
|
|
264
|
+
capture_output=True, text=True,
|
|
265
|
+
)
|
|
266
|
+
self.assertEqual(process.returncode, 1)
|
|
267
|
+
self.assertIn("error:", process.stderr)
|
|
268
|
+
|
|
269
|
+
def test_units_across_line_breaks_and_boolean_review_types(self) -> None:
|
|
270
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
271
|
+
before, after, review = (Path(directory) / name for name in ("before.md", "after.md", "review.json"))
|
|
272
|
+
before.write_text("上限は30\n秒です。", encoding="utf-8")
|
|
273
|
+
after.write_text("上限は30\n分です。", encoding="utf-8")
|
|
274
|
+
self.assertEqual(check_invariants(before, after)["status"], "blocked")
|
|
275
|
+
before.write_text("設定をを保存します。", encoding="utf-8")
|
|
276
|
+
after.write_text("設定を保存します。", encoding="utf-8")
|
|
277
|
+
self.write_review(before, after, review)
|
|
278
|
+
value = json.loads(review.read_text(encoding="utf-8"))
|
|
279
|
+
value["checks"]["negation"] = "true"
|
|
280
|
+
review.write_text(json.dumps(value), encoding="utf-8")
|
|
281
|
+
self.assertEqual(check_invariants(before, after, review_path=review)["status"], "review_required")
|
|
282
|
+
|
|
283
|
+
|
|
116
284
|
if __name__ == "__main__":
|
|
117
285
|
unittest.main()
|
|
@@ -36,6 +36,20 @@ Read `references/responsibility-boundary.md` before acting. This skill owns:
|
|
|
36
36
|
- Selection and adaptation of a packaged design specification
|
|
37
37
|
- A deterministic handoff contract for the host's PPTX skill
|
|
38
38
|
|
|
39
|
+
When a presentation request still lacks a defined decision question,
|
|
40
|
+
evidence-backed findings, or option analysis, load kotonoha's sibling
|
|
41
|
+
`consulting-analyst` skill first. Consume its `synthesis-handoff.md` rather
|
|
42
|
+
than inventing business conclusions during storyline design. Preserve its
|
|
43
|
+
evidence IDs, confidence, counterevidence, decision criteria, and conditions
|
|
44
|
+
that would change the recommendation. If the sibling skill is absent, ask for
|
|
45
|
+
the decision question and evidence or label conclusions as unverified.
|
|
46
|
+
|
|
47
|
+
If the handoff status is `Incomplete`, either return decision-critical gaps
|
|
48
|
+
for further analysis or show the incomplete status, evidence gaps, confidence,
|
|
49
|
+
and conditional wording in the presentation plan. Return to analysis when
|
|
50
|
+
new evidence, a different audience decision, changed criteria, or a
|
|
51
|
+
contradiction would change the conclusion.
|
|
52
|
+
|
|
39
53
|
This skill must not:
|
|
40
54
|
|
|
41
55
|
- Create, edit, unzip, or inspect `.pptx` binaries
|
|
@@ -6,19 +6,21 @@ description: >-
|
|
|
6
6
|
notes/CHANGELOG, user manuals/how-to guides, code comments/docstrings,
|
|
7
7
|
requirements definitions, system designs, test plans, operations runbooks,
|
|
8
8
|
migration plans, security designs/threat models, technical proposals,
|
|
9
|
-
RFI/RFP procurement documents, and Qiita/Zenn
|
|
9
|
+
Blueprints, White Papers, RFI/RFP procurement documents, and Qiita/Zenn
|
|
10
|
+
articles. Use for requests
|
|
10
11
|
like "write a README", "draft a design doc", "define system requirements",
|
|
11
12
|
"write a system design", "create a test plan", "write an operations
|
|
12
13
|
runbook", "plan a migration", "create a threat model", "write a technical
|
|
13
|
-
proposal", "
|
|
14
|
-
"clean up my commit
|
|
14
|
+
proposal", "create a Blueprint", "write a White Paper", "draft an RFI",
|
|
15
|
+
"create an RFP", "write this PR description", "clean up my commit
|
|
15
16
|
message", "make this how-to guide clearer", "write API docs", "summarize
|
|
16
17
|
the release notes", "write a Zenn article", "write this up for Qiita", as
|
|
17
18
|
well as
|
|
18
19
|
Japanese-language equivalents (「READMEを書いて」「設計ドキュメントを作って」
|
|
19
20
|
「要件定義書を作って」「システム設計書を書いて」「テスト計画書を作って」
|
|
20
21
|
「運用設計書を書いて」「移行計画を作って」「脅威モデルを作って」
|
|
21
|
-
「技術提案書を書いて」「
|
|
22
|
+
「技術提案書を書いて」「Blueprintを作って」「ホワイトペーパーを書いて」
|
|
23
|
+
「RFIを作って」「RFPを作って」「PRの説明文を書いて」
|
|
22
24
|
「コミットメッセージを整えて」「手順書を分かりやすくして」
|
|
23
25
|
「APIドキュメントを整備して」「リリースノートをまとめて」
|
|
24
26
|
「Zennの記事を書いて」「Qiitaに投稿する記事を書いて」). Especially useful when
|
|
@@ -41,8 +43,8 @@ with the shortest path. Covers README, design docs/ADRs, API reference, PR
|
|
|
41
43
|
descriptions/commit messages/issue reports, release notes/CHANGELOG, user
|
|
42
44
|
manuals/how-to guides, code comments/docstrings, requirements definitions,
|
|
43
45
|
system designs, test plans, operations runbooks, migration plans, security
|
|
44
|
-
designs/threat models, technical proposals,
|
|
45
|
-
and Qiita/Zenn articles.
|
|
46
|
+
designs/threat models, technical proposals, Blueprints, White Papers,
|
|
47
|
+
RFI/RFP procurement documents, and Qiita/Zenn articles.
|
|
46
48
|
|
|
47
49
|
Default format: Markdown for every doctype in this skill, except a git
|
|
48
50
|
commit message body (plain text by convention — light "-" bullets are
|
|
@@ -54,18 +56,35 @@ reference files.
|
|
|
54
56
|
|
|
55
57
|
## Division of labor
|
|
56
58
|
|
|
57
|
-
Document
|
|
58
|
-
the
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
Document creation can span three layers: "is the reasoning defensible", "is
|
|
60
|
+
the structure right", and "is the prose natural and readable". The bundled
|
|
61
|
+
`consulting-analyst` skill owns problem decomposition, hypotheses, evidence,
|
|
62
|
+
option evaluation, and synthesis when those are not yet settled. This skill
|
|
63
|
+
owns structure, document type conventions, completeness, and reader fit. The
|
|
64
|
+
bundled `japanese-prose` skill owns sentence-level naturalness, reading load,
|
|
65
|
+
terminology, and repeated-pattern analysis.
|
|
66
|
+
|
|
67
|
+
When a request for a Blueprint, White Paper, proposal, or decision document
|
|
68
|
+
still lacks a defensible analysis, load the sibling `consulting-analyst`
|
|
69
|
+
skill first and consume its `synthesis-handoff.md`. Do not silently invent
|
|
70
|
+
the missing analysis inside document prose. If the sibling skill is absent,
|
|
71
|
+
ask for the decision question and evidence or label analytical conclusions as
|
|
72
|
+
unverified. Preserve issue, hypothesis, source, evidence, criterion, weight,
|
|
73
|
+
score, confidence, counterevidence, and uncertainty records. Return the work
|
|
74
|
+
to analysis when new evidence, a new decision question, changed criteria, or
|
|
75
|
+
a contradictory conclusion requires analytical judgment.
|
|
76
|
+
|
|
77
|
+
If the handoff status is `Incomplete`, either return the decision-critical
|
|
78
|
+
gaps to `consulting-analyst` or preserve that status, the evidence gaps, the
|
|
79
|
+
confidence, and conditional wording visibly in the document. Never turn an
|
|
80
|
+
incomplete handoff into an unqualified recommendation. Tech-writer then locks
|
|
81
|
+
down the document structure and orchestrates the §5 handoff to
|
|
82
|
+
japanese-prose during `write` mode before the final rubber-duck review.
|
|
65
83
|
|
|
66
84
|
- Rule of thumb: "does removing a heading still make sense?" tests structure
|
|
67
|
-
(this skill's job). "Does
|
|
68
|
-
|
|
85
|
+
(this skill's job). "Does the recommendation follow from evidence?" tests
|
|
86
|
+
analysis (`consulting-analyst`). "Does rereading a single sentence change
|
|
87
|
+
its meaning?" tests prose (`japanese-prose`).
|
|
69
88
|
- Code comments/docstrings document code itself, but the same
|
|
70
89
|
structure-and-completeness framing still applies.
|
|
71
90
|
|
|
@@ -110,7 +129,13 @@ hand the user a checklist to fill in. Instead:
|
|
|
110
129
|
For a supplier response, structure the document against the supplied
|
|
111
130
|
RFP's requirement IDs, requested proposal contents, pricing format, and
|
|
112
131
|
contract deviations, then apply the general principles in
|
|
113
|
-
`references/style-constitution.md`.
|
|
132
|
+
`references/style-constitution.md`. For a bare "Blueprint" request, ask
|
|
133
|
+
whether the reader needs an integrated future state and transformation
|
|
134
|
+
path (`blueprint`), implementation-level system detail (`system-design`),
|
|
135
|
+
or approval for one investment (`technical-proposal`). For a bare "White
|
|
136
|
+
Paper" request, ask whether the goal is an evidence-led publication
|
|
137
|
+
(`white-paper`) or an internal approval request (`technical-proposal`);
|
|
138
|
+
do not treat a sales brochure as an evidence-led White Paper.
|
|
114
139
|
2. Open the matching reference file and note its target reader and any
|
|
115
140
|
"settle before writing" items. Combined with the general musts below,
|
|
116
141
|
this is your information checklist — but never show it to the user as a
|
|
@@ -129,7 +154,10 @@ hand the user a checklist to fill in. Instead:
|
|
|
129
154
|
approved requirements baseline for a system design, exit criteria for a
|
|
130
155
|
test plan, RTO/RPO for an operations runbook, rollback conditions for a
|
|
131
156
|
migration plan, assets and trust boundaries for a threat model, market
|
|
132
|
-
unknowns for an RFI,
|
|
157
|
+
unknowns for an RFI, evaluation rules for an RFP, planning horizon,
|
|
158
|
+
approval authority, and baseline evidence for a Blueprint, or the central
|
|
159
|
+
claim, evidence standard, and publisher or sponsor conflicts for a White
|
|
160
|
+
Paper).
|
|
133
161
|
5. **A "don't know" / "not applicable" / "no ticket for this" answer
|
|
134
162
|
satisfies a must — it is not a reason to keep asking.** Ask that must
|
|
135
163
|
at most once; if the answer is a non-answer, record it as a stated
|
|
@@ -162,6 +190,8 @@ hand the user a checklist to fill in. Instead:
|
|
|
162
190
|
| Migration plan / 移行計画書 | migration-plan | `references/doctypes/migration-plan.md` |
|
|
163
191
|
| Security design / Threat model / セキュリティ設計書 | security-design | `references/doctypes/security-design.md` |
|
|
164
192
|
| Internal technical proposal | technical-proposal | `references/doctypes/technical-proposal.md` |
|
|
193
|
+
| Blueprint / 将来構想・変革設計図 | blueprint | `references/doctypes/blueprint.md` |
|
|
194
|
+
| White Paper / ホワイトペーパー | white-paper | `references/doctypes/white-paper.md` |
|
|
165
195
|
| Request for information / RFI | rfi | `references/doctypes/rfi.md` |
|
|
166
196
|
| Request for proposal / RFP | rfp | `references/doctypes/rfp.md` |
|
|
167
197
|
| Zenn article | zenn | `references/doctypes/zenn.md` |
|
|
@@ -176,8 +206,8 @@ one-question-at-a-time intake for reader and outcome.
|
|
|
176
206
|
For documents likely to run long — design docs/ADRs, user manuals with
|
|
177
207
|
multiple steps, API references covering several endpoints, requirements
|
|
178
208
|
definitions, system designs, test plans, operations runbooks, migration
|
|
179
|
-
plans, security designs, technical proposals,
|
|
180
|
-
the user calls
|
|
209
|
+
plans, security designs, technical proposals, Blueprints, White Papers,
|
|
210
|
+
RFI/RFP documents, or anything the user calls
|
|
181
211
|
"long"/"detailed"/"comprehensive" — draft a table of contents (heading
|
|
182
212
|
outline) before writing any body prose.
|
|
183
213
|
|
|
@@ -207,7 +237,8 @@ document and needs the outline step below.
|
|
|
207
237
|
For living, multi-section documents (README, design doc, API reference,
|
|
208
238
|
release notes, user manual, requirements definition, system design, test
|
|
209
239
|
plan, operations runbook, migration plan, security design, technical
|
|
210
|
-
proposal, RFI/RFP, Zenn/Qiita article), write under
|
|
240
|
+
proposal, Blueprint, White Paper, RFI/RFP, Zenn/Qiita article), write under
|
|
241
|
+
the 8 rules
|
|
211
242
|
in `references/style-constitution.md`. Summary: state "what this is" and
|
|
212
243
|
"the outcome for the reader" in the first three lines; make headings
|
|
213
244
|
labels that preview content (not "Overview", but "Overview of what");
|
|
@@ -225,7 +256,10 @@ For every Markdown doctype, surround `**strong emphasis**` with half-width
|
|
|
225
256
|
spaces when the delimiters would otherwise touch prose. For example, write
|
|
226
257
|
`これは **強調** になる`, not `これは**強調**にならない`. Spaces are not
|
|
227
258
|
required at line boundaries or next to punctuation, and must not be placed
|
|
228
|
-
inside the `**` delimiters.
|
|
259
|
+
inside the `**` delimiters. Use ASCII spaces (`U+0020`), never full-width
|
|
260
|
+
spaces (`U+3000`), tabs, or non-breaking spaces, immediately before and after
|
|
261
|
+
emphasis embedded in prose. Write `これは **「重要」** と説明する`, not
|
|
262
|
+
`これは **「重要」** と説明する`.
|
|
229
263
|
|
|
230
264
|
For atomic artifacts (commit messages, PR descriptions, issue reports,
|
|
231
265
|
code comments/docstrings, a single entry appended to an existing
|
|
@@ -373,8 +407,8 @@ for `write` mode; do not run it for `review` or `score` mode.
|
|
|
373
407
|
See each reference file for detail. The items below are for living,
|
|
374
408
|
multi-section documents (README, design doc, API reference, release notes,
|
|
375
409
|
user manual, requirements definition, system design, test plan, operations
|
|
376
|
-
runbook, migration plan, security design, technical proposal,
|
|
377
|
-
Zenn/Qiita article). Atomic
|
|
410
|
+
runbook, migration plan, security design, technical proposal, Blueprint,
|
|
411
|
+
White Paper, RFI/RFP, Zenn/Qiita article). Atomic
|
|
378
412
|
artifacts (commit message, PR
|
|
379
413
|
description, issue report, code comment/docstring, a single appended
|
|
380
414
|
release-notes entry) are already covered by their own doctype checklist
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# <Blueprint名>
|
|
2
|
+
|
|
3
|
+
<対象読者、実現する将来像、この文書を使って合意する事項を3文以内で記載する。>
|
|
4
|
+
|
|
5
|
+
- オーナー: <組織・役割>
|
|
6
|
+
- 作成日: <YYYY-MM-DD>
|
|
7
|
+
- 最終更新日: <YYYY-MM-DD>
|
|
8
|
+
- 対象期間: <YYYY-MM-DD〜YYYY-MM-DD、または3年間など>
|
|
9
|
+
- 対象範囲: <事業・組織・業務・データ・技術など>
|
|
10
|
+
- ステータス: Draft / In Review / Approved / Rejected / Deferred / Superseded
|
|
11
|
+
- 承認者・会議体: <名称>
|
|
12
|
+
- 現行版: <版番号>
|
|
13
|
+
- 置き換える文書: <文書名・版、または該当なし>
|
|
14
|
+
- Analysis status: Completed / Incomplete / Not performed
|
|
15
|
+
- Evidence gaps: <不足する証拠、影響する判断、収集担当・期限、またはなし>
|
|
16
|
+
- 分析ハンドオフ: <synthesis-handoff.mdの所在、またはなし>
|
|
17
|
+
|
|
18
|
+
`Analysis status`は文書の承認ステータスとは別に記録する。`Incomplete`の場合は、不足する証拠と確からしさを明示し、影響する結論・推奨事項を条件付きで記載する。判断を妨げる不足は`consulting-analyst`へ戻すか、この文書に残す。`Not performed`の場合は、分析未実施の範囲と理由を記載し、分析済みとして扱わない。
|
|
19
|
+
|
|
20
|
+
## <このBlueprintで実現する成果>
|
|
21
|
+
|
|
22
|
+
<対象期間の終了時に、誰が何を実現できる状態になるかを記載する。>
|
|
23
|
+
|
|
24
|
+
| 成果ID | 期待する成果 | 現状値 | 目標値 | 測定方法 | 判定時期 | オーナー |
|
|
25
|
+
|---|---|---:|---:|---|---|---|
|
|
26
|
+
| OUT-001 | <成果> | <値> | <値> | <方法> | <時期> | <役割> |
|
|
27
|
+
|
|
28
|
+
## 対象範囲と対象外
|
|
29
|
+
|
|
30
|
+
### 対象範囲
|
|
31
|
+
|
|
32
|
+
- <対象となる組織、能力、業務、データ、システム、地域>
|
|
33
|
+
|
|
34
|
+
### 対象外
|
|
35
|
+
|
|
36
|
+
- <このBlueprintでは扱わない事項と、その扱い先>
|
|
37
|
+
|
|
38
|
+
### 前提条件と制約
|
|
39
|
+
|
|
40
|
+
| ID | 種別 | 内容 | 根拠 | 変更時の影響 |
|
|
41
|
+
|---|---|---|---|---|
|
|
42
|
+
| CON-001 | 前提 / 制約 | <内容> | <資料・決定> | <影響> |
|
|
43
|
+
|
|
44
|
+
## 変革を必要とする背景
|
|
45
|
+
|
|
46
|
+
<外部環境、利用者ニーズ、経営課題、技術的負債、規制など、将来像が必要な理由を事実と解釈に分けて記載する。>
|
|
47
|
+
|
|
48
|
+
| ドライバーID | ドライバー | 根拠 | 対応しない場合の影響 |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| DRV-001 | <変化・課題> | <データ・資料> | <影響> |
|
|
51
|
+
|
|
52
|
+
## 設計原則
|
|
53
|
+
|
|
54
|
+
| 原則ID | 原則 | 判断への適用方法 | 例外を認める条件 |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| PRN-001 | <原則> | <選択・優先順位への反映> | <条件と承認者> |
|
|
57
|
+
|
|
58
|
+
## 現在地を示すベースライン
|
|
59
|
+
|
|
60
|
+
### 現在の能力と成熟度
|
|
61
|
+
|
|
62
|
+
| 能力ID | 能力 | 現状 | 成熟度 | 根拠 | 主な課題 |
|
|
63
|
+
|---|---|---|---|---|---|
|
|
64
|
+
| CAP-001 | <能力> | <現在の状態> | 1〜5 | <評価資料> | <課題> |
|
|
65
|
+
|
|
66
|
+
### 現在の構成
|
|
67
|
+
|
|
68
|
+
<業務、組織、データ、アプリケーション、基盤、セキュリティ、運用のうち、対象範囲に必要な現在の構成を示す。>
|
|
69
|
+
|
|
70
|
+
```mermaid
|
|
71
|
+
flowchart LR
|
|
72
|
+
A[<現在の利用者・業務>] --> B[<現在の能力・システム>]
|
|
73
|
+
B --> C[<現在の成果・制約>]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 目標とする能力と将来像
|
|
77
|
+
|
|
78
|
+
### 目標能力
|
|
79
|
+
|
|
80
|
+
| 能力ID | 目標能力 | 提供する価値 | 対象者 | 成熟度目標 | 成功条件 |
|
|
81
|
+
|---|---|---|---|---|---|
|
|
82
|
+
| CAP-001 | <能力> | <価値> | <対象者> | 1〜5 | <測定可能な条件> |
|
|
83
|
+
|
|
84
|
+
### 将来のOperating Model
|
|
85
|
+
|
|
86
|
+
| 観点 | 将来の状態 | 主な変更 | 意思決定者 |
|
|
87
|
+
|---|---|---|---|
|
|
88
|
+
| 組織・役割 | <状態> | <変更> | <役割> |
|
|
89
|
+
| 業務プロセス | <状態> | <変更> | <役割> |
|
|
90
|
+
| ガバナンス | <状態> | <変更> | <役割> |
|
|
91
|
+
| 人材・スキル | <状態> | <変更> | <役割> |
|
|
92
|
+
|
|
93
|
+
### 将来のデータ・技術構成
|
|
94
|
+
|
|
95
|
+
<技術が対象外の場合は、その理由と別文書を記載する。>
|
|
96
|
+
|
|
97
|
+
```mermaid
|
|
98
|
+
flowchart LR
|
|
99
|
+
A[<利用者・チャネル>] --> B[<目標能力>]
|
|
100
|
+
B --> C[<データ・サービス・基盤>]
|
|
101
|
+
C --> D[<測定可能な成果>]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
| 構成要素 | 責任 | 原則・標準 | 詳細設計の所在 |
|
|
105
|
+
|---|---|---|---|
|
|
106
|
+
| <要素> | <責任> | <適用する原則> | <文書・未作成> |
|
|
107
|
+
|
|
108
|
+
### セキュリティ・リスク・運用の将来像
|
|
109
|
+
|
|
110
|
+
- セキュリティ: <信頼境界、責任分担、主要統制>
|
|
111
|
+
- リスク管理: <識別、受容、軽減、報告の方法>
|
|
112
|
+
- 運用: <所有権、監視、継続性、改善サイクル>
|
|
113
|
+
|
|
114
|
+
## 現在地と将来像の差分
|
|
115
|
+
|
|
116
|
+
| Gap ID | 関連能力 | 現在地 | 将来像 | 必要な変更 | 優先度 |
|
|
117
|
+
|---|---|---|---|---|---|
|
|
118
|
+
| GAP-001 | CAP-001 | <状態> | <状態> | <変更> | High / Medium / Low |
|
|
119
|
+
|
|
120
|
+
## 変革ワークストリーム
|
|
121
|
+
|
|
122
|
+
| WS ID | ワークストリーム | 解消するGap | 成果物 | オーナー | 依存関係 | 完了条件 |
|
|
123
|
+
|---|---|---|---|---|---|---|
|
|
124
|
+
| WS-001 | <名称> | GAP-001 | <成果物> | <役割> | <WS・外部条件> | <条件> |
|
|
125
|
+
|
|
126
|
+
## 移行段階とロードマップ
|
|
127
|
+
|
|
128
|
+
<日付だけでなく、各段階へ進む条件と完了条件を記載する。>
|
|
129
|
+
|
|
130
|
+
| フェーズ | 目的 | 対象ワークストリーム | 開始条件 | 完了条件 | 目標時期 |
|
|
131
|
+
|---|---|---|---|---|---|
|
|
132
|
+
| Phase 1 | <目的> | WS-001 | <条件> | <測定可能な条件> | <時期> |
|
|
133
|
+
|
|
134
|
+
### 移行中の共存と廃止
|
|
135
|
+
|
|
136
|
+
- 共存が必要な状態: <旧新の併存、データ同期、二重運用>
|
|
137
|
+
- 切り替え条件: <判断指標・承認者>
|
|
138
|
+
- 廃止対象と条件: <業務・システム・契約・データ>
|
|
139
|
+
- ロールバックまたは方針見直し条件: <条件>
|
|
140
|
+
|
|
141
|
+
## ガバナンスと意思決定
|
|
142
|
+
|
|
143
|
+
| 判断事項 | 決定者 | 提案者 | 相談先 | 報告先 | 判断時期 |
|
|
144
|
+
|---|---|---|---|---|---|
|
|
145
|
+
| <判断事項> | <役割> | <役割> | <役割> | <役割> | <時期> |
|
|
146
|
+
|
|
147
|
+
### 例外と変更管理
|
|
148
|
+
|
|
149
|
+
- 原則の例外申請: <手順・承認者>
|
|
150
|
+
- Blueprint変更: <提案、影響分析、承認、版管理>
|
|
151
|
+
- 下位文書との不整合: <検出・解消方法>
|
|
152
|
+
|
|
153
|
+
## 成果の測定とレビュー
|
|
154
|
+
|
|
155
|
+
| 指標ID | 関連成果 | 指標 | 目標 | データ源 | 頻度 | 未達時の対応 |
|
|
156
|
+
|---|---|---|---:|---|---|---|
|
|
157
|
+
| KPI-001 | OUT-001 | <指標> | <値> | <データ源> | <頻度> | <見直し・是正> |
|
|
158
|
+
|
|
159
|
+
## リスクと未解決事項
|
|
160
|
+
|
|
161
|
+
| ID | 種別 | 内容 | 影響 | 対応 | オーナー | 期限 |
|
|
162
|
+
|---|---|---|---|---|---|---|
|
|
163
|
+
| RSK-001 | リスク / 未解決事項 | <内容> | <影響> | <対応> | <役割> | <日付> |
|
|
164
|
+
|
|
165
|
+
## トレーサビリティ
|
|
166
|
+
|
|
167
|
+
分析ハンドオフがある場合は、関連するQ / HYP / FND / EVD / GAP / INT / CRT IDsを保持する。INTは介入、CRTは選択肢の評価基準を表す。該当しないリンクは理由付き`N/A`とし、ハンドオフがない場合は分析IDを無理に作らない。
|
|
168
|
+
|
|
169
|
+
| 論点 Q IDs | 仮説 HYP IDs | 発見 FND IDs | 証拠 EVD IDs | ドライバー | 設計原則 | 目標能力 | Gap | 介入 INT IDs | 評価基準 CRT IDs | ワークストリーム | 指標 |
|
|
170
|
+
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
171
|
+
| <関連Q IDs、またはN/A> | <関連HYP IDs、またはN/A> | <関連FND IDs、またはN/A> | <関連EVD IDs、またはN/A> | DRV-001 | PRN-001 | CAP-001 | GAP-001 | <関連INT IDs、またはN/A> | <関連CRT IDs、またはN/A> | WS-001 | KPI-001 |
|
|
172
|
+
|
|
173
|
+
## 承認と変更履歴
|
|
174
|
+
|
|
175
|
+
### 承認
|
|
176
|
+
|
|
177
|
+
ヘッダーのステータスと、次の承認結果を一致させる。承認結果が`Rejected`または`Deferred`の場合、ステータスを`Approved`にしない。
|
|
178
|
+
|
|
179
|
+
| 役割 | 氏名・会議体 | 判断 | 日付 | 条件 |
|
|
180
|
+
|---|---|---|---|---|
|
|
181
|
+
| <役割> | <名称> | Approved / Rejected / Deferred | <YYYY-MM-DD> | <条件> |
|
|
182
|
+
|
|
183
|
+
### 変更履歴
|
|
184
|
+
|
|
185
|
+
| 版 | 日付 | 変更内容 | 変更者 | 承認者 |
|
|
186
|
+
|---|---|---|---|---|
|
|
187
|
+
| 0.1 | <YYYY-MM-DD> | 初版 | <氏名> | <氏名・会議体> |
|