Do you mean you can use osascript in the plist itself?
This is what I actually did, in the end:
Step 1: have launchctl load and run the plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.applehelpwriter.duplicate-bin</string>
<key>ProgramArguments</key>
<array>
<string>/Users/sphil/bin/duplicateBin</string> -- this is shell script file
</array>
<key>StartInterval</key>
<integer>86400</integer>
</dict>
</plist>
Step 2: run the file /Users/sphil/bin/duplicateBin
This contains one line: osascript ~/bin/AppleScripts/duplicateBin.scpt
Step 3: run duplicateBin.scpt
This is a standard AppleScript file with handlers and variables that does the work I actually want done.
Now, I could have cut step 3 and just written a Bash script to do the job that the AppleScript was doing, but since I didn't realise any of this till after I'd already spent time writing and testing the AppleScript, I guess I'll just keep it as it is.
However, if there's a way to get from the plist directly to the AppleScript that'd be worth doing. One less operation to invoke = one less thing to get broken!