<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pearl, branch main</title>
<subtitle>Pearl Edits and Reflects Linear — manage Linear.app issues as org-mode in Emacs
</subtitle>
<id>https://git.cjennings.net/pearl/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/pearl/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/'/>
<updated>2026-05-24T20:34:17+00:00</updated>
<entry>
<title>test: add an end-to-end acceptance flow</title>
<updated>2026-05-24T20:34:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:34:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=e48e9b75160fae5641ac5818e7e381cbcfdb8a5e'/>
<id>urn:sha1:e48e9b75160fae5641ac5818e7e381cbcfdb8a5e</id>
<content type='text'>
Stubs the single GraphQL chokepoint and drives the full integration path against a temp active file: run a saved query, render with the source header, read the source back, refresh the same source with an in-place merge, switch sources while the buffer is dirty (the edit is preserved, not clobbered), then from inside a rendered issue subtree sync an edited description, add a comment, and set priority. Everything above the wire — filter compilation, normalization, sort, render, header round-trip, merge, the conflict gate, comment append, and the field setter — runs for real, so the query and org-representation layers are exercised together rather than in isolation. 388 tests green (384 unit + 4 integration).
</content>
</entry>
<entry>
<title>test: cover sort and render ordering boundary cases</title>
<updated>2026-05-24T20:28:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:28:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=9c0dbf985cdc3360b47adc24f50964f8cf04b2cc'/>
<id>urn:sha1:9c0dbf985cdc3360b47adc24f50964f8cf04b2cc</id>
<content type='text'>
Added ERT tests for the deterministic-ordering guarantees: title sort folds nil and empty titles to the empty key (ordered first ascending); a nil (none) priority sorts last ascending and first descending; equal keys keep input order ascending and reverse it descending (Emacs sort is stable, then nreverse); and the render boundary sorts by priority after normalization even when a node omits the field. 384 tests green.
</content>
</entry>
<entry>
<title>test: cover comment insertion and extraction boundary cases</title>
<updated>2026-05-24T20:24:12+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:24:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=11109b45094eaecc1dc87a2e99afab4040732c8f'/>
<id>urn:sha1:11109b45094eaecc1dc87a2e99afab4040732c8f</id>
<content type='text'>
Added ERT tests: append targets the current issue's Comments subtree even when a later issue already has its own Comments; add-comment from inside a comment subtree refuses (no issue id at that heading); edit-current-comment refuses a comment missing LINEAR-COMMENT-ID with no network call; and a comment body containing drawer-looking (:note:) text reads back intact. 380 tests green.
</content>
</entry>
<entry>
<title>test: lock markdown round-trip identity across boundary cases</title>
<updated>2026-05-24T20:19:09+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:19:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=95bd7f4661ec5f43ba2eb7e8545b3cf9287e55c8'/>
<id>urn:sha1:95bd7f4661ec5f43ba2eb7e8545b3cf9287e55c8</id>
<content type='text'>
Added a round-trip test for the markdown boundary cases the coverage audit flagged: multiple links on a line, parens inside a URL, inline code whose contents look like markdown, non-ASCII prose, and unclosed / trailing fenced code. All round-trip to identity, so a fetch with no edit cannot change the remote on push. Two cases (paren-URL and markdown-looking inline code) round-trip safely despite an imperfect intermediate Org form, noted in the test and filed as a display-fidelity follow-up. 376 tests green.
</content>
</entry>
<entry>
<title>test: cover malformed and unknown source headers</title>
<updated>2026-05-24T20:15:55+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:15:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=0a65ae7c57aecbb948a3cf9675564b731efee55d'/>
<id>urn:sha1:0a65ae7c57aecbb948a3cf9675564b731efee55d</id>
<content type='text'>
Added ERT tests for the generated #+LINEAR-SOURCE header: a syntactically malformed source line reads back nil (no reader error) and refresh-current-view surfaces the "no source recorded" user error; a valid-but-unknown :type reaches the "Unknown Linear source type" user error; and a source whose name and filter carry quotes, parens, colons, and non-ASCII round-trips through build-org-content and read-active-source unchanged. 375 tests green.
</content>
</entry>
<entry>
<title>test: cover cache and resolver failure cases</title>
<updated>2026-05-24T20:13:53+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:13:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=6fca176d45b91d281bab36b51260e0ca1a788084'/>
<id>urn:sha1:6fca176d45b91d281bab36b51260e0ca1a788084</id>
<content type='text'>
Added ERT tests that the per-team collection cache and the resolvers fail soft: pearl--team-collection returns nil and caches nothing on a malformed (missing nodes) or nil response, so a retry refetches and a later success populates the cache; pearl--resolve-team-id returns nil rather than erroring when its backing fetch fails; pearl--custom-views likewise does not cache nil and recovers on a later call. Also dropped a stale pearl--cache-issues binding from this file's cache-reset macro — that variable was removed earlier. 371 tests green.
</content>
</entry>
<entry>
<title>test: cover malformed remote page shapes in the query pager</title>
<updated>2026-05-24T20:08:09+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:08:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=2e87942b8bdff716cef7af9ca99fce8ef1588a5c'/>
<id>urn:sha1:2e87942b8bdff716cef7af9ca99fce8ef1588a5c</id>
<content type='text'>
Added ERT tests that the query and pager layer degrades gracefully on bad payloads instead of erroring: a success response missing data.issues yields an empty result; data.customView nil yields a structured result with no Lisp error; a page reporting has-next-page with a nil end-cursor terminates at the max-pages bound rather than looping; and pearl--node-list returns the empty list for non-list or non-vector nodes. 366 tests green.
</content>
</entry>
<entry>
<title>test: assert the dirty-buffer path preserves disk and buffer state</title>
<updated>2026-05-24T20:04:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:04:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=5f72705cf8534543134da907a26069fff97b799c'/>
<id>urn:sha1:5f72705cf8534543134da907a26069fff97b799c</id>
<content type='text'>
Extended the dirty-buffer coverage: with known content saved to disk and an unsaved edit on top, pearl--update-org-from-issues leaves the buffer modified with its edit, leaves the on-disk file at the original saved content (not the render, not the buffer text), and still surfaces the dirty buffer per the UX contract. 362 tests green.
</content>
</entry>
<entry>
<title>test: cover the delete-failure branch keeping the subtree</title>
<updated>2026-05-24T20:02:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:02:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=56d95e96490732b4d88bcd0d8c16708b998be285'/>
<id>urn:sha1:56d95e96490732b4d88bcd0d8c16708b998be285</id>
<content type='text'>
Added an ERT test that pearl-delete-current-issue, when the confirmation is given but pearl--delete-issue-async returns :success nil, leaves the issue subtree and its sibling intact rather than removing local state on a failed remote delete. The command already behaves correctly. 361 tests green.
</content>
</entry>
<entry>
<title>test: cover sync-back push-failure branches at the command level</title>
<updated>2026-05-24T20:01:01+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T20:01:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=1a26149d4d7f16adb1552ba31a2de290a5c86fc4'/>
<id>urn:sha1:1a26149d4d7f16adb1552ba31a2de290a5c86fc4</id>
<content type='text'>
Added ERT tests that the three sync commands leave provenance untouched when the push fails (:success nil): pearl-sync-current-issue keeps LINEAR-DESC-SHA256 and -UPDATED-AT, pearl-sync-current-issue-title keeps LINEAR-TITLE-SHA256, and pearl-edit-current-comment keeps LINEAR-COMMENT-SHA256 — and in each case the edited text stays in the buffer for retry. Each test asserts the push was attempted with the rendered text. The commands already behave correctly; this locks it. 360 tests green.
</content>
</entry>
</feed>
