Since we have no idea when the LR 4 SDK documentation might arrive, I started reverse-engineering changes to photo:getFormattedMetadata() and photo:getRawMetadata(). Here are the differences I've observed between LR 3.6 and LR 4.1 RC2:

photo:getFormattedMetadata()

gpsAltitude is now in feet rather than meters:

"2500.0 ft" rather than "762.00 m"

I don't know if this is localized to each country.

photo:getRawMetadata()

The representation of photos not in a stack has changed. In LR 3.6 it is:

countStackInFolderMembers = 1,

stackInFolderMembers = {--table: 3

[1] = LrPhoto( id "14000" )},

stackPositionInFolder = 1,

topOfStackInFolderContainingPhoto = LrPhoto( id "14000" ),

In LR 4.1 RC2 it is:

countStackInFolderMembers = 0,

stackInFolderMembers = {},

stackPositionInFolder = 1,

LR 4's representation is inconsistent but more memory-efficient.

At last, there's pickStatus!

0 = unflagged

1 = flagged

-1 = rejected

I haven't tested whether pickStatus can be changed via photo:setRawMetadata().

@Lr4.0, Lightroom would not convert all entries from 6.6 to 6.7 - only when one goes to view or make an adjustment. I'm really not sure what-all prompts it, I just noticed they've been sorta disappearing over time...

So, YES - any robust code must be able to recognize 6.6. I've gotten away with assuming it's identical to 6.7, but obviously there could be some differences or there wouldn't have been a different number in the first place.

I mean, I discovered it via error messages in my code that was originally not recognizing it.

I wish Adobe would have just converted all entries when reading a beta catalog, so there would not be this issue, but alas, that is not the case.

Almost all the mechanism is already present: photo:getDevelopSettings() returns the a photo's current crop settings, and LrApplication.addDevelopPresetForPlugin() lets a plugin create new presets. The only problem is that develop presets don't allow crop settings.