G-084 increment 2 + achieved flip - parsekey completeness closed:
Cross-member -multiple on a shared-parsekey option group is now a DEFINE-TIME
error unless ALL members belong to one @opts group marked -parsekeymode error
(G-083 mutual exclusivity makes per-member collection well-defined; a single
-multiple member with its own parsekey is unrestricted). This settles the
G-084 cross-member accumulation decision as rejection rather than
accumulate-in-received-order: collection on one storage key is ambiguous
(collect-vs-replace undefined), and rejection eliminates the silent loss
without new collection semantics. The check runs AFTER the G-053
canonicalisation so range forms verdict correctly ({0 1} replace-shape
allowed; a pre-canonicalisation placement would raise a raw non-boolean
error for any range form).
Value -parsekey integrity settled at define time: duplicate value parsekeys
rejected (trailing values consume positionally - the shared slot silently
overwrote), dash-led value parsekeys rejected (they landed in the options
namespace of result/received and aborted parse with an internal error in
the option-shaped validation paths; every option storage key is dash-led,
so this one rule also removes all cross-class collisions).
parse_status/parse_report storage-key attribution: parse_status_build now
resolves a storage key claimed by exactly ONE argument (value -parsekey,
declared option -parsekey, '='-suffixed optset tail) back to that argument,
so argstatus/Source report received with the value-in-effect instead of
default/0. Shared-parsekey groups stay unresolved - the remaining recorded
display gap (engine-level per-member tracking; archived as the goal's open
Follow-on).
undefine/undefine_deflist now return "" (previously the whole internal
cache dict to any caller capturing the value). define -help documents
-parsekey for the first time (rename semantics for options and values,
leader rejection, shared groups and -parsekeymode, last-defined-member
defaults precedence, the -multiple rule, value-key uniqueness/non-dash).
Moduledoc tclcore comment corrected (leader -parsekey settled as rejection,
not pending). Internal sweep: dead values-loop identifiers removed
(val_ident/val_ident_is_parsekey/values-side seen_pks), leader reverse map
removed (VAL_NAMES-driven build), dead parsekey-from--default derivation
removed, stale pre-G-084 comments corrected.
Tests: parsekey_shared_key_multiple_rejected strengthened (message pins,
{0 1}/{0 4} range coverage, the -parsekeymode error escape hatch incl
collection and optionconflict); new parsekey_value_parsekey_integrity,
parsereport_storagekey_attribution, parsestatus_storagekey_attribution;
inc-1 comment damage repaired (duplicated block, eaten G-083 provenance
lines, stale GAP-era comment); 2026-08-08 future-dating normalized to
2026-08-07 in touched files (CHANGELOG 0.59.0/0.60.0 headers corrected
likewise; the underlying commits landed 2026-08-07 AEST).
Goal flip (user-approved): the Goal line's accumulate wording amended to
the settled define-time-rejection design; G-084 flipped achieved 2026-08-07
and archived (detail -> goals/archive/, index -> GOALS-archive.md,
reference sweep applied - G-167 survey note gains achieved markers for
G-053/G-083/G-084; Follow-on recorded: shared-group per-member received
attribution => open). Detail file gains ## Progress (inc 1 + inc 2 + flip
evidence). src/tests/modules/AGENTS.md punk/args index updated to the
settled-pin state.
Project 0.60.0 -> 0.61.0 + CHANGELOG (value -parsekey support and the
define-time integrity rules are user-visible shell behaviour; G-053
precedent). punk::args 0.23.0 -> 0.24.0.
Suites: punk/args 401/0; modules tree 1313 pass / 11 constraint-skipped /
0 fail (zig-built tclsh90s 9.0.5); testbody_lint clean; goals_lint clean;
punkboot version-parsing 81/81; make.tcl projectversion consistency OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com