@c4a/context-cli 0.7.67 → 0.7.70

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "protocol": "context.indexer.cli-release-manifest/v1",
3
3
  "package": "@c4a/context-cli",
4
- "version": "0.7.67",
4
+ "version": "0.7.70",
5
5
  "issuer": "context4ai/context",
6
6
  "bundles": [
7
7
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c4a/context-cli",
3
- "version": "0.7.67",
3
+ "version": "0.7.70",
4
4
  "type": "module",
5
5
  "description": "Local runtime and Agent integration for traceable knowledge production",
6
6
  "license": "MIT",
@@ -24,17 +24,17 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@c4a/agent-graph": "0.3.0",
27
- "@c4a/context": "0.7.67",
28
- "@c4a/extract": "0.7.67",
29
- "@c4a/extract-contract": "0.7.67",
30
- "@c4a/extract-go": "0.7.67",
31
- "@c4a/extract-mdx": "0.7.67",
32
- "@c4a/extract-proto": "0.7.67",
33
- "@c4a/extract-rush": "0.7.67",
34
- "@c4a/extract-sql": "0.7.67",
35
- "@c4a/extract-style": "0.7.67",
36
- "@c4a/extract-thrift": "0.7.67",
37
- "@c4a/extract-ts": "0.7.67",
27
+ "@c4a/context": "0.7.70",
28
+ "@c4a/extract": "0.7.70",
29
+ "@c4a/extract-contract": "0.7.70",
30
+ "@c4a/extract-go": "0.7.70",
31
+ "@c4a/extract-mdx": "0.7.70",
32
+ "@c4a/extract-proto": "0.7.70",
33
+ "@c4a/extract-rush": "0.7.70",
34
+ "@c4a/extract-sql": "0.7.70",
35
+ "@c4a/extract-style": "0.7.70",
36
+ "@c4a/extract-thrift": "0.7.70",
37
+ "@c4a/extract-ts": "0.7.70",
38
38
  "@mermaid-js/layout-elk": "0.2.0",
39
39
  "commander": "^11.0.0",
40
40
  "fast-xml-parser": "^5.10.1",
@@ -18099,6 +18099,19 @@ var init_indexerAgentStepProtocol = __esm(() => {
18099
18099
  ]);
18100
18100
  });
18101
18101
 
18102
+ // ../context/src/articleSourceLocatorInput.ts
18103
+ var articleSourceLocatorInputSchema;
18104
+ var init_articleSourceLocatorInput = __esm(() => {
18105
+ init_zod();
18106
+ init_articleStructure();
18107
+ init_indexerProtocolCommon();
18108
+ articleSourceLocatorInputSchema = exports_external.union([
18109
+ articleSourceLocatorSchema,
18110
+ exports_external.object({ path: portableIndexerPathSchema, heading: exports_external.string().trim().min(1) }).strict(),
18111
+ exports_external.object({ path: portableIndexerPathSchema, quote: exports_external.string().min(1) }).strict()
18112
+ ]);
18113
+ });
18114
+
18102
18115
  // ../context/src/knowledgeMap.ts
18103
18116
  function validateEntries(entries) {
18104
18117
  const indexed = new Map(entries.map((entry) => [entry.key, entry]));
@@ -18208,6 +18221,7 @@ function parseIndexerCurrentActionSubmission(value) {
18208
18221
  }
18209
18222
  var catalogProviderSelectionSchema, providerSelectionEntrySchema, providerObservationSchema, indexerProviderSelectionSemanticInputSchema, indexerProviderResolutionSemanticInputSchema, indexerProviderProgramAuthorizationSemanticInputSchema, partitionGroupSchema2, partitionDispositionSchema, partitionUnsupportedSchema, completePartitionInputSchema, failedPartitionInputSchema, indexerPartitionSemanticInputSchema, authorVisualSchema, authorSectionSchema, authorTemplateVariablesSchema, authorMemberDispositionSchema, authorMaterialGapSchema, authorDiagnosticSchema, authorInputBaseSchema, indexerAuthorSemanticInputSchema, indexerPartitionBatchSemanticInputSchema, indexerAuthorBatchSemanticInputSchema, indexerMainBatchSubmissionEnvelopeSchema, postAuthorSectionSchema, postAuthorInputBaseSchema, indexerPostAuthorSemanticInputSchema, indexerPostAuthorBatchSemanticInputSchema, structureReviewBaseSchema, indexerStructureReviewInputSchema, layoutConfirmationBaseSchema, indexerLayoutConfirmationInputSchema, revisionSectionReferencesSchema, approvedRevisionSemanticInputSchema, sourceUpdateSemanticInputSchema, indexerCurrentActionInputDefinitions, indexerCurrentActionInputSchema;
18210
18223
  var init_indexerSemanticInput = __esm(() => {
18224
+ init_articleSourceLocatorInput();
18211
18225
  init_articleStructure();
18212
18226
  init_indexerProtocolCommon();
18213
18227
  init_knowledgeMap();
@@ -18513,8 +18527,8 @@ var init_indexerSemanticInput = __esm(() => {
18513
18527
  ]);
18514
18528
  revisionSectionReferencesSchema = exports_external.array(exports_external.object({
18515
18529
  source_ref: exports_external.string().min(1),
18516
- locator: articleSourceLocatorSchema
18517
- }).strict()).max(3);
18530
+ locator: articleSourceLocatorInputSchema
18531
+ }).strict());
18518
18532
  approvedRevisionSemanticInputSchema = exports_external.union([
18519
18533
  exports_external.object({
18520
18534
  stage: exports_external.literal("approved-revision"),
@@ -20725,6 +20739,7 @@ var init_src = __esm(() => {
20725
20739
  init_knowledgeMap();
20726
20740
  init_indexerApprovedKnowledge();
20727
20741
  init_articleStructure();
20742
+ init_articleSourceLocatorInput();
20728
20743
  });
20729
20744
 
20730
20745
  // src/project/codeAnalysisInput.ts
package/plugins/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.67
1
+ 0.7.70
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "c4a",
3
3
  "description": "Start or continue a project-local knowledge workspace through one graph-routed entry.",
4
- "version": "0.7.67",
4
+ "version": "0.7.70",
5
5
  "author": {
6
6
  "name": "c4a"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "c4a",
3
- "version": "0.7.67",
3
+ "version": "0.7.70",
4
4
  "description": "Start or continue a project-local knowledge workspace through one graph-routed entry.",
5
5
  "author": { "name": "c4a" },
6
6
  "homepage": "https://github.com/context4ai/c4a",
@@ -10,7 +10,7 @@
10
10
  "skills": "./skills/",
11
11
  "interface": {
12
12
  "displayName": "C4A Context",
13
- "shortDescription": "Initialize and advance a local, source-linked project knowledge workspace.\nv0.7.67",
13
+ "shortDescription": "Initialize and advance a local, source-linked project knowledge workspace.\nv0.7.70",
14
14
  "longDescription": "Create a Context workspace and use agent-guided next steps to register sources, run extraction, review candidates, build package outputs, and verify health without silently mutating source repositories.",
15
15
  "developerName": "c4a",
16
16
  "category": "Productivity",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "c4a",
3
3
  "displayName": "C4A Context",
4
- "version": "0.7.67",
4
+ "version": "0.7.70",
5
5
  "description": "Start or continue a project-local knowledge workspace through one graph-routed entry.",
6
6
  "author": {
7
7
  "name": "Context4AI",
@@ -2,7 +2,7 @@
2
2
  "schema": "agent-graph.bundle.v1",
3
3
  "provider": {
4
4
  "id": "c4a/context",
5
- "version": "0.7.67"
5
+ "version": "0.7.70"
6
6
  },
7
7
  "providerManifest": "provider.yaml",
8
8
  "graphs": [
@@ -213,7 +213,7 @@
213
213
  {
214
214
  "id": "context.sdk.site-translation",
215
215
  "path": "resources/manuals/guides/site-translation.md",
216
- "digest": "sha256:369ffdc81481e48843891f5e007129d38047e4077a693b3bc58fa6c8e8f86666"
216
+ "digest": "sha256:f91c6676dc2b51e91e29d9a818c56039b5f6389982b124d3f3609c7c88293a6a"
217
217
  },
218
218
  {
219
219
  "id": "context.sdk.template-variables",
@@ -288,7 +288,7 @@
288
288
  {
289
289
  "id": "procedure.approved-revision",
290
290
  "path": "resources/procedures/approved-revision.md",
291
- "digest": "sha256:4ee897e6c13e0e908e4d28b239d93f74e66756ef7707277997225743ca250552"
291
+ "digest": "sha256:31bc0c4dfb0393b079f69c5cfe84c0b4b0e77149e64e923838bdeeb0f7002669"
292
292
  },
293
293
  {
294
294
  "id": "procedure.close-and-build",
@@ -323,7 +323,7 @@
323
323
  {
324
324
  "id": "procedure.knowledge-updates",
325
325
  "path": "resources/procedures/knowledge-updates.md",
326
- "digest": "sha256:6b54d24f6928721e1e941c904d45aee97fe053cb90173f297659b7fdb181e0da"
326
+ "digest": "sha256:a8c3505aa7bd7e97db85fafb89a30a62f15c24e9976b1de1f5d3736143b3e0fd"
327
327
  },
328
328
  {
329
329
  "id": "procedure.note",
@@ -348,7 +348,7 @@
348
348
  {
349
349
  "id": "procedure.production-stage-files",
350
350
  "path": "resources/procedures/production-stage-files.md",
351
- "digest": "sha256:00abeb0d32efb3fa8bf65fe1864e42fd5a16be42c2de7644a344465699cecc0a"
351
+ "digest": "sha256:add64bef96b5d87aa8205386637a00b1a4a57cf40f715fcf5659d45b577ac2cc"
352
352
  },
353
353
  {
354
354
  "id": "procedure.project-configuration",
@@ -435,12 +435,12 @@
435
435
  {
436
436
  "id": "schemas/approved-revision-result.schema.json",
437
437
  "path": "schemas/approved-revision-result.schema.json",
438
- "digest": "sha256:18d66d69acd29ff87aba456e58dacc693781768f066411262912df47a2367de5"
438
+ "digest": "sha256:e672c5c6de7f0f6eb523486b71a7b92ae735d36632fafc351b734732d6fbedb0"
439
439
  },
440
440
  {
441
441
  "id": "schemas/indexer-agent-step-result.schema.json",
442
442
  "path": "schemas/indexer-agent-step-result.schema.json",
443
- "digest": "sha256:9900937515f9987775e6a61c3b8ce4d754296ce5a1958e69985676665d2f8ec6"
443
+ "digest": "sha256:b80501f5c131ffd731cd2f96513c37aa012c3470098a287bd58b06c4698af6d2"
444
444
  },
445
445
  {
446
446
  "id": "context.indexer.registry-bootstrap",
@@ -589,7 +589,7 @@
589
589
  },
590
590
  {
591
591
  "path": "provider.yaml",
592
- "digest": "sha256:13d87c848d3f6b43d934f8f23da53a8fa3e52566a18a11c9850c0a2e084bfc41"
592
+ "digest": "sha256:f4aa4bb6f22eb6e9fd9a95f5b44f87b404768bfbc0a40df7413df908a21b9033"
593
593
  },
594
594
  {
595
595
  "path": "resources/contracts/indexer-provider-guide.yaml",
@@ -649,7 +649,7 @@
649
649
  },
650
650
  {
651
651
  "path": "resources/manuals/guides/knowledge-updates.md",
652
- "digest": "sha256:e389fcc1d5dd4be5e4255889f68e977f34b16d983e169b1c3cc5f6d97322a487"
652
+ "digest": "sha256:c26d6552b9a21d2ce1fb3a2508d0909165a3f61ab126fc4f7153fc2bca738e95"
653
653
  },
654
654
  {
655
655
  "path": "resources/manuals/guides/lark-resources.md",
@@ -681,7 +681,7 @@
681
681
  },
682
682
  {
683
683
  "path": "resources/manuals/guides/site-translation.md",
684
- "digest": "sha256:369ffdc81481e48843891f5e007129d38047e4077a693b3bc58fa6c8e8f86666"
684
+ "digest": "sha256:f91c6676dc2b51e91e29d9a818c56039b5f6389982b124d3f3609c7c88293a6a"
685
685
  },
686
686
  {
687
687
  "path": "resources/manuals/guides/source-batches.md",
@@ -717,7 +717,7 @@
717
717
  },
718
718
  {
719
719
  "path": "resources/procedures/approved-revision.md",
720
- "digest": "sha256:4ee897e6c13e0e908e4d28b239d93f74e66756ef7707277997225743ca250552"
720
+ "digest": "sha256:31bc0c4dfb0393b079f69c5cfe84c0b4b0e77149e64e923838bdeeb0f7002669"
721
721
  },
722
722
  {
723
723
  "path": "resources/procedures/close-and-build.md",
@@ -745,7 +745,7 @@
745
745
  },
746
746
  {
747
747
  "path": "resources/procedures/knowledge-updates.md",
748
- "digest": "sha256:6b54d24f6928721e1e941c904d45aee97fe053cb90173f297659b7fdb181e0da"
748
+ "digest": "sha256:a8c3505aa7bd7e97db85fafb89a30a62f15c24e9976b1de1f5d3736143b3e0fd"
749
749
  },
750
750
  {
751
751
  "path": "resources/procedures/note.md",
@@ -765,7 +765,7 @@
765
765
  },
766
766
  {
767
767
  "path": "resources/procedures/production-stage-files.md",
768
- "digest": "sha256:00abeb0d32efb3fa8bf65fe1864e42fd5a16be42c2de7644a344465699cecc0a"
768
+ "digest": "sha256:add64bef96b5d87aa8205386637a00b1a4a57cf40f715fcf5659d45b577ac2cc"
769
769
  },
770
770
  {
771
771
  "path": "resources/procedures/project-configuration.md",
@@ -857,11 +857,11 @@
857
857
  },
858
858
  {
859
859
  "path": "schemas/approved-revision-result.schema.json",
860
- "digest": "sha256:18d66d69acd29ff87aba456e58dacc693781768f066411262912df47a2367de5"
860
+ "digest": "sha256:e672c5c6de7f0f6eb523486b71a7b92ae735d36632fafc351b734732d6fbedb0"
861
861
  },
862
862
  {
863
863
  "path": "schemas/indexer-agent-step-result.schema.json",
864
- "digest": "sha256:9900937515f9987775e6a61c3b8ce4d754296ce5a1958e69985676665d2f8ec6"
864
+ "digest": "sha256:b80501f5c131ffd731cd2f96513c37aa012c3470098a287bd58b06c4698af6d2"
865
865
  },
866
866
  {
867
867
  "path": "schemas/indexer-registry-bootstrap.schema.json",
@@ -901,7 +901,7 @@
901
901
  },
902
902
  {
903
903
  "path": "skills/translate-site-locales/SKILL.md",
904
- "digest": "sha256:b5197f6568b1443022d631f661d7484291c9be512b78109f91e6b42806294e7e"
904
+ "digest": "sha256:d736b2dff46cc75330522ecbef41f10d77b24dae87fcd290418bb25683f94a43"
905
905
  },
906
906
  {
907
907
  "path": "skills/work-production-stage/SKILL.md",
@@ -912,5 +912,5 @@
912
912
  "indexer": [],
913
913
  "workspace": []
914
914
  },
915
- "digest": "sha256:e70281043cdf69e95392b4fcf03d83a8ce7ea0c5ce846b426c43105a9540b5d9"
915
+ "digest": "sha256:063167b951010b10898421a8585b4cd8311eb002f56d08131d675c1755c510c1"
916
916
  }
@@ -1,6 +1,6 @@
1
1
  schema: agent-graph.provider.v1
2
2
  id: c4a/context
3
- version: 0.7.67
3
+ version: 0.7.70
4
4
  name: Context workflow
5
5
  description: Internal work contract for Context knowledge workspaces.
6
6
  graphs:
@@ -706,3 +706,14 @@ an explicit empty list removes them, and deleting a fragment removes its
706
706
  citations. Each fragment may cite at most three source positions. Register and
707
707
  authorize new material before citing it, then follow normal Review, close and
708
708
  build. Article links alone do not authorize reading new sources or prove a claim.
709
+
710
+ ### Locating submitted references
711
+
712
+ Submission locators also accept `{path, heading}` or `{path, quote}` instead of
713
+ line numbers. Use exactly one form. A heading matches an exact ATX heading
714
+ outside code fences in a Markdown source; its region ends before the next
715
+ same-level or higher-level heading. A quote is an exact, unique, nonempty
716
+ substring (line endings are normalized). Ambiguous matches return candidate
717
+ line ranges. Both forms resolve against authorized captured text before hashing;
718
+ stored references still contain only `path`, `start_line` and `end_line`.
719
+ The three-region limit applies after resolving and deduplicating positions.
@@ -60,8 +60,11 @@ map_entries:
60
60
  ```
61
61
 
62
62
  A translated article keeps every `context:section` marker, id and order, every
63
- fenced code block with its language and content (Mermaid labels may change), and
64
- every link target. Submission validates all items first and saves nothing when
63
+ fenced code block and its language marker, and every link target. Prose in
64
+ `text`, `txt`, and `plaintext` blocks may be translated; keep commands, paths,
65
+ and placeholders such as `<repository>` unchanged. Mermaid labels may change.
66
+ All other blocks, including blocks without a language marker, keep their content
67
+ unchanged. Submission validates all items first and saves nothing when
65
68
  any item fails. A digest from before an approved content change is rejected.
66
69
 
67
70
  `skip` records that the current pending items are published in the primary
@@ -76,3 +79,24 @@ an outdated notice and a button that switches to the original; a missing page
76
79
  shows the original with a notice. Navigation titles without a translation use
77
80
  the translated article title, then the primary title. Site search covers every
78
81
  language; opening a result in another language switches to it.
82
+
83
+
84
+ ## Incremental drafts
85
+
86
+ `prepare` returns section changes, title/description changes, exterior-text changes
87
+ (including the article tail), and section order changes. It writes draft files
88
+ and a `submission_path` template. Unchanged parts retain their translation;
89
+ changed parts contain the current primary-language text for the Agent to translate.
90
+ Review every pending part before submitting; generated source text is not a translation.
91
+
92
+ Older current translations acquire source-part baselines without changing their
93
+ reader text. Older stale translations report `diff: unknown` and get a full source
94
+ draft plus a `.previous.md` translation for comparison.
95
+
96
+ Repeated preparation preserves edited drafts. `draft: rebase-required` means the
97
+ source changed while a draft was being edited; that draft is excluded from the
98
+ submission template. Reconcile it with the current source, then explicitly add
99
+ the returned `source_digest` to that article's submission entry. Never copy a new
100
+ digest onto an unreconciled draft. Ordinary submissions still use `expected_digest`.
101
+ A draft without a generation record, such as one left by an older workflow, is
102
+ kept as `unrecorded_draft` beside a freshly generated draft.
@@ -170,3 +170,14 @@ If the user explicitly requires a different presentation, explain the difference
170
170
  and resolve that choice before accepting it. Do not rerun unchanged Repair to
171
171
  force a format the program deliberately omits. Check the actual resulting page;
172
172
  accepted tasks or an empty Composer result alone do not demonstrate a correction.
173
+
174
+ ### Locating submitted references
175
+
176
+ Submission locators also accept `{path, heading}` or `{path, quote}` instead of
177
+ line numbers. Use exactly one form. A heading matches an exact ATX heading
178
+ outside code fences in a Markdown source; its region ends before the next
179
+ same-level or higher-level heading. A quote is an exact, unique, nonempty
180
+ substring (line endings are normalized). Ambiguous matches return candidate
181
+ line ranges. Both forms resolve against authorized captured text before hashing;
182
+ stored references still contain only `path`, `start_line` and `end_line`.
183
+ The three-region limit applies after resolving and deduplicating positions.
@@ -706,3 +706,14 @@ an explicit empty list removes them, and deleting a fragment removes its
706
706
  citations. Each fragment may cite at most three source positions. Register and
707
707
  authorize new material before citing it, then follow normal Review, close and
708
708
  build. Article links alone do not authorize reading new sources or prove a claim.
709
+
710
+ ### Locating submitted references
711
+
712
+ Submission locators also accept `{path, heading}` or `{path, quote}` instead of
713
+ line numbers. Use exactly one form. A heading matches an exact ATX heading
714
+ outside code fences in a Markdown source; its region ends before the next
715
+ same-level or higher-level heading. A quote is an exact, unique, nonempty
716
+ substring (line endings are normalized). Ambiguous matches return candidate
717
+ line ranges. Both forms resolve against authorized captured text before hashing;
718
+ stored references still contain only `path`, `start_line` and `end_line`.
719
+ The three-region limit applies after resolving and deduplicating positions.
@@ -104,3 +104,14 @@ build resumes the same stage; a failed build retains the pause and all tasks.
104
104
  To cancel that pause explicitly, use `context run --resume-writing --format json`.
105
105
  It preserves approved articles, candidates and existing task input handles.
106
106
  Partial delivery must include the approved articles needed by its local links.
107
+
108
+ ### Locating submitted references
109
+
110
+ Submission locators also accept `{path, heading}` or `{path, quote}` instead of
111
+ line numbers. Use exactly one form. A heading matches an exact ATX heading
112
+ outside code fences in a Markdown source; its region ends before the next
113
+ same-level or higher-level heading. A quote is an exact, unique, nonempty
114
+ substring (line endings are normalized). Ambiguous matches return candidate
115
+ line ranges. Both forms resolve against authorized captured text before hashing;
116
+ stored references still contain only `path`, `start_line` and `end_line`.
117
+ The three-region limit applies after resolving and deduplicating positions.
@@ -30,26 +30,64 @@
30
30
  "minLength": 1
31
31
  },
32
32
  "locator": {
33
- "type": "object",
34
- "properties": {
35
- "path": {
36
- "type": "string"
33
+ "anyOf": [
34
+ {
35
+ "type": "object",
36
+ "properties": {
37
+ "path": {
38
+ "type": "string"
39
+ },
40
+ "start_line": {
41
+ "type": "integer",
42
+ "minimum": 1
43
+ },
44
+ "end_line": {
45
+ "type": "integer",
46
+ "minimum": 1
47
+ }
48
+ },
49
+ "required": [
50
+ "path",
51
+ "start_line",
52
+ "end_line"
53
+ ],
54
+ "additionalProperties": false
37
55
  },
38
- "start_line": {
39
- "type": "integer",
40
- "minimum": 1
56
+ {
57
+ "type": "object",
58
+ "properties": {
59
+ "path": {
60
+ "$ref": "#/anyOf/0/properties/sections/items/properties/references/items/properties/locator/anyOf/0/properties/path"
61
+ },
62
+ "heading": {
63
+ "type": "string",
64
+ "minLength": 1
65
+ }
66
+ },
67
+ "required": [
68
+ "path",
69
+ "heading"
70
+ ],
71
+ "additionalProperties": false
41
72
  },
42
- "end_line": {
43
- "type": "integer",
44
- "minimum": 1
73
+ {
74
+ "type": "object",
75
+ "properties": {
76
+ "path": {
77
+ "$ref": "#/anyOf/0/properties/sections/items/properties/references/items/properties/locator/anyOf/0/properties/path"
78
+ },
79
+ "quote": {
80
+ "type": "string",
81
+ "minLength": 1
82
+ }
83
+ },
84
+ "required": [
85
+ "path",
86
+ "quote"
87
+ ],
88
+ "additionalProperties": false
45
89
  }
46
- },
47
- "required": [
48
- "path",
49
- "start_line",
50
- "end_line"
51
- ],
52
- "additionalProperties": false
90
+ ]
53
91
  }
54
92
  },
55
93
  "required": [
@@ -57,8 +95,7 @@
57
95
  "locator"
58
96
  ],
59
97
  "additionalProperties": false
60
- },
61
- "maxItems": 3
98
+ }
62
99
  }
63
100
  },
64
101
  "required": [
@@ -129,26 +129,64 @@
129
129
  "minLength": 1
130
130
  },
131
131
  "locator": {
132
- "type": "object",
133
- "properties": {
134
- "path": {
135
- "type": "string"
132
+ "anyOf": [
133
+ {
134
+ "type": "object",
135
+ "properties": {
136
+ "path": {
137
+ "type": "string"
138
+ },
139
+ "start_line": {
140
+ "type": "integer",
141
+ "minimum": 1
142
+ },
143
+ "end_line": {
144
+ "type": "integer",
145
+ "minimum": 1
146
+ }
147
+ },
148
+ "required": [
149
+ "path",
150
+ "start_line",
151
+ "end_line"
152
+ ],
153
+ "additionalProperties": false
136
154
  },
137
- "start_line": {
138
- "type": "integer",
139
- "minimum": 1
155
+ {
156
+ "type": "object",
157
+ "properties": {
158
+ "path": {
159
+ "$ref": "#/$defs/approvedRevision/anyOf/0/properties/sections/items/properties/references/items/properties/locator/anyOf/0/properties/path"
160
+ },
161
+ "heading": {
162
+ "type": "string",
163
+ "minLength": 1
164
+ }
165
+ },
166
+ "required": [
167
+ "path",
168
+ "heading"
169
+ ],
170
+ "additionalProperties": false
140
171
  },
141
- "end_line": {
142
- "type": "integer",
143
- "minimum": 1
172
+ {
173
+ "type": "object",
174
+ "properties": {
175
+ "path": {
176
+ "$ref": "#/$defs/approvedRevision/anyOf/0/properties/sections/items/properties/references/items/properties/locator/anyOf/0/properties/path"
177
+ },
178
+ "quote": {
179
+ "type": "string",
180
+ "minLength": 1
181
+ }
182
+ },
183
+ "required": [
184
+ "path",
185
+ "quote"
186
+ ],
187
+ "additionalProperties": false
144
188
  }
145
- },
146
- "required": [
147
- "path",
148
- "start_line",
149
- "end_line"
150
- ],
151
- "additionalProperties": false
189
+ ]
152
190
  }
153
191
  },
154
192
  "required": [
@@ -156,8 +194,7 @@
156
194
  "locator"
157
195
  ],
158
196
  "additionalProperties": false
159
- },
160
- "maxItems": 3
197
+ }
161
198
  }
162
199
  },
163
200
  "required": [
@@ -8,13 +8,20 @@ knowledge map title that is missing or stale for each declared locale, with the
8
8
  `expected_digest` to submit. Approved knowledge in the primary language remains
9
9
  the only source of truth; translations never change it.
10
10
 
11
+ Use the returned draft and submission paths. Preserve unchanged translated parts
12
+ and translate the listed changes in a natural tone. For `diff: unknown`, compare
13
+ with the previous translation. A `rebase-required` draft must be reconciled with
14
+ the current source before explicitly confirming its `source_digest`.
15
+
11
16
  For each article, read the approved file and write a complete translation to a
12
17
  temporary file under `.tmp/agent-payloads/`. Keep its structure exactly:
13
18
 
14
19
  - frontmatter contains only a translated `title` and optional `description`;
15
20
  - keep every `context:section` marker, id and order unchanged;
16
- - keep every fenced code block, language and content unchanged; only Mermaid
17
- labels may be translated;
21
+ - keep every fenced code block and language marker; translate prose in `text`,
22
+ `txt`, and `plaintext` blocks, preserving commands, paths and placeholders such
23
+ as `<repository>`. Mermaid labels may be translated. Keep content unchanged
24
+ in every other block, including blocks without a language marker;
18
25
  - keep every link target unchanged; translate link labels only;
19
26
  - keep product names, commands, file paths, identifiers and API names as written.
20
27