1.1.0-release
What's new
commit 212172952fcba2905a255a9e4125075ac80326cc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 19:24:19 2026 +0530
Release 1.1.0: version bump, release notes and the gated release run
- Version 1.0.1 -> 1.1.0 in the TOC, NS.version, the version assertions in
tests/test_setups.lua, and the version examples in module-map and debug.
- README: a 1.1.0 Version History row (drag to attach, the Situations tab,
no duplicate bars where Blizzard won't filter by spell, the CC Root / CC
Snare split, /am redraw and /am profile), de-AI pass run over the row.
- Release run 20261009-191725 at ad636a2: lint 0/0 over 174 files,
2058/2059 tests (0 failed, 1 kit case skipped by design), 11 perf
scenarios, complexity with 0 functions above CCN 15 (max 15), blindFiles 0.
The bundle's ANALYSIS.md is written. On the RESULTS.md watch list,
modules/Anchors_Snap.lua (newly in the 1000-1500 band) is ruled on, every
band disposition is refreshed, and eight entries Accepted at three
consecutive release runs are flagged as owed a fix or a deviation ID.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J2w6FgfFYw93meWZN9Ahn6
commit ad636a250eb9b187b4b5fe31669b39a3fc36e0d1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 9 17:49:18 2026 +0530
SD-FIN-02: sync docs to code (collection sync-docs pass 2026-10-09)
Docs and comment citations reconciled against today's tree: stale counts,
drifted file:line citations, orphan anchors and toolchain gaps, each verified
independently before applying. Comment edits are comment-only. Dead-export
candidates reported, not removed. Green gate run after the edits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J2w6FgfFYw93meWZN9Ahn6
commit 02d8ec25b41e0c5a98d07df9b78ae386ba9410ed
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 22:26:54 2026 +0530
AM-STD: address review — name every load-time template binder and FilterViews in the load order
Review of 429e5e6 found the toc-file-§5 re-read incomplete and the
module-map narrative it widened wrong:
- docs/module-map.md item 5 said the unnamed modules bind nothing at load
beyond core/'s seams, but FilterCompiler binds NS.FilterViews at file
load (a pair the TOC already marks LOAD-BEARING). Item 5 now names
FilterViews before FilterCompiler.
- Container was not the only modules/ file binding NS.CONTAINER_TEMPLATE
(defaults\Profile.lua) at file load: Style, Style_Bars, Style_Icons,
Style_Text (which indexes its .text there), Anchors_Attach and Anchors
do too. Their TOC notes now name it, and module-map item 5 lists all
seven. The commit body of 429e5e6 understated this; this commit is the
correction.
- A new test_loadorder case scans every modules\ file for a file-scope
`local X = NS.CONTAINER_TEMPLATE...` and requires it below
defaults\Profile.lua with a LOAD-BEARING note naming
NS.CONTAINER_TEMPLATE (red first: six binders unnamed). settings/ is
out of its scope: settings\Text.lua binds the template too, and the
Settings section header already states it loads last.
docs/test-cases.md regenerated; Total 2058 equals the README badge.
The #22 relabel (AM-A-05) is still pending with the owner; no GitHub
write was made.
Gate: lua tests/run.lua 2058 passed, 0 failed, 1 skipped; luacheck .
0/0 over 174 files; lizard 0 functions above CCN 15; largest authored
.lua defaults/Categories.lua, 1344 lines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 02d8ec25b41e0c5a98d07df9b78ae386ba9410ed
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 22:26:54 2026 +0530
AM-STD: address review — name every load-time template binder and FilterViews in the load order
Review of 429e5e6 found the toc-file-§5 re-read incomplete and the
module-map narrative it widened wrong:
- docs/module-map.md item 5 said the unnamed modules bind nothing at load
beyond core/'s seams, but FilterCompiler binds NS.FilterViews at file
load (a pair the TOC already marks LOAD-BEARING). Item 5 now names
FilterViews before FilterCompiler.
- Container was not the only modules/ file binding NS.CONTAINER_TEMPLATE
(defaults\Profile.lua) at file load: Style, Style_Bars, Style_Icons,
Style_Text (which indexes its .text there), Anchors_Attach and Anchors
do too. Their TOC notes now name it, and module-map item 5 lists all
seven. The commit body of 429e5e6 understated this; this commit is the
correction.
- A new test_loadorder case scans every modules\ file for a file-scope
`local X = NS.CONTAINER_TEMPLATE...` and requires it below
defaults\Profile.lua with a LOAD-BEARING note naming
NS.CONTAINER_TEMPLATE (red first: six binders unnamed). settings/ is
out of its scope: settings\Text.lua binds the template too, and the
Settings section header already states it loads last.
docs/test-cases.md regenerated; Total 2058 equals the README badge.
The #22 relabel (AM-A-05) is still pending with the owner; no GitHub
write was made.
Gate: lua tests/run.lua 2058 passed, 0 failed, 1 skipped; luacheck .
0/0 over 174 files; lizard 0 functions above CCN 15; largest authored
.lua defaults/Categories.lua, 1344 lines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 429e5e69eba79b3be66500b6f37d2cdd76c57982
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 22:21:27 2026 +0530
AM-STD: Re-read the TOC against standard v2.77.0; sync test-cases
Standards reference roll to Ka0s WoW Addon Standard v2.77.0
(WowAddonStandards feat/2026-10-07-review-audit-remediation):
- The three-place reference (AuraMaster.toc ## X-Standard, the README
Standard badge, CLAUDE.md "Standards compliance") is versionless today,
and documentation-§6 still prescribes the versionless URL/badge form, so
nothing in the three places changes.
- Citation sweep over live docs and comments (libs/, tests/_kit/ and the
frozen docs/audits, docs/reviews, docs/automated-tests/<run>,
docs/revendor, docs/perf-analysis stores excluded): every one of the 934
filename-§N citations resolves to an existing section file and "### N."
heading on the feature branch; no global §N.M notation, retired file
name (agent-context.md, complexity.md) or drop-in label remains outside
docs/superpowers/, whose §N.M hits are the local specs' own section
numbers, not the standard's.
- v2.77.0 asks each addon to re-read its whole TOC listing against
toc-file-§5's widened denominator (WS-04). One position was mislabeled:
modules\Container.lua sat under "Conventional: ... peers resolved at
call time", but it binds NS.CONTAINER_TEMPLATE (defaults\Profile.lua) at
file load. It now carries a LOAD-BEARING note; the group's Conventional
note names what the rest bind at load (core seams only), and
ContainerManager keeps its own Conventional note. A new
test_loadorder case pins the order and the note (red first: the line
had no note of its own). docs/module-map.md's load-order narrative says
the same.
Docs sync over AM-01..AM-10: slash-dispatch.md, module-map.md
(core/Database_Migrations.lua, tests/drag_helpers.lua,
test_anchors_attach.lua), the ARCHITECTURE.md documentation map and its
counts (25 commands, 26 shims, 4 messages), testing.md, DEPENDENCIES.md
(v1.71.0) and CLAUDE.md were already current. docs/test-cases.md is
regenerated (the prose census's tracked-file count moved 210 -> 211 with
core/Database_Migrations.lua, plus the new loadorder case); Total 2057
equals the README badge, bumped from 2056.
Issue store (AM-A-05): relabeling closed GitHub issue #22 from
state:untriaged to state:done is pending with the owner; the permission
classifier denies that GitHub write to agents, so no gh write was made
here. The exceptions.tsv row for it lives in Ka0sAddonsCommonTasks,
which this item may not touch, and is left to the run record.
Gate: lua tests/run.lua 2057 passed, 0 failed, 1 skipped; luacheck .
0/0 over 174 files; lizard 0 functions above CCN 15; no authored .lua
over 1500 lines (largest defaults/Categories.lua, 1344).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 46324059ecdd40b282414cf5d9005c9eaf10c878
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:52:48 2026 +0530
AM-10: Ignore .claude and media/screenshots in .pkgmeta
The .claude ignore line sat commented out while .claude/commands/ is
tracked; packaging's strong form counts a commented-out line as a
miss, so packaging checks (a) and (b) reported NOT IGNORED and
UNACCOUNTED for .claude. Replace the commented pair with a live line.
(The BigWigs packager skips dotfiles anyway, so this is conformance,
not a shipped-bytes fix.)
Also ignore media/screenshots: 26 MB of PNG/JPG the client cannot
load, linked from the README via the forgecdn copies. The ten other
Ka0s addons already ignore it; AuraMaster was the lone outlier.
Packaging checks (a)-(c) re-run: no NOT IGNORED, no FALSE CLAIM, and
(b) prints only .git, which the playbook exempts.
Findings: AM-A-04, AM-A-09.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 137380187799ae4e1d43ee5b2abfe070ad36ba84
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:49:58 2026 +0530
AM-09: Spill the Module Map's placement narrative into data-flow.md
docs/ARCHITECTURE.md was 426 lines (hub SHOULD ~400) and its ## Module Map
ran 94 lines against documentation-§3's ~60-line MUST spill rule. Most of
it was a placement / attach / test-mode / unlock / drag-to-attach / strip
tooltip narrative, data flow rather than a module map.
The narrative (the 69-line paragraph from "The engine-facing core is four
modules" through the name label) moves verbatim into docs/data-flow.md
under a new "## Placement, preview and drag in brief" section, placed just
before "## Where a container sits", which carries each part in detail. The
Module Map keeps an eight-line summary naming the engine-facing modules and
one link to the new section; the existing docs/module-map.md pointer stays.
Measured after: hub 365 lines, Module Map span 34 lines. No inbound link
or code comment cited the moved text (grep of docs/, core/, modules/,
settings/, tests/ for ARCHITECTURE.md references), so no anchor needed
repointing.
Finding: AM-A-02.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit e9671267b64332ac9471a36a82cadec70238efb3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:46:41 2026 +0530
AM-08: Name the launcher menu's Test mode entry; fix map row, test comment
Since standard v2.67.0 / LibKa0s-Launcher-1.0 minor 4, the launcher's
left click opens the settings and test mode is the right-click menu's
Test mode entry (docs/ARCHITECTURE.md launcher section). Five sites still
said the left click toggled test mode:
- docs/ARCHITECTURE.md (slash section, /am test paragraph)
- docs/settings-panel.md (Test mode row)
- modules/Preview.lua (SetTestMode doc comment)
- settings/General.lua (header comment and the disabled-refusal comment)
All now name the launcher menu's Test mode entry. Comments and docs only;
no player-visible string changes.
The ARCHITECTURE.md documentation-map row for settings-panel.md named a
`Tab | Covers` table; it now names `Page | Tabs | Covers`, the header
settings-panel.md actually carries. tests/test_render_coverage.lua's push
comment pointed at the retired `#` scanner in test_lintconfig.lua; it now
names the vendored kit's test_lizard_sighted gate.
Finding: AM-A-06.
Deviation: the item text says the map row becomes `Page | Covers`; the
real table header in docs/settings-panel.md:12 is `Page | Tabs | Covers`,
so the row names that, which is what the item intends ("matching
docs/settings-panel.md:12").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit b3870337aa5e5a941d65a915f8b43a5eb26ef9fb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:43:52 2026 +0530
AM-07: Stop lowercasing translated labels in the container picker
settings/OptionsSetup.lua containerList applied string.lower to the
translated aura-type and style labels. A byte-wise lower misses
non-ASCII capitals and would decapitalize German nouns; casing belongs
to the translation. Both :lower() calls are dropped (the item's chosen
remedy over new whole-phrase lowercase keys), and the function's doc
comment says why.
Spec change: the enUS picker suffix now reads "(Player Debuffs, Icons)"
instead of "(Player debuffs, icons)". The two picker-label tests
(test_options_descriptor, test_pages_containers) were updated first and
failed red against :lower(), then pass. docs/settings-panel.md notes the
casing. Test count unchanged (2057), so docs/test-cases.md and the
README badge are untouched.
Finding: AM-R-06 (review F-006). The verified verdict rated this
optional (enUS-only today); the plan item binds the drop.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit ae3f3ac301f67febdcdc8572d658e43305b6d868
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:40:59 2026 +0530
AM-06: address review — debug tag map names core/Database_Migrations.lua for Migrate
The per-container v3 and v5 Migrate lines now come from the split-out
migrations file; the tag map row listed only core/Database.lua.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 30266ed75a84836819f64792ec78fe356bbd52b6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:38:44 2026 +0530
AM-06: Peel the frozen schema migrations into core/Database_Migrations.lua
core/Database.lua had reached 1406 lines (layout-§1 band) and every schema
step added 70-80 more; RESULTS.md's own trigger ("the migrations are the
seam to peel") had fired. Resolves AM-R-02 (review F-002).
- New core/Database_Migrations.lua (935 lines): Database.MigrateV2 .. V12,
their private helpers and frozen id tables (HEALING_V1/V2,
KNOWN_AURA_TYPES, V7_*, V8_OLD_*, V11_LAYOUT, V12_*), plus the
KNOWN_EDGE/DEFAULT_EDGE set only the ladder reads -- moved verbatim
(checked line for line against HEAD). It binds `local Database =
NS.Database`, rebinds `copy` from Database.DeepCopy and `normalizeKeys`
from the newly published Database.NormalizeKeys, and only adds members.
- core/Database.lua (496 lines) keeps AceDB init, the registry helpers,
EachProfile, SCHEMA_STEPS, climbLadder and NS.RunMigrations with AM-02's
13 DebugAtEnable('Migrate') lines. SCHEMA_STEPS already looked each step
up as Database.MigrateVn inside its apply closure, so the late binding
holds: the steps run from NS.InitDB at OnInitialize, after every file.
- AuraMaster.toc: the new file right after core\Database.lua, with a
Conventional: note (test_loadorder's coverage case passes; the harness
loads it from the TOC).
- Docs: module-map.md gets a row for the new file (and the v12 step the
old row had missed), ARCHITECTURE.md's file count 58/16 -> 59/17, every
core/Database.lua:<line> citation repointed (schema.md, profiles.md,
common-tasks.md, module-map.md, ARCHITECTURE.md), schema.md's per-step
file names, the RESULTS.md watch-list row refreshed, and code comments
in defaults/, modules/, core/Constants.lua and tests that named
core/Database.lua for migration code now name the new file.
Deviations: common-tasks.md's "append { to = 12 ... } (the next version)"
was stale (v12 exists) and is now 13, edited because the line was being
repointed anyway. RESULTS.md's LOC column keeps the run's 1327; the
disposition text records the peel. Running the kit's complexity suite
wrote a bundle and rewrote RESULTS.md; both were reverted, as recording a
run is not this item's job.
Gate: lua tests/run.lua 2056 passed / 0 failed / 1 skipped, 2057 total
(unchanged from before the move); luacheck 0/0; complexity suite green,
max CCN 15 (0 warnings); largest authored file 1344 lines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit ced31817312a248deb533863c5db7554adf8166c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:28:34 2026 +0530
AM-05: Bring logCandidates below CCN 15 with a per-target text helper
modules/Anchors_Snap.lua's logCandidates measured CCN 18 under the
sighted shadow, the one function over 15, which blocks the
automated-tests-§3 release gate. Most of the count was and/or
defaulting. Its [Anchor] line stays byte-identical.
- targetText(dragged, t): a target's text, its ineligibleWhy or else
its rect as a parent.
- The outcome suffix and the targets list are now named locals
(outcome, targets).
- rectText(found) answers logRect's "l,b,r,t" or "no rect", so the
own-rect and parent-rect reads stop repeating `and ... or "no rect"`.
- otherIds(dragged): the sorted ids of every other live container.
Sighted lizard: logCandidates 11 (was 18), targetText 2, otherIds 3,
rectText 2. Complexity suite: 0 warnings, max CCN 15.
Characterization first (testing-§13): tests/test_anchors_mark.lua pins
the exact snapshot lines at a drag's start and its drop over three
targets (a rect, a disabled one, one with no rect) and over no
targets. It passed before the refactor. Mutations of the outcome and
targets suffixes turn it red. docs/test-cases.md is regenerated and
the README Tests badge rolls to 2056.
Findings: AM-R-01, AM-A-03 (a).
Deviations:
- The helpers otherIds and rectText(found) are new beyond the item's
targetText plus hoisted suffixes. Those two alone reached CCN 15
under the sighted shadow, not the expected <= 12. Both are named
helpers, not a Part2 split or an if-ladder (anti-pattern #52).
- The characterization case is in tests/test_anchors_mark.lua, not
test_anchors_drag.lua. The existing DD-21 snapshot case lives there,
and test_anchors_mark.lua has the shared helpers.
- The regenerated docs/test-cases.md also corrects the prose line's
tracked-file count from 208 to 210. AM-04 added two suites and left
that count stale.
- Plain `lizard` (1.24.0) is blind to logCandidates both before and
after this change, so figures come from the kit's sighted shadow
(tests/_kit/lizard_sighted.lua).
- AM-A-03 part (b), a sighted four-suite release run with band
dispositions for Anchors_Snap.lua and the drag suite, is deferred
to the next release run (automated-tests-§6). This run cuts no
release, so RESULTS.md and the bundles are left untouched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 6d029a30c3dc9148e720fb3c42763622216d6734
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:20:27 2026 +0530
AM-04: Split the drag suite; the detach leeway moves to its own suite
tests/test_anchors_drag.lua was 1490 lines, 10 under layout-§1's 1500-line
cap (AM-R-04, review F-004). Split verbatim along its existing seam:
- tests/test_anchors_drag.lua (637 lines, 21 cases) keeps the drag
lifecycle: starting a drag, holding it steady, the driver, the highlight
and join marker, a drag cut short, and the gold back on every end path.
- tests/test_anchors_attach.lua (744 lines, 22 cases) takes the detach
leeway section (A4): hold, re-pair and red past C.DETACH_RADIUS, with its
own helpers (leewayDrag, assertPainted, assertLoneDot, secretParentDrag).
- tests/drag_helpers.lua (149 lines, not a suite) holds the helpers both
suites use (plant, env, recordAnchor, recordOverlays, rgba, stripEdge,
assertNothingHungOn, assertEdgeOn, dotAt, lineEnd), moved verbatim; each
suite binds them to locals of the same name, so no test body changed.
The new suite is listed in tests/run.lua after test_anchors_drag.
docs/test-cases.md is regenerated: the sorted case-name set is identical
and the Total stays 2055; only the grouping moves. docs/module-map.md
splits the drag row, adds the attach row and the helper row, and
test_anchors_mark.lua's two "as test_anchors_drag.lua's env/stripEdge"
comments now point at tests/drag_helpers.lua.
Deviation: the item named the moving blocks "drop/attach/detach outcome"
and kept "leeway" in the drag suite. Drop outcomes already live in
tests/test_anchors_drop.lua, so the only attach/detach-outcome blocks left
in the drag file were the leeway's. Moving those balances the two files
under 1000 lines, which a highlight-only move would not have done.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 821464d4250051a42b1336136ff011a833a3b45c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:14:33 2026 +0530
AM-03: Plain degraded help rows; rekey the debug row; document listing
The library-absent Slash stub no longer copies LibKa0s-Slash's FormatRow
(slash-commands-§1: a degraded help row prints `cmd desc` plainly).
SlashLib becomes `{}` and stub.LandingRows builds each row inline as
"/am " .. verb .. " " .. desc, which stub.PrintHelp prints; the block
comment says the degraded row is plain. The live path is unchanged.
The debug help row is rekeyed to the standard's wording, "Toggle the debug
console — on/off enable/disable logging" (em dash like every other AM
row); the old enUS key is removed in the same change.
docs/slash-dispatch.md row 11 now describes the listing the code prints:
under a `Containers` heading, `name #id - unit - type - style` (fields
gray, ` - disabled` appended), the selected one marked `>`. The code's
separators are kept.
Red first: tests/test_slash.lua pins every degraded landing row to the
plain shape (no em-dash join, no |c) and the /am help debug row to the
new key; tests/test_slash_verbs.lua's degraded help assertion updated to
the plain row. docs/test-cases.md regenerated (Total 2055) and the README
Tests badge rolled to 2055/2055. The comment grew by a line, so the
settings/Slash.lua citations below it in docs/slash-dispatch.md and
docs/module-map.md move by one.
Findings: AM-A-07, AM-R-07.
Deviation: the stub's SlashLib is a file local, so "SlashLib.FormatRow is
nil" is pinned behaviourally (each degraded row equals the plain join)
rather than by reading the member.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit b12fb1f56ec38e0d59fbdfa5e6f152639ebe5062
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 20:06:06 2026 +0530
AM-02: Route schema-migration summary lines through DebugAtEnable
NS.RunMigrations runs only from NS:InitDB at OnInitialize, while
NS.State.debug is still false, so every ladder-level gated
NS.Debug('Migrate', ...) line was dropped and never reached the log.
debug-logging-§8 Lifecycle coverage makes a schema migration a MUST line.
The 11 per-step per-profile summaries, the 'v%s -> v%s' stamp line and
the starter-seed line now go through NS.DebugLog.DebugAtEnable('Migrate',
...) with the same format strings and args, so they land after [Init]
the first time logging is turned on. The per-container lines inside the
MigrateVn bodies stay on gated NS.Debug (they would overflow the 32-entry
at-enable queue on a large profile; the step summary counts them). Failed
steps still print to chat. The library-absent stub already carries
DebugAtEnable, so no stub change.
Tests: new red-first case in tests/test_migrations.lua (logging off at
load, nothing logged; SetEnabled(true) shows '[Migrate] v11 -> v12' and
the v12 profile summary after [Init]). The captureSteps helper and the
test_database per-profile-count case now observe DebugAtEnable instead of
NS.Debug, so they keep asserting what they did.
Ripples: the SCHEMA_STEPS comment explains the routing; docs/debug.md and
docs/schema.md say the lines go through the at-enable queue; the
core/Database.lua:1247 citation in docs/schema.md and docs/common-tasks.md
moves to :1255 (the comment pushed SCHEMA_STEPS down); docs/test-cases.md
regenerated and the README Tests badge rolled to 2054/2054.
Finding: AM-A-08.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 77c6c0f3b063ac547b363cfadcdf228ea0b700ea
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 19:59:56 2026 +0530
AM-01: resolve a bare number by name first, refuse a cross-match, '#N' = id
findContainer (settings/Slash.lua), behind /am select and /am delete, read
any numeric argument as an id before trying names, while the name
validator accepts a bare-number name such as '3'. So '/am delete 3' could
delete container #3 when the player meant the container named '3', and
AceDB has no undo (AM-R-05, review F-005).
New precedence: '#N' is always the id N; otherwise an exact
case-insensitive name match wins (a shared name is still refused); a bare
number that is one container's name and a DIFFERENT container's id is
refused with one new enUS sentence naming both; a bare number nobody is
named falls back to the id; one container answering both is that one.
Numeric names stay allowed. The name scan moved into findByName, and a
refusal now travels as { sentence, args... } so sayNotFound can format
the four-argument line.
- tests/test_slash_verbs.lua: four new cases (cross-match refused on
delete and select, '#3' deletes #3, '7' selects by name, bare id
fallback plus same-container); the first three were red before the fix,
the fourth is a guard for the id fallback and the same-container case.
- locales/enUS.lua: one new key.
- docs/slash-dispatch.md: rows 12 and 14 and the "Names on select and
delete" section document the precedence.
- docs/test-cases.md regenerated; README Tests badge 2049 -> 2053.
- Line citations into settings/Slash.lua shifted by 21 lines and were
rolled in docs/slash-dispatch.md, docs/module-map.md and a comment in
settings/GeneralSpells.lua (the docs citation tests caught them).
Frozen docs/superpowers/ plans and research were left as written.
Deviation: the /am select and /am delete help rows were left unchanged;
'#id' does not fit their short "id or name" shape, and the refusal line
itself tells the player to type #N.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit b4c29ab0e7a3c2b7ec014a4eb5871dc463663281
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 19:51:41 2026 +0530
RV-AM: re-vendor LibKa0s v1.71.0; record v1.69.0-v1.70.0 span (AM-A-01)
Copy both payloads whole from the LOCAL tag v1.71.0 in ../LibKa0s (tag
object 3bf1b97, commit cb274a4) via git archive: libs/LibKa0s/ (Env 2,
Slash key 20.2, Widgets key 12.1.4.3.2, OptionsIdList 4) and tests/_kit/
(kit revision 37 -> 38, new secrets.lua). diff -r against the extract is
empty for both.
Ripples in the same commit:
- CLAUDE.md provenance line, DEPENDENCIES.md:85/:92 and
docs/module-map.md:293 roll v1.70.0 -> v1.71.0.
- docs/test-cases.md regenerated: kit 38 counts the declared diagnostics
opt-out skip on its own Skipped row, so Total 2050 -> 2049, which now
equals the README badge (2049/2049; badge unchanged).
- docs/revendor/2026-10-07-v1.71.0/ (01_DELTA, 02_CANDIDATES,
03_DECISIONS, 05_SUMMARY): no contract blockers (ParseValue's nan/inf
refusal is relied on by no AuraMaster path); every candidate, Kit.secret
included, is "not adopted in this run" per OWNER_SCOPE 5.
- docs/revendor/2026-10-07-v1.69.0-v1.70.0/ span bundle (01_DELTA and
05_SUMMARY only) for the unrecorded re-vendors 3656914 (v1.69.0) and
c070393 (v1.70.0), line 1 per the verified remediation, base v1.68.1 in
the body; both carried by sweep, nothing adopted. Resolves AM-A-01.
Gates: lua tests/run.lua 2049 passed / 0 failed / 1 skipped; luacheck
0/0 in 171 files; complexity green with 1 pre-existing warning
(logCandidates, CCN 18, owned by AM-05; no authored Lua changed here);
largest authored .lua 1490 lines.
Deviations: no ARCHITECTURE register row added, because
docs/ARCHITECTURE.md:373 names the docs/revendor/ store without listing
bundles. Working-tree-only EOL drift in two RA-00 frozen files
(docs/audits/2026-10-07/02_DEVIATIONS.md,
docs/reviews/2026-10-07/02_PROPOSED_CHANGES.md) was repaired by
rm + checkout so the eol suite passes; no tracked content changed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit 20a39d69f92134c48f2013b1e2251c5ce910c38e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 16:51:51 2026 +0530
RA-00: record 2026-10-07 standards audit and review bundles
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RoCGDEVoaSdzqSHHsASPMi
commit c070393ba413f837abe787bb4cfc32d317519d9d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 11:38:24 2026 +0530
chore: re-vendor LibKa0s v1.70.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4XiFWzQrd9ee19aBpkVmt
commit c070393ba413f837abe787bb4cfc32d317519d9d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Wed Oct 7 11:38:24 2026 +0530
chore: re-vendor LibKa0s v1.70.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4XiFWzQrd9ee19aBpkVmt
commit 3656914891e415a34c43d8e8b59f161d8c60d9a4
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Tue Oct 6 14:52:49 2026 +0530
chore: re-vendor LibKa0s v1.69.0 (kit 37; adds the line chart widget)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4XiFWzQrd9ee19aBpkVmt
commit c8b0cafae417d44a718b48c421d108516ba5f27f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 15:15:52 2026 +0530
DC-REV-02: re-vendor LibKa0s v1.68.1 (kit 36; library bytes unchanged)
Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.68.1 (tag 9fb7956, commit
9000cbd) via git archive. The library payload is byte-identical between v1.68.0 and v1.68.1, so
all 32 minors stand; kit 35 -> 36 (framework.lua, run-automated-tests.sh, test_eol.lua: the
dev-copilot command names, comments and one printed RESULTS.md line). Nothing added or deleted.
Vendor parity: diff -r against the tag is empty for both payloads, both directions.
- CLAUDE.md provenance line, DEPENDENCIES.md:85 and :92, docs/module-map.md:293 roll to v1.68.1.
- Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (01, 02, 03, 05). Zero adoption candidates,
no interview, no contract blocker, no span bundle.
Gates (ka0s-bounded):
- lua tests/run.lua: 2049 passed, 0 failed, 1 skipped, 2050 total (test_vendor_sync green)
- luacheck .: 0 warnings / 0 errors in 171 files
- run-automated-tests.sh --suite complexity --no-bundle: verdict green, 1 warning that predates
this change (logCandidates, modules/Anchors_Snap.lua:892, CCN 18, from cb766da); recorded in
the bundle's summary
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit c8b0cafae417d44a718b48c421d108516ba5f27f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 15:15:52 2026 +0530
DC-REV-02: re-vendor LibKa0s v1.68.1 (kit 36; library bytes unchanged)
Copies libs/LibKa0s/ and tests/_kit/ whole from the local tag v1.68.1 (tag 9fb7956, commit
9000cbd) via git archive. The library payload is byte-identical between v1.68.0 and v1.68.1, so
all 32 minors stand; kit 35 -> 36 (framework.lua, run-automated-tests.sh, test_eol.lua: the
dev-copilot command names, comments and one printed RESULTS.md line). Nothing added or deleted.
Vendor parity: diff -r against the tag is empty for both payloads, both directions.
- CLAUDE.md provenance line, DEPENDENCIES.md:85 and :92, docs/module-map.md:293 roll to v1.68.1.
- Frozen bundle docs/revendor/2026-10-04-v1.68.1/ (01, 02, 03, 05). Zero adoption candidates,
no interview, no contract blocker, no span bundle.
Gates (ka0s-bounded):
- lua tests/run.lua: 2049 passed, 0 failed, 1 skipped, 2050 total (test_vendor_sync green)
- luacheck .: 0 warnings / 0 errors in 171 files
- run-automated-tests.sh --suite complexity --no-bundle: verdict green, 1 warning that predates
this change (logCandidates, modules/Anchors_Snap.lua:892, CCN 18, from cb766da); recorded in
the bundle's summary
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit 6e3291831dfe41d9c0aeaf02bd4c091a3115b866
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 14:21:24 2026 +0530
DC-REN-01: aura-spells-review runs the bounded runner from ~/.claude/dev-copilot/bin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit 6e3291831dfe41d9c0aeaf02bd4c091a3115b866
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 14:21:24 2026 +0530
DC-REN-01: aura-spells-review runs the bounded runner from ~/.claude/dev-copilot/bin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsGF7a1YxB69EsRnBC8rcE
commit 93de6c049c196a595ff758f0cdf18d7505b5bfff
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sun Oct 4 10:50:23 2026 +0530
CC-SPLIT: Soft CC splits into CC Root and CC Snare; Hard CC is now CC Loss of Control (schema v12)
The debuff category Soft CC answered two questions at once. It is now two lists: CC Root (`ccRoot`,
14 ids: roots and freezes, SpellMechanic 7) and CC Snare (`ccSnare`, 45 ids: slows, SpellMechanic
11). The 57 Soft CC ids split cleanly by the client's own mechanic and tooltip, and the Shaman totems'
Earthgrab (64695, root) and Earthbind (3600, snare) are added by hand. Hard CC keeps its `hardCC` key
and is relabeled CC Loss of Control.
Schema v12 (`Database.MigrateV12`) runs over every stored profile. A container that stored a Soft CC
state gets it on both new keys, so nothing draws differently. Soft CC list edits follow their ids,
and an id the old row never shipped goes to both.
tools/spell-research now derives three buckets (precedence: loss of control, then root, then snare).
Its sentinels, combat-log pipeline, recorded decisions, fixtures, tests and README are updated.
Docs: schema v12, smoke test INSTALL-9, row counts (269, Filters 57), category counts and the
regenerated test inventory.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjckAFm91RhfPfmBHZYP4w
commit 0b333ceba4438503c24f99503e169c92275c20c3
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 12:47:46 2026 +0530
SD-FIN-01: sync docs (schema rows 268, Filters 56; EdgePoints a test seam; ResolvedEdge comment)
The settings-row counts missed the Situations tab's rows; placement docs now describe EDGE_PAIRS/Spec, which production uses; Anchors.EdgePoints is published for the headless suite only; a comment naming the removed Anchors.ResolvedEdge now says so.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit 1682cda0b753aea1b3d3269990ddcd01aeda3228
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 10:48:04 2026 +0530
DD-22: a drag's start re-places every container whose rect reads secret, parents first (A15, #22)
The owner's DD-21 log: after a reload, [11] (id 10), its parent and grandparent read "no rect" while
their chain's root read plainly, so [11] could be no target (a detached child could not go back on
it) and the hold drew a lone dot; [11] turned readable only once an apply re-placed it. Now, out of
lockdown, BeginDrag re-anchors each live, enabled, shown container whose footprint does not read, in
attach-chain depth order, before the lift and the rest read.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit 1682cda0b753aea1b3d3269990ddcd01aeda3228
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 10:48:04 2026 +0530
DD-22: a drag's start re-places every container whose rect reads secret, parents first (A15, #22)
The owner's DD-21 log: after a reload, [11] (id 10), its parent and grandparent read "no rect" while
their chain's root read plainly, so [11] could be no target (a detached child could not go back on
it) and the hold drew a lone dot; [11] turned readable only once an apply re-placed it. Now, out of
lockdown, BeginDrag re-anchors each live, enabled, shown container whose footprint does not read, in
attach-chain depth order, before the lift and the rest read.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit cb766daa6c8863d154f70ce3ed3b8d34da7a2c27
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 10:36:21 2026 +0530
DD-21: log what the snap sees at each drag's start and drop; regression case for a detach then re-attach to the same parent
Owner report (2026-10-03): after a reload, a container dragged off its parent would not re-attach to
it until another target had been shown. Headless, with the owner's flows (no GC-1), the same sequence
re-attaches, so the cause is in-game only. While logging is on, each drag now writes its own rect
and every other container's rect as a parent, or why it is no target, at its start and at its drop.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit bf26c50841ab33476c86d4da8f8dd891667d3f10
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 10:24:31 2026 +0530
DD-20: M8 checkpoint row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit 5f540c9709120e9c9f6af70999c127831299b004
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 10:24:26 2026 +0530
DD-20: review fixes: stale cursor-fallback wording in ARCHITECTURE, module-map, Anchors.lua and two test comments
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit b07965e9570de36e523196db522543a1ceee2f2b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 10:21:50 2026 +0530
DD-20: where the strip's rect reads secret, the strip tooltip is pinned beside the cursor where it entered (A14, #22)
Owner's option B (2026-10-03). A container attached under a parent holding auras reads secret, so
tooltipPlace declined and the widget's tooltip followed the cursor. Now it is pinned to UIParent
16 right of the cursor and 10 above it (16 left near the screen's right edge), fixed for the hover;
nil, the cursor-following fallback, only where the cursor, tooltip or screen does not read.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit f0c99d49528f8115824b3dd5264f6e0af5b2570e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 09:51:27 2026 +0530
DD-19: M7 checkpoint row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit 90de0ce66dd63ca3fde5165953d4fc19b611aa93
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 09:51:25 2026 +0530
DD-19: review fixes: ReleaseStrip's dragged-strip restore pinned, module-map's A7/A12 wording, a test comment's numbers
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit 784cea6d46f1a46fc2e75ddc031fe25bfb77af11
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 09:46:40 2026 +0530
DD-17 + DD-18: a side the child faces beats a corner, then the shortest line; the dragged strip lit with the target's (A12, A13, #22)
Owner's fourth smoke round (2026-10-03). Snap.Nearest ranked eligible sides by gap alone, so a
child beside one wide strip was joined end to end to the corner of the strip below (a nearer gap,
a line the strip's whole width long). Now a side the child spans alongside beats a corner one, then
the shorter line between the pair's two points; dist stays the gap for the leeway. While a mark
shows, the dragged container's own strip is repainted with the target's, and gets its gold back on
every end path. New suite tests/test_anchors_mark.lua; smoke DRAG-18; addendum A12, A13.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBEbct8mwzFqZSG1oTkv8f
commit 9c632fae95edb61150d520d8ee6273c6c50c9b34
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 01:43:13 2026 +0530
DD-16: M6 checkpoint row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit fd2ce8cb8df321b1919ad019c78e374ad699ca6a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 01:38:01 2026 +0530
DD-16R: the travel gate covers a parent with no readable rect; the release and A11's growth-edges-only rule pinned
Round-3 review of DD-16 (3 confirmed findings), fixed by the orchestrator:
- refused() gated on cur.dist, so a grandchild whose parent reads no rect at all could still be
taken by a neighbour straight after the lift's cursor jump; it now gates on the missing rest
vector whatever the distance. New case, red without the change.
- the no-rest-read case's release assertion could not fail (the drop on 3 asks GC-1 and writes
nothing); it now asserts NS.AttachByDrop is never called.
- reach()'s 'that edge only' rule was unpinned vertically; a block past the strip on every side now
keeps the strip's non-growth edges (the both-edges mutant fails it).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 1ed5e6fdff4e0d2eddeb4e1c20dc53e0f04e8057
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 01:27:17 2026 +0530
DD-16R: with no rest read, no pair at all wins until the cursor moves C.SNAP_RADIUS; the rest pick and A11's union pinned
beats() applied the no-rest-vector travel gate only to hits on the current
parent, so a child of a populated parent (its anchor secret before the lift)
let go where the lift left it could attach to a neighbor in snap range: its
current pair's distance runs to the parent's strip alone, far above a block
several rows deep. The gate now refuses every hit while the current pair has a
distance but no rest vector (refused(), split out to keep beats under CCN 15).
Tests: the neighbor case (hold at travel 0, attach 3 at 30, the release snaps
back); the gate's boundary at exactly C.SNAP_RADIUS; the rest-pick guard,
pinned by a child resting a unit under its parent (its pick's gap under the
leeway's measure); and a strip overhanging its block on every growth side
keeping its own edges (A11's union). The equal-width case's two red-under
notes now name `away`; the chain-move drop case gets the rest read its
sibling has. Docs: known-limitations, DRAG-9 and its history row,
ARCHITECTURE, module-map; inventory regenerated, badge 2033/2033.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 750ae326691fe71f29d4b94a99907b538bc1c8c6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 01:11:13 2026 +0530
DD-16R: with no rest read before the lift, no pair of the current parent wins until the cursor moves C.SNAP_RADIUS
A child hanging from its parent's secret engine reads secret before the lift, so noteRest records
no rest vector and the lift centers it under the cursor. Its hit's gap then always beat the stored
pair's Euclidean distance, and a let-go right after the jump re-paired it by the grab's offset.
beats now refuses every pair of the current parent in that case until the cursor has travelled past
C.SNAP_RADIUS. A drop test that moved the child with no cursor travel and no rest now plants its rest.
Docs: ARCHITECTURE.md and module-map.md no longer say a parent whose block reads secret is never
re-paired (findFrom measures it on its strip); data-flow.md and known-limitations.md note the travel
gate; DRAG-9's log line is `drop: attach to <A's id> LEFT>RIGHT (<side>)` and gains a let-go step.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit c4c7a02738ebe382aa3cc9ec8b154f5fa960447e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 00:59:28 2026 +0530
DD-16R: the current parent is measured for the pick on its current pair's rect, so a populated parent's other sides re-pair
053fb6d refused every pair of the current parent whenever its block read secret
and its strip read (a parent holding auras, the normal case in play), so a
child could no longer be moved to another side of its own parent: beside its
strip Tick answered hold or detach where 057cba2 and f45426b attached.
Compare like for like instead. classify now finds through findFrom, which runs
Snap.Nearest over the candidates with the current parent's rect replaced by
the rect its current pair is measured on (SR.HungParent: the strip alone where
the block reads secret, never out to the one-element fallback). A nudge under
a one-row populated parent still holds on the stored pair (no pair of the strip
is in range), and the release writes nothing. A hit on the current parent
carries that rect, so markRect draws its dot where it was measured. The
`reached` plumbing (SR.HungParent's second return, beats' and sameAsCurrent's
terms) is gone; the cur.dist guards for a parent with no readable rect stay.
New drag cases: a child beside a secret-engine, strip-reading parent attaches
1:LEFT>RIGHT, its dot on the strip, and the release writes LEFT/RIGHT; a drop
on a wide strip's right side re-attaches TOPLEFT>TOPRIGHT.
Docs: module-map's test_anchors_drag row (the collapsed mark only for a hidden
or unreadable strip; the DD-16R cases), data-flow's leeway paragraph,
known-limitations (below a populated parent, another pair only near its
strip), smoke DRAG-9 (re-attach beside A's strip) and its history row.
Inventory and badge regenerated (2029/2029).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 053fb6da30cd8588a4221be185a1d2be56bccf05
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 00:43:19 2026 +0530
DD-16R: a current parent measured off its strip alone never re-pairs by its fallback hit
DD-16 let a parent's strip read while its engine reads secret. Snap.Find then
measured that parent on its strip out to the one-element fallback, while
currentPair measured it with SR.HungParent on the strip alone, so the stored
pair had a distance and beats()' fallback guard never fired: a child nudged
10 to 20 units under a one-row parent was re-attached by the far pair.
SR.HungParent (parentRect) now also says whether its block read; currentPair
keeps it as `reached`, and beats() and sameAsCurrent() refuse any pair of the
current parent when it did not. New drag case pins the hold on the stored pair
for nudges of -10, +10 and +20, and the release writes nothing.
Docs: ARCHITECTURE's module count (58 files, 22 modules) and the
Anchors_SnapRect load-bearing pair; the known-limitations heading names the
before-side end of a side. Inventory and badge regenerated (2027/2027).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 46182e6081835b7fdd7fbdaa22db7bc22d39ed4e
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 00:33:39 2026 +0530
DD-16R: DRAG-9's hold is two dots and a line on A's strip; inventory regenerated after staging
DRAG-9 said a hold on a parent holding auras showed a lone dot on B's join
point. In game A's strip reads (it hangs from A's anchor), so SR.HungParent
returns that strip, its growth side not reaching the secret block, and the
hold draws two dots and a line from A's strip bottom to B's strip top. The
lone dot shows only while A's strip is hidden or unreadable. Step reworded,
its correction recorded, and a characterization test pins the two-dot hold.
docs/test-cases.md regenerated after staging, so the prose disclosure counts
the tracked files DD-16 added (11 of 207). Badge 2026/2026.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit f45426b9f04c2a16a042ab43a57f1c4e785d4a6f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Sat Oct 3 00:08:54 2026 +0530
DD-16: the parent's growth sides reach its block (A11, #22)
The parent's measuring rect (every drop target, the detach leeway's
parent, and the mark drawn on them) is its strip with each edge on a
side it grows toward taken out to its block's far edge, when the block
reads: Snap.ParentRect over Snap.TargetRect (its guard and one-element
fallback), and over Anchors.HangFrame with no fallback for the leeway.
The dragged child's rect stays its strip. The side pick, thirds, dots,
line and leeway follow, so below a parent growing down the dots sit on
its block's bottom, where the child lands.
The rect readers move to modules/Anchors_SnapRect.lua (TOC and
load-order test), keeping modules/Anchors_Snap.lua under 1000 lines.
Tests for growth down/up/right/left; known-limitations drops the
after-side bullet; ARCHITECTURE, data-flow, module-map and smoke
DRAG-1/2/9/15/16/17 updated; inventory and badge regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 057cba21518753416c91136ea63c06199e5c6451
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:56:06 2026 +0530
DD-15A: addendum A11, the parent's growth sides reach its block (#22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit b00b0ac9577a131d3efb95ed8f804c5d02c9a789
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:51:55 2026 +0530
TP-AM-01R: CONT-9 tooltip sits beside the strip; v1.68.0 summary records the adoption gate (#22)
Smoke CONT-9 still placed the strip tooltip at the cursor, contradicting
DRAG-11 after cfcf0df's tooltipPlace adoption. It now reads beside the
strip, flipping left near the screen's right edge, and its history row
records the correction.
The in-flight re-vendor bundle docs/revendor/2026-10-02-v1.68.0/ gains the
post-adoption gate row in 05_SUMMARY.md (2021 / 0 / 1, luacheck 0/0 in 169
files, lizard clean) and a Bundle shape note: no 03_DECISIONS.md or
04_EXECUTION_PLAN.md, because the cross-repo LIBKA0S_TOOLTIP_PLACE plan
bundle holds both.
Gate: 2021 passed / 0 failed / 1 skipped; luacheck 0/0; lizard -C 15 clean.
Docs only; test cases unchanged, so test-cases.md and the badge stand.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit cfcf0dfef8b03511d2746e52693992c39d072672
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:46:20 2026 +0530
TP-AM-01: the strip tooltip sits beside the strip, flipping left near the right screen edge (#22)
Adopts LibKa0s v1.68.0's tooltipPlace. A new module, modules/Anchors_Tooltip.lua
(loaded before modules/Anchors.lua, which binds NS.AnchorsTooltip.Place at file
load), reads the strip's rect (the hovered frame, or the strip a help or close
mark belongs to) and its effective scale through NS.Secrets, converts it to
screen pixels and then to the tooltip's own units, and pins the tooltip to
UIParent alone: its TOPLEFT a gap right of the strip's TOPRIGHT, or its TOPRIGHT
a gap left of the strip's TOPLEFT when the right side would pass the screen's
right edge. Never anchored to the strip, which sits in the anchor's restricted
tree. Any secret or missing read answers nil, and the widget falls back to the
cursor owner BuildHandle keeps (tooltipOwner = "cursor").
Tests first: tests/test_anchors_tooltip.lua (right side, left flip and the
just-fits edge, secret and nil reads, scale conversion, mark to strip, and the
strip, help and close marks placed through BuildHandle). The cursor-owner and
line-count cases in test_anchors_handle and test_anchors_close now read the
fallback's second draw. Docs: ARCHITECTURE, module-map, midnight-quirks, smoke
DRAG-11; test-cases regenerated, badge 2021/2021.
Gate: 2021 passed / 0 failed / 1 skipped; luacheck 0/0; lizard -C 15 clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 0042f6dd3c54f4e726681023aabd592019161f13
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:39:58 2026 +0530
TP-AM-01: re-vendor LibKa0s v1.68.0 (WidgetsDragHandle minor 4)
Both payloads copied whole from the local v1.68.0 tag (cc9f5eb); one file
moved, WidgetsDragHandle 3 -> 4 (the optional tooltipPlace hook). The kit
stays at revision 35. The provenance line, DEPENDENCIES.md's vendor-sync
paragraph and docs/module-map.md's library row roll to v1.68.0. No contract
blocker: without the hook the widget makes minor 3's calls. Bundle:
docs/revendor/2026-10-02-v1.68.0/.
Gate: 2015 passed / 0 failed / 1 skipped; luacheck 0/0; lizard -C 15 clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 85c0956204fd901578b0ff421c64d72d55f00946
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:34:22 2026 +0530
DD-15R: DRAG-15 measures the leeway as travel; the before side's one-element jump and overlap documented (#22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 2d61afe0993c3d61f5945e9c05083e80b9e0ecf6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:28:25 2026 +0530
DD-15R: smoke DRAG-2 and DRAG-15 move E sideways as well as up (#22)
DD-15R's review: a child resting below its parent by the start pair and
moved straight up over the parent's block has that pair's two points
exactly the vertical gap apart, and the middle (equal width) or end
(twice as wide) pair's gap is the same, so beats' strict comparison
ties, classify answers hold and the drop snaps back. DRAG-2's centered
drop below A and DRAG-15's wide-child step promised an attach there.
Both steps now move E a few px sideways as well as up, and say that a
move straight up ties and holds. Docs only; no code change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 8b51441861af8bb46b2558109b6b141c329806f7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:19:44 2026 +0530
DD-15R: a neighbor never takes a child let go where it rests; docs on strip geometry (#22)
DD-15's review: on the strips (A10) the current pair's two points rest a
whole parent block apart, so beats' "strictly nearer than the current
pair" let any other container's strip in snap range re-attach a child
picked up and let go where it sits. beats now compares the hit's gap with
the leeway's rest-invariant measure, `away` (the nearer of the pair's
distance and how far it has moved since the drag began), else the
distance. Anchors_Snap.lua stays at 1000 lines.
Tests: a third container beside a resting child holds at the tick and
the drop writes nothing; the equal-width child now holds until it has
moved further than the middle pair's gap; the leeway case's comment
says 122, not 82.
Docs: smoke DRAG-1, DRAG-2, DRAG-9 and DRAG-15 describe strip geometry
(the after side reached over the parent's block, the thirds of the strip,
a populated parent's dots on its strip, a neighbor beside a resting
child); known-limitations states the real offsets (a block height across
the after side, block length less strip length along a side) and folds
the first-element entry into A10; ARCHITECTURE, data-flow and module-map
describe the new comparison. Inventory and badge regenerated (2015/2015).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit f1f806501b3a20fd3703755163ed8866d1cb871c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 23:06:03 2026 +0530
DD-15: the snap measures and draws on the strips (A10, #22)
Snap.Footprint and the dragged container's own rect now answer the
container's drag-handle strip while it is visible and reads (readRect's
secret guards), else A8's footprint (block plus a shown name label). The
side, the align third, the dots, the line, the box and the A4 leeway all
follow; where a drop attaches is unchanged. The dead strip half of
widen/takeIn is folded into one footprint helper (Anchors_Snap.lua 1002 ->
1000 lines). Comments, ARCHITECTURE, data-flow, module-map,
known-limitations and smoke DRAG-1, DRAG-15, DRAG-16 (and DRAG-17's dot
line) now describe dots on the strips. Tests: strip rect on each growth,
a parent whose strip sits below its block (dot on the strip's corner),
side and leeway measured on strips, unreadable strips falling back.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 467f69e128bfac3d0c2c7256c916818fcc0d5657
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 22:59:13 2026 +0530
DD-14A: addendum A10, the strip is the rect (#22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 76178881c2172b84bd3e71845421ee5640e69882
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 22:42:18 2026 +0530
DD-14: M5 checkpoint row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 661d6c88bb9b864c4989a1ca8defd97a9375a5eb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 22:38:04 2026 +0530
DD-14: a child in snap range of its own pair holds; the leeway pinned on footprints (#22)
- classify: when the snap's pick is the current pair itself (measured, the
parent's block reading), hold. A7 makes that pair the pick anywhere over its
third of the parent's side, so a child flush under a long parent went red and
detached on release. The cur.dist guard keeps a hit on a secret parent's
one-element fallback from counting.
- Snap.Candidates: make a pool entry only when its slot is first reached, so
the dragged container (always ineligible) no longer costs two tables a tick.
- Tests: the long-parent hold, the leeway on strip-inclusive footprints (both
block-only mutants now red), REST_SLACK's drift both ways, the fallback guard
past the cursor radius, and no allocation in Candidates.
- Docs: the DRAG-1 dot positions split by the side E comes from, a DRAG-15 step
for a long parent, the module-map test rows rewritten for A6-A8, the wider-
child limitation qualified (more than a third wider), and a new limitation:
the dots show footprints touching while the drop joins blocks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 1b1a5c34655f52e9d6be55c2c96caf570d2d7e40
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 22:11:08 2026 +0530
DD-13R: the rest pick holds only a child let go where it rests; a wide child reaches its end pair (#22)
The rest-pick exception in beats() kept a hit on the current parent from
ever re-attaching by the pair Snap.Nearest picked where the drag began,
however far the child had moved. For a child wider than its parent that
pick is a real and different pair (the end pair, its center in the last
third), so a drop could never reach it without detaching first.
The exception now applies only while the current pair's vector is within
REST_SLACK (2 UIParent units) of where it rested (currentPair's new
`moved`), which still covers the equal-width let-go it was written for.
New test: a 200-wide child under a 100-wide parent, moved 10 left, attaches
by TOPRIGHT>BOTTOMRIGHT. DRAG-15 gains the matching smoke step, data-flow
describes the narrowed rule, and known-limitations notes that a child wider
than its parent aligns backwards by thirds (A7 measures its center).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit ffc2a34a8153892aff7580ad9a4b2af10238a9b6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 22:04:20 2026 +0530
DD-13: side first, align by thirds, on what you see; the leeway is 128 (#22)
Addendum A7, A8, A9 (the owner's second smoke round: the middle pairs never
won, the dots sat on the placeholder, 64 px was far too little).
A7: Snap.Nearest no longer takes the nearest pair of points. For each side of
each target, the gap between the child's facing edge and that side decides
(|gap| <= C.SNAP_RADIUS, the spans overlapping with the target's widened by
the radius; a touch is no overlap), then the child's center over the side cut
in thirds picks the start, middle or end pair (a border goes to the middle).
Rank by |gap|, ties by target id then table order; dist is |gap|.
A8: every rect is the container's visible footprint: its block (the hang rect
with its fallback for a target, the anchor for the dragged one, the hang
frame with no fallback for the leeway's parent) with its strip and name label
taken in while each is visible and reads plainly (Snap.Footprint). The pick,
the dots, the line, the box fallback and the leeway all use it; where a drop
attaches is unchanged.
A9: C.DETACH_RADIUS = 128.
Not settled by the addendum: a hit on the current parent never re-attaches by
the pair the pick gave where the drag began (beats, noted in BeginDrag), so a
child as wide as its parent and stored by its start pair (Automatic) holds
when let go where it rests, though centered it picks the middle pair.
Tests: the thirds on all four sides for equal widths, a third's border, a
point-wide target, the gap and widened-overlap rule, footprints on each
growth with the label and unreadable parts, Find and the dots on strips, the
box over the footprint, the rest pick, and the leeway figures at 128. Docs:
ARCHITECTURE, data-flow, known-limitations, module-map, smoke cases DRAG-1,
2, 5, 9, 15, 16, 17 and their history row, test-cases, badge; a moved
Constants citation in schema.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit fbcd5c9e7bc459ffe50ecd2fdfb5432db32665d8
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 21:44:32 2026 +0530
DD-12: the mark repaints the target strip's own edge and gives its gold back on every end path (#22)
Addendum A6. A5's overlay (a frame of ours SetAllPoints on the strip) never showed in game, most
likely because the client voids anchors into the restricted tree the strip hangs in. The overlay is
gone: the mark now repaints the strip's OWN edge 2px in its color through NS.Style.DrawEdge (the
painter the widget drew it with, the same four textures), and paints the widget's gold back
(Anchors.STRIP_EDGE, 1px 1,0.82,0 at 0.6, named once beside the other strip numbers) when the mark
moves to another strip or hides. At most one strip is ever off its gold. Every end path runs through
hideHighlight (no pair, Shift, combat, a strip hidden mid-drag, the drop, EndDrag from a cancel or a
Destroy of the dragged container), and ContainerClass:Destroy now calls Snap.ReleaseStrip so a
target destroyed mid-drag is not kept dormant with a green strip. The box fallback for a target with
no visible strip is unchanged.
Tests pin the repaint, no frame of ours anchored to a strip, no repaint per tick, the restore when
the mark moves, and the restore on each end path (drop, out of range, Shift, combat, either strip
hidden, either container destroyed, a profile switch). DRAG-1 and DRAG-17 updated; data-flow,
ARCHITECTURE and module-map follow; test-cases regenerated, badge 2000/2000.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 5bd587fa7acf1a261dae9eb11aa2522b58f0eb5b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 21:33:40 2026 +0530
DD-11A: addendum A6-A9 from the second smoke round (#22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit e9dfb4e26f7ca85591e62a0accfb6ea24c28dbf5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 21:21:24 2026 +0530
DD-10: M4 checkpoint row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit c8f5d616b0c1aa03e3538b60c8a81261e844b629
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 21:16:04 2026 +0530
DD-11: the mark colors the target's strip edge instead of boxing its placeholder (#22)
Addendum A5: while a pair is shown, the target's drag-handle strip (for a
hold or a detach, the current parent's) gets a 2px edge in the mark's color
(green, or red past the leeway) over its own 1px gold one. The edge is an
overlay of ours, Snap.stripEdge, a plain frame hung by SetAllPoints on the
strip in the highlight's TOOLTIP strata and painted with Style.DrawEdge:
no Backdrop, nothing read off the strip, the strip's own edge never touched.
It is re-hung only when the target changes and taken off the strip when the
mark moves or hides. A target with no visible strip falls back to the old
box over its rect (Snap.box), so a mark is never lost; a hold or a detach
with no readable parent rect keeps A4's single-dot mark and still edges the
parent's strip. The dots and the line are unchanged.
Docs: ARCHITECTURE, data-flow, module-map, known-limitations and README
describe the strip edge; smoke-tests DRAG-1 to DRAG-5, DRAG-8, DRAG-9,
DRAG-15 and DRAG-16 corrected, DRAG-17 new; test-cases regenerated and the
badge at 1999/1999.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit a4169af41c68dab904e47c28f6f36eb3d9bdf00d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 21:07:18 2026 +0530
DD-10A: addendum A5, the mark on the target's strip (#22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit fb8ffcba9962a287845bd3e5b147b01e495cee88
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 21:04:35 2026 +0530
DD-10: DRAG-15's Shift step states the geometry that tells Shift from a tie (#22)
A and E are Text containers of one width, so with E's top middle under
A's bottom middle all three of A's bottom pairs, E's own included, are
equally near: the strictly-nearer rule kept E's pair without Shift too,
and the step passed whether Shift worked or not. It now narrows E by 40
to 80 px, checks first that the middle pair takes E without Shift, then
repeats with Shift for the hold and the snap back.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 9b578365d181970caa70da80d444a062f2d3ea25
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 21:03:32 2026 +0530
DD-10: a before-side pair is moved out past its parent's strip and name label (#22)
The three outside pairs on a parent's before side (the drop "above" a
parent growing down) placed as free pairs, X/Y alone, flush on the block
edge: exactly where the parent's strip and name label sit (out past V0).
The child covered the parent's name, locked or not, and its strip while
unlocked. attachSpec now moves such a pair out by the parent's own
furniture rows (beforeRoom: its strip while shown, its label while
shown, in the parent's scale), the mirror of the room an after follower
makes for its own furniture, and PlaceAttached also re-places followers
when that room changes. Every other free pair still places at X/Y alone.
Owner call to confirm at smoke time (DRAG-16): the addendum's A2 says the
before-side pairs take "no seam gap"; this adds room for the parent's
furniture only, no seam gap. A pair picked by hand that puts a child
flush above its parent moves too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit f7830d87d8de698d600c730430a5164e40d2a7b6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:59:41 2026 +0530
DD-10: pin that a container whose parent has no live instance detaches with no hold (#22)
classify's "a parent with no live instance leaves nothing to hold on" was
documented but unpinned: returning "hold" there left the suite green, and
such a container could then never be dragged off a deleted or disabled
parent. A drop case now pins it (checked red under that mutation).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 2b734a6f14cd73ff36aec8be32b56982eac09c5f
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:58:30 2026 +0530
DD-10: a hold or a detach is drawn on the rect the leeway measured, or as the child's dot alone (#22)
The mark for a hold or a detach was drawn on Snap.TargetRect, which falls
back to the parent's one-element anchor, while the leeway measured the
whole block with no fallback; a parent that read nothing showed no mark
at all, so a detach by cursor travel never turned anything red, and a
hidden parent was boxed at its last rect. currentPair now keeps the rect
it measured (nil for a hidden or unreadable parent), markRect draws on it,
and with none the whole mark collapses onto the child's dot, green then
red. Also pins the hidden-parent branch of the leeway, which no case
reached (removing the IsShown gate left the suite green).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 7226bc9b01c102d081fad7fe800e16f0995551f5
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:56:19 2026 +0530
DD-10: the detach leeway runs from where the container rested, not from its bare join (#22)
Place never sets a follower on its bare join: the seam gap, its own strip
and label room and its X/Y nudge, all in its own scale, lie between. The
leeway measured the bare join, so a container with a label at scale 1.5,
or nudged 70 off its parent, was red the moment its drag started and a
release in place detached it. Snap.BeginDrag now reads the current pair's
vector before the lift, where the settings put it, and the hold measures
the nearer of how far that vector has moved and the bare distance itself,
so dragging a nudged child onto its parent's point still holds. With no
rest vector (the child read secret at the start) the cursor's travel
stands in, as for an unreadable parent. The known limitation this
removes is gone from known-limitations.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 37c8c6bfde35bf8b53eb7b8ab388aa2cd32cc824
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:53:06 2026 +0530
DD-10: a drag never re-attaches by its own pair, nor by a secret parent's one-element fallback (#22)
classify's step 1 let any snap hit win while the current pair had no
distance, which is always the case when the parent's block reads secret.
Snap.Find then measured that parent on its first element, so a child
resting under a one-row parent was in range of its own pair: the release
rewrote container.attach with x and y 0, losing the nudge, instead of
snapping back. beats() now refuses the current pair itself and every pair
of a current parent that has no distance, and otherwise keeps the
strictly-nearer rule.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit da1d7accdc3684dbbd1e72af2ec757841a7298f2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:37:37 2026 +0530
DD-09: an attached container holds within a 64-unit leeway, turns red past it, and snaps back if let go sooner (#22)
Owner feedback, addendum A4. New C.DETACH_RADIUS (64 UIParent units) and
C.DETACH_COLOR (red). For a container attached to another, the tick and the
release share one classify: another pair in snap range wins (green, a release
attaches) only when strictly nearer than the container's current pair; else
the current pair (Anchors.AttachPoints, its own point now to its parent's on
Anchors.HangFrame) holds while at most DETACH_RADIUS apart (green on that pair,
a release snaps back through Anchors.Place, writes nothing, logs "drop: held
(leeway)"); else the box, both dots and the line turn red and a release
detaches (D6). Shift suppresses the other pair only. A parent that does not
read (hidden, or its hang frame secret) holds while the cursor has moved less
than DETACH_RADIUS from the drag start; it is never measured on the
one-element anchor fallback, which would read a multi-row parent as red at
rest. Screen-container drags and combat are unchanged. Snap.Tick now answers
the shown pair and its state. The strip tooltip's attached line explains the
red marks and the snap back.
Tests: hold, the 64/65 bound, red and back to green, another pair beating the
hold, Shift with hold, a pair only as near as the current one not taking it,
the cursor fallback in UIParent units, a secret parent block, a screen drag
unchanged; at the drop, snap back writing nothing, detach past the radius, the
release classified afresh, Shift within the leeway, the unreadable-parent
fallback, the held line, the tooltip. Docs: ARCHITECTURE, data-flow,
module-map, debug, known-limitations, README; smoke DRAG-5, DRAG-9, DRAG-11,
CONT-9 corrected, DRAG-15 new, Pending sign-off updated; schema.md's
Constants citation moved; test-cases regenerated, badge 1989/1989.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 087591766faf40781a23e284c5e9b747bb88fa8b
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:23:24 2026 +0530
DD-08: a 10px join dot on each side of the pair and a line between them (#22)
Owner feedback, addendum A1 and A3. The parent's join dot grows from 6px to
10px; the highlight now also puts a dot of the same size on the dragged
container's own point of the pair and a 2px Line region (CreateLine on the
highlight, both ends set against UIParent) between the two dots. The dots are
child frames of the highlight and the line one of its regions, so they show
and hide with the box and are never toggled on their own. One helper,
paintHighlight, colors the box, both dots and the line, and repaints only when
the color changes, so DD-09 can switch the whole mark to red in one call.
Tests: the dot size, the child dot on its own point at the parent's size, the
line's two ends and thickness, one color for all parts, both dots and the line
parented to the highlight, everything following a new pair, and a before-side
(free) pair drawn top-to-bottom. CreateLine mocked in tests/wow_mock.lua and in
the region recorder. Smoke: DRAG-1 corrected, DRAG-16 new.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 518339a550b89dcd09939a74034009d9477baaf7
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:14:48 2026 +0530
DD-07: a drop picks among the twelve outside pairs by mirror, independent of growth (#22)
Addendum A2: Snap.Nearest no longer searches the nine growth-relative sides.
It scans the twelve outside pairs (each of the target's four sides, its start,
middle and end point, joined to the child's point mirrored across that side),
ties to the first target in id order and then the table order. The answer
gains `side` and names the token the pair classifies as under the target's
flow growth, nil for a before-side pair, which places as a free pair (G5).
FoldPoints is unchanged. The drop's [Anchor] line now names the pair and its
token or "free". Tests for the twelve and their mirror under two growths, the
table-order tie, a before-side Find and drop; docs and DRAG-1/DRAG-2 follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 9dc1ffc17d375d02e4e816fdf591ec2739013dcc
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 20:08:05 2026 +0530
DD-06A: addendum from the owner's smoke feedback (#22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit b8a932ad9086b6ab2072017936f427d0038213f2
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:58:21 2026 +0530
DD-06: M3 checkpoint row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit bc2d1096e42852150c74beaa7055b6161ff8bf5a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:52:22 2026 +0530
DD-05: the cursor-jump bound, a performable DRAG-4 and smoke checks for the fixes (#22)
The cursor fallback in lift() was documented as "a jump of at most its own
size", but the player grabs the strip, which sits outside the block (past a
shown name label, and wider than a narrow element): a 16 px bar can jump about
28 px, 48 px with its label. known-limitations, smoke DRAG-9 and the Snap
comment now give the real bound; the spec's correction is recorded under
"Review corrections (DD-05)".
DRAG-4 asked to drag A over its own followers, which travel with it; it now
checks that they never light up while A or B is dragged. DRAG-12 to DRAG-14
cover a drop between pulls in a key, a dropped side surviving a growth
change, and a drag cut short by /am lock.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 64d7361fc23faa05721d4faa102febacffc5a91c
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:50:33 2026 +0530
DD-05: a named-frame container with no frame name yet says it cannot be dragged (#22)
The strip tooltip's frame branch needed a non-empty frame name, so a container
just switched to Named frame (the mode written, the name not yet) fell through
to the screen line, "Drag to move. Drop it on another container...", a drag
beginDrag refuses. The branch is keyed on the mode alone now, with its own
line for the empty name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 3820874df1a8d6c1a07c02c86e8f1cc487249d98
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:49:00 2026 +0530
DD-05: pin the id-order tie and the quiet move along a chain (#22)
Two lines no case could fail: table.sort(order) in Snap.Candidates (the
mock's dense ids made pairs walk them in order anyway) and `confirmed = same`
in NS.AttachByDrop (the only case kept the same target, so no chat line was
ever reachable). One case walks the instances backwards through pairs and
checks the tie keeps the lower id; another moves a container onto another
follower of its own parent and checks nothing is said in chat. Each was
confirmed red under its mutation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 3a6e09bff1954dfece4358ed7eb4e538ffb34ad9
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:46:37 2026 +0530
DD-05: the attach popup refuses a target deleted while it was up (#22)
The GC-1 popup has no timeout and its OnAccept checked only combat; the
Parent container row's validate lets a missing id through (WouldCycle finds
no loop). Deleting the target while a drop's popup was up, then accepting,
wrote mode container on a missing parent, and Place sent the container to a
stale screen position. OnAccept now re-checks that the target still exists
and otherwise writes nothing and says why in one gray line.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 2cbc794a0db0f20dafc9279519a6bb5ee4419928
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:44:33 2026 +0530
DD-05: a drop folds its pair to Automatic only whole (#22)
Snap.FoldPoints folded each half of the picked pair on its own, so a drop on
a side sharing one point with Automatic stored a mixed pair (ahead-start under
right/down as nil > TOPRIGHT). Once the parent's growth or a Text parent's
justify moved Automatic, that pair resolved to a degenerate one (TOPRIGHT >
TOPRIGHT under Grow Left) and the child sat on the parent's first element.
A drop picks a whole side, so the pair now folds to nil, nil only when the
whole of it is Automatic's, and is otherwise stored absolute.
The spec gains a "Review corrections (DD-05)" section recording this and the
two placement fixes before it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 1487c65f319fd451a0dc6495fabac11e014d1c51
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:42:38 2026 +0530
DD-05: a drag whose strip hides mid-drag is canceled, and Destroy ends a live drag (#22)
Only the strip's OnDragStop ended a drag, and the client sends none to a
strip hidden mid-drag (/am lock, a stand-down, a disable or a profile switch
run while the button is held): `dragging` stayed true, so Anchors.Place
ignored the container until its next drag, and the driver kept ticking.
Snap.Tick now cancels a drag whose strip is not visible, once out of combat:
StopMovingOrSizing, Snap.EndDrag and a Place from the stored settings, with
nothing written. ContainerClass:Destroy stops and ends a drag still live on
the instance it tears down. The drag suite's handles are shown, as an
unlocked profile shows them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 1777c8c43c4766b46bfb4f8c58424cf10ef09ab6
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:39:27 2026 +0530
DD-05: a drop places the container at once, and a combat drop is re-placed when combat ends (#22)
dropOn waited for the apply a written attach's CONFIG_CHANGED queues, but
ContainerManager holds applies while auras are secret as well as under
lockdown (CM.MustDefer), and a drag runs between pulls in a key with no
lockdown: the dropped container stayed loose on UIParent while its settings
said attached. It now calls Anchors.Place whatever AttachByDrop answers.
An attached container dropped in combat is held, and Snap.PlaceHeld puts it
back on its parent at PLAYER_REGEN_ENABLED, rather than relying only on the
held RequestApply.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 7a0958ddc259aea5383202fe57ebf13acd764583
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:21:34 2026 +0530
DD-04: strings and docs for drag to attach (#22)
The strip tooltip's how-to line (tooltipSpec, modules/Anchors.lua)
follows the spec's Strings: a screen container reads "Drag to move.
Drop it on another container to attach it there; hold Shift to place
it without attaching. Right-click for settings."; one attached to
another container names its parent ("Attached to '%s'. Drag it away to
detach it, or onto another container to attach it there; ..."); a
frame-attached one is unchanged. A container-attached one whose parent
is gone reads as a screen one, since it drags all the same. The retired
"Drag to move. Right-click for settings." key leaves enUS.lua. The
comments on C.ATTACHED_NAME_COLOR and handleParts now say the gray
means attached, not "cannot be dragged". Layout > Anchor's Attach to
description says a drop attaches and a drag away detaches.
Docs: ARCHITECTURE (file counts 56/20, Anchors_Snap's load-bearing
position, the drag and drop path, the limitation summary), module-map
(the Anchors_Snap row, its load order, the Anchors row's beginDrag and
Place guard, rows for the three new suites), known-limitations
(frame-attached containers still do not drag; the lift jumps to the
cursor where the anchor reads secret; a target whose engine reads
secret is measured by its first element), data-flow (the tooltip
lines, the positions read, a new "Drag to attach" subsection), README
(usage, Place it, two troubleshooting rows), settings-panel, scope,
debug (the [Anchor] drop lines), midnight-quirks (the lift is the one
re-anchor). Smoke tests: DRAG-1 to DRAG-11 in the Layout section and
its index, CONT-9 corrected for the new tooltip lines, all listed under
Pending sign-off, none marked passed. schema.md's Constants citation
moved with its line.
One new case (test_anchors_handle.lua); two assertions updated to the
new lines. docs/test-cases.md regenerated, badge 1966/1966.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 01ceed431672de8801a2204ee580229a84ffe996
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:10:25 2026 +0530
DD-03C: M1 checkpoint row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 912d2be1f82e23cbc7837880dd6abe4d14777d84
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 19:05:48 2026 +0530
DD-03: the drop attaches, asks first or detaches (#22)
Snap.Drop (modules/Anchors_Snap.lua), the handle's OnDragStop, now
decides from the drop itself: combat, Shift and the candidate are read
again at the drop. A candidate in range with no Shift builds the D7
section (a copy of the stored attach: mode container, the target, the
picked side's points folded to nil where they equal Automatic, x and
y 0; frame, point and relativePoint kept) and hands it to
NS.AttachByDrop, published from settings/Layout.lua. It writes the
section, or, when the chain the drop joins flows differently (GC-1),
shows the AURAMASTER_ATTACH_FLOW popup carrying the section as its
data, so the existing OnAccept writes it whole; the drop then re-places
the container where its stored settings put it. A drop that only moves
a container along the chain it already follows asks nothing and prints
no flow line.
An attached container dropped with no candidate, or with Shift held,
detaches (D6): Anchors.SavePosition (which now answers whether it
stored) writes the position, then the attach section with mode screen
and x = y = 0, the target and points kept. A position that reads secret
is not stored, so it does not detach and goes back to its parent. Combat
started mid-drag attaches nothing (D11): a screen container stores its
position as before; an attached one writes nothing and asks for a
silent apply, which waits for combat to end and re-places it then.
Every outcome writes one [Anchor] line (drop: attach to <id> <token>,
detach, moved, held (combat)).
container.attach joins Schema's SECTIONS, and the CONFIG_CHANGED path
joins Anchors' FLOW_PATHS and ContainerManager's PARENT_PATHS, so a
whole-section write re-applies the followers and the container it
names, as a leaf write to the mode, target or points does.
New suite tests/test_anchors_drop.lua (11 cases); DD-02's attached-drop
case is superseded there; schema cases updated for the new section.
docs/schema.md's section list corrected; five doc citations moved with
their lines. docs/test-cases.md regenerated, badge 1965/1965.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit f2e9618bbd140e90bcf659db0c88ea32ac8ea46a
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 18:51:56 2026 +0530
DD-02: drag lifecycle for drag to attach (#22)
canDrag in modules/Anchors.lua becomes beginDrag: a screen or a
container-attached container drags (never a frame-attached one, never in
combat), and on a yes it hands the container to Snap.BeginDrag, which
lifts a container-attached anchor onto UIParent before StartMoving
(BOTTOMLEFT at its GetLeft/GetBottom where they read plain, else its
center under the cursor over its effective scale), sets
container.dragging and starts the snap driver. Anchors.Place returns
early while dragging is set (answering placedAs or "screen"), so a
visibility pass, PlaceAttached or an apply cannot yank the anchor back.
modules/Anchors_Snap.lua gains the driver (one plain frame, OnUpdate
armed only while a drag is live, Snap.Tick at most every 0.03s, no
candidate while Shift is held or in combat), the highlight (a plain
frame under UIParent at TOOLTIP strata with Style.DrawEdge's 2px strips
in C.SNAP_COLOR, no Backdrop) and its 6px join marker, both built on the
first drag and shown only with a candidate. The handle's OnDragStop now
calls Snap.Drop: it ends the drag (dragging cleared, OnUpdate cleared,
highlight hidden), then a screen container saves its position as before
and a container-attached one is re-placed from its settings out of
combat. Attach, detach and GC-1 at the drop are DD-03's.
IsShiftKeyDown joins the mock and .luacheckrc. New suite
tests/test_anchors_drag.lua (11 cases); the handle case that held an
attached container still now holds a frame-attached one.
docs/test-cases.md regenerated, badge 1955/1955.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit e6d59892937bc6048ddca394da18c510c2d94840
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 18:41:11 2026 +0530
DD-01: snap core for drag to attach (#22)
New modules/Anchors_Snap.lua (TOC after Anchors.lua, with its own
LOAD-BEARING note): Snap.PointAt and Snap.Nearest, the pure core that
picks the nearest of the nine classified sides under the target's flow
growth within C.SNAP_RADIUS (ties keep the first target in id order and
the first side in ATTACH_EDGES order); Snap.Candidates and Snap.Find,
which read eligible targets (enabled, anchor shown, not self, not a
follower by WouldCycle) on the frame a follower would hang from, guarded
through Secrets.NumberOr, in UIParent units, with an unreadable engine
falling back to the target's anchor; and Snap.FoldPoints, which stores
each half of the picked pair nil where it equals Automatic for that
child on that target.
Anchors.HangFrame is published from targetFor so the snap reads the very
frame a drop would hang from; Anchors_Attach hands EDGE_PAIRS and its
flow growth to the snap through NS.AnchorsAttach. C.SNAP_RADIUS (24) and
C.SNAP_COLOR join core/Constants.lua. Two doc citations moved with the
lines (docs/schema.md, docs/data-flow.md). New suite
tests/test_anchors_snap.lua (15 cases) and a load-order pair;
docs/test-cases.md regenerated, badge 1944/1944.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit a33458268927d7875292b3fe36213074c39635a1
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 18:32:59 2026 +0530
DD-00: design and plan for drag-and-drop container attachment (#22)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 8a94011e3d43434b14dc8f0bb8c5eb614be71f34
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 18:17:47 2026 +0530
SI-12: doc sync before merge; FILT-53..63 passed (owner)
Doc sync against the branch's code: the Situations tab draws Unit type first
(module-map's Filters and test_pages_situations rows, settings-panel's section
order, ARCHITECTURE's tab summary, and FILT-59's stale closing clause); the
warnings gap is noted on OptionsSetup's module-map row; the Filters section
heading counts its 56 rows (46 + the ten Situations rows); ARCHITECTURE's
module map counts 19 modules, 55 authored files.
The owner reported FILT-53 to FILT-63 passing in game on 2026-10-02: each
Result line records it and their two Pending sign-off rows are removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 8a94011e3d43434b14dc8f0bb8c5eb614be71f34
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 18:17:47 2026 +0530
SI-12: doc sync before merge; FILT-53..63 passed (owner)
Doc sync against the branch's code: the Situations tab draws Unit type first
(module-map's Filters and test_pages_situations rows, settings-panel's section
order, ARCHITECTURE's tab summary, and FILT-59's stale closing clause); the
warnings gap is noted on OptionsSetup's module-map row; the Filters section
heading counts its 56 rows (46 + the ten Situations rows); ARCHITECTURE's
module map counts 19 modules, 55 authored files.
The owner reported FILT-53 to FILT-63 passing in game on 2026-10-02: each
Result line records it and their two Pending sign-off rows are removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 3013669fcff0a2dbd61e13bf9c82761efe26ce17
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 18:03:04 2026 +0530
SI-11: Unit type first on the Situations tab; a gap under the orange warnings on every Filters tab
Owner request (2026-10-02, from an in-game screenshot): the Unit type section moves to the top of
the Situations tab, above "Where spell lists don't apply" and "Show in"; and the orange warning
lines no longer run straight into the first section: Helpers.RenderWarnings leaves a
Helpers.WARNINGS_GAP (10, the addon's section gap) under them, only when a warning is drawn. It is
the one place that orange text is drawn, so the gap applies on every Filters tab. The Options stub
carries a zero WARNINGS_GAP for parity. Tests first; docs, smoke checks and citations moved.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit e8a6c7a25da6d9a509d2b3caf57e9766a5c311cf
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 16:20:00 2026 +0530
SI-10: checkpoint row for the owner addenda (SI-08..SI-10)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit dbb62e0f779d2aeca0934170182788663ec152eb
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 16:19:46 2026 +0530
SI-10R: regenerate docs/test-cases.md after staging SI-10's new files (the prose case names the tracked-file count)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit c65b430ca911d35f5894822079a9afb33b3ce904
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 16:12:55 2026 +0530
SI-10: the Situations tab's Unit type gate (addendum S6): Unit type and Reaction on target and focus
Adds the addendum spec (docs/superpowers/specs/2026-10-02-filter-situations-addendum-unit-filter.md).
filter.unitFilter = { kind = all|npc|player, reaction = all|friendly|neutral|hostile } joins
CONTAINER_TEMPLATE (All / All, backfilled by the load pass; Copy -> Filters, Duplicate and Defaults
carry it), with two validated rows in the Situations group taking the visibility effect.
NS.Compat.UnitReactionKind(unit) bands UnitReaction(unit, "player") (>=5 friendly, 4 neutral, <=3
hostile), pcall + CanAccess, nil when unknowable (shim 26). ContainerClass:ShouldShow now reads
(not locked) or previewing or (visibilityAllows and zoneAllows and unitAllows): target and focus
containers only, no unit or an unknowable answer allows, hiding through ApplyLive's combat-legal
SetEnabled. ApplyVisibility records the answer (unitOpen); CM.ApplyUnitGate re-runs the pass for
containers whose answer moved, from OnUnitSwap and the existing UNIT_FACTION / UNIT_FLAGS view frames
(target, focus, player); nothing new is registered.
The Situations tab ends with a Unit type section after Show in: Unit type and Reaction on target and
focus, "Always your own character or pet." on player and pet containers. Locale strings; README
usage and FAQ; settings-panel, ARCHITECTURE, data-flow, module-map, schema, compat-layer,
midnight-quirks (UnitReaction), performance; smoke checks FILT-60 to FILT-63 (FILT-59 now ends with
the section); new suites test_container_unitfilter and test_unitfilter_settings; docs/test-cases.md
regenerated, badge 1928/1928. luacheck 0/0, no function above CCN 15.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit dab6af18df7e683c17151bbdda0361eb7d04eb48
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 15:54:37 2026 +0530
SI-09R: rename a local that shadowed the fresh() helper (luacheck W431, slipped into 0ac2310)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 0ac23101e45f875a133d520da17fbaef80d070ec
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 15:54:00 2026 +0530
SI-09R: a rebuilt engine starts clean; Update's stale path and the filter-string resend tested
Review of d012a75: Build left a retired engine's viewStale on the fresh one (an unneeded full
resend and a false "stale=yes"); Build now clears it. New cases pin Update marking the view stale
on a refused setter and resending in full, and the retry resending every filter string (the two
views share them here, so only the forced resend sends any). Four mutations verified red in a
scratch copy outside the repo.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit d012a75de86d4ef84ddb22974d8d0376cadf8fac
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 15:45:36 2026 +0530
SI-09: a refused view setter leaves the view stale and resent in full; diagnostics print the active view
ApplyView and Update recorded a view switch even when the engine refused a setter (callEngine
pcalls and logs it once), so /am diagnostics could name a view the engine did not hold. Now a
refused setter sets inst.viewStale; the next switch or update resends every group's filter string
and candidate filters in full and clears it. The [Plan] spell-list line adds "stale=yes", and each
group line prints the filters of the view the engine holds (NS.Container.ViewOf) instead of always
the ids view's, which made a remainder group read as "match nothing" on enemies.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 016d2874ef9d4b4838f5c767b7216396d9917db0
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 15:41:58 2026 +0530
SI-08: "Castable by you" becomes "Castable/Dispellable by you", with Blizzard's definition
Blizzard's RAID filter is "helpful auras the player can apply and harmful auras the player can
dispel", and on an enemy it also flags buffs the player can remove: a hunter could not see an NPC's
Enrage (Bloodsurge) in an "Every aura, once" container because this row, named for the player's own
casts, was set to Hide. Owner decision (2026-10-02): keep the behavior, rename the row and quote
Blizzard's definition in its tooltip; the README FAQ says it covers dispellable enemy buffs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 6ef717306eb5e5e0d0b4c37c2a93ce9b65536103
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 14:14:54 2026 +0530
SI-07: M3 checkpoint row (full battery green)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 9a7d825639064569d032dec46dc6b8bda2e342cd
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 14:08:49 2026 +0530
SI-06: warnings, notes and the Situations tab point to the setting that decides
Under the default "Every aura, once", three texts promised what only the
blizzard view does:
- The orange identity warnings (FC.WARN.IDS_*) ended "Only Blizzard
categories set to Show draw."; they now end "The Situations tab picks what
draws there." The plan never reads the Situations settings, so the
sentence names no view.
- The debuff spell-list note under Categories said a Hide leaves only the
Blizzard Show categories; it now says the Situations tab picks what draws.
- The honor line now names Duration: "Only auras with a duration" rides on
the base, so the every view honors it.
The player/pet debuff dropdown gets its own tooltip instead of the On players
one, whose parenthetical is dropped. README (Usage, FAQ, the orange-line
FAQ), known-limitations, settings-panel and smoke checks FILT-30/51/59
follow; FILT-59 quotes the Duration option as the dropdown reads. debug.md
says a Situations write logs a [Filter] line only when the view moves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 3ca93db0fc7b913024999506b08a71e93ad5fe9d
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 14:04:51 2026 +0530
SI-06: true red-under notes for the diagnostics and Situations-page cases
The diagnostics case could not tell inst.view from a fresh resolve: at every
assertion the two agreed. It now stores npcs = "blizzard" past the view
effect and asserts the line still says view=every situation=npcs (checked by
making planLines print ResolveView: red).
The player/pet buff timeless note named literal-mode keying, which that case
cannot catch; it now names what it guards, the note drawn outside the
where-spell-lists-don't-apply branch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit f14543d2b700bafa3bf56e6bdf13b87fedf94195
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 14:03:56 2026 +0530
SI-06: freeze the owner-profile proof's category inputs at 5b6c9f2
F.master recorded every spells-kind group's whole shipped spell list, while
F.categoriesFor built the compile context from the live NS.Categories. The
next edit to a shipped list would have failed the byte-identity proof with no
view regressed. The fixture now carries F.shipped, the shipped definitions at
5b6c9f2 cut to what the compiler reads, and builds the context from it alone.
Checked by adding an id to the live Offensive cooldowns list: the proof stays
green.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
commit 75120924f952cda45475a8ccdb5bee6b1dbdc1ef
Author: Tushar Saxena <tushar.saxena@gmail.com>
Date: Fri Oct 2 14:01:51 2026 +0530
SI-06: the stand-up re-resolves player and pet debuff views; a true broadcast guard
standUpContainers moved the views of target and focus containers only. A
player or pet debuff container's view now follows its Players setting, and a
Situations write made while stood down reaches no view effect, so it kept the
stale view until the held apply ran (an M+ key: the whole run). The stand-up
now re-resolves player and pet containers too.
The "moves only the container it names" case could not see a broadcast: the
other container's stored setting resolved to the same view. It now stores
"blizzard" on the other container past the effect, so a broadcast moves it
(checked by mutating CM.ApplyViews' match).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X7u34U99DrEPHJTMx6E6u8
This mod has no additional files

