Skyveil Retail 1.1.0-beta
==============================================

Skyveil for World of Warcraft retail (Midnight 12.1.5, interface
120105). A separate addon from Skyveil 2.3.0 for Forever; it uses the
same shared code and the same SavedVariables name (SkyveilDB), in its
own folder, SkyveilRetail.

It drops chat from players in a guild whose name contains a needle you
add, runs your chat rules, mutes, alerts, Guild Command, the roster, the
debug report and SkyveilSync, and Layers (shards) (Beta). No needle is
set until you add one. Filtering is local. It sends nothing to the
server except a /who when you ask, the declines you turn on, the addon
messages you press Send for, as guild master a guild rank rename you
press Send for, and what LAYERS (SHARDS) (BETA) below says: your Share
line on each press, layer requests, invites, accepts, group leaves,
joining and leaving the SkyveilLayers channel and, as host, the lead
pass (PromoteToLeader) of leave order 3. Nothing else.

Every send site in this release, and nothing else: (a) SkyveilSync's
one-shot -LocalLlmHint / --local-llm-hint, only when you run it, sends
one report's first line, state line and errors once to a model on your
own computer (127.0.0.1, ::1 or localhost), then exits; (b) the
website help bar's Tier 2 bridge to Ollama or llama.cpp on your
computer, only when you turn it on and press Ask; (c) the browser's
built-in model, only when you turn it on (it runs inside your
browser); (d) the /who, decline, Guild Command and Layers sends above.
Hints, /sv ? and /sv debug send nothing. No cloud service is called.


INSTALL
-------
The zip has two folders: SkyveilRetail and SkyveilSync. Put
SkyveilRetail in Interface/AddOns, so it is
World of Warcraft\_retail_\Interface\AddOns\SkyveilRetail with
SkyveilRetail.toc inside. SkyveilSync is optional and does not go in
AddOns; see SkyveilSync/README.txt. Do not install it next to Skyveil (Forever)
in the same client folder. Type /sv to open the options.


RETAIL CLIENT
-------------
Retail 12.x hides some game data from addons as secret values and
blocks some sends. Skyveil Retail checks for each, by feature, and
never reads a secret value:
- Chat lockdown (a Mythic+ run, a PvP match, an instance encounter):
  chat lines arrive secret and addon messages and chat sends to other
  players are blocked. Skyveil lets secret lines through unfiltered,
  holds Guild Command sends ("the client blocked the message; press
  again later") and refuses layer presses and Share.
- Inside an instance, creature names, IDs and GUIDs are secret. Skyveil
  takes no layer (shard) reading there and skips secret names, guilds
  and IDs on nameplates and tooltips.
- Removed globals are reached through their retail calls:
  C_ChatInfo.SendChatMessage, ChatFrameUtil.AddMessageEventFilter,
  C_PartyInfo.InviteUnit and LeaveParty, C_AddOns.GetAddOnMetadata,
  and the Settings panel by its category ID.
- The Skyborne veil is kept but matches no one: Skyborne is a Forever
  race.

Retail self-checks (Layers tab and /sv layerlog, 2 s after login):
R1: retail client: the game reports the retail project.
R2: chat filters: the chat filter API exists.
R3: addon messages: C_ChatInfo send exists and the SKYV prefix is
    registered.
R4: options: the panel is registered in the game's Settings.
R5: channel: join, look up and send to SkyveilLayers exist.
R6: secret values: the game's secret check exists.
R7: group: invite, accept and leave calls exist.


WHAT WORKS WHERE
----------------
                         Forever (Skyveil)   Retail (Skyveil Retail)
Skyborne veil            yes                 matches no one
Guild needles, mutes     yes                 yes; secret data skipped
Chat rules and filters   yes                 yes; secret lines pass
Alerts, roster, stats    yes                 yes
Guild Command            yes                 yes; held in chat lockdown
Layers view and hop      yes (layer)         yes (layer (shard)), outside
                                             instances and lockdown
Debug, SkyveilSync       yes                 yes; records the client


SLASH COMMANDS
--------------
/skyveil and /sv open the options. Every command (also /sv help all):

/sv options — open the options panel
/sv config — open the options in a movable window of its own
/sv stats — blocked-line counts: today, 7 days, 14 days, top channels and
    rules
/sv on — lower the veil
/sv off — raise the veil
/sv toggle — flip on or off
/sv cross on|off — guild master cross next to names (display only, on by
    default)
/sv inspect — race id, file, GUID and guild of your target
/sv status — nearby, Skyborne, guild and rule counts
/sv clearcache — forget remembered Skyborne names and GUIDs
/sv forgetids — forget learned race ids
/sv forgetguilds — forget learned guild names
/sv guild add|remove|list <text> | guild note <text> = <note> | guild expire
    <text> 7|30|90|never — match text inside a guild name; a needle can
    carry a note and an expiry
/sv mute Name — hide that player's chat on this client
/sv unmute Name — undo a hand mute
/sv word add|remove <text> — hide any message containing the text (a rule
    in every channel)
/sv alerts [trigger|output] on|off | alerts <trigger> <output> on|off |
    alerts cooldown N | alert test — alerts on your client only: chat
    line, sound, raid-warning-style screen text, flash; 10 s cooldown, one
    per 2 s (off until you turn them on)
/sv roster on|off|show [n]|find Name|summary|clear — guild join, leave and
    rank log; names kept as salted hashes (off until you turn it on);
    summary counts ranks and recent activity
/sv minimap on|off — show or hide the minimap button
/sv setup [scope=full|names|chat] [gold recruit links lfg nonlatin spam
    repeats minimap] [profile=shared|character] — setup in three steps:
    veil scope, presets, profile mode
/sv groupwarn on|off — a line when a member of a veiled guild joins your
    group (names the guild only)
/sv who — one /who for a guild needle (5 s cooldown)
/sv layers [share on|off|host on|off|off|block Name|unblock Name|cap 1-3]
    — Layers (shards) (Beta): open the tab; share, host, off, block a name, host
    invite cap (off until you turn them on)
/sv layerlog — this session's layer events, 200 lines (memory only,
    cleared at logout except a saved debug report's copy)
/sv debug — debug report to copy; Save and reload saves it to the
    SavedVariables file (last 5 kept)
/sv ? <words> | hint <words> — search Skyveil's help on your client;
    prints at most 2 lines, only when you ask
/sv private help — Guild Command: Private (beta, off until you turn it on)
/sv help [page|all] — this list, ten lines a page
/sv rule add word|contains|starts|link|item|wild|nonlatin <text>
    [scope=trade,say,...] [highlight] — add a chat rule
/sv log [n] — show the last blocked lines (memory only)
/sv reveal N — show one blocked line
/sv unblock N — turn off the rule that hid line N, exempt its guild or
    unmute its sender
/sv exemptguild <guild> — never veil a guild by needle (same as unblock on
    its line)
/sv unexempt <guild>|list — remove a guild exemption, or list them
/sv spam off|low|normal|strict — spam filter for public chat
/sv repeats on|off|<seconds> — hide the same line from the same sender
    within the repeat window (30 seconds by default, 5 to 600)
/sv lowlevel N|off — hide whispers from players below level N when their
    level is known
/sv exempt friends|guild|group on|off — who is never hidden by rules
/sv export — print a share string of your rules
/sv import <string> | import apply [merge|replace] | import cancel — check
    a share string, preview every rule, then apply it
/sv preset <name> [apply] — preview a preset rule pack; add apply to add
    it
/sv profile list|use <name>|copy <name>|delete <name>|rename <new
    name>|reset — settings and rules per profile; each character picks one

A key binding for toggle is listed under Key Bindings → AddOns → Skyveil.


LAYERS (SHARDS) (BETA)
-------------
/sv layers opens the Layers tab. Sharing and hosting are off until you
turn them on.
Skyveil reads your layer in a zone from the ID of a creature you target
or mouse over.
Share joins SkyveilLayers, a visible chat channel. Each Share press posts one
line with your character, zone and layer. Anyone in that channel can
read it.
The list shows layers in your zone that sharers posted, how many hosts
are on each, and how old the post is. Older than 15 minutes is removed.
Click a layer to ask a host on it for an invite. One press every 10
minutes. If the hop reverts, that press retries with the next leave
order, up to 3 invites, each from a host with room under its cap.
Hosting: anyone can host while they can invite: solo, party leader with
under 5 in the party, or raid leader or assistant with under 40 in the
raid. A host's Skyveil invites the character who asked, up to 3 per
minute, never a blocked name. When the host cannot invite, Skyveil
refuses requests at once; the listing changes on the host's next Share
press or leaves the host count after 5 minutes.
You must be solo to ask. Your Skyveil accepts only the invite from the
host you asked, within 30 seconds.
After the hop, the group step runs and Skyveil reads your layer again.
It shows Hop held or Hop reverted. After a revert it tries the next
leave order at once: you leave, then the host leaves first, then the
host passes lead first. In leave order 3 the host leaves when the game
shows the asker as group leader (PARTY_LEADER_CHANGED), or after 5 s.
The order that holds is kept until /reload. A solo host leaves the
group; a grouped host stays in their group. If the game blocks a part,
Skyveil turns that part off and the Layers tab names it. When no
reading is live, the Layers tab shows the last shard seen this
session, marked stale; it is kept in memory only and is never shown as
a live reading.
/sv layerlog shows this session's layer events. It stays on your
computer and is cleared at logout, except the last 200 lines a saved
debug report copies (see DEBUG REPORT).
A join can move the host's whole group to your layer. Hosting in a group
puts your group's layer at stake.
Block a name with /sv layers block Name. /sv layers off stops sharing
and hosting at once. Skyveil does not ask, invite or auto-accept a
player your veil covers: a muted name, a veiled guild's member or a
remembered Skyborne.
Layer lists stay in memory for this session. Saved: your on/off choices
and blocked names as hashes.

Self-checks. The Layers tab and /sv layerlog show what each check
found this session:
T1: leave order 1 (you leave): your layer 10 s after leaving equals
    the target.
T1a: leave order 2 (host leaves first): the same reading.
T1b: leave order 3 (host passes lead, then leaves): the same reading;
    fails if the lead pass is blocked.
T1g: grouped host: your layer read after the asker joined equals your
    layer before.
T2: layer (shard) reading: creature IDs carry a shard field, and two
    different values were seen. Unchecked while every creature ID read
    was secret (inside an instance); never faked.
T3: hosting: the invite call ran from a request with no click.
T4: auto-accept: the accept call ran and you joined the host's group.
T5: auto-leave: the leave call ran and you were out of the group.
T6: sharing: a Share line was sent and your own line came back on
    SkyveilLayers.
T7: assistant hosting: as raid assistant, the invite call ran.


DEBUG REPORT
------------
/sv debug opens a report to copy (Ctrl+A, then Ctrl+C). It has the
addon version, client build, your settings, the last 200 layer log
lines, the hop and self-check results, whether you can host, and Lua
errors from Skyveil's own files, with times. Other players appear as
hashed IDs. It has no chat text and no guild roster. At most 64 KB;
the oldest log lines go first.
After the version and client lines comes one state line: state:
addon=<folder> ver=<version> errs=<count> T=<checks> R=<checks>. Each
check is its id and a code: P pass, F fail, U unchecked, - not run, H
held, V reverted, r read, s sent, c called, K kept, M moved. R is n/a
on Forever. The state line has no names, GUIDs or layer numbers.
Save and reload saves the report, including the last 200 layer log
lines, to the SavedVariables file
_retail_\WTF\Account\<account>\SavedVariables\SkyveilRetail.lua and
reloads the UI.
A report is also saved there at each logout and /reload. The last 5
are kept. /sv debug sends nothing. Skyveil keeps a copy of errors from
its own files and passes every error on to the game's error handler.
SkyveilSync (in the download, optional) copies each saved report to a
"Skyveil Reports" folder on your computer. See SkyveilSync/README.txt.
On retail the report also has the line
"flavor: Retail (WOW_PROJECT_ID 1) interface 120105 build <build>" and
"addon: SkyveilRetail".


HINTS
-----
The options panel ends in one muted hint line from your current state
and an Ask box. On retail: a chat lockdown, or an instance while the
Layers tab is open. On the Layers tab: Share and Host off, or the next
leave order after a reverted hop. /sv ? <words> and /sv hint <words>
search Skyveil's own help on your client and print at most 2 lines,
only when you type them. The hint changes on game events and tab
changes only. Hints send nothing and never name players.


CHANGES
-------
1.1.0-beta
Quiet hints: one hint line and an Ask box at the bottom of the options;
/sv ? <words> (or /sv hint) answers in at most 2 lines, only when you
ask. /sv debug reports carry a state line. Leave order 3 waits until the
asker shows as leader (5 s at most). Layers shows the last shard seen,
marked stale, in memory only. SkyveilSync writes
SKYVEIL_LATEST_RETAIL.txt, a copy of the newest retail report, and has a
one-shot --local-llm-hint for a model on your own computer. Nothing new
is sent unless you run the one-shot hint.

1.0.0-beta
The first retail release, a beta.
