Repository navigation
v1.3.2
-
Preserve private Just recipes across stacked attributes, recognize literal Make targets
with double-colon rules and inline recipes, and reject duplicate value options before collection. -
Refuse conflicting or duplicate annotated-tag headers before release identity checks.
-
Ignore local Qoder sessions and release build output at repository level for isolated Git audits.
-
Docs: tighten the release-notes claims that a post-release audit could not reproduce from the
published artifacts. The 1.3.1 "Preserve" note is exact only for Markdown:--format jsonand
--format json-compactembedtool.version, so their bytes differ from 1.3.0 by that one string,
while every remaining field — including each real repository'snested_contextpath list —
matched 1.3.0 byte for byte (measured on seven repositories). Two README sentences that described
the document key set and the version renumbering relative to 1.2.0 are restated version-neutrally,
since a reader of 1.3.1 cannot resolve "now" or "below" from the shipped text. -
Fixed: a skipped or absent root source reports the machine code of the condition the collector
observed, taken from that condition itself, instead of a code looked up from the sentence shown in
context. The lookup matched only the exact wording in use, so any reworded or newly added
sentence fell through toskipped_unreadableand--format json/--format json-compactcould
report an unrelated condition as an unreadable file with nothing anywhere indicating the mistake.
The five codes (not_present,skipped_symlink,skipped_not_regular,skipped_encoding,
skipped_unreadable) and the Markdown sentences are unchanged for every repository that collects
today. -
Fixed: a
truncatedsource status is no longer derived by searching the rendered body for the
truncation marker. A source whose own text quotes that marker was reported as truncated; only a
budget that actually shortened the body now claims it. -
Changed: the directory tree lists each directory's own entries before descending into any of its
subdirectories, so a repository's top-level files are no longer displaced by deep content. In any
worktree whose listing includes a subdirectory entry and that subdirectory's own contents, the
lines after that entry appear in a different order than in 1.3.1, which changes the
## Directory Treebody insidecontextand thereforecontext_sha256. The tree's budgets
(12 KiB of listing body, 300 entries, depth 2), the meaning oftruncated, the entry kinds and
every JSON key are unchanged. -
Added: directory enumeration is capped per directory — 512 entries for the tree, 1,024 for the
nestedAGENTS.mdpresence scan — and the retained entries are the alphabetically first names, so
a single huge directory is no longer materialised whole and a capped listing does not depend on
operating-system enumeration order. Each scan keeps its own budget and its own truncation signal.
Capped tree directories are reported by exactly oneListing incomplete:line carrying the total
count, the limit that was applied and up to three example names, and by at most eight
directory_listing_incompletestatusesentries naming individual directories plus one aggregate
entry giving the totals when more were capped than are named individually; a capped directory
beyond the retained examples is counted rather than silently dropped, counting the capped
directories the listing reached: a directory is reached only when its parent offered it inside that
parent's own alphabetical prefix and kept it, so capped siblings displaced by the entry budget are
disclosed through their parent's truncation rather than as separate numbers. Previously each capped directory
produced its own unbounded note outside any budget. Measured on a freshly built repository of
exactly 120 directoriescap000tocap119, each holding the 513 empty filesitem000to
item512, committed withGIT_AUTHOR_DATEandGIT_COMMITTER_DATEboth
2020-01-01T00:00:00+0000and no other entries -- the section is 4,551 bytes on 1.3.1 with no
incompleteness note or status at all, 17,998 bytes on 7562d86 with 120 notes, which is 5,710
bytes past the 12 KiB it documents, and 4,132 bytes here with one note. The listing body is the
same 3,687 bytes on 7562d86 and here, so bounding the note cost no entries, while the section
dropped by 13,866 bytes.tests/test_directory_tree.pymachine-checks the invariants on a
reduced form of this shape -- one note, a bounded status count, a section inside its budget and a
reconciled total -- not these absolute byte counts, which depend on the name widths above.
The note is charged against the 12 KiB listing budget before the body is
cut, so the claim cannot inflate the section; where the note is long it is paid for in listing
bytes, and the marker plustruncatedsay so. The heading and fence lines remain unmetered, as
they were in 1.3.1. Internal counting and deduplication use the raw directory
path and the aggregate carries an explicit identity, because display escaping is not injective: a
directory named`and one named\x60render identically and must stay two facts. A
directory above the nested-scan cap sets the existingscan_truncatedflag and
nested_agents_scan_truncatedstatus. No JSON key set changes, soschema_versionstays 3/4. -
Added: when a directory's own entries no longer fit the tree item budget, its subdirectories and
its non-directories each keep a share of it, so alphabetically-earlier directories cannot crowd
out a rootREADME.mdentirely. The precondition is now stated exactly, and it is three limits
rather than two: the enumeration must have offered the name, the 300-entry budget must still have
a slot, and the 12 KiB listing budget must still have room to render the line. Being offered is
not the same as an uncapped root -- the 512-entry cut drops only the names sorting after its
retained prefix, so aREADME.mdthat sorts early is still listed from a capped root. Any one of
them can drop a name on its own, so the tool promises no specific file; where a
limit bites the listing reports the count, the cap and its retained examples instead of
implying completeness. -
Fixed: a directory tree shortened by its own 12 KiB render budget is now reported in the machine
formats. The renderer kept that fact to itself, socontextcarried the truncation marker while
statusesstayed silent: measured on a repository of 297 root files with 41-character names, 298
entries were collected and passed the 300-entry item budget, the 12 KiB body budget published 292
of them, and 1.3.1 emitted no tree status at all for that cut.truncated/tree/Directory Treeis
now reported for a render-budget cut as well as for a collection cut.contextand
context_sha256are byte-identical to 1.3.1 on that fixture and no JSON key changed; the gap
predates 1.3.1 and is on a path this change touches, so it is fixed here rather than left to
documentation. -
Changed: the shared limits and frozen value types move to
context_loader/model.pyand the safe,
bounded filesystem primitives tocontext_loader/filesystem.py;collect.pykeeps collection
policy,render.pyderives display text from the typed reason, and no output changes from the move
itself.
Package: https://pypi.org/project/context-loader/1.3.2/
Source commit: c705cc45c432b1359d9b740f3f34238766a79960