@c4a/context-cli 0.7.66 → 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.66",
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.66",
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.66",
28
- "@c4a/extract": "0.7.66",
29
- "@c4a/extract-contract": "0.7.66",
30
- "@c4a/extract-go": "0.7.66",
31
- "@c4a/extract-mdx": "0.7.66",
32
- "@c4a/extract-proto": "0.7.66",
33
- "@c4a/extract-rush": "0.7.66",
34
- "@c4a/extract-sql": "0.7.66",
35
- "@c4a/extract-style": "0.7.66",
36
- "@c4a/extract-thrift": "0.7.66",
37
- "@c4a/extract-ts": "0.7.66",
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.66
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.66",
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.66",
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.66",
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.66",
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.66"
5
+ "version": "0.7.70"
6
6
  },
7
7
  "providerManifest": "provider.yaml",
8
8
  "graphs": [
@@ -193,7 +193,7 @@
193
193
  {
194
194
  "id": "context.sdk.package-outputs",
195
195
  "path": "resources/manuals/guides/package-outputs.md",
196
- "digest": "sha256:cfdd455edd5cb04ede7525a78458f8086d58a59f94e24cde4ca591628d1a22df"
196
+ "digest": "sha256:695a97ef8abc86e1fd8646f90f100f074ba7547f496087204caee73c6ab9237c"
197
197
  },
198
198
  {
199
199
  "id": "context.sdk.package-templates",
@@ -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",
@@ -248,7 +248,7 @@
248
248
  {
249
249
  "id": "diagnostic.verification",
250
250
  "path": "resources/diagnostics/verification.md",
251
- "digest": "sha256:c8a3933fa250c66d12542fc1cf91bdd231ce578c34676d8bc2d7638d325e649f"
251
+ "digest": "sha256:49ea3bfff8b1315aa81f2dfef245ca181499a40c10bca43ec12a37f7d50383a8"
252
252
  },
253
253
  {
254
254
  "id": "diagnostic.workspace-state",
@@ -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:4f47fb7a3549e3bba40a3a291e53e01dc2e7f99e39674032a076528c531415ea"
592
+ "digest": "sha256:f4aa4bb6f22eb6e9fd9a95f5b44f87b404768bfbc0a40df7413df908a21b9033"
593
593
  },
594
594
  {
595
595
  "path": "resources/contracts/indexer-provider-guide.yaml",
@@ -605,7 +605,7 @@
605
605
  },
606
606
  {
607
607
  "path": "resources/diagnostics/verification.md",
608
- "digest": "sha256:c8a3933fa250c66d12542fc1cf91bdd231ce578c34676d8bc2d7638d325e649f"
608
+ "digest": "sha256:49ea3bfff8b1315aa81f2dfef245ca181499a40c10bca43ec12a37f7d50383a8"
609
609
  },
610
610
  {
611
611
  "path": "resources/diagnostics/workspace-state.md",
@@ -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",
@@ -665,7 +665,7 @@
665
665
  },
666
666
  {
667
667
  "path": "resources/manuals/guides/package-outputs.md",
668
- "digest": "sha256:cfdd455edd5cb04ede7525a78458f8086d58a59f94e24cde4ca591628d1a22df"
668
+ "digest": "sha256:695a97ef8abc86e1fd8646f90f100f074ba7547f496087204caee73c6ab9237c"
669
669
  },
670
670
  {
671
671
  "path": "resources/manuals/guides/page-customization.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:1bcf1bb627d06f9259cb0851140fbe276447f68ecaaf5c0e2519140c176b91a3"
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.66
3
+ version: 0.7.70
4
4
  name: Context workflow
5
5
  description: Internal work contract for Context knowledge workspaces.
6
6
  graphs:
@@ -19,3 +19,5 @@ whether the content needs revision.
19
19
  Changed, missing or ambiguously relocated source regions identify articles to
20
20
  inspect through the normal revision workflow. Warnings do not add a separate
21
21
  maintenance gate, silently rewrite articles or confirm that the prose is current.
22
+ Build does not repeat this comparison or read registered sources, so package
23
+ pages carry no source-region notice; run verify before publishing.
@@ -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.
@@ -173,8 +173,8 @@ the workspace under `translations/<tag>/` and follow the
173
173
  [site translation](site-translation.md) procedure. The top bar language button
174
174
  switches the current page in place. A saved choice wins, then the browser
175
175
  languages, then `site.lang`; the choice is remembered under
176
- `site.localePreferenceKey` (default `context-locale:<package>:<base>`), which
177
- sites on one origin can share. Pages without a current translation show the
176
+ `site.localePreferenceKey` (default `context-locale`), which
177
+ sites on one origin share unless configured otherwise. Pages without a current translation show the
178
178
  original with a notice. LLM Docs and Changelog stay in the primary language.
179
179
  `context-site-map.json` lists translated, stale and missing counts per locale.
180
180
  Without `site.locales` the button still switches the interface between Chinese
@@ -575,6 +575,10 @@ not a generated HTML file: builds never overwrite existing values. Deleting it
575
575
  restores built-in defaults; Review does not need the file or an existing website
576
576
  build. The next website build recreates it.
577
577
 
578
+ Websites open in light mode regardless of the system color scheme. The reader's
579
+ light/dark choice is remembered under the origin-wide `context-theme` key, so
580
+ sites and other pages on one origin share it.
581
+
578
582
  Each `light`/`dark` object supports `brand`, `accent`, `background`, `surface`,
579
583
  `text`, `mutedText`, and `border`. Values are hexadecimal CSS colors (`#RGB`,
580
584
  `#RRGGBB`, or `#RRGGBBAA`). Partial objects inherit missing default colors. Invalid
@@ -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": [