NEWS


SemNetCleaner 2.0.0

Full rebuild of the package's internals (see REFACTOR_PLAN.md for the phase-by-phase development record). Every pre-2.0.0 exported name still works -- see "Backward compatibility" below -- so existing scripts do not need to change. The package had zero tests before this rebuild; it now has an extensive testthat suite covering every exported and internal function, including scripted-input tests that drive the full interactive spell-check wizard end to end.

New functions

Real bugs fixed

More than 60 confirmed correctness issues were found and fixed across every phase of this rebuild; the full numbered list (with reproductions) lives in REFACTOR_PLAN.md. Highlights:

Backward compatibility

Every pre-2.0.0 exported name is kept working via R/legacy.R, calling straight into its new-named replacement:

| Old name | New name | |---|---| | bad.response() | bad_response() | | best.guess() | best_guess() | | bin2resp() | binary_to_responses() | | qwerty.dist() | qwerty_distance() | | read.data() | read_data() | | resp2bin() | responses_to_binary() |

textcleaner(), convert2snafu(), pluralize(), and singularize() keep their original names -- no wrapper needed.

Shiny companion app

automated_edit() -- the manual spell-check review app launched mid-pipeline by correct_changes()/textcleaner() -- is fully rebuilt (see SHINY_PLAN.md for the development record). It now takes the data to review as a real R argument (automated_edit(automated)) instead of round-tripping it through a tempdir()/CSV file, which fixes a real, confirmed bug (a hardcoded Windows-style path separator broke the file read on Linux/Mac) at the root instead of patching the join, removes a concurrent-session file-collision risk, and makes the app's server logic unit-testable via shiny::testServer().

Spell-correction enhancements

best_guess() gains a phonetic (Metaphone) disambiguation signal alongside its existing QWERTY-keyboard tiebreak, closing a real gap: a word like "graple" differs in length from both of its plausible corrections ("grape", "grapple"), so the existing same-length-only QWERTY check couldn't disambiguate them, but Metaphone resolves it instantly. QWERTY and phonetic are evaluated as peers -- agreement reinforces the answer, disagreement falls through to manual review rather than arbitrarily picking one (e.g. a "gremble" typo of "grumble" has QWERTY pick "tremble" while Metaphone correctly picks "grumble"; neither is trusted over the other). @references gains a Philips (1990) Metaphone citation. hunspell and phonics move from Suggests to Imports, since both are reachable from textcleaner()'s own default pipeline.

Point-and-click wizard: textcleaner_shiny()

A new Shiny app wrapping the entire textcleaner() pipeline end to end -- upload, options, automated spell-check, manual spell-check wizard, corrections review, download -- as a point-and-click alternative to the interactive console wizard. Every console menu option is a real clickable button, plus a free-text box for typing a custom word/string directly; the "GOOGLE WORD"/"GOOGLE STRING"/"GOOGLE IT" options open an embedded in-app search (DuckDuckGo -- a real Google results page cannot be embedded via iframe at all) instead of a new browser window. Built directly on the console wizard's own save/resume mechanism, so none of spellcheck_menu()'s decision logic is reimplemented -- see SHINY_PLAN.md for the full design record, including two real, additive-only fixes this required in already-tested code: spellcheck_dictionary()'s saved resume state gains a $pending field describing the next decision's render context, and a new build_answer_burst() closes a genuine hang hazard in how many answers a single button click must supply. automated_edit() (the automated-changes review step) is reused here as an embedded, namespaced sub-module rather than rebuilt, via automated_edit_ui()/automated_edit_server()'s new id = argument. A new prepare_automated_for_review() closes a real bug found via live browser testing (a "non-conformable arrays" crash reviewing automated corrections) by extracting correct_changes()'s own automated- matrix padding logic into a shared, exported function. advance_wizard(), build_answer_burst(), wizard_menu_labels(), wizard_response_letters(), and make_shiny_search_fn() are also newly exported -- every one of these, textcleaner_shiny()'s own wizard module needs to call by name from outside the package namespace. promises added to Suggests; minimum shiny version raised to 1.8.0 (for shiny::ExtendedTask). The package's own startup message now points new users at textcleaner_shiny().

Dependency changes

Internal