logseq-matryca-parser 1.4.1__tar.gz → 1.4.2__tar.gz

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 (110) hide show
  1. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/CHANGELOG.md +23 -0
  2. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/CONTRIBUTING.md +2 -2
  3. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/PKG-INFO +15 -3
  4. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/README.md +14 -2
  5. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/SECURITY.md +2 -2
  6. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/ARCHITECTURE.md +7 -7
  7. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/BUG_HUNT_REPORT.md +4 -0
  8. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/CODEQL.md +1 -1
  9. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/GOOD_FIRST_ISSUES.md +33 -20
  10. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/README.md +1 -1
  11. logseq_matryca_parser-1.4.2/docs/design-docs/README.md +13 -0
  12. logseq_matryca_parser-1.4.2/metrics/index.json +9 -0
  13. logseq_matryca_parser-1.4.1/metrics/history.json → logseq_matryca_parser-1.4.2/metrics/quarters/2026-Q2.json +1625 -634
  14. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/pyproject.toml +1 -1
  15. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/__init__.py +1 -1
  16. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/agent_press.py +57 -4
  17. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/agent_writer.py +2 -0
  18. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/exceptions.py +4 -0
  19. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/kinetic.py +10 -2
  20. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/synapse.py +30 -21
  21. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_agent_press.py +45 -0
  22. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_agent_writer.py +51 -0
  23. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_extract_changelog.py +43 -0
  24. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_forge.py +93 -1
  25. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_graph.py +76 -1
  26. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_kinetic.py +102 -0
  27. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_lens.py +30 -0
  28. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_logseq_markdown.py +39 -0
  29. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_synapse.py +87 -1
  30. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/uv.lock +1 -1
  31. logseq_matryca_parser-1.4.1/docs/design-docs/README.md +0 -11
  32. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.cursorignore +0 -0
  33. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.cursorrules +0 -0
  34. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/CODEOWNERS +0 -0
  35. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/FUNDING.yml +0 -0
  36. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  37. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  38. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  39. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  40. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/dependabot.yml +0 -0
  41. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/labels.yml +0 -0
  42. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/scripts/create_good_first_issues.sh +0 -0
  43. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/workflows/ci.yml +0 -0
  44. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/workflows/daily-metrics.yml +0 -0
  45. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/workflows/github_release.yml +0 -0
  46. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.github/workflows/pypi_publish.yml +0 -0
  47. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.gitignore +0 -0
  48. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.pre-commit-config.yaml +0 -0
  49. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/.repomixignore +0 -0
  50. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/CODE_OF_CONDUCT.md +0 -0
  51. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/LICENSE +0 -0
  52. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/Makefile +0 -0
  53. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/NOTICE +0 -0
  54. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/claude-skill-logseq-read/SKILL.md +0 -0
  55. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/claude-skill-logseq-read/scripts/parse_logseq.py +0 -0
  56. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/COOKBOOK.md +0 -0
  57. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/RELEASE_PROCESS.md +0 -0
  58. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/design-docs/ARCHITECTURE_BLUEPRINT.md +0 -0
  59. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/design-docs/CODE_SCAFFOLD.md +0 -0
  60. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/design-docs/LOGSEQ_ASSET_RESOLUTION_SPEC.md +0 -0
  61. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/design-docs/LOGSEQ_DATASCRIPT_MAPPING.md +0 -0
  62. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/design-docs/LOGSEQ_TEMPORAL_ONTOLOGY.md +0 -0
  63. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/design-docs/OFFICIAL_MLDOC_SPECS.md +0 -0
  64. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/design-docs/REFERENCE_SPEC.md +0 -0
  65. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/error_log.md +0 -0
  66. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/internal/STATIC_ANALYSIS_POLICY.md +0 -0
  67. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/logseq_ast_primer.md +0 -0
  68. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/rfc/OLLAMA_RAG.md +0 -0
  69. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_AGENT_NATIVE_XRAY.md +0 -0
  70. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_CLI_HYDRATION_AND_ENRICHMENT.md +0 -0
  71. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_CONTEXT_SYNTHESIS_AND_SCOPING.md +0 -0
  72. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_EMBED_EXPANSION_AND_FLUENT_QUERIES.md +0 -0
  73. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_GRAPH_RAG_SEMANTICS.md +0 -0
  74. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_HEADLESS_WRITER.md +0 -0
  75. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_INCREMENTAL_WATCHER.md +0 -0
  76. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_INLINE_SHIELD_AND_NAMESPACES.md +0 -0
  77. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_OBSIDIAN_ADAPTER.md +0 -0
  78. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_ROBUSTNESS_AND_SOFT_BREAKS.md +0 -0
  79. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_TOML_FIX_AND_PYPI_DISTRIBUTION.md +0 -0
  80. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/docs/roadmaps/ROADMAP_UUID_AND_GRAPH_SUPERPOWERS.md +0 -0
  81. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/examples/demo_logseq_journal.md +0 -0
  82. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/examples/run_demo.py +0 -0
  83. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/legacy/local_digestor.py +0 -0
  84. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/lib/bindings/utils.js +0 -0
  85. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/lib/tom-select/tom-select.complete.min.js +0 -0
  86. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/lib/tom-select/tom-select.css +0 -0
  87. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/lib/vis-9.1.2/vis-network.css +0 -0
  88. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/lib/vis-9.1.2/vis-network.min.js +0 -0
  89. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/repomix-output-parser.xml +0 -0
  90. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/scripts/__init__.py +0 -0
  91. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/scripts/archive_repository_metrics.py +0 -0
  92. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/scripts/debug_pre_release.py +0 -0
  93. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/scripts/extract_changelog.py +0 -0
  94. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/.gitignore +0 -0
  95. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/NOTICE +0 -0
  96. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/__main__.py +0 -0
  97. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/forge.py +0 -0
  98. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/graph.py +0 -0
  99. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/lens.py +0 -0
  100. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logos_core.py +0 -0
  101. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logos_parser.py +0 -0
  102. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logseq_markdown.py +0 -0
  103. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/logseq_paths.py +0 -0
  104. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/src/logseq_matryca_parser/pyproject.toml +0 -0
  105. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_archive_repository_metrics.py +0 -0
  106. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_exceptions.py +0 -0
  107. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_logos_parser.py +0 -0
  108. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_logseq_paths.py +0 -0
  109. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_package_version.py +0 -0
  110. {logseq_matryca_parser-1.4.1 → logseq_matryca_parser-1.4.2}/tests/test_pre_release_roundtrip.py +0 -0
@@ -7,6 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - **Contributor issues (wave 3)** — Six new issues from local code study ([#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59)–[#64](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/64)): LENS ghost wikilink nodes, corrupt X-Ray state handling, `agent_write` assert guard, and paired good-first tests.
13
+ - **Contributor issues (wave 4)** — Seven issues from Clean Architecture code study ([#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65)–[#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71)): SYNAPSE cyclic embed duplication, unresolved embed semantics, kinetic dead code, graph watcher DIP, English DX messages, OCP embed refactor, and parametrized SYNAPSE tests. Agent rule: [`.cursor/rules/07-clean-architecture-audit.mdc`](.cursor/rules/07-clean-architecture-audit.mdc).
14
+ - **Contributor issues (wave 5)** — [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) / [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73): `append_child_to_node` corrupts Markdown when the source file lacks a trailing newline (agent-write data loss).
15
+
16
+ ## [1.4.2] - 2026-06-29
17
+
18
+ ### Fixed
19
+
20
+ - **agent-write** — `append_child_to_node` normalizes source files missing a trailing newline before line splice, preventing new bullets from being appended onto the last line ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#74](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/74)).
21
+ - **SYNAPSE** — cyclic `{{embed [[Page]]}}` chains no longer duplicate parent literal text; page embed expansion tracks an immutable host-page chain seeded from `to_context_enriched_chunks` ([#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#75](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/75)).
22
+ - **agent-write** — `SessionAliasRegistry.load_from_disk` tolerates empty, malformed, or legacy-wrapped X-Ray JSON; KINETIC exits with a clear message instead of a traceback ([#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60), [#76](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/76)).
23
+
24
+ ### Added
25
+
26
+ - **Test coverage (wave 2)** — Community contribution ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58), maintainer #43): **65** new pytest cases for `detect_tab_size_from_markdown`, graph link/backlink helpers, SYNAPSE embedding strip + metadata schema, FORGE Markdown/JSON visitors, LENS node classification, `extract_changelog` CLI, `LogseqConfigReader` timestamps, and KINETIC `agent-write` validation errors. Closes [#20](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/20), [#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52).
27
+ - **Regression tests** — Seven new cases for newline splice, cyclic page embed, and malformed X-Ray state (issues [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73), [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)); suite total **450** pytest.
28
+
29
+ ### Changed
30
+
31
+ - **Contributor docs** — [`README.md`](README.md), [`docs/README.md`](docs/README.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), [`SECURITY.md`](SECURITY.md), and [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) harmonized for **v1.4.2** (test count, supported versions, agent-write / SYNAPSE behavior notes).
32
+
10
33
  ## [1.4.1] - 2026-06-24
11
34
 
12
35
  ### Added
@@ -15,7 +15,7 @@ User-facing behavior is documented in:
15
15
  - [`README.md`](README.md) — overview, quickstart, and feature matrix
16
16
  - [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — LOGOS, SYNAPSE, `LogseqGraph`, agents, and data flow
17
17
  - [`docs/logseq_ast_primer.md`](docs/logseq_ast_primer.md) — Logseq Spatial Markdown domain rules
18
- - [`CHANGELOG.md`](CHANGELOG.md) — shipped releases (current: **1.4.1**) and **Unreleased** changes (Keep a Changelog)
18
+ - [`CHANGELOG.md`](CHANGELOG.md) — shipped releases (current: **1.4.2**) and **Unreleased** changes (Keep a Changelog)
19
19
  - [`docs/RELEASE_PROCESS.md`](docs/RELEASE_PROCESS.md) — version bump, tag, and PyPI publish checklist
20
20
  - [`docs/CODEQL.md`](docs/CODEQL.md) — CodeQL default setup (no custom `codeql.yml`)
21
21
  - [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) — curated starter tasks for new contributors
@@ -124,7 +124,7 @@ CI runs the same commands as your local environment: `uv sync --all-extras`, the
124
124
  make all
125
125
  ```
126
126
 
127
- As of **v1.4.1**, `make test` runs **378** pytest cases with **≥80%** line coverage on `src/logseq_matryca_parser` (currently ~**90%**). New contributors should mirror patterns in [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) and the module map in that file’s **Test suite** section.
127
+ As of **v1.4.2**, `make test` runs **450** pytest cases with **≥80%** line coverage on `src/logseq_matryca_parser` (currently ~**91%**). New contributors should mirror patterns in [`docs/GOOD_FIRST_ISSUES.md`](docs/GOOD_FIRST_ISSUES.md) and the module map in that file’s **Test suite** section.
128
128
 
129
129
  Or run each step individually:
130
130
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: logseq-matryca-parser
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: The Logos Protocol: Deterministic Logseq AST parsing for Matryca.ai.
5
5
  Project-URL: Homepage, https://github.com/MarcoPorcellato/logseq-matryca-parser
6
6
  Project-URL: Repository, https://github.com/MarcoPorcellato/logseq-matryca-parser
@@ -53,7 +53,7 @@ Description-Content-Type: text/markdown
53
53
  [![Status: Stable](https://img.shields.io/badge/Status-Stable-22c55e.svg?style=flat-square)](#)
54
54
  ![Origin: Matryca.ai](https://img.shields.io/badge/Origin-Matryca.ai-gold?style=for-the-badge)
55
55
 
56
- **v1.4.1** — Test-hardening patch: **378 tests** (+107), community coverage for parser helpers, CLI agents, FORGE visitors, and wave-2 good-first issues ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)) — no production API changes (see [CHANGELOG](CHANGELOG.md)).
56
+ **v1.4.2** — Bugfix patch: agent-write splice safety, SYNAPSE cyclic embed truncation, resilient X-Ray state reload ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). **450 tests** (wave 1 + wave 2 + regression suite). See [CHANGELOG](CHANGELOG.md).
57
57
 
58
58
  > *Turning a forest of local plain-text files into a unified semantic powerhouse.*
59
59
 
@@ -147,6 +147,18 @@ Logseq Matryca Parser is a deterministic **Stack-Machine engine** that acts as t
147
147
 
148
148
  ---
149
149
 
150
+ ## ⚡ Release highlights (v1.4.2)
151
+
152
+ Patch release — agent-write and SYNAPSE correctness fixes. **No intentional breaking changes** to public APIs.
153
+
154
+ | Area | Change |
155
+ | :--- | :--- |
156
+ | **agent-write** | Headless splice normalizes files missing a final newline; corrupt `.matryca_xray_state.json` yields a controlled CLI exit ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). |
157
+ | **SYNAPSE RAG** | Cyclic `{{embed [[Page]]}}` chains truncate at the re-entrant edge without duplicating parent literal text ([#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65)). |
158
+ | **Test suite** | **450** pytest cases (**+72** vs v1.4.1): wave 2 community coverage ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58)) plus regression tests for the three fixes. |
159
+
160
+ ---
161
+
150
162
  ## ⚡ Release highlights (v1.4.1)
151
163
 
152
164
  Patch release — contributor test coverage and onboarding refresh. **No intentional changes** to parser, graph, or CLI runtime behavior.
@@ -373,7 +385,7 @@ Marker syntax (`[#A]`, `SCHEDULED: <...>`, `DEADLINE: <...>`) is stripped from `
373
385
  ## 🛠️ Quickstart
374
386
 
375
387
  ```bash
376
- # Install from PyPI (latest: v1.4.1)
388
+ # Install from PyPI (latest: v1.4.2)
377
389
  uv pip install logseq-matryca-parser
378
390
 
379
391
  # Optional: filesystem watcher for live incremental graph updates
@@ -12,7 +12,7 @@
12
12
  [![Status: Stable](https://img.shields.io/badge/Status-Stable-22c55e.svg?style=flat-square)](#)
13
13
  ![Origin: Matryca.ai](https://img.shields.io/badge/Origin-Matryca.ai-gold?style=for-the-badge)
14
14
 
15
- **v1.4.1** — Test-hardening patch: **378 tests** (+107), community coverage for parser helpers, CLI agents, FORGE visitors, and wave-2 good-first issues ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)) — no production API changes (see [CHANGELOG](CHANGELOG.md)).
15
+ **v1.4.2** — Bugfix patch: agent-write splice safety, SYNAPSE cyclic embed truncation, resilient X-Ray state reload ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). **450 tests** (wave 1 + wave 2 + regression suite). See [CHANGELOG](CHANGELOG.md).
16
16
 
17
17
  > *Turning a forest of local plain-text files into a unified semantic powerhouse.*
18
18
 
@@ -106,6 +106,18 @@ Logseq Matryca Parser is a deterministic **Stack-Machine engine** that acts as t
106
106
 
107
107
  ---
108
108
 
109
+ ## ⚡ Release highlights (v1.4.2)
110
+
111
+ Patch release — agent-write and SYNAPSE correctness fixes. **No intentional breaking changes** to public APIs.
112
+
113
+ | Area | Change |
114
+ | :--- | :--- |
115
+ | **agent-write** | Headless splice normalizes files missing a final newline; corrupt `.matryca_xray_state.json` yields a controlled CLI exit ([#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72), [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60)). |
116
+ | **SYNAPSE RAG** | Cyclic `{{embed [[Page]]}}` chains truncate at the re-entrant edge without duplicating parent literal text ([#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65)). |
117
+ | **Test suite** | **450** pytest cases (**+72** vs v1.4.1): wave 2 community coverage ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58)) plus regression tests for the three fixes. |
118
+
119
+ ---
120
+
109
121
  ## ⚡ Release highlights (v1.4.1)
110
122
 
111
123
  Patch release — contributor test coverage and onboarding refresh. **No intentional changes** to parser, graph, or CLI runtime behavior.
@@ -332,7 +344,7 @@ Marker syntax (`[#A]`, `SCHEDULED: <...>`, `DEADLINE: <...>`) is stripped from `
332
344
  ## 🛠️ Quickstart
333
345
 
334
346
  ```bash
335
- # Install from PyPI (latest: v1.4.1)
347
+ # Install from PyPI (latest: v1.4.2)
336
348
  uv pip install logseq-matryca-parser
337
349
 
338
350
  # Optional: filesystem watcher for live incremental graph updates
@@ -6,8 +6,8 @@ Security fixes are provided **only for the latest released version** on [PyPI](h
6
6
 
7
7
  | Version | Supported |
8
8
  | ------- | --------- |
9
- | **1.4.1** (latest) | Yes |
10
- | 1.4.0 and older | No |
9
+ | **1.4.2** (latest) | Yes |
10
+ | 1.4.1 and older | No |
11
11
 
12
12
  We recommend always running the current release and upgrading promptly when a security advisory is published.
13
13
 
@@ -270,7 +270,7 @@ Beyond flat `Document` emission, **`to_context_enriched_chunks`** targets **vect
270
270
 
271
271
  1. **Breadcrumbs.** [`_build_breadcrumbs`](../src/logseq_matryca_parser/synapse.py) walks the owning `LogseqPage` and the node’s UUID `path` so the chunk’s visible text carries **human-readable lineage** (page title + ancestor outline), not just an opaque `parent_id`.
272
272
 
273
- 2. **Recursive macro / embed expansion.** [`_expand_macros_and_embeds`](../src/logseq_matryca_parser/synapse.py) operates on **`node.content`** (not `clean_text`) so tokens hidden from embeddings—such as `((uuid))` inside `{{embed ((uuid))}}`—remain visible to the scanner. It expands **`{{embed ((uuid))}}`** by inlining the target block’s content (with **per-UUID cycle detection**) and **`{{embed [[Page]]}}`** by inlining page bodies via **`LogseqGraph.get_page`** (case-insensitive, with **per-title cycle detection**). Unresolved embed targets yield **empty replacement** instead of hanging the export pipeline (v1.4.0).
273
+ 2. **Recursive macro / embed expansion.** [`_expand_macros_and_embeds`](../src/logseq_matryca_parser/synapse.py) operates on **`node.content`** (not `clean_text`) so tokens hidden from embeddings—such as `((uuid))` inside `{{embed ((uuid))}}`—remain visible to the scanner. It expands **`{{embed ((uuid))}}`** by inlining the target block’s content (with **per-UUID cycle detection**) and **`{{embed [[Page]]}}`** by inlining page bodies via **`LogseqGraph.get_page`** (case-insensitive, with **per-title embed-chain detection** — the host page title seeds an immutable chain so inter-page cycles truncate at the re-entrant edge instead of re-inlining parent literals). Unresolved embed targets yield **empty replacement** instead of hanging the export pipeline (v1.4.0).
274
274
 
275
275
  3. **Org-mode-style property inheritance.** Metadata includes **`effective_properties`**: the merge produced by [`LogseqGraph.get_effective_properties`](../src/logseq_matryca_parser/graph.py) — **page frontmatter first**, then each ancestor on `node.path` **top-down**, with deeper `LogseqNode.properties` **overriding** shallower keys. Downstream filters can therefore key off inherited `type::`, `status::`, etc., without re-walking the outline at query time.
276
276
 
@@ -288,7 +288,7 @@ In the **LLM OS** metaphor, **LOGOS** is the **read path** into the hierarchical
288
288
 
289
289
  1. **Weekly append sandbox (`logseq_agent_write`).** A **deterministic**, **configuration-aware** channel that **dynamically reads `config.edn`** (for example **`:journal/page-title-format`**) so filenames and titles align with the vault’s own conventions. Writes use **`open(..., mode="a")`** **append-only** I/O — agents **append** new block material **after** existing bytes; they do **not** rewrite, merge, or re-indent prior content. Surfaced through the **`append`** command in **KINETIC**.
290
290
 
291
- 2. **Headless Markdown splicer (`append_child_to_node`).** For **in-place graph mutation** under an existing parent block, the engine resolves `target_uuid` via `LogseqGraph.get_node_by_uuid`, walks to the **deepest last descendant** to obtain a **1-based `line_end` insertion index**, and computes child indentation as **`(target_node.indent_level + 1) × graph.tab_size`** spaces before the `- {content}` bullet prefix. The raw file is split into lines, the new row is inserted at that index, and the result is flushed through a **same-directory `tempfile.mkstemp` + `os.replace`** — an atomic swap that avoids torn reads during concurrent tooling. **KINETIC** exposes this as **`matryca-parse agent-write`**, resolving parent blocks by **`--alias`** (from the X-Ray state file) or **`--target-uuid`**.
291
+ 2. **Headless Markdown splicer (`append_child_to_node`).** For **in-place graph mutation** under an existing parent block, the engine resolves `target_uuid` via `LogseqGraph.get_node_by_uuid`, walks to the **deepest last descendant** to obtain a **1-based `line_end` insertion index**, and computes child indentation as **`(target_node.indent_level + 1) × graph.tab_size`** spaces before the `- {content}` bullet prefix. The raw file is split into lines (normalizing a missing final newline first so the last logical row is not concatenated with the splice), the new row is inserted at that index, and the result is flushed through a **same-directory `tempfile.mkstemp` + `os.replace`** — an atomic swap that avoids torn reads during concurrent tooling. **KINETIC** exposes this as **`matryca-parse agent-write`**, resolving parent blocks by **`--alias`** (from the X-Ray state file) or **`--target-uuid`**.
292
292
 
293
293
  Both paths keep **existing topology intact** relative to their contract: append-only journaling never truncates prior bytes; the splicer only inserts one new child line at an AST-derived coordinate so a subsequent **LOGOS** parse remains deterministic.
294
294
 
@@ -374,7 +374,7 @@ Human-facing RAG (SYNAPSE enriched chunks, breadcrumbs, inherited properties) op
374
374
 
375
375
  #### Stateful session registry (`.matryca_xray_state.json`)
376
376
 
377
- X-Ray is designed for **stateless LLM toolchains**: each `agent-read` invocation is a fresh process, yet agents must still **write back** to blocks they only saw as `[n]` tokens. After **`generate_aliases`**, **KINETIC** persists the alias map to **`<graph_root>/.matryca_xray_state.json`** via **`SessionAliasRegistry.save_to_disk`**. A later **`matryca-parse agent-write --alias N`** loads that JSON with **`load_from_disk`**, resolves `N → uuid`, and hands off to **`append_child_to_node`**. The read/write pair therefore composes as **two independent CLI exits** without stuffing UUIDs into the model context — the filesystem holds session continuity.
377
+ X-Ray is designed for **stateless LLM toolchains**: each `agent-read` invocation is a fresh process, yet agents must still **write back** to blocks they only saw as `[n]` tokens. After **`generate_aliases`**, **KINETIC** persists the alias map to **`<graph_root>/.matryca_xray_state.json`** via **`SessionAliasRegistry.save_to_disk`**. A later **`matryca-parse agent-write --alias N`** loads that JSON with **`load_from_disk`**, resolves `N → uuid`, and hands off to **`append_child_to_node`**. Malformed or empty state files yield a controlled CLI exit (empty registry for whitespace-only files; **`SessionAliasRegistryError`** for invalid JSON) rather than an uncaught traceback. The read/write pair therefore composes as **two independent CLI exits** without stuffing UUIDs into the model context — the filesystem holds session continuity.
378
378
 
379
379
  #### Session alias mechanics (`SessionAliasRegistry`)
380
380
 
@@ -557,11 +557,11 @@ Recursive and character-budget chunkers assume **approximately flat prose**. Log
557
557
  | :--- | :--- |
558
558
  | [`logseq_ast_primer.md`](logseq_ast_primer.md) | Before touching parser or serialization behavior |
559
559
  | [`COOKBOOK.md`](COOKBOOK.md) | Integration examples (Synapse, `LogseqGraph`, watcher) |
560
- | [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | Picking a first PR ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)); wave 1 tests landed in **v1.4.1** |
560
+ | [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | Picking a first PR ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52)); wave 1 tests landed in **v1.4.1**, wave 2 + bugfix regressions in **v1.4.2** |
561
561
  | [`README.md`](README.md) | Project overview and quickstart |
562
- | [`../CONTRIBUTING.md`](../CONTRIBUTING.md) | `uv` setup, `make all` (**378** pytest, ~**90%** coverage), PR checklist |
562
+ | [`../CONTRIBUTING.md`](../CONTRIBUTING.md) | `uv` setup, `make all` (**450** pytest, ~**91%** coverage), PR checklist |
563
563
  | [`design-docs/README.md`](design-docs/README.md) | Warning before using historical DDD blueprints |
564
564
 
565
- ### Quality gate (v1.4.1)
565
+ ### Quality gate (v1.4.2)
566
566
 
567
- Local and CI parity: `uv sync --all-extras` → `make lint` → `make check` → `make test`. The test gate enforces **≥80%** coverage on `src/logseq_matryca_parser` with **378** pytest cases as of **v1.4.1** (community wave 1 via [#42](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/42)). Dedicated modules: `tests/test_exceptions.py`, `tests/test_extract_changelog.py` — see [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) § Test suite.
567
+ Local and CI parity: `uv sync --all-extras` → `make lint` → `make check` → `make test`. The test gate enforces **≥80%** coverage on `src/logseq_matryca_parser` with **450** pytest cases as of **v1.4.2** (community wave 2 via [#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58) plus agent-write / SYNAPSE regression tests). Dedicated modules: `tests/test_exceptions.py`, `tests/test_extract_changelog.py` — see [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) § Test suite.
@@ -37,6 +37,10 @@ Nonostante la suite verde, l’analisi guidata da analisi statica e da probe run
37
37
 
38
38
  **Wave 8 (2026-06-23):** +6 bug via analisi statica `query(resolve_relative_page_link)`, `query(agent_press)`, probe backlink/namespace/tag case, `_export_json`, `resolve_asset_path` — chiusura mappatura moduli core.
39
39
 
40
+ **Wave 9–10 (2026-06-29):** issue GitHub [#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59)–[#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71) — LENS ghost wikilinks, X-Ray state corrupto, SYNAPSE cyclic embed / unresolved semantics, kinetic dead code, watcher DIP, DX inglese, OCP embed refactor. Vedi `CHANGELOG.md` [Unreleased].
41
+
42
+ **Wave 11 (2026-06-29):** [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) — `append_child_to_node` corrompe il Markdown quando l'ultima riga del file sorgente **non** termina con `\n` (splice sulla stessa riga → outline corrotto dopo `agent-write`). Probe: `impact(append_child_to_node)` → CLI `agent_write`. Paired test issue [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73).
43
+
40
44
  ---
41
45
 
42
46
  ## 2. Metodologia (Clean Architecture lens)
@@ -1,6 +1,6 @@
1
1
  # CodeQL code scanning
2
2
 
3
- **Logseq Matryca Parser** (v1.4.1+) uses **GitHub CodeQL default setup** for static analysis (SAST) on Python.
3
+ **Logseq Matryca Parser** (v1.4.2+) uses **GitHub CodeQL default setup** for static analysis (SAST) on Python.
4
4
 
5
5
  ## Why there is no `codeql.yml` workflow
6
6
 
@@ -22,19 +22,23 @@ Ideal first PR: no production code changes, copy patterns from nearby tests.
22
22
  | ID | Title | Skills | Issue |
23
23
  | :--- | :--- | :--- | :--- |
24
24
  | GFI-01 | `test(kinetic): add CLI error-path coverage for missing graph and optional deps` | pytest, Typer | [#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19) |
25
- | GFI-02 | `test(kinetic): cover agent-write validation errors` | pytest, CLI | [#20](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/20) |
25
+ | GFI-02 | `test(kinetic): cover agent-write validation errors` | pytest, CLI | [#20](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/20) ✅ |
26
26
  | GFI-03 | `test: add dedicated tests for exception hierarchy` | pytest | [#21](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/21) ✅ |
27
27
  | GFI-04 | `test(logseq_paths): cover empty title and fallback graph-root derivation` | pytest | [#22](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/22) ✅ |
28
28
  | GFI-05 | `test: add unit tests for extract_changelog release helper` | pytest | [#23](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/23) ✅ |
29
29
  | GFI-06 | `test(agent): add CLI test for agent-read --query filter` | pytest, CLI | [#24](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/24) ✅ |
30
- | GFI-17 | `test(logseq_markdown): unit tests for detect_tab_size_from_markdown` | pytest | [#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43) |
31
- | GFI-18 | `test(synapse): table-driven tests for _strip_markdown_for_embedding` | pytest | [#44](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/44) |
32
- | GFI-19 | `test(graph): unit tests for _normalize_relative_link_target helper` | pytest | [#45](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/45) |
33
- | GFI-20 | `test(extract_changelog): cover main() CLI exit codes and stdout` | pytest | [#47](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/47) |
34
- | GFI-21 | `test(agent_writer): cover LogseqConfigReader format_timestamp and config fallback` | pytest, CLI | [#48](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/48) |
35
- | GFI-22 | `test(lens): classify journal and project nodes in GraphVisualizer` | pytest | [#49](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/49) |
36
- | GFI-23 | `test(graph): unit tests for backlink alias token helpers` | pytest | [#50](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/50) |
37
- | GFI-24 | `test(synapse): direct build_synapse_metadata schema coverage` | pytest | [#51](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/51) |
30
+ | GFI-17 | `test(logseq_markdown): unit tests for detect_tab_size_from_markdown` | pytest | [#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43) ✅ |
31
+ | GFI-18 | `test(synapse): table-driven tests for _strip_markdown_for_embedding` | pytest | [#44](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/44) ✅ |
32
+ | GFI-19 | `test(graph): unit tests for _normalize_relative_link_target helper` | pytest | [#45](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/45) ✅ |
33
+ | GFI-20 | `test(extract_changelog): cover main() CLI exit codes and stdout` | pytest | [#47](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/47) ✅ |
34
+ | GFI-21 | `test(agent_writer): cover LogseqConfigReader format_timestamp and config fallback` | pytest, CLI | [#48](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/48) ✅ |
35
+ | GFI-22 | `test(lens): classify journal and project nodes in GraphVisualizer` | pytest | [#49](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/49) ✅ |
36
+ | GFI-23 | `test(graph): unit tests for backlink alias token helpers` | pytest | [#50](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/50) ✅ |
37
+ | GFI-24 | `test(synapse): direct build_synapse_metadata schema coverage` | pytest | [#51](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/51) ✅ |
38
+ | GFI-27 | `test(lens): regression test for unresolved wikilink ghost nodes` | pytest | [#62](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/62) |
39
+ | GFI-28 | `test(agent_press): cover malformed SessionAliasRegistry JSON on load` | pytest, CLI | [#63](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/63) |
40
+ | GFI-31 | `test(synapse): table-driven embed expansion edge cases` | pytest | [#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71) |
41
+ | GFI-34 | `test(agent_writer): append_child without trailing source newline` | pytest, CLI | [#73](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/73) |
38
42
 
39
43
  ---
40
44
 
@@ -57,8 +61,12 @@ Ideal first PR: no production code changes, copy patterns from nearby tests.
57
61
  | GFI-12 | `test(forge): add direct ObsidianForgeVisitor visitor tests` | pytest, FORGE | [#30](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/30) ✅ |
58
62
  | GFI-13 | `test(parser): table-driven tests for clean_node_content helper` | pytest | [#31](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/31) ✅ |
59
63
  | GFI-14 | `test(parser): unit tests for normalize_logseq_timestamp edge inputs` | pytest | [#32](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/32) ✅ |
60
- | GFI-25 | `test(forge): direct MarkdownForgeVisitor property and id filtering` | pytest, FORGE | [#46](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/46) |
61
- | GFI-26 | `test(forge): direct JSONForgeVisitor nested stack behavior` | pytest, FORGE | [#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52) |
64
+ | GFI-25 | `test(forge): direct MarkdownForgeVisitor property and id filtering` | pytest, FORGE | [#46](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/46) ✅ |
65
+ | GFI-26 | `test(forge): direct JSONForgeVisitor nested stack behavior` | pytest, FORGE | [#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52) ✅ |
66
+ | GFI-29 | `fix(lens): skip ghost page nodes for unresolved wikilinks` | pytest, LENS | [#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59) |
67
+ | GFI-30 | `fix(agent): handle corrupt X-Ray state files without crashing agent-write` | pytest, CLI | [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60) |
68
+ | GFI-32 | `chore(synapse): replace Italian ImportError strings with English DX messages` | docs, SYNAPSE | [#69](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/69) |
69
+ | GFI-35 | `fix(agent_writer): append_child corrupts files missing trailing newline` | pytest, CLI | [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) |
62
70
 
63
71
  ---
64
72
 
@@ -68,24 +76,29 @@ Ideal first PR: no production code changes, copy patterns from nearby tests.
68
76
  | :--- | :--- | :--- | :--- |
69
77
  | GFI-15 | `feat(forge): add minimal CSV exporter` | Follow existing JSON visitor pattern in `forge.py` | [#33](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/33) |
70
78
  | GFI-16 | `docs: RFC Ollama one-click local RAG` | Design-only RFC; implementation in follow-up issues | [#34](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/34) *(draft at [`rfc/OLLAMA_RAG.md`](rfc/OLLAMA_RAG.md))* |
79
+ | GFI-33 | `refactor(synapse): extract embed-expansion strategy (OCP)` | Mentor — strategy pattern | [#70](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/70) |
71
80
 
72
81
  ---
73
82
 
74
- ## Recommended starter pack (wave 2)
83
+ ## Recommended starter pack (wave 3)
75
84
 
76
- Best first picks from the new batch — pure helpers or clear fixtures:
85
+ From local code study (waves 9–10) — tests and small fixes with clear repros:
77
86
 
78
87
  | Priority | ID | Why |
79
88
  | :---: | :--- | :--- |
80
- | 1 | GFI-19 ([#45](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/45)) | Pure function, parametrized table |
81
- | 2 | GFI-18 ([#44](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/44)) | Pure regex helper, high clarity |
82
- | 3 | GFI-17 ([#43](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/43)) | Small markdown utility, no graph I/O |
83
- | 4 | GFI-25 ([#46](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/46)) | Mirrors merged Obsidian visitor tests |
84
- | 5 | GFI-20 ([#47](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/47)) | Extends existing `test_extract_changelog.py` |
89
+ | 1 | GFI-31 ([#71](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/71)) | SYNAPSE embed table tests — pairs with #65/#66 |
90
+ | 2 | GFI-28 ([#63](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/63)) | JSON fixtures for agent session state |
91
+ | 3 | GFI-27 ([#62](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/62)) | Single-file LENS regression |
92
+ | 4 | GFI-32 ([#69](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/69)) | Small English DX fix in `synapse.py` |
93
+ | 5 | GFI-01 ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)) | CLI error-path coverage still open |
94
+
95
+ **Bugs (maintainer / mentor):** [#65](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/65) cyclic embed duplication, [#59](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/59) LENS ghosts, [#60](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/60) corrupt X-Ray state, [#72](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/72) agent-write newline splice.
96
+
97
+ Wave 2 (GFI-17–GFI-26, GFI-02) is **complete** ([#58](https://github.com/MarcoPorcellato/logseq-matryca-parser/pull/58)).
85
98
 
86
99
  ---
87
100
 
88
- ## Test suite (v1.4.1)
101
+ ## Test suite (v1.4.2+)
89
102
 
90
103
  | Module | Test file |
91
104
  | :--- | :--- |
@@ -99,7 +112,7 @@ Best first picks from the new batch — pure helpers or clear fixtures:
99
112
  | Release helpers | `tests/test_extract_changelog.py`, `tests/test_package_version.py` |
100
113
  | Exceptions | `tests/test_exceptions.py` |
101
114
 
102
- Run the full gate: `make all` (**378** pytest cases as of **v1.4.1**).
115
+ Run the full gate: `make all` (**450** pytest cases after wave 2 + bugfix regressions).
103
116
 
104
117
  ## Out of scope for a first PR
105
118
 
@@ -8,7 +8,7 @@ Use this page to find **active** documentation. Files under [`design-docs/`](des
8
8
  | :--- | :--- | :--- |
9
9
  | [`ARCHITECTURE.md`](ARCHITECTURE.md) | Contributors, integrators | LOGOS, SYNAPSE, `LogseqGraph`, agents, data flow |
10
10
  | [`logseq_ast_primer.md`](logseq_ast_primer.md) | Parser contributors | Logseq Spatial Markdown domain rules |
11
- | [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | New contributors | Curated starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52); wave 1 landed in **v1.4.1**) |
11
+ | [`GOOD_FIRST_ISSUES.md`](GOOD_FIRST_ISSUES.md) | New contributors | Curated starter tasks ([#19](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/19)–[#52](https://github.com/MarcoPorcellato/logseq-matryca-parser/issues/52); wave 1 in **v1.4.1**, wave 2 + bugfix tests in **v1.4.2**) |
12
12
  | [`COOKBOOK.md`](COOKBOOK.md) | Integrators | Copy-paste recipes (Synapse, graph query, watcher, agents, contributor test patterns) |
13
13
  | [`RELEASE_PROCESS.md`](RELEASE_PROCESS.md) | Maintainers | Semver, tag, and PyPI publish checklist |
14
14
  | [`CODEQL.md`](CODEQL.md) | Maintainers | CodeQL default setup notes |
@@ -0,0 +1,13 @@
1
+ > ⚠️ **Notice:** For the active documentation index, please refer to the main [README.md](../../README.md).
2
+
3
+ # Historical design documents
4
+
5
+ For contributors: These files are Document-Driven Development blueprints from the initial Logos Protocol scaffolding. They explain design intent and mldoc parity research — they are not the live implementation contract.
6
+
7
+ For current architecture and APIs, use:
8
+
9
+ * [ARCHITECTURE.md](../ARCHITECTURE.md) — active system design
10
+ * [logseq_ast_primer.md](../logseq_ast_primer.md) — Logseq Spatial Markdown domain rules
11
+ * [README.md](../../README.md) — documentation index
12
+
13
+ Each file in this folder includes the same historical banner at the top. When implementing parser behavior, prefer tests in tests/test_logos_parser.py and OFFICIAL_MLDOC_SPECS.md as reference, then confirm against the running code in src/logseq_matryca_parser/.
@@ -0,0 +1,9 @@
1
+ {
2
+ "schema_version": 1,
3
+ "partition": "calendar_quarter",
4
+ "quarters": [
5
+ "2026-Q2"
6
+ ],
7
+ "legacy_migrated": true,
8
+ "updated_at": "2026-06-29"
9
+ }