Skip to content

v1.3.2

Choose a tag to compare

@github-actions github-actions released this 29 Sep 07:29
  • 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 json and
    --format json-compact embed tool.version, so their bytes differ from 1.3.0 by that one string,
    while every remaining field — including each real repository's nested_context path 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 to skipped_unreadable and --format json / --format json-compact could
    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 truncated source 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 Tree body inside context and therefore context_sha256. The tree's budgets
    (12 KiB of listing body, 300 entries, depth 2), the meaning of truncated, 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
    nested AGENTS.md presence 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 one Listing incomplete: line carrying the total
    count, the limit that was applied and up to three example names, and by at most eight
    directory_listing_incomplete statuses entries 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 directories cap000 to cap119, each holding the 513 empty files item000 to
    item512, committed with GIT_AUTHOR_DATE and GIT_COMMITTER_DATE both
    2020-01-01T00:00:00+0000 and 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.py machine-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 plus truncated say 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 \x60 render identically and must stay two facts. A
    directory above the nested-scan cap sets the existing scan_truncated flag and
    nested_agents_scan_truncated status. No JSON key set changes, so schema_version stays 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 root README.md entirely. 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 a README.md that 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, so context carried the truncation marker while
    statuses stayed 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 Tree is
    now reported for a render-budget cut as well as for a collection cut. context and
    context_sha256 are 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.py and the safe,
    bounded filesystem primitives to context_loader/filesystem.py; collect.py keeps collection
    policy, render.py derives 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