Seems it is possible to add new items to the game using the TESnip approach. The trick, it would seem, is to get new items to store in saved games. I added some armor and with a little work was able to purchase it, craft it and enchant it. But its gone when loading from a save, whether in my inventory, a followers, or just lying on the ground.
One flukey thing I noticed was the Full Name field appears to be encoded somehow. I can edit as a string and it appears properly named in game, but the viewer identifies the entry as an invalid ID. It seems to read as corrupted even if I don't edit the field (just save with TESnip). The viewer properly reads the Full Name field on vanilla armor, but it seems to be mapped somewhere that I cannot find.
Have you made any progress towards persistence in-game?
If by "the viewer" you mean Skyrim Viewer, that's because the current release was going off of old information about the FULL and other related fields. See my response below:
I suppose this is the right place though OT from the current discussion. I've created my own fork of TESsnip to allow editing of ESP files and ESM files without FOMM. What I noticed is that the FULL substructure changes meaning depending on whether its an ESM or ESP file. When its an ESM, the strings are an integer used to lookup into the files in the Strings folder where there are English (at least for me) versions of the strings. When the file is an ESP, the FULL structure is just a normal string embedded in the file. TESsnip was never designed for this kind of behavior and was rather cumbersome trying to make work but I got enough of it going to make my own armor placeholder with custom description.
I really like the idea of the strings being externalize but would be nice for ESP as well without having to convert everything to ESM files.
Actually, that's not entirely true. We've decoded this a bit more:
bit 7 (hex 0x80) in the TES4 record header is the 'isLocalized' flag. If this flag is True (which it is in Skyrim.esm and Update.esm), then this tells the engine that any field of type 'lstring' (aka, localized string) should be a 4 byte number referencing the string entry in the .DLSTRING, .ILSTRING, and .STRINGS files for that mod. If the flag is False, it means that any field of type 'lstring' should be a zero-terminated string. Also, those string files can be packed into BSA's as well, so it's a [censored] to look them up if you're doing it with an external program.
The 'lstring' type fields I've found so far are FULL, DESC, RNAM, CNAM, BPTN, DNAM, ALFD, ANAM, TNAM