<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pure/store, branch master</title>
<subtitle>Verified execution runtime unifying state, persistence, and replication.
</subtitle>
<id>http://git.yeowoo.org/pure/atom?h=master</id>
<link rel='self' href='http://git.yeowoo.org/pure/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/'/>
<updated>2026-10-01T17:19:14Z</updated>
<entry>
<title>Build with clang, and the core and store on macOS, again</title>
<updated>2026-10-01T17:19:14Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-10-01T17:19:14Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=8450156e98ee49484f3fadad791d5684f9576f8b'/>
<id>urn:sha1:8450156e98ee49484f3fadad791d5684f9576f8b</id>
<content type='text'>
Apple clang 21 (an M3) and clang 19 refused what gcc let pass (research
029):
- PURE_FIELD_REST was an enum of UINT32_MAX, past an int (C17): a macro.
- a store's publish copied an entry rebuild left unset when the record
  was not found (the copy was never used): copied when it was made.
- the log's image writer kept a count only Linux's sync_file_range uses.
- ",{" + (row == from) read as adding an int to a string: said plainly.
- the tests: mkdtemp, hidden by _POSIX_C_SOURCE on macOS, needs
  _DARWIN_C_SOURCE; a string split so that \x80 and a stay apart is
  bracketed; a count left over and a malloc measure only glibc has.
The core's and the store's tests pass on the Mac.
</content>
</entry>
<entry>
<title>Give each store its own writer's turn and commit group (017)</title>
<updated>2026-10-01T01:01:42Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-10-01T01:01:42Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=a09ef095623c3b3f951edff2eb0c013708159f70'/>
<id>urn:sha1:a09ef095623c3b3f951edff2eb0c013708159f70</id>
<content type='text'>
Threads of one process took turns as the tree store's writer for every
store at once, through one mutex held for a whole session, syncs
included, and commits grouped in one queue whose leader published each
store's requests in turn. One store's slow sync held every other
store's commit, so apps of one host would wait on each other's device.

The turns and the group are now a store's, found by its directory's
identity (two paths to one directory still share them, since the file
lock arbitrates only between processes). The temporary files' sequence,
which that mutex guarded, is atomic. A test holds a commit in its sync
and commits to another store meanwhile, while a second commit to the
held store, by another path, waits; before this change it hangs.
</content>
</entry>
<entry>
<title>Wait on the monotonic clock everywhere a deadline is waited for</title>
<updated>2026-09-30T02:17:59Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-30T02:17:59Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=385754c2d00ba3f4c74a22f55d4756e101f215b1'/>
<id>urn:sha1:385754c2d00ba3f4c74a22f55d4756e101f215b1</id>
<content type='text'>
Review 004's timer fix (103) counted the deadlines on the monotonic
clock, but the owner still slept until a wall-clock time: with the
clock set back an hour a node's timers would stop for that hour. So
would a wire's pause between tries, and a lone commit after a group
would wait an hour for the others to join it. The test's LD_PRELOAD
moves only what the process reads, so there each wait ended at once
instead, and the timers went on ticking while the owner spun a core.

core/wait.h makes conditions that wait on the monotonic clock
(pthread_condattr_setclock; macOS keeps the wall clock) and deadlines
on it. The owner's waits, the wire's pauses and the group commit's
gathering use them.

clock-back.so can now move the clock forward too (CLOCK_SHIFT_S), and
check.py server_clocks moves it an hour each way under a node with a
timer and a wire to a port no one listens on, and under a document
server whose three threads commit together, then one alone. Before:
back, 159 % CPU and 50,886 tries in 1.2 s; forward, 1 tick, 1 try, and
a lone commit that never ended. After: 59 ticks, 0 % CPU, 4 tries and a
lone commit of 2.6 ms, both ways.
</content>
</entry>
<entry>
<title>Write list images a chunk at a time, and keep the log within the lists' size</title>
<updated>2026-09-28T10:12:37Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T10:12:37Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=3c8cc4e887c861c392223a54fd5be2b49db29874'/>
<id>urn:sha1:3c8cc4e887c861c392223a54fd5be2b49db29874</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Keep lists as images and a log of their changes, checkpointed off the owner</title>
<updated>2026-09-28T09:44:19Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T09:44:19Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=4c4c73c30a0524cf893d813fda215199150a6934'/>
<id>urn:sha1:4c4c73c30a0524cf893d813fda215199150a6934</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Log an app's saves in reused segments and write list images whole beside the store</title>
<updated>2026-09-28T09:43:45Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T09:43:45Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=cff25dd387376311b09bab3a58377fecbfe818e4'/>
<id>urn:sha1:cff25dd387376311b09bab3a58377fecbfe818e4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Share the store's digest between its files</title>
<updated>2026-09-28T09:43:06Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-28T09:43:06Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=923576863660d995476dffc7b285ee20e9707f27'/>
<id>urn:sha1:923576863660d995476dffc7b285ee20e9707f27</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Let a runtime-owned state grow past the document limit</title>
<updated>2026-09-27T22:38:54Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-27T22:38:54Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=ad27f1f5a4fc7a53d116feb9b1e2352239147fe0'/>
<id>urn:sha1:ad27f1f5a4fc7a53d116feb9b1e2352239147fe0</id>
<content type='text'>
A list's stored form is one value in the tree store, so the limit on a
document (1.38 MiB, what a host carries whole as an HTTP body) capped a
table at about 51,000 rows of 28 bytes. A value the runtime owns, a state
(a key starting with '.') or a draft without a key, may now grow to 1 GiB;
documents keep their limit. The store's format is unchanged: its trees
already reach far past either.
</content>
</entry>
<entry>
<title>Give a compacted file the zeros of its whole cycle (085)</title>
<updated>2026-09-27T13:46:31Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-27T13:46:31Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=aea3f640ea59d91f7ca9b193acfcc3e26740318b'/>
<id>urn:sha1:aea3f640ea59d91f7ca9b193acfcc3e26740318b</id>
<content type='text'>
Commits grew the tree store's tail 256 KiB at a time, each growth a sync
that also committed the ext4 journal for the new size and blocks. A file
installed by compaction now carries written zeros up to where the next
compaction will come (4 x live + slack, plus a commit's margin), capped at
the size of the file it replaces, so a store never takes more space than
before and shrinks when its live data does. The cycle's commits then only
overwrite blocks the file has.

Store commits: 317.5 -&gt; 385.5 a second, ext4 journal commits 109 -&gt; 45 for
4,000 commits; durable app posts +5.3%, their p99 the same within this SD
card's noise. The new cycles test keeps sizes still between compactions
once the live data is whole, and shows the file shrinking with it.

</content>
</entry>
<entry>
<title>Lay Pure out as a core with the parts selected around it</title>
<updated>2026-09-27T12:14:38Z</updated>
<author>
<name>eunhhu</name>
<email>necpition205@gmail.com</email>
</author>
<published>2026-09-27T12:14:38Z</published>
<link rel='alternate' type='text/html' href='http://git.yeowoo.org/pure/commit/?id=37d3a1e152707d2da587440c4cea8601b9ef0fd2'/>
<id>urn:sha1:37d3a1e152707d2da587440c4cea8601b9ef0fd2</id>
<content type='text'>
The app model, the tree store and the HTTP host lived in
prototypes/connections among the earlier document runtime, the store was
known only by its format's name, and Vega compiled six Pure sources by path.
Now, as the README's principle has it:

  core/   runtime, flow and the app model (module*.c), with what the core
          asks of storage (state.h, store.h)
  store/  the tree store (PURETRE3, PUREREC1)
  serve/  pure-serve: HTTP host, outbound delivery, JSON in place
  cli/    pure-run, pure-edit-module

A top-level make builds libpure.a (app model and store, for hosts to link)
and the hosts; make check runs the store's and the app model's tests. The
earlier runtime still builds from prototypes/connections against core/ and
store/ (check, check-tree and check-core pass). Design 009 records the rule:
parts by role behind libraries; git repositories split by coupling, so the
store stays here while its contract moves with the core, and Vega stays apart.

</content>
</entry>
</feed>
