Development Timeline

"Nothing in the world can take the place of Persistence. ... Persistence and determination alone are omnipotent."
- Calvin Coolidge

When you're slaving away on any long-term effort, there may come a time when you're a few months into it but nothing much actually works the way you want it to, and all you can see is the huge gulf between your current position hip-deep in mud and your original vision high in the clouds. At this point it's really easy to get discouraged, to lose sight of your overall goals, to feel that you're not getting anything accomplished, and to prematurely conclude that the whole project is and always was pointless.

There are many techniques which can help defend against this danger, one of which is to log the completion of every development task, even the little ones that seem trivial but which eat up inordinate amounts of time and energy. With that kind of work-log, you can look back and objectively see how much you've accomplished and how far the project has come, so I keep such a log for JIFFEE.

While I seriously doubt that anyone will care about the details of this timeline, I'm posting it here so that if you're contemplating anything similar you can get some little inkling of what you're getting into. The purpose here is not to scare you away from large projects; on the contrary, the purpose is to increase your chances of success by helping you embark on any such project with realistic expectations so you don't needlessly abandon your quest half-way up the mountain.

To add a bit of perspective, I call this "long-term" but not "large-scale" development, because after spending many years working for big software shops, "large" to me means over 1 million lines. At under 10,000 lines JIFFEE is still well within the realm of "small-scale," but with a single developer working in spare time even that can take years to really get right.

For those who don't care to read every line, here is an executive summary of a few of the points that can be gleaned from the log:

And now, without further ado, here is the log:

All ye code warriors with courage enough to gaze upon the dragon, cast off your rose-colored glasses and behold the glorious, gruesome path of software development.

= 2007-02-10 (and following week)
- started JS adventure game
- worked a lot more on JS adventure game
- kept working on JS adventure game
- worked more on JS adventure game
- worked more on JS adventure game
- worked more on JS adventure game (JIFFEE), created googlepages site for it
- worked a lot more on JIFFEE (wrote 1st two parts of Tutorial)
- kept working on JIFFEE
= 2007-02-22
- Put a redirect on JIFFEE landing page to home.html (to use jiffee.css)
- Split tutorial chapters into individual files (ch1-ch4)
- Created CSS, got blue borders and copyright text to all work
- Verified that all formatting was removed to CSS
- Modified all HTML pages to say <html lang="en">
- Added "alt" tags for both jpgs (accessibility)
- Re-organized links on home page
- Fixed lost italics ("anything") on home page
- Created landingpage template (jiffee.html)
- Modified the landing page to load both jiffee.js and jiffee-en.js
- Modified links to JS files to make them always go to main website.
- Added "language=javascript" to all three script loads
- Created sunny-day.js and .html
= 2007-02-24
- Changed blockquote to blockquote class=code (3 example desc *not* code)
- Removed explicit accessor method, just use thing[] now
- current line count: 1800
= 2007-02-25
- Learned about JS objects/ctors/inheritance/subclassing
- Replaced asterisk convention with thing[].trait and thing[].cmd
= 2007-02-26
- Added exception handling that reports to screen, even for init-time errors
= 2007-02-27
- Added connect/disconnect/connected w/ wild cards
- Removed startinglocation, contents, location
- Replaced moveto() with put()
= 2007-03-03
- refactored look/where to report_loc_long/short
- made first Location created the default starting location
- changed relationship routine names from "connect" to "relate"
- changed so any command can suppress final location reporting
= 2007-03-04
- added detection for "source file didn't load" (no starting location)
- revised tutorial ch1 to keep in sync w/ code
- uploaded latest stuff to
= 2007-03-05
- long discussion about JIFFEE w/ Jason (in Kirkland)
= 2007-03-06
- learned how to use JSUnit
= 2007-03-08
- changed language=javascript to type=text/javascript (code & docs)
- converted underscores to mixedCaseVarNames
- validated (and fixed) documentation html and css files
- wrote unit tests for part of main library
= 2007-03-09
- installed jsUnit and created skeleton structure for full test suite
- debugged why IE doesn't run (IE won't take trailing comma in object literal)
- restructured to use "var jiffee = new Game()" to make testing easier
= 2007-03-10
- finished unit tests for relationship library
= 2007-05-28
- did redesign of cmds/items structure
= 2007-06-03
- wrote up a "design philosophy" page
= 2007-06-06
- converted sunny-day.js to setTrait()/command() notation
- fixed up synonym replacement to do whole words (or phrases) only
- added more detailed room descriptions to sunny-day.js
= 2007-06-07
- stripped out Location/Item subclassing - replaced by traits and "createXXX" functions
- restructured run() to use apply() - uniform application of every command to Things
- set up predefined look/where cmds for locations
- set up predefined examine/where/inventory cmds for items
- added "take XXX" (but not quite working yet)
= 2007-06-08
- debugged get/put
- restructured run() to use an "earshot" list to avoid double-execution
= 2007-06-09
- got inventory/apply/execute sorted out, w/ proper return values
- added map/dust to sunny-day
- added simple default get/put response
- made synonyms work for deletions
= 2007-06-10/11
- added item logic, filled out enough to play through the whole game (map/flower/key/chest)
- uploaded latest stuff (including a playable version of sunny-day) to googlepages
= 2007-06-12
- split out language-dependencies into jiffe-en.js
- added links to home page to do FIGS+C/C translations of all documentation
= 2007-06-13
- added navlinks to all pages, especially to include backlinks to site home page
- worked on filling out descriptions/commands
- wrote the "how to play" page, and linked to it from the Sunny Day intro
= 2007-06-14
- added more detail to descriptions
- added an "intro" to first display of kitchen description
- changed "synonym" to "interpretAs()"
- fixed door bedroom/bathroom to be sw/nw
- fixed door to attic to include a description of opening the door and
	going up the steep, narrow stairs into hot, still air
- fixed "open lock", "unlock lock", etc. to be same as "unlock chest"
- made puddle display as a funky-smelling soggy spot in rooms w/ floor=="rug"
- made sure "empty pitcher" == "pour water"
- expunged all English from jiffee.js (esp checks for "look", "where", etc.)
- it's working! so I finally showed it to Rosemary
- 2007-06-15
- got a french version working
- 2007-06-16
- showed Sunny Day to Zhao laoshi at YCIS
- showed Sunny Day to Bob M
= 2007-06-17
- more work
= 2007-11-22
- more work
= 2007-12-08
- prepared and showed preliminary demo of JIFFEE to Winnie
= 2007-12-09
- email a link to Winne
= 2007-12-26
- worked all day
= 2007-12-27
- more work
= 2007-12-29
- more work
= 2007-12-30
- more work
= 2008-01-03
- worked all day
= 2008-01-04
- worked all day
= 2008-01-26
- cleaned up encoding class
= 2008-01-27
- wrote cookie class
= 2008-01-28
- cleaned up cookie class
= 2008-01-29
- more clean-up of cookie class
= 2008-02-03
- wrote Util (Error, IOBuffer) class
= 2008-02-07
- updated Encoding and Cookie classes to use Util.validate/error
- wrote and tested Parser class
- started writing Agenda class
= 2008-02-08
- reverted to com.michaelkenniston.jiffee namespace
- fixed all Error handling to use "if !e.isJiffeeError"
- modified method definition syntax to match Style Guide (use prototype)
- made all private data/methods use trailing_ convention
= 2008-02-09
- finished testing Agenda class
- started State class
- moved all current source and test files to "src/", renamed files consistently
- changed "string" to 'string' (to conform to style guide)
= 2008-02-10
- split addVarTrait into addRangeTrait and addEnumTrait, added addRefTrait
- continued working on State class impl and unit tests, finished initial set/get
= 2008-02-11
- tightened name validation and weird name checking
- found and fixed bug w/ state encoding
= 2008-02-12
- set up URL redirect from to
= 2008-02-15
- started jiffee-mod-base and jiffee-controller
- did some cleanup on Encoding ("trait" -> "var") API
- started extending State unit tests
= 2008-02-16
- restructured State (untangle set-fixed/change-changeable vs. arb/ref/etc types)
- added delta callbacks from state to agenda
- did a little debugging, finished unit tests for State
- got jiffeelib-base and unit tests almost done
= 2008-02-17
- make Set() be consistent w/ Get() - same 3 required args, makes code clearer
- added State.find(trait, value) returns nounSset (avoids many->many
	combinatorial explosion of my original "related" design
- changed xxxEvent() to notifyXXX()
- wrote Controller and unit tests
- made parser split multi-lines first, added getRaw() and getParsed() to Controller
- made controller create player, is-place, location, etc.
- made controller echo each command (sanitized) before execution
- added type-checking for noun/trait input to whenCommand/whenChange
= 2008-02-18
- wrote Priorities class and unit tests
- more style fixups - all args on one line, or each arg on own line
- status: 19 files, 3826 lines, 78 unit tests, all green
- integrated string-priorities into rest of the code
- fixed to auto-start Priority, State, Agenda
= 2008-02-19
- began restructuring to eliminate all globals and use error codes
- updated util, cookie, encoding w/ new structure
- got rid of i/o buffering in util (belongs in controller)
= 2008-02-23
- installed JSDoc (had to apt-get htmltemplate-perl)
- started converting modules to JSDoc
= 2008-02-24
- continued restructuring, adding JSDoc comments, switching to using e.jiffeeCode
- changed trigger wildcards from undefined to '*'
- changed 'base' priority to 'normal'
- made get return undefined if slot does not exist (can use "get()||default_value")
- finished restructuring VM, 4116 lines, 73 unit tests, all green
= 2008-02-27
- got lib-base to pass tests
= 2008-02-28
- started unit test for "game"
= 2008-03-01
- removed "noun" from command-triggers
= 2008-03-02
- changed jiffee-xx to jiffeevm-xx
- got rid of implicit clearTodoList() - call it explicitly if you need to
- changed "perform" to go down a stack of performers
- moved Place/Person/Thing logic from state/controller into libbase
- added connect() to do a quick bidirectional connection
- added isNoun(), isTrait() to state
= 2008-03-08
- worked on CT course outline while kids were at Sutton
= 2008-04-12
- worked on JIFFEE while kids were at Sutton
- added in/inside/out/outside to move options
= 2008-04-16
- tracked down some bugs, added some code to prep for Citizen Teacher class
= 2008-04-19
- worked on JIFFEE while kids were at Sutton
- started fixing jsdoc comments (libbase were missing @member)
- fixed bug where command would match on prefix/suffix: "^foo|bar$" instead of "^(foo|bar)$"
- added "don't know how" command
- added "help" command
= 2008-04-22
- verified/tested that first command does a "longLook"
- merged "undefined/don't know how" back into wolf version
- merged bug fix for prefix/suffix recognition back into wolf version, and added tests
- merged "help" command back into wolf version, added test
- got all unit tests running again
- got jiffee-game.html debugged, w/ proper error handling
- added python script to build a single big jiffee.js file
- set up mit*.js/html files, uploaded to googlepages
- made errors thrown during game definition (initial js load) show up
= 2008-04-23
- started teaching JIFFEE in CT apprenticeship
- fixed *Look() routines so the longdesc can detect 1st-call (to print an intro)
= 2008-04-24
- installed todos and added to packaging script to convert line breaks to DOS format (in .js/.html files)
= 2008-04-26
- fixed priority levels and tests - setPriority was backwards
- added unit test for connect() - now up to 82 tests (all passing)
- split "help" handling into prefix/cmds/suffix
= 2008-04-27
- added localize() i18n/l10n code to lib-base, w/ tests
- uploaded new crossroads.js and mit.js to googlepages (w/ kids' copyright notice)
- added "inventory" and "examine" commands, with tests
- added "get" and "put" commands
= 2008-04-28
- added more unit tests: here(), "get", "put"
- added code to strip out a/an/some/any/the
- cleaned up some L10N code
- cleaned up awkward phrasing for nouns that don't exist or are not present to get/examine
- added subpriorities in todo lists to honor order of whenXXX() calls, added test
- uploaded latest mit.js to googlepages (ready for class on Wed - 90 tests all passing)
= 2008-05-01
- changed names: "whenXXX()" to "addXXXTrigger()" to more accurately reflect function
- changed name of clearTodoList to clearActionList
- updated jiffee-game.html (template) w/ new stuff from mit.html (e.g. footer)
- updated HTML error trapping to report jiffeeCode if present, else FireFox JavaScript Console reminder,
	and debugged the behavior under different conditions (alas, no unit test for this one)
- put quotes into 'never seen any "x" around here'
- made "inv" command put "<br>" between items.
- made short-look and long-look both display stuff that is at that location
= 2008-05-02
- changed "help" command to special case - append to a global string instead of multiple triggers
- changed equal-priority ordering to LIFO so later (specialized) actions will override earlier (more general)
- added addLocalCommandAction() to baselib
= 2008-05-03
- worked on updating sunny-day to JIFFEE v2
- changed addLocalCommandAction to j.command(), make it trigger for both places and things-in-earshot
= 2008-spring
- taught a 10-week Citizen Schools apprenticeship (training, classes, meetings)
- read Chris Crawford book
- started reading Twisty Little Passages
- downloaded and started reading docs for Inform-7
- picked out and ordered a Win98 box for compatibility testing
- received and set up Win98 box (tortoise)
- wrote rough draft of a "motivations" document explaining "why JIFFEE?"
= 2008-08-21
- figured out why all JS test failing (FF3 bug), found workaround, all 94 pass
- changed all jiffeevm -> jiffee, since everything is just a module
- converted util to Checks
- wrote a Translate module
= 2008-08-22
- started converting all modules to stand-alone classes, i.e. *not* mix-ins
- attended Citizen Schools meeting at work
= 2008-08-23
- continued converting modules to stand-alone objects, almost done
= 2008-08-24
- continued conversion, hit a snag on callbacks losing their context
= 2008-08-25
- converted all callbacks to closures to maintain object context
- renamed xxxCmd() to doXxxCmd()
- cleaned up performXxx() names
- finished converting to stand-alone objects, all 95 tests pass!
- split "Help" module out of Base
- made perform() always take exactly 2 args (changed opt_event to event)
= 2008-08-26
- split Persons module out of Base
- split Places module out of Base
- split Things module out of Base
- refactored the whole clearActionList business (it was breaking modularity):
	- the agenda is a FIFO queue of jobs
	- a job is a priority-queue of tasks
	- a task is an {action, event} pair
	- perform(task) returns true/false
	- doXXXCmd(event) returns void, can use actionCount, call clearJob()
- all 106 tests passing (now have a bit over 6000 lines of code)
- double-checked that no jiffee-base code or tests got lost during splitting
- emailed Ellen re: helping instruct Citizen Schools IF class
- cleaned up start/freeze/buildChunks terminology, all => start
= 2008-08-27
- made each module take "language" function as ctor arg
- split Display module out of Controller
- collapsed localize_() into and cleaned up error-checking
- merged useful parts of Translator and tests into Display
- added literal pass-through w/ sanitizing
- all 107 tests pass, lines of code = 6362
- renamed Game => Engine, split out of example game
- changed base priorities from 'normal' => 'pre-command, command, post-command'
= 2008-08-28
- cleaned up module-starting code
- reverted priorities back to just => 'normal'
- added game/phase triggering to Controller to provide hooks for persistence
- wrote Persistence module (resume/save/restore/restart) and tests
- made getFingerprint() return String instead of int
- all 115 tests pass, lines of code = 7010
= 2008-08-29
- added checks.requires() and tests
- restructured all module ctors to use context objects and checks.requires
- made all language (en_us) routines take 0 args, use this.context.parser etc.
- cleaned-up:  perform(action, event) vs. action_function(event)
- made sure long/short-desc, dirs, carrying/present are perform'ed properly
- added tests for places/things perform'ing descriptions
- removed fingerprint-checking from Encoding (used only in cookie names)
- started writing Barnyard
- did some nasty debugging of missing stuff during final integration
- all 121 tests pass
- basic Barnyard nav working
= 2008-08-30
- renamed Slots => Traits
- renamed traits.addXXXTrait() => addXXX() (as prep for noun split later)
- started work on the Verbs module
- tested current version of Barnyard on an XO - it works fine!
= 2008-08-31
- started writing Verbs tests
- fixed bug: strips only first 'the/a/an' etc.
- finished Verbs module
- all 136 tests pass, 8257 lines of code
= 2008-09-01
- populated events w/ (plus doc, plus test)
- broke cyclic dependency Verbs <--> Places/Persons by moving definition of
	player and location to into Verbs
- made Persistence use Verbs
- modified verbs.add() to take priority and 3 help strings
- changed internal form from "north" to "go north"
- made Places use Verbs
- make Things use Verbs
- got Barnyard working (2 to be fed, 2 babies to rescue, veggies for pie)
	using new verbs/overrides to minimize if/then/else logic
- posted jiffee.js, barnyard.js/html to googlepages (which are being
	discontinued; have to check out "sites")
= 2008-09-02
- found and fixed bug (used reserved word "delete" as a method name)
- smoke-tested Barnyard on: Ubuntu/FF3, Ubuntu/Opera,
	XP/FF3, XP/IE, XP/Opera, XP/Safari, and XP/Chrome (works on all 7)
= 2008-09-03
- discovered Google Pages is shutting down, looked at Google Sites, won't
	work for JIFFEE web site
- did some research on how to include sound in web pages
- set up mini-hosting, transferred files from,
	pointed at
= 2008-09-04
- created and, pointed at sonic site,
	tested email to both
- changed all "com.michaelkenniston.jiffee.XXX" to "com.jiffeegames.XXX"
= 2008-09-06
- messed around with URL-framing and 'target="_top"' but it was too ugly
- rewrote home page, got set up w/ URL-forwarding
- collapsed Crossroads into one file (but left as J2), posted it
- made a copy of MIT syllabus doc and linked to it
= 2008-09-07
- added more material to whyjiffee.html
- posted current (imperfect but workable) barnyard and sunnyday games to web
= 2008-09-08
- fixed ULR redirect on -> instead of /jiffee
= 2008-09-09
- did apprenticeship fair at MIT
= 2008-09-10
- decided that StartActions.add(string or loc) just adds complication
	better to just places.add("intro"), set "look" to a function that
	prints intro and moves player
- removed all references to
- made "<meta charset=utf-8" stuff come right after <head> in html files
- added new-format intro to Barnyard
= 2008-09-11
- got a better translation from Xiaohui for the tapestry in Sunny Day
- added a hint about needing veggies for dinner to Barnyard
= 2008-09-14
- started restructuring Engine class (while kids swam at Sutton)
= 2008-09-14
- continued restructuring Engine class
= 2008-09-15
- finished first pass of Engine restructuring, got all 137 tests green again
- created a favicon, figured out how to link it, posted it to live site
= 2008-09-16
- taught Citizen Schools apprenticeship week 1
= 2008-09-17
- changed <mod>.name/dependencies to NAME/DEPENDENCIES
- added "locator" param to all <mod>.init() functions
= 2008-09-18
- changed Engine to take [shortName, fullyQualifiedName] pairs as dependencies
- changed Engine to pass a real locator function to <mod>.init()
- all 138 tests green
= 2008-09-19
- added first draft of syntaxerrors.html and errorcodes.html
- added engine.addStdLibs()
= 2008-09-20
- added test for engine.addStdLibs()
- added all JSDoc comments to Engine
- fixed all file names to be hyphenated
- cleaned up top-level structure (removed jiffee.html, created example*.*)
- created build and generate-starter-files scripts
- converted Barnyard to use example*.* as a pattern
- wrote and tested Score module
= 2008-09-21
- tracked down a bizarre bug with an unerasable cookie
- all 146 tests green
- added Score to barnyard
= 2008-09-22
- requested access to (to admin
= 2008-09-23
- taught Citizen Schools apprenticeship week 2
= 2008-09-29
- wrote skeleton for Footbridge game, posted to website
- tested on all 5 browsers, worked on 3 (FF, Op, Chr)
= 2008-09-30
- taught Citizen Schools apprenticeship week 3
= 2008-10-04
- tracked down IE bug (trailing commas in array-initializer lists)
- started using, cleaned up all lint in JIFFEE source
- installed MS Web Developer Express to help debug IE bugs
= 2008-10-05
- tracked down another IE bug (string[pos] instead of charAt(pos)) w/ MWDX
- installed jsunit on wolf-XP
- installed cygwin on wolf-XP (for ssh to
- extended build script to create zip archive of whole website
- ran jsunit w/ IE, Safari, Opera, and Chrome
- found and fixed a bunch more bugs, now have clean jsunit on all 5 browsers
= 2008-10-06
- started "musings.txt" file
= 2008-10-07
- taught Citizen Schools apprenticeship week 4
- fixed broken link and typo in syllabus.html
- fixed misformatted help strings for save and restore
= 2008-10-08
- found a compass rose for footbridge game
- went to Citizen Schools debrief/dinner
= 2008-10-11
- tracked down "last" bug - IE and Safari lose their cookie state on
	browser restart, but all jsunit tests pass.  The fix was to use
	expires= instead of max-age= due to IE incompatibility.
- downloaded latest "footbridge" to wolf/games dir
- renamed generate-* to build-* so that all the scripts are "build scripts"
- wrote build-upload to ftp the zip to sonic, then ssh and unpack the zip
- updated build to auto-update the "page last updated" in html files
- got rid of all DOS-formatting of files on wolf
- removed fancy "initial caps in different color" on home page
= 2008-10-12
- added "set -e" to all build scripts to make them more robust
- added Google Translate gadget to home page
- tested: translate widget - works great!
- tested: IE save-target-as on example files, they edit perfectly in Notepad
- tested: IE save-target-as zip, everything edits in Notepad
- tested: state persistence across browser restarts, all 5 work on WinXP!
	(IE, FF, Safari, Opera, Chrome)
- fixed home page title and h1 to include domain name
- set up yahoo groups for jiffeegames-teachers, jiffeegames-players,
	jiffeegames-announce, jiffeegames-authors
- set up jiffeegames @yahoo email (mostly to block any squatters)
= 2008-10-13
- created jiffeegames @gmail and @aol emails, tested them
- created jiffeegames on youtube
- created jiffeegames @hotmail, tested it
= 2008-10-15
- loaded Firefox 1.0, 1.5, 2.0 onto wolf/XP
- all unit tests pass on FF1.0/1.5/2.0/3.0.3
- wrote up testing.html and browsers.html (so as not to forget hard-learned
= 2008-10-16
- installed and tested versions of Opera 3-8 on XP, only 8.0 and up work right
- included jsunit version number in browsers.html
- in testing.html, added a third option (i)
= 2008-10-18
- reorganized web site, made Home much smaller, split material into
	Resources for Players/Authors/Teachers/Developers/General
- made a sitemap.html and added it to the head of all the breadcrumb trails
- checked license, then packaged jsunit with zip file
- tested old Netscape versions
= 2008-10-19
- tested NT browsers, found IE6 bug and fixed it
- added (year) to each item in testing.html (latest copyright on browser)
= 2008-10-20
- ordered 3rd and 4th editions of Flanagan (for compatibility work)
- borrowed Mac OS X and T-Mobile G1 from Craig, ran all jsunit tests,
	all worked fine (!!!)
- browsers.html: added direct link to run the whole jsunit test suite w/out
	downloading the zip file
- put a disclaimer on the home page that this is still pre-beta quality
- general.html:  added link to Google for "Interactive Fiction"
- sitemap.html:  added a "runtime" heading
- checked links, repaired broken ones, made dead ones point to not-implemented
- made h1 on home page be the same color as all others, adjusted the color
- general.html: added a link to
- fixed the redirect on to point to
- decided not to use meta-tags for "" and "",
	put those in the home page text instead
- sent a welcome message to the 4 yahoo groups, so they won't be completely
	empty and perhaps get deleted
= 2008-10-21
- changed jiffeegames/home.html to
- reworded the disclaimer on home page
- with great difficulty, patched redirect on -> sonic
- made <hr> blue, and made it consistently appear after <h1>
- testing.html: added T-Mobile G1
- emailed the author of jsunit:  it works on the G1!
= 2008-10-22
- fixed build-format script to touch written-date only when a file actually
- added a navbar, along with Contact and About pages
- players.html: added "any Android-based mobile phone such as the T-Mobile G1"
- automated check for consistent navbars
- automated check for consistent copyright
- ripped out all bread-crumbs and modified copyright statement
= 2008-10-23
- made revisions to about.html, why.html, teachers.html, testing.html
- tested JIFFEE0.3 under Win2000/FF1 at M.I.T. (works fine)
- moved "align=center" into <h1> and navbars (for better degradation)
- added .htaccess, custom 404 page, tested it
- verified that the jiffee.js I tested at M.I.T. is the frozen one on wolf
- tried to turn on compression w/ .htaccess but it didn't work
- created jiffeegames-developers Yahoo! group (forgot this one before)
	and linked to it from general.html
= 2008-10-24
- if-in-education.html: added ref. to Vilni
- linked sitemap -> 404
- made "" the prefix for all <title> tags
- made build script check for proper capitalization of JavaScript
- made build script generate sitemap.xml and robots.txt
- added Google Analytics (to all pages) to track hits
= 2008-10-25
- made script auto-advance copyright year on Jan 1
- fixed syllabus page to have formatting consistent with the rest of the site
- made build script verify (for every *.html page):
	- correct copyright notice
	- proper capitalization of "JavaScript"
	- <title> ...
	- <h1 align="center ...
	- navbar
	- Google Analytics code
	- sitemap.html links to it
	- all title/h1/link-text are consistent
- tried to put a std navbar on JSDoc pages, but couldn't get it to work
	(too much frames magic inside them)
- made all footnotes consistent [N]anchors
- put a little picture of me and some brief bio info on the "about" page
- testing.html: marked (X) the versions that _don't_ work
- verified .htaccess fixed to make custom 404 work again
- verified Google Analytics is working
= 2008-10-26
- checked exact load# of IE6 on NT - same one fails on Win2000 and works on WinNT
= 2008-10-30
- downloaded new files from CT apprentices
- fixed a couple bugs in build-archive
- changed robots.txt to block /src/ and /games/
- changed sitemap.xml to omit js_docs_out
- asked R's opinion, changed color-scheme from blue to brown, but then back to
	blue because anything else clashes with default link colors
- added to build script: create a nice "JIFFEE Source Code" page, w/ links at the
	top of the page to each file, in alphabetical order, for Google to index.
- changed "Site Map" to "Sitemap" so that all navbar links are single words
- changed "General Resources" to "Links"
- removed "Resources for" from all page titles, to match navbar
- tweaked sitemap priority to boost education pages
= 2008-10-31
- created a blank qanda.html under Developers page
- tweaked sitemap priority of jiffee-source page
- verified that Google Webmaster Tools is happy w/ latest sitemap syntax
- renamed general.html to links.html
- made all 4 res pages P/T/A/D link directly to the related Yahoo! Group,
- restructured all 4 P/T/A/D pages use more bullet lists to make them easier to read
- split about.html into "About Me" and "About the System"
= 2008-11-01
- installed scanner driver on new XP box, configured scanner software
- scanned kids' "under construction" drawings and added them to not-implemented page
= 2008-11-02
- added timeline.html and populated it with existing development log info,
	wrote a little text about why that might be interesting
- added more links to links.html
- fixed broken (and forgotten) redirect from
- ran unittests on XO (games work, but not jsunit)
- signed up for free linkrot-checking at, got 1st report
- evaluated other dead-link-checkers, w3c one works well
= 2008-11-04
- taught CT class 6
= 2008-11-08
- started populating the qanda page
- made many small updates to various web pages
- updated testing page to include OLPC XO-1
- installed subversion on laptop and set up repository for
- backported bug fix to .htaccess
- put alt tags on all images
- fixed HTML validation errors in web pages, including nested <pre> in jiffee-source
- added a build check for 2-"<a href" per line (to improve consistency checking)
- added build check for height/width tags on img (to improve speed)
- added build check for alt tag on every img (to improve accessibility)
= 2008-11-09
- created validate.html, verified all pages validate, added logo to home page
- added CSS link to validation page
- added dead link checking to validation page
- fixed validate.html, so it will pass HTML validation!
= 2008-11-10
- minor tweaks to web page wording
- replaced "referer" links that broke dead-link-checking w/ specific URL links
- fixed svn repos so I don't have to "sudo svn commit"
= 2008-11-11
- renamed navbar links Home Classroom Authoring Games Internals
- added silly footnotes to About page
- minor updates to multiple web pages
- created a "contributors" page
= 2008-11-12
- added a bunch more "war story" footnotes to about.html
- minor updates to other web pages
= 2008-11-13
- drew a rough-draft "twisty-passages" logo
- got horizontal format logo to work around titles
- got vertical format logo to work in margin
- minor updates to web page
- tried using the standard CSS in js_docs_out, but it had no effect
= 2008-11-14
- looked up some info about generating jpg files from python, found Tkinter
= 2008-11-15
- wrote Python program to generate logo, got it mostly working w/ Tkinter
= 2008-11-16
- switched from Tkinter to ImageDraw, now can save png file directly
- fixed up off-by-one and even-margin problems
- got GIMP to anti-aliasing for me
- experimented with sizes and settled on one
- cleaned up program (comments, copyright)
- got most of the unique 80-pair no-dup string done
- finished and verified the 80-pair string for the logo
= 2008-11-17
- added a horizontal bar around all level-1 headers
= 2008-11-18
- made a minor tweaks to 404, contributors, qanda pages
= 2008-11-19
- cleaned spam out of yahoo group and fixed gmail filters so I'll see it next time
- fixed sitemap.xml ( example has bad syntax)
- incorporated latest footbridge files into master source code
- put copyright notices on build* scripts
- used to make completely
	new favicon (color #99b) with J-shaped maze fragment
= 2008-11-20
- tried anti-aliasing favicon, GIMP works but it looked worse
- minor webpage edits, added a couple q-and-a's
- fixed syllabus HTML validation errors
= 2008-11-21
- messed around with jsdocs/iframes/framesets, made some progress, but decided
	it's too complicated to bother with until I do full CSS layouts
= 2008-11-22
- organized the qanda.html page into sections
- added automatic spellcheck of web pages to build scripts, and was humbled
- uploaded latest version (spellchecked), re-checked validation (all pages OK)
- fixed sitemap.xml (again), uploaded, Google says it's clean now
- reviewed all the <h1> page titles, but decided they're fine they way they are
- tested IE weirdness w/ Tony's changes, turned out to be my cockpit error
= 2008-11-24
- tested FF1.0.8 on Win98 and WinNT, added to testing.html
- reformatted the testing.html page as a big table
= 2008-11-25
- minor edits to web pages
- made the favicon a smidgen darker
- fixed bug in barnyard - double-display of "cat here" at game-start
= 2008-11-26
- made a release archive, updated build scripts
= 2008-11-29
- fixed up Release Archive page (improved formatting, add more detailed lists)
- created 0.4 release directory (freezes 0.3 at end of CS apprenticeship)
- change navbar "Internals" link to "Framework"
- added tooltips to navbar menu entries
- re-wrote home page
- added an item to QandA page
= 2008-11-30
- installed JSLint locally and scripted it to check all my JavaScript source
- added more stuff to QandA page
- finished rewriting home page to better target the intended audiences
- fixed an HTML validation problem
= 2008-12-01
- fixed formatting (3rd try!) of release archive page
- added November "done" items to timeline page, minor edits to index.html
- removed obsolete file jiffee-game.html that was triggering a LinkTiger report
- looked into using <xmp> for timeline, but it would be a bad idea
= 2008-12-02
- taught Citizen Schools apprenticeship (week 8)
- merged students' latest updates into official source
- did the "polish" work on the region written by the student who dropped out
- checked latest web page formatting in all 5 Win browsers, found a couple glitches
= 2008-12-03
- fixed left/right padding on navbar
- fixed bgcolor, paragraph-margin, and copyright-position problems in IE
= 2008-12-04
- revalidated all web pages
- Added "how to write IF" page w/ first couple links
= 2008-12-06
- minor updates to web pages
= 2008-12-08
- verified rendering of all web site pages on Win95 (IE5 and FF1)
= 2008-12-09
- taught Citizen Schools apprenticeship (week 8 - WOW prep and rehearsal)
= 2008-12-11
- taught Citizen Schools apprenticeship (WOW demo event at M.I.T.)
- checked versions of OS and browser in MIT Mac Lab
= 2008-12-13
- added another item to qanda page about compatibility testing
= 2008-12-15
- updated checklist.html and releases.html, other minor updates
- listed and explained multiple domain names
= 2008-12-16
- taught Citizen Schools apprenticeship (Wow demo event at work)
= 2008-12-19
- added an item to checklist.html
= 2008-12-20
- laptop started failing, suspended work
= 2009-01-03
- started shopping for new laptop
= 2009-01-08
- bought a new laptop
= 2009-01-11
- returned laptop (problems running Ubuntu), started shopping again
= 2009-01-22
- ordered a Dell laptop
= 2009-01-28
- Dell Inspirion 1525 delivered, started configuring it for dual-boot
= 2009-02-11
- started (finally!) working on JIFFEE again
- reinstalled subversion
= 2009-02-12
- recovered subversion repository that got lost during full system restore
- did leftover svn commits and removed a bunch of junk files
- new laptop is (I think) configured and ready to work again
= 2009-02-23
- installed perl html templates, fromdos
- fixed copyright date ranges
- got all "build" scripts to run comletely clean again!
- replaced all "--" in docs with —
- added SHA material to qanda page
- added SHA-224 code, got all tests green again
- added version number to fingerprint
- made sure all tests are still correct for fingerprinting
- wrote up a teaching-hints page with ideas from the last two semesters of CT
= 2009-02-24
- presented "Write Your Own Computer Game" at Citizen Schools apprenticship fair
= 2009-02-25
- added test for boundary of state fit/nofit in cookie
- changed traits.set()->freeze(), .change()->set(), all tests green again
= 2009-02-26
- verified upload scripts on new laptop by doing full upload to the web server
- changed display template notation from $N to ${N} (to allow "it costs $3.45")
- added compareTranslations method to Display class, w/ test
- added null translations to make it easier to migrate games to multi-lingual
- added Spanish output to Barnyard and std libs, got it mostly working
- all 148 tests are green
= 2009-03-02
- restricted all Yahoo groups to keep spammers out (and deleted a bunch of spam)
- made temporary fix of broken link in Sunny Day game
= 2009-03-03
- taught Citizen Schools apprenticeship (semester 3 - session 1)
= 2009-03-10
- taught Citizen Schools apprenticeship (semester 3 - session 2)
= 2009-03-17
- taught Citizen Schools apprenticeship (semester 3 - session 3)
= 2009-03-21
- added two more items to Q-and-A page
- fixed broken link in Sunny-Day, fixed up filenames (use hyphens between words)
- turned off strict translation in Barnyard (0.4 not yet ready)
- downloaded and checked in staircase game, added link to it from classroom page
- removed src-0.3/jiffee-game.html (obsolete, causing LinkTiger to complain)
- fixed filenames for navbar consistency: teachers/authors/players/developers ->
- uploaded latest version to sonic and sanity-tested it
= 2009-03-22
- worked on parser - added tokenizing code
= 2009-03-24
- taught Citizen Schools apprenticeship (semester 3 - session 4)
= 2009-03-26
- added Eames quote to checklist.html
- added David, Heather, and 5 apprentices to contributors.html
= 2009-04-04
- changed a link to an external doc to avoid an unreliable web host
- added Dinkelacker quote to timeline.html
- added 4 more months of log to timeline.html
- created unit test for barnyard game
- changed barnyard class name from Example to Barnyard
= 2009-04-05
- added unit test for Staircase game
- froze Footbridge game as a single file (like Crossroads)
- integrated in-progress 0.4 with Staircase (for week 5), all tests green
- moved error-formatting from HTML to Checks module (for easier improvements)
- all 156 tests are green
- improved set/freeze tests a little bit
- stripped help strings out of verbs.add() to prepare for verb re-work
- uploaded latest versions to the web
= 2009-04-06
- hit all the validation links to make sure latest website upload is clean
= 2009-04-10
- cleaned up jslint problems
- fixed an IE bug
- fixed a bug in barnyard
- uploaded new version
= 2009-04-11
- installed latest version of 0.4 library on apprentices' laptops
= 2009-04-12
- fixed another IE/comma bug
- uploaded new version
- extended lint-checking to cover more source files
- tracked down 4KB/domain bug in IE, fixed unit tests to avoid tickling it
= 2009-04-13
- worked on parser
= 2009-04-14
- worked on parser
- taught CT (semester 3, class 5)
= 2009-04-15
- get JIFFEE work done?  You've got to be kidding; this was income tax day.
= 2009-04-16
- completed new parseCommand() for "<noun>[<verb>]"
- started restructuring verb module
= 2009-04-18
- major restructuring of multiple modules to handle new command format
- ran 0.3 regression suite on a borrowed iPhone, all passed
= 2009-04-20
- added defaults for verbs and nouns w/out external forms
- added items to qanda web page
- fixed last failing tests; all 154 are green again (13 seconds to run)
- got lint-check and build clean again
- migrated barnyard and staircase to new library, fixed more bugs
- all tests (145) green again
- downloaded latest apprentice work, integrated, tested, uploaded back to web
= 2009-04-21
- taught Semester 3, Week 6 of CS apprenticeship
- added a quote to a web page
= 2009-04-22
- minor web page updates
- incorporated Heather's cheat-sheet into website
- started assembling a beta-release checklist (so I know when it's ready)
= 2009-04-23
- tracked down a nasty bug that Peter found, was already fixed in latest version
= 2009-04-24
- updated web testing results to show iPhone passing on 0.3
- added more items to the releases wish list 
- hit on terms "author/player language" to distinguish semantics from syntax
= 2009-04-25
- replaced actionCount with throw "done"/"not done" to clean up overrides/defaults
- got rid of all the cloying "I'm sorry" phrases in default responses.
= 2009-04-26
- got the tests all (145) green again
- changed error reporting to put the message first, function call last.
- improved nexterrorcode to detect codes never tested
= 2009-04-28
- integrated latest student's work with latest library, uploaded to web
- taught Semester 3, Week 7 of CS apprenticeship
= 2009-05-03
- added comments explaining obscure technique for "add new action after old"
- fixed bug in "restart" where it succeeded, then claimed it didn't know how
- added "throw 'auto' handling" to controller code
- minor web page updates
- added a temporary fix for a lower-case/upper-case bug
= 2009-05-04
- integrated latest student work and library into staircase game
= 2009-05-05
- taught week 8 of CS apprenticeship
- integrated latest student work into staircase game
= 2009-05-09
- fixed compatibility bugs, got 0.4 unit tests to pass under Chrome, IE
  (already passing on FF and Safari)
= 2009-05-10
- fixed compatibility bug, got 0.4 unit tests to pass under Opera
  (Android still fails)
= 2009-05-12
- taught week 9 of CS apprenticeship
= 2009-05-19
- taught week 10 of CS apprenticeship
= 2009-05-21
- merged and uploaded final student work for semester 3
= 2009-05-21
- helped apprentices demo their work at McKinley
= 2009-05-27
- looked for a parsing bug (but didn't find it yet)
- semester 3 apprenticeship "WOW" presentation at McKinley
= 2009-05-30
- tried to debug Android/G1 bug, but debugging on a cellphone is too painful
- downloaded Android emulator to use for debugging
= 2009-05-31
- got Android emulator working on laptop
- worked on Android bug, looks like random memory corruption; bug keeps morphing
= 2009-08-05
- attended Citizen Schools recruiting meeting
= 2009-08-26
- met w/ Matt Kane re: co-teaching
= 2009-09-01
- apprenticeship fair in Redwood City
= 2009-09-08
- taught Citizen Schools semester 4 week #1
= 2009-09-15
- taught Citizen Schools semester 4 week #2
= 2009-09-22
- set up and configure two additional laptops for Citizen Schools
- taught Citizen Schools semester 4 week #3
= 2009-09-29
- taught Citizen Schools semester 4 week #4
= 2009-10-06
- taught Citizen Schools semester 4 week #5
= 2009-10-19
- prep for NSF presentation tomorrow
= 2009-10-20
- gave presentation at NSF/Google-sponsored Education Summit for CS educators
- handled logistics for prentation (moving laptops around campus)
= 2009-10-27
- taught Citizen Schools semester 4 week #6
= 2009-10-28
- attended Citizen Schools meeting in Redwood City
= 2009-10-29
- phone call w/ Evy Megerman re: outstanding CS apprenticeships
= 2009-11-03
- taught Citizen Schools semester 4 week #7
= 2009-11-04
- checked first version of autumn 2009 CT game into subversion
- update "contributors" page with more names
- updated "done" list for the last 3 months
= 2009-11-09
- set up an example verb for class tomorrow
= 2009-11-10
- added new "add verb" call (old style just too complex) and implemented it
- taught Citizen Schools semester 4 week #8
= 2009-11-17
- taught Citizen Schools semester 4 week #9
= 2009-11-28
- fixed weird bug with jiffee-source filename
- uploaded latest verison of apprentices code
- added/corrected name spelling in copyright notice
- fixed broken link to M.I.T.
- updated timeline.html
- added a unit test for plaza game
- tests were failing with NS_ERROR_FILE_NOT_FOUND, updated to jsUnit 2.2
- src-0.3 all 146 tests green, src-0.4 all 148 tests are green
- fixed build scripts to make jiffee-source.html be part of src-*.*
- uploaded new website w/ Plaza game included
- fixed a bug in jiffee-source.html that broke the navbar
- added Mikhail Kalashnikov quote
= 2009-11-29
- reversed the order of arguments to "places.connect()", because people really
	want to say "put the dining room to the north of the kitchen" instead
	of "from the kitchen, moving north takes you to the dining room".
- added places.describe() and things.describe(), with tests, to start filling
	out the new "level 1" functions.
- tracked down "$4" substitution bug, but it was already fixed in 0.4 back in Feb
- fixed obscure bug in example* files
- fixed long-standing bug in parser that ignored bogus single-word commands
- cleaned up inconsistencies and overlap with example* files
- improved "is not a constructor" Firefox error message for missing quotes
- removed duplicate error formatting code in HTML (already in Checks)
- fixed link to Vilmi article
= 2009-11-30
- fixed yet another bug in jiffee-source.html handling (broken nav links in
	release directories) found by LinkTiger
- cleaned up quotation formatting in web pages
- made links to release directories go via to limit LinkTiger
- made yet another fix for jiffee-source.html, this time to get .content zipped
= 2009-12-01
- added selector functions things.carrying/present/reachable,, w/ tests
- fixed broken Checks tests and improved tests to cover new functionality
- fixed broken bug fix on bad-single-word commands
- all 150 tests green again for 0.4 (and all 146 for 0.3 still green)
- taught CT semester 4 week 10
= 2009-12-03
- presented at the SVEFoundation/CitizenSchools event
- added conference list to website
- added "MOVE [x] TO y|HERE" as legal actions (and remove "name of place")
= 2009-12-04
- made sitemap.xml point directly to host to make Google Webmaster tools happier
- fixed nexterrorcode to detect untested codes > first free code, added to build
- added tests as needed to make nexterrorcode run clear
- added Jessica to contributors page and reworked the format a bit
= 2009-12-05
- added qanda item about why avoiding downloads is important
- added qanda item about the name JIFFEE
- made "list of actions" be a valid action, to allow multiple display-and-move
- cleaned up throw done/not done/auto with better doc and added full tests
- fixed bug by disallowing add*Trigger after game has started
- renamed Agenda module to Rules, in prep for restructuring
- 2009-12-06
- added run() to Engine, and made it responsible for calling start() in all
  modules in the correct bottom-up order
- added checks.*Only() and updated code to call it as appropriate
- discovered untested error legs that had been stubbed as 'XX' codes, fixed them
- all 167 tests are green
- made another improvement to nexterrorcode
- defined fields on Events, Rules, Filters
- implemented new notifyEvent, getEvent, getAction, etc.
= 2009-12-07
- started a Glossary
= 2009-12-09
- added more material to Glossary
- linked Glossary to sitemap
- changed "command" to "directive" in eventType
- changed module name Rules --> Scheduler, 172 tests passing
= 2009-12-10
- final update of apprentices' work for semester 4 "plaza" game
- upload all revisions to web
- did CS semester 4 final presentation (WOW at MIT)
= 2009-12-11
- cleaned up quotation format and added three more
= 2009-12-12
- simplified dependency-injection and put all methods inside init to change all -> (i.e. make all module methods be closures)
- fixed up qanda entries about dependency injection
= 2009-12-13
- added "override" and "special case" to glossary, and cleaned up format
- minor tweaks to links on classroom page
= 2009-12-15
- changed *-desc trait names to "look around", "where am i", "inventory",
	"examine" to make clear that they are really overrides
- cleaned up directive names ('WHERE' -> 'WHERE AM I', 'LOOK' -> 'LOOK AROUND')
- tested on NexusOne, v0.4 only had one minor test problem
= 2009-12-26
- added link link to WOW showcase at
- tweaked a couple of "teaching hints" items
- changed name of Things module to Props, to leverage what people already
	know about stage scenery and stage props
- fixed glossary to reflect thing->prop terminology change
- added more Scheduler tests (bad args, cascading events)
- removed obsolete getNextTask() and clearJob() methods from Scheduler
- changed new Rule()/addRule() to addRule(eventType)
- removed obsolete scheduler methods addChangeTrigger(), addCommandTrigger()
- removed obsolete notifyCommand() and notifyChange() methods
- remove dead data members of Scheduler
= 2009-12-27
- changed rule.addPresent()/addNotPresent() to addRequired()/addRejected()
- added scheduler.addLegalProperty() and checkPropertyName_()
- made Rule.addXXX() and notifyEvent() check for misspelled property names
- all 174 tests are green
- improved lint check, cleaned up typeof(x), a==b, a!=b
- stopped using "name" as an identifier
- wrote first draft of verbs.describe()
- changed exceptions done/notdone/auto -> event done/event not done/rule done
= 2009-12-30
- refactored performAndCheckForChanges in controller, use it in verb.describe
- added override handling to verb.describe
- allowed '*' as "direct" and "DIRECT OBJECT" in verb selector clauses
- allowed "DIRECT OBJECT" in string actions
= 2009-12-31
- replaced old verbs.add() w/ new verbs.describe() or scheduler.addRule()
- removed verbs.add()
- removed obsolete appliesOnly*() and complainIf*()
- used overrides consistently in go, look around, where am i, inventory,
	examine, get, put
- added display.erase() to chop string off end, used in places.doLookAroundCmd
- used consistently to get better error-checking
- removed
- used props.reachable()/carried()/present() where appropriate
- allowed call-chaining on rule.xx() and verbs.describe()
- added jsdoc comments for Rule methods
- discovered that latest restructuring broke the all automatic JSDoc generation
- upgraded to jsdoc-toolkit to get JSDocs working again
- added MODULE- prefix to all author-lang display strings to avoid collisions
- made all library directives be lower-case:  get, inventory, help, etc.
- fixed Jxxx error codes to be real numbers with tests
- put a link to glossary in the authoring page
- added a couple more items to the question-and-answer page
= 2010-01-01
- added optional whereAmI argument to places.describe
- ported barnyard to 0.4
- added preliminary bilingual support to Help module
- added automatic "I see no X here" for verbs with unreachable direct objects
- added optional arguments to props.describe()
- fixed a couple minor bugs
- all 180 tests green
- uploaded to web, verified jsdocs working correctly now
- fixed a new bug and added more tests to catch it
- uploaded to web again
- tested on Windows: FF, IE, Chrome, Opera, Safari - all but FF had 1 failure
= 2010-01-02
- debugging under Vista too painful, so installed Chrome on Ubuntu
- tracked down Chrome bug, was a serious error in my tests, can't understand
  how it ever passed on the other 4 browsers (and 70% of the time on Chrome)
- fixed bugs in checks-test for browser (in)compatibility
- fixed broken HTML validations