@debonet/idd 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,793 @@
1
+ # Hosted questionnaire
2
+
3
+ ## Purpose
4
+
5
+ The hosted IDD page lets a person review and answer questionnaires stored in
6
+ GitHub projects, and lets that person see questionnaires from several
7
+ projects in one viewer.
8
+
9
+ ## His words
10
+
11
+ > {#m-3jzy1x} RULING (CEO) 2026-11-05: “Seems like CloudRun is the way to go.”
12
+
13
+ > {#m-7wyw60} RULING (CEO) 2026-11-05: “can the comms go directly
14
+ > from the browser? so the form generates json in the browser, and the
15
+ > browser submits the change directly to github?”
16
+
17
+ > {#m-ol5xyr} RULING (CEO) 2026-11-05: “Prior answers need to always
18
+ > be presented as text and never as HTML.”
19
+
20
+ > {#m-4as0w8} RULING (CEO) 2026-11-05: “But if it's a separate
21
+ > repository we can't leverage github code repository permissions for
22
+ > access control.”
23
+
24
+ > {#m-3jz9c9} RULING (CEO), 2026-11-08, IDD question
25
+ > `3e4177d4bd9b9d93457d3c254374b354d1874ed32b17391f3b4433bd92db78be`:
26
+ > “Which projects should appear first on the IDD page? After you sign in to
27
+ > the IDD page, it lists project questionnaires you can read. A project can
28
+ > have open questions, rejected answers, or only answered questions. If
29
+ > several projects need your attention, which project should the page put at
30
+ > the top? A) Projects with unanswered questions first, sorted by the oldest
31
+ > question. B) Projects where the agent is marked blocked first, then other
32
+ > unanswered questions by age. C) All projects in alphabetical order, with
33
+ > open and conflict counts shown.” His answer: “B — Projects where the agent
34
+ > is marked blocked first, then other unanswered questions by age.”
35
+
36
+ > {#m-2wp6gd} BUG REPORT (CEO), 2026-11-08: “This does not count as a
37
+ > conflict: [the same question's accepted answer and a rejected submission
38
+ > with identical choice B and an empty note].”
39
+
40
+ > {#m-65v6r2} BUG REPORT (CEO), 2026-11-08: “Returning to ‘all projects’
41
+ > effectively unsubmits my prior answers.”
42
+
43
+ > {#m-c37rfq} RULING (CEO), 2026-11-08: “The web page is alreay open. It
44
+ > should somehow know to reload.”
45
+
46
+ > {#m-umb15o} RULING (CEO), 2026-11-08, IDD question
47
+ > `de91a974a87d89a88e487cbe7650fbdb743f7259ce32fe59fc6f3818d708c658`:
48
+ > “How should a project writer resolve a conflicting answer? A question has
49
+ > an accepted answer and a different later answer was rejected. What should
50
+ > the IDD page let a project writer do to resolve this conflict? A) Keep
51
+ > accepted answer and mark rejected submission resolved. B) Accept rejected
52
+ > submission instead, preserving both answers in history. C) Ask a new
53
+ > clarifying question and keep both submissions until answered.” His answer:
54
+ > “A”. His note: “Huh? What is a ‘project writer’? What do you mean by
55
+ > ‘accepted’ and ‘rejected’ (Do you mean one was first and the other was a
56
+ > conflict?)
57
+ >
58
+ > Look, here's what should happen:
59
+ >
60
+ > if a question is answered and then re-answered later (either by another
61
+ > session, or someone revisits an already answered question and changes their
62
+ > answer) the response should be a follow on questions to clarify what to do.
63
+ > Something like: ‘on date X answer Y was chosen, but on date Z, answer A was
64
+ > chosen. Given that Y has already been implemented and subsequent decisions
65
+ > made based on that, should we now switch to A?”
66
+
67
+ > {#m-j48adi} RULING (CEO), 2026-11-08: “previously answered questions
68
+ > should be ‘re-visitable’. i.e. I should be able to change prior answers
69
+ > (causing a conflict, which triggers a clarification sequence)”
70
+
71
+ > {#m-1nrz2d} RULING (CEO), 2026-11-09: “So you need to figure out how to send a
72
+ > notification from webpage to the codex (or claude code, chatgpt.com,
73
+ > claude.ai) session”
74
+
75
+ > {#m-g75yf0} RULING (CEO), 2026-11-09: “So let's fix it. `idd-page` should just be
76
+ > `idd`. For ChatGPT.com or Claude.ai, an idle chat can’t currently be
77
+ > addressed through this page: it would need a supported integration in that
78
+ > host. Such things exist. Find the mechanism and use it.”
79
+
80
+ > {#m-551a7e} RULING (CEO), 2026-11-09: “answers should get letters so they can
81
+ > be referenced in the note, e.g. A, B, C, etc.”
82
+
83
+ > {#m-t4tzrb} RULING (CEO), 2026-11-09: “Also, make it so that the IDD page gets a
84
+ > cookie, so that when I open it again I don't need to re-login every time.”
85
+
86
+ > {#m-zgomvq} RULING (CEO), 2026-11-10: “We may need a button to give the app
87
+ > access to more repositories. I think I may have only approved the one
88
+ > project (idd) at this point.”
89
+
90
+ > {#m-babliv} BUG REPORT (CEO), 2026-11-13: “OMG. Sometimes the text
91
+ > field gets erased while I'm typing in it. What is happening? Is the page
92
+ > refreshing and wiping out my in-progress work?”
93
+
94
+ > {#m-zqh3c0} BUG REPORT (CEO), 2026-11-13: “Importantly also: the page
95
+ > scroll should not change when being updated. It is quite jarring.”
96
+
97
+ > {#m-6nlxee} BUG REPORT (CEO), 2026-11-13: “Better, but the text I was
98
+ > editing scrolled when the page updated (unsure if my caret moved, but the
99
+ > scroll of the textbox went back to 0 and I could not see the bottom/most
100
+ > recent part of the entry)”
101
+
102
+ > {#m-mwyvc9} RULING (CEO), 2026-11-13: “Yes. Do it. Each item already has a
103
+ > stable id, so use that for the root of the element key”
104
+
105
+ > {#m-sv3g4i} BUG REPORT (CEO), 2026-11-13: “when you sign in using
106
+ > the menu, the menu should go away. Today it remains open.”
107
+
108
+ > {#m-3qt6qa} “I'm still seeing
109
+ > submitted observations in the observations box. They should be moved to the
110
+ > answered section.”
111
+
112
+ > {#m-h21kou} RULING (CEO), 2026-11-10: “Also, don't show the branch in the
113
+ > special case where it is \"main\"
114
+ >
115
+ > Design issues:
116
+ > * the \"Give IDD access to repositories\" button is huge and in the wrong
117
+ > spot. It should live at the top of the \"Your questionnaires\" dashboard.
118
+ > * make the order on the dashboard: conflicts, unanswered, answered. Make
119
+ > the conflict and unanswered numbers much bigger than the text. Color them
120
+ > red, and blue (or some theme-appropriate colorization indicating
121
+ > very-important, important), unanswered remains small and default colored.
122
+ > * what does \"no active agent status\" mean? It is way to prominent. If
123
+ > needed, put on the right side and use short phrases (e.g. \"none active\")
124
+ > and hover can show more info.
125
+ > * when in a project the title should be \"Project: <project>, Branch:
126
+ > <branch> Questions\", this stuff should go away:
127
+ >
128
+ > Questionnaire data updated from GitHub.
129
+ >
130
+ > ← All projects
131
+ > debonet/aios · main
132
+ > Questionnaire data is on idd-main
133
+ >
134
+ > * the return arrow should be above the title and should read \"<-- dashboard\"
135
+ > (with a real arrow)
136
+ > * \"Questionnaires are stored in their GitHub project repositories.\" should
137
+ > be removed
138
+ > * add a hamburger menu that includes:
139
+ > either:
140
+ > * sign out
141
+ > * signed in as <username>
142
+ > or:
143
+ > * sign in
144
+ >
145
+ > and:
146
+ > * add repositories
147
+ > * top repositories (top 10 sorted by date of conflicts, then unanswered)
148
+ > * <repo 1>
149
+ > * <repo 2>
150
+ > * FAQ
151
+ > * About
152
+ >
153
+ > * make the About page basically be a digest of the README that answers: why?
154
+ > what? how?
155
+ > * make the FAQ include questions about security and access (where are keys
156
+ > kept? questions and answers kept)
157
+ > * make the IDD in the upper left bigger, and use the logo (Logo version),
158
+ > which I will put in the docs/ directory
159
+ > * make a favicon from the \"Icon\" version of the logo”
160
+
161
+ > {#m-2cjvpr} BUG REPORT (CEO), 2026-11-10: “Fix questions so that all the text is
162
+ > to the right of the radio button on wrapped lines. I.e. the text should be
163
+ > left justified to the right of the radio button”
164
+
165
+ > {#m-w1kbnf} BUG REPORT (CEO), 2026-11-10: “When you click
166
+ > \"submit answer\" the question box should roll-up and disappear immediatley
167
+ > and the networking should happen in the background.”
168
+
169
+ > {#m-5saq28} BUG REPORT (CEO), 2026-11-10: “The rollup on submit is not working.
170
+ > It should take a second or two. Currently the question immediately
171
+ > disappears, which is jarring and confusing because it is immediately
172
+ > replaced with the question below. Instead it should roll-up (shrink
173
+ > vertically, as in the jquery-style animation) and the question below rising
174
+ > with it so that it is clear what is happening.”
175
+
176
+ > {#m-loh9m9} BUG REPORT (CEO), 2026-11-10: “doing back to the dashboard still
177
+ > yields and empty screen?”
178
+
179
+ > {#m-4fn63n} “Can we cache/store the projects in a cookie so that there's no delay
180
+ > when you reload or go back to the dashboard? When the fetch completes it can
181
+ > update the display and cookie.”
182
+
183
+ > {#m-65brxv} “It would be useful if the \"<-- dashboard\" could also indicate how
184
+ > many projects have conflicts and/or questions pending. Some number that tells
185
+ > how mnay projects need your attention.”
186
+
187
+ > {#m-3xcl02} BUG REPORT (CEO), 2026-11-11: “The count after "<-- dashboard" should
188
+ > not include the current project!”
189
+
190
+ > {#m-n9dd7y} “Drop the \"Project: \" in the header”
191
+
192
+ > {#m-i0grng} BUG REPORT (CEO), 2026-11-10: “The logo and favicon are not
193
+ > working”
194
+
195
+ > {#m-j5r1fg} “I moved the old logos out of the way and replaced them with a single
196
+ > cleaner logo. Use that for both the page and the favicon. It no longer
197
+ > contains text, so for the logo at the top of the page add in html "IDD
198
+ > Interrogation-Driven Development" in some attrative way”
199
+
200
+ > {#m-rhr8be} “That should be a standard part of your unit test suite.”
201
+
202
+ > {#m-v12ugx} “Use the new docs/Question*png image as the favicon”
203
+
204
+ > {#m-zanwxq} “So \"Question Histor\" should instead be
205
+ > \"depricated questions\" or \"revisited questions\" or something like that.”
206
+
207
+ > {#m-3fsbff} “The theme selector is too prominent. Move it to the
208
+ > right side, on the same line as the \"<-- dashboard\"”
209
+
210
+ > {#m-8drgj4} RULING (CEO), 2026-11-10: “We should also have a
211
+ > splash/informational page that shows up when you're not logged in. And
212
+ > when you're logged in, you go directly to your dashboard.”
213
+ >
214
+ > {#m-cba3po} RULING (CEO), 2026-11-10: “On the splash page, show some
215
+ > screenshots with fake questions and answers, using the various themes.
216
+ > Put them in drop-shadow'd rounded rectangle gradient-alpha (fade at top)
217
+ > image containers.”
218
+
219
+ > {#m-1um0ef} RULING (CEO), 2026-11-11: “blurb below is too wordy. TL;DR.
220
+ > Make it short punchy sentences. something like: ‘You provide initial
221
+ > spec, agent starts coding, posts async questions, you answer to guide the
222
+ > development’ but even punchier”
223
+
224
+ > {#m-jp4via} RULING (CEO), 2026-11-11: “the key motivator here is:
225
+ > human intelligence is the limited resource. Don't waste it reading walls
226
+ > of text. Critical issues surfaced. Compactly, clearly, and decisively.
227
+ > Human judgement is captured efficiently. --> Use it in why and elsewhere”
228
+
229
+ > {#m-yj5thl} RULING (CEO), 2026-11-11: “themes is not the big
230
+ > feature. The big features are:
231
+ > * secure
232
+ > * access to questions matches developer's access to the code
233
+ > * works on any github project public or private
234
+ > * works from anywhere -- laptops, tablets, phones
235
+ > * you dont need to set up a server
236
+ > * supports branches, question merging, conflict resolution
237
+ > --> make each of the example images demonstrate/visualize a different
238
+ > one of those things, and do it with different themes (so theming isn't
239
+ > the feature being promoted). Your goal is to show examples how the
240
+ > system can be used”
241
+
242
+ > {#m-cpqj0v} RULING (CEO), 2026-11-11: “add a teaser at the bottom
243
+ > that IDD optionally integrates with the ConcordSTC agentic engineerign
244
+ > approach.”
245
+
246
+ > {#m-hfp7kb} RULING (CEO), 2026-11-11: “The why, what, how boxes were good.
247
+ > Drop the \"Why IDD\". Keep the Human judgement text, then below it add back
248
+ > Why, How, What boxes, with very short sentences:
249
+ > Why: Efficient capture of human judgement
250
+ > What: No walls of text. Just crisp questions
251
+ > How: Agent asks when it needs, you answer when you can.”
252
+
253
+ > {#m-nnxwab} RULING (CEO), 2026-11-11: “The examples need to be examples.
254
+ > You've mixed examples of the product with key features. For the features,
255
+ > list them in attractive boxes (not images of that kind of look like the
256
+ > product). Again the list from above, but make crisper:
257
+ > * secure
258
+ > * access to questions matches developer's access to the code
259
+ > * works on any github project public or private
260
+ > * work from anywhere -- laptops, tablets, phones
261
+ > * you dont need to set up a server
262
+ > * supports branches, question merging, conflict resolution
263
+ >
264
+ > Then show examples of semi-real things:
265
+ > * the \"when should reminders arrive?\" question is a good one
266
+ > * another one about using one package over another
267
+ > * another one showing a conflict resolution (you said X, bob said Y, which
268
+ > is correct?)”
269
+
270
+ > {#m-3sqckb} “Can you pick a theme that is somewhat more attractive and interesting?
271
+ > Perhaps the colors you use for the silk theme, but with a sans serif font.
272
+ > Also, have greater size variations in the fonts”
273
+
274
+ > {#m-ikc4ps} “No that is too \"brown\", look at the openai.com/about page, and use a
275
+ > theme closer to that”
276
+
277
+ > {#m-ry1hp7} BUG REPORT (CEO), 2026-11-12: “BUG: conflict
278
+ > resolution is not working. I'm clicking submit changed answer, and another
279
+ > conflict shows up. Also, the rejected submissions are showing up in the
280
+ > conflicts area.”
281
+
282
+ > {#m-4w4679} FEATURE (CEO), 2026-11-12: “reverse the order
283
+ > of the answered questions, so the most recent is at the top.”
284
+
285
+ > {#m-o26kii} BUG REPORT (CEO), 2026-11-12: “the
286
+ > \"<-- dashboard\" is still showing a needs attention count that includes
287
+ > the current project.”
288
+
289
+ > {#m-awh12l} BUG REPORT (CEO), 2026-11-12: “take a look at the idd file in
290
+ > ~/@aois. It seems to contain a conflict which keeps reoccurring every time I
291
+ > \"resolve\" it.”
292
+
293
+ > {#m-hvgu3e} RULING (CEO), 2026-11-12: “Ohh. So there's two different things:
294
+ > * conflicts to be resolved
295
+ > * conflicts that have been resolved but have not yet been addressed
296
+ > The latter seems like it should just go into the answered section. Answered
297
+ > questions also may not yet have been addressed, but they leave the open
298
+ > questions section.”
299
+
300
+ > {#m-yxktyi} RULING (CEO), 2026-11-12: “Can we add a ‘thoughts and
301
+ > observations’ section, which is essentially a perpetually open question
302
+ > of what do you have in mind? and just provides a text box. When you write
303
+ > in it, it generates a new question-id (with essentially an empty question,
304
+ > maybe the date) and the statement you've made? That way you can remotely
305
+ > send ideas and any active agent can pick them up and work on them (and
306
+ > presumably ask followup questions about them if needed)”
307
+
308
+ > {#m-2cwth4} RULING (CEO), 2026-11-12: “That information should somehow be
309
+ > embedded in the splash page so that I can tell a model ‘go look at
310
+ > interrogation.dev and let's use it’.”
311
+
312
+ ## Hosted page
313
+
314
+ * {#s-71l9ho <m-3jzy1x@623b849} The IDD viewer and project questionnaires are
315
+ served from an IDD web application deployed on Google Cloud Run.
316
+ * {#s-1lggg7 <arch} The viewer lists the projects the signed-in GitHub
317
+ user can read that have an IDD questionnaire, and links each project to
318
+ its questionnaire.
319
+ * {#s-7f2p1j <arch} A project questionnaire page identifies its GitHub
320
+ repository and code branch; the page shows that branch's IDD questionnaire.
321
+ * {#s-6k70cj <arch} The dashboard shows each project's unanswered, conflicting, and
322
+ answered questions, and the time unanswered questions have been waiting.
323
+ * {#s-0kqa6m <arch,m-h21kou@7fe10b2} Dashboard question counts appear in this order:
324
+ conflicts, unanswered, answered. Conflict and unanswered numbers are larger
325
+ than their labels; conflicts use the theme's alert color and unanswered
326
+ counts use the theme's accent color. Answered counts stay small and use the
327
+ default subdued color.
328
+ * {#s-c128mc <arch,m-h21kou@7fe10b2} Agent status is aligned at the right of each
329
+ project row and uses a short label such as `none active`, `working`, or
330
+ `blocked`; its title tooltip provides the detailed session status.
331
+ * {#s-nf173i <arch,m-h21kou@7fe10b2} Project and questionnaire headings omit the
332
+ branch label when the code branch is `main`; other branches remain visible.
333
+ * {#s-eeqrcf <arch,m-h21kou@7fe10b2,m-n9dd7y@66937d7} A questionnaire heading reads
334
+ `<repository>, Branch: <branch> Questions`, omitting `, Branch:
335
+ <branch>` for `main`. Above it, one back link returns to the dashboard.
336
+ The questionnaire view does not show the success notice, the IDD data
337
+ branch name, or another project/branch line.
338
+ * {#s-pgrj98 <m-65brxv@d2a98c2,m-o26kii@87c1cd6} The questionnaire's
339
+ dashboard return link reads `← dashboard · <n> need attention`, where `<n>`
340
+ counts each other repository and IDD branch with at least one unanswered
341
+ question or unresolved answer conflict once, excluding the current
342
+ repository and IDD branch by their stable identities.
343
+ * {#s-ajo3ld <m-3fsbff@a314ab9} The theme selector shares a row with the dashboard
344
+ back link and is aligned at the right side of that row.
345
+ * {#s-kmiped <m-zgomvq@a9d3d33,m-h21kou@7fe10b2} The signed-in dashboard places a
346
+ compact `Add repositories` link at the top of `Your questionnaires`; the
347
+ hamburger menu also contains that link.
348
+ * {#s-prsnbh <arch,m-h21kou@7fe10b2} A hamburger menu opens and closes an accessible
349
+ navigation panel. It shows either sign-in or the signed-in username and
350
+ sign-out action, an Add repositories link, the top ten repositories, FAQ,
351
+ and About. The panel uses the compact spacing, aligned text, and clear
352
+ hierarchy of a standard graphical application menu; repository links are
353
+ indented beneath Top repositories with tree lines showing their parentage.
354
+ The final repository connector ends in an L, without a vertical line
355
+ continuing below it.
356
+ * {#s-sb8f7i <arch,m-h21kou@7fe10b2} The menu lists at most ten distinct
357
+ repositories with questionnaires. Repositories with conflicts come first,
358
+ sorted by their latest conflict time descending; the rest are sorted by
359
+ unanswered question count descending, then oldest unanswered question
360
+ first, then repository name. A repository link opens its most urgent
361
+ questionnaire branch.
362
+ * {#s-ia2mkv <arch,m-h21kou@7fe10b2} The About page presents a concise digest of
363
+ the README's Why, What and How sections.
364
+ * {#s-kmzltz <arch,m-h21kou@7fe10b2} The FAQ answers who can read and answer,
365
+ where GitHub credentials and app secrets are kept, and where questions and
366
+ answers are stored.
367
+ * {#s-vgd6wr <m-j5r1fg@473daea,m-v12ugx@63766d4} The provided Interrogation Flow Decision Icon image is used as
368
+ the upper-left brand mark beside visible HTML text reading “IDD
369
+ Interrogation-Driven Development”; the Question Bubble Decision Flow image
370
+ is used as the favicon.
371
+ * {#s-3htunx <m-i0grng@584ee4f} The logo and favicon URLs referenced by the viewer return
372
+ their PNG image files with the `image/png` media type.
373
+ * {#s-gj59q3 <m-zanwxq@4e60fc3} The collapsed question history section is labeled
374
+ `Superseded questions`.
375
+ * {#s-fn4x75 <arch,m-h21kou@7fe10b2} The footer sentence `Questionnaires are stored
376
+ in their GitHub project repositories.` is not displayed.
377
+ * {#s-hun225 <arch,m-ec324x@c9504b3} Each hosted question displays the reserved X option
378
+ from `specs/project-files.md` last, using its fixed text. A legacy question
379
+ without X receives the same displayed option without changing its stored
380
+ question or id.
381
+ * {#s-qpdk8t <arch,m-ec324x@c9504b3} A question with no saved answer and no unsent
382
+ draft starts with no option selected. An existing answer or draft remains
383
+ selected when the form is revisited or refreshed.
384
+ * {#s-li6mcw <m-2cjvpr@8bfc299} Each answer option places its radio button in a left column and
385
+ all of its label text in a right column; wrapped lines start at the same
386
+ left edge as the first line of label text.
387
+ * {#s-1ci45n <m-w1kbnf@3fb9f61,m-5saq28@dd97235} Submitting an answer starts a visible vertical
388
+ collapse of its question box that lasts one to two seconds, with following
389
+ content rising as the box shrinks, while the network request runs at the
390
+ same time; a failed request restores the question box and its draft.
391
+ * {#s-ifpl8z <m-3jz9c9@647adb8} **Dashboard order.** Projects with an agent session
392
+ marked blocked appear first. Other projects with unanswered questions
393
+ follow, ordered by the creation time of their oldest unanswered question.
394
+ Projects with no unanswered questions appear last.
395
+ * {#s-yl7soe <arch} Projects with the same ordering priority are sorted by
396
+ repository full name and then code branch.
397
+ * {#s-3fmok8 <m-65v6r2@23373a9} When a person returns to All projects and
398
+ reopens a questionnaire during the same page session, the viewer preserves
399
+ any unsubmitted choice and note for each open question.
400
+ * {#s-vb6pz0 <m-loh9m9@271a655} Returning from a questionnaire to the dashboard displays the
401
+ available project branches.
402
+ * {#s-lqwhd5 <m-4fn63n@ead29bc} When project summaries saved in browser local storage exist for
403
+ the signed-in GitHub account, the dashboard displays them before fresh
404
+ repository data finishes loading, then updates the display and saved
405
+ summaries with the fetched project data.
406
+ * {#s-qv9ghz <arch} The dashboard cache is scoped to the signed-in GitHub account and
407
+ contains no access tokens, question text or answers.
408
+ * {#s-8j6gdw <m-c37rfq@5dbe195} While the viewer is open and signed in, it
409
+ automatically detects changes to IDD branches and refreshes their displayed
410
+ questionnaire data without requiring a page reload. It preserves unsent
411
+ answer drafts and the current dashboard or questionnaire view.
412
+ * {#s-o1emm0 <m-babliv@56a9a30} A background questionnaire refresh preserves the
413
+ unsent text in the Thoughts and observations field, as well as unsent answer
414
+ drafts and the current page view.
415
+ * {#s-nedtaj <m-zqh3c0@ebc8c99} When a background data refresh redraws the dashboard or
416
+ questionnaire, the page retains its scroll position.
417
+ * {#s-b7mfmz <m-6nlxee@8de6a06} When a background questionnaire refresh redraws a text
418
+ field, it restores that field's internal scroll position, selection and
419
+ focus, so the person can continue editing where they left off.
420
+ * {#s-0ez7w1 <m-mwyvc9@7e88d5d} A questionnaire item that remains present across a background refresh or
421
+ reorder retains its rendered root and any in-progress editing state; stable
422
+ item ids distinguish questions, thoughts, answers and conflicts.
423
+ * {#s-np9p6t <m-sv3g4i@5b705c0} After GitHub sign-in succeeds, the navigation menu
424
+ closes.
425
+ * {#s-1v9p2k <m-c37rfq@5dbe195} The GitHub App's push webhook is validated with
426
+ its configured HMAC secret. Only pushes to refs beginning
427
+ `refs/heads/idd-` trigger a viewer notification; webhook payloads are not
428
+ forwarded to browsers.
429
+ * {#s-jmz4e7 <m-c37rfq@5dbe195} The hosted service sends a generic invalidation
430
+ event to connected viewers and active command waiters over a same-origin
431
+ Server-Sent Events stream. The event contains no repository, branch,
432
+ commit, or answer data.
433
+ * {#s-mj541y <arch} When an agent is waiting for an answer through `idd wait`,
434
+ the hosted service's invalidation event makes that waiting command check
435
+ the remote IDD branch immediately; the answer is read from GitHub, not
436
+ from the event.
437
+ * {#s-9gymp2 <m-1nrz2d@b86ec13,m-g75yf0@44f7e6c} ChatGPT Work chats can
438
+ subscribe to the hosted `idd.data.changed` MCP event; when a matching
439
+ IDD-branch push arrives, ChatGPT delivers the event to that subscribed chat
440
+ and follows the user's instruction for what to do next.
441
+ * {#s-v65h8r <arch} The hosted MCP event contains only a generic change
442
+ indicator; it carries no repository, branch, commit, question, answer, or
443
+ user data.
444
+ * {#s-4vnngz <arch} The hosted MCP event is global: every active subscription is
445
+ notified for every push to any `idd-*` branch.
446
+ * {#s-fda7vp <arch} The `/mcp` endpoint advertises MCP Events during
447
+ initialization and lists one webhook-delivered `idd.data.changed` event
448
+ with no subscription arguments and a payload containing only
449
+ `{"changed":true}`.
450
+ * {#s-jzlic8 <arch} The `/mcp` endpoint exposes the standard MCP tool
451
+ `idd_wait_for_change`; an active call waits up to 240 seconds for an IDD
452
+ branch push and returns only whether a change occurred.
453
+ * {#s-7ppa6w <arch} A Codex session may wait for changes through both the IDD
454
+ MCP `idd_wait_for_change` tool and `idd wait <question-id>` at once. Either
455
+ can signal a change; the session synchronizes and inspects the latest IDD
456
+ branch, treating duplicate signals idempotently.
457
+ * {#s-udvxd8 <arch} The hosted service stores MCP event subscriptions durably,
458
+ including their callback URL, signing secret, event name, and expiration,
459
+ and retains them across Cloud Run restarts.
460
+ * {#s-zsz7sy <arch} The hosted service grants MCP event subscriptions a finite
461
+ expiration and refreshes an existing subscription idempotently when ChatGPT
462
+ repeats its subscription request.
463
+ * {#s-95yj75 <arch} The MCP event endpoint validates callback destinations as
464
+ public HTTPS addresses, verifies each callback with a fresh signed
465
+ challenge before storing a subscription, and signs event deliveries using
466
+ Standard Webhooks.
467
+ * {#s-mome2c <arch} A user can unsubscribe from an MCP event; repeated
468
+ unsubscribe requests succeed without changing other subscriptions.
469
+ * {#s-mter3r <arch} A Claude.ai custom connector can use
470
+ `idd_wait_for_change` to receive the generic change result while a tool call
471
+ is active; Claude.ai does not support the MCP Events subscription used for
472
+ unsolicited delivery to an idle chat.
473
+ * {#s-8sk5lv <m-c37rfq@5dbe195} A signed-in browser reloads its project data
474
+ directly from GitHub when it receives an invalidation event.
475
+ * {#s-6sl6e9 <m-c37rfq@5dbe195} When push notifications are unavailable or the
476
+ event stream is disconnected, the browser checks IDD branch heads every 30
477
+ seconds and refreshes when a head changes. A reconnected event stream causes
478
+ an immediate refresh to recover missed notifications.
479
+ * {#s-u8f4vi <m-umb15o@4ae4e2f,m-j48adi@77b2d25} A person can revisit an answered question in the
480
+ collapsed Answered section, see its current answer, and submit a changed
481
+ choice or note; the form starts with the current answer selected and note
482
+ filled in.
483
+ * {#s-46zdl6 <m-551a7e@e3167a4} Each option in the hosted questionnaire displays its key followed
484
+ by a period and a space before its text, such as `A. First`, so the person
485
+ can refer to the key in the answer note.
486
+ * {#s-ax24rw <arch} A project becomes visible in a user's dashboard when an IDD
487
+ questionnaire branch is pushed to a repository the user can read; no key
488
+ is copied into the viewer.
489
+ * {#s-foxumh <arch} The viewer places rejected answer submissions that differ from
490
+ the accepted answer in a Conflicts section, unanswered questions in an
491
+ Unanswered section, and accepted questions in a collapsed Answered section.
492
+ An omitted note and an empty note are the same answer for conflict detection.
493
+ * {#s-10icw5 <m-umb15o@4ae4e2f} A changed answer to a previously answered question
494
+ appears as a conflict while the currently committed answer remains visible
495
+ as the prior ruling.
496
+ * {#s-68mj1g <arch} A question with an unresolved answer conflict appears in the
497
+ Conflicts section and cannot be resubmitted from that card. When its
498
+ clarification answer is recorded, the agent resolves the conflict and the
499
+ question appears in the Answered section, even while the agent has not yet
500
+ carried out the ruling.
501
+ * {#s-4p12mq <m-4w4679@821d091} The collapsed Answered
502
+ section orders questions by accepted-answer timestamp, newest first.
503
+ * {#s-i9eyq7 <arch} Anyone who can read the GitHub repository can read its
504
+ questionnaire; only a user with repository write permission can submit an
505
+ answer.
506
+ * {#s-gu4cxa <arch} The project agent adds its questionnaire to
507
+ the viewer by pushing the `idd-<branch>` branch to the project repository;
508
+ no user copies a repository key or questionnaire token.
509
+ * {#s-0zk4qi <arch} Each project questionnaire has an always-visible “Thoughts and
510
+ observations” section with a text box that invites the person to share an
511
+ idea or observation. Submitting non-empty text appends a thought to that
512
+ project's current IDD branch; the form remains available for another
513
+ submission.
514
+ * {#s-zexwsh <m-yxktyi@b0efeab,m-3qt6qa@4b64c8f} Immediately after a thought is submitted successfully, its card appears in the Answered section with its
515
+ stable id, submission time and text as plain text. The Thoughts and
516
+ observations section holds only the submission form. Thought text is never
517
+ displayed as HTML or treated as a question requiring an answer.
518
+ * {#s-pla1x4 <arch} Submitting a thought writes directly from the browser to the
519
+ repository's `idd/thoughts.json` on its IDD branch using GitHub access
520
+ already granted to the signed-in user. A user without repository write
521
+ permission cannot submit. Concurrent submissions are retried against the
522
+ latest file so each distinct thought is retained; no submission silently
523
+ overwrites another.
524
+ * {#s-x4v7f8 <arch} A successful thought submission gives the person visible
525
+ confirmation and triggers the same generic questionnaire-change
526
+ notification as other IDD branch updates.
527
+
528
+ ## Sign-in and project discovery
529
+
530
+ * {#s-6qd8cg <m-1um0ef@6d0079c} The landing-page introduction uses short sentences to say
531
+ the user gives the agent a specification, the agent starts coding and asks
532
+ asynchronously when decisions arise, and the user's answers guide the work.
533
+ * {#s-rle2e6 <m-jp4via@372ebc0} The landing page says human judgment is the scarce resource,
534
+ promises to surface critical decisions compactly and clearly, and says answers
535
+ are captured for the work to follow.
536
+ * {#s-ixb261 <m-3sqckb@be4a1af,m-ikc4ps@b94ec3a} The signed-out landing page uses a clean editorial style
537
+ inspired by OpenAI's About page: near-white surfaces, charcoal text, a
538
+ restrained cool accent, a sans-serif font, generous spacing, and a clear type
539
+ scale with a large hero and section headings, and smaller labels and support
540
+ text.
541
+ * {#s-a9y6kc <m-8drgj4@443e70b} On page load, a signed-in user goes directly to the
542
+ project dashboard, while a signed-out user sees an informational landing
543
+ page with a GitHub sign-in action.
544
+ * {#s-lxsmnv <m-hfp7kb@6afb5f9} After the human-judgment statement, the landing page shows
545
+ three compact boxes labeled Why, What, and How with these respective
546
+ messages: “Efficient capture of human judgment,” “No walls of text. Just
547
+ crisp questions,” and “Agent asks when it needs, you answer when you can.”
548
+ * {#s-q6l925 <m-nnxwab@b96d3e8} The landing page lists six capabilities in feature boxes,
549
+ separate from its questionnaire examples: secure use; question visibility
550
+ and answering governed by the same repository permissions as code; public
551
+ and private GitHub projects; use from phones, tablets, and laptops; no
552
+ server for the project owner to set up; and branch-aware question merging
553
+ and answer-conflict resolution.
554
+ * {#s-3z7br4 <m-nnxwab@b96d3e8} The landing page shows three fictional questionnaire
555
+ examples: a reminder-time choice, a package choice, and a follow-up asking
556
+ which answer to use when the user's earlier answer differs from Bob's.
557
+ * {#s-r6ac5z <m-nnxwab@b96d3e8,m-yj5thl@e055d58} The three questionnaire examples use different
558
+ built-in theme styles as decoration; the examples show question content
559
+ rather than mock screenshots of the IDD product.
560
+ * {#s-ry22kb <m-cpqj0v@055fe29} The bottom of the landing page says IDD can optionally be
561
+ paired with ConcordSTC and briefly describes its agentic engineering role.
562
+ * {#s-yaanwo <m-2cwth4@716df92} The public landing page includes a visible “Use IDD in your
563
+ project” block with a copyable prompt that tells an agent to visit
564
+ `https://interrogation.dev`, install `@debonet/idd`, resolve the installed
565
+ package's `INSTRUCTIONS.md` path with `require.resolve`, and follow those
566
+ instructions to set up IDD in the current project.
567
+ > {#m-2kt5yx} FEATURE REQUEST (CEO), 2026-11-12: “The installation instructions are not
568
+ > visible on interrogation.dev Are they there? (actually, hiding them in an
569
+ > agent-readable comoment early in the file might be a great idea, e.g.:
570
+ > <!-- if you're an agent that wants to install Interrogation Driven Development
571
+ > (IDD), use npm install @debonet/idd --> )”
572
+ * {#s-iy7nbz <m-2kt5yx@1aed464} The public landing page's HTML starts with a plain HTML comment
573
+ telling agents to install `@debonet/idd`, read its installed
574
+ `INSTRUCTIONS.md`, and use `https://interrogation.dev`; the comment is not
575
+ displayed as page text.
576
+ * {#s-nq82ty <arch} The viewer signs users in through the IDD
577
+ GitHub App's user authorization flow and requests only the app's repository
578
+ contents permission.
579
+ * {#s-7falz6 <arch} The Cloud Run application starts OAuth,
580
+ validates a short-lived state value at the callback, exchanges the authorization
581
+ code for a GitHub user access token, and returns that token only to the viewer
582
+ window that started the matching sign-in attempt, even when the browser severs
583
+ the popup's opener during GitHub's cross-origin redirects.
584
+ * {#s-1n1bgd <m-rhr8be@e22d43f} The sign-in-start unit test verifies that the authorization URL
585
+ uses the registered GitHub App client ID and the exact production callback
586
+ URL `https://interrogation.dev/auth/callback`.
587
+ * {#s-zapq64 <arch} The callback response is not cached; it sends the token to the
588
+ matching viewer window through a same-origin channel and closes its window
589
+ after delivery.
590
+ * {#s-gl226e <arch} The viewer accepts a callback token only for its current
591
+ sign-in attempt; an unrelated or stale callback cannot sign it in.
592
+ * {#s-g9fydo <arch} The browser keeps the active GitHub access token only in
593
+ memory and uses it to request repositories and questionnaire data directly
594
+ from GitHub; page scripts cannot read the persistent authentication cookie.
595
+ * {#s-9040av <arch} The dashboard lists repositories visible
596
+ through the signed-in user's GitHub App access and includes a repository only
597
+ when its default branch or another discovered code branch has a matching
598
+ `idd-<branch>` branch.
599
+ * {#s-qxpze6 <m-zgomvq@a9d3d33} While signed in, the dashboard offers a link to the IDD GitHub App's
600
+ installation page so the user can grant it access to additional repositories.
601
+ * {#s-14uprd <arch,m-zgomvq@a9d3d33} When the viewer regains focus after the user changes the app's
602
+ repository access, it re-enumerates repositories through GitHub and refreshes
603
+ the project list while preserving the current questionnaire and unsent answer
604
+ drafts.
605
+ * {#s-bhzh7h <arch} The viewer requires the GitHub App to be
606
+ installed on a repository before listing or changing that repository's IDD
607
+ data; GitHub enforces the user's and installation's repository permissions.
608
+
609
+ ## Browser and server boundary
610
+
611
+ * {#s-96h8gu <arch} The Cloud Run service serves the static
612
+ viewer and the OAuth start and callback routes; it does not proxy GitHub
613
+ repository reads or writes.
614
+ * {#s-xg63my <arch} The GitHub App client secret is supplied
615
+ to the Cloud Run service through its secret manager binding and is never
616
+ sent to a browser.
617
+ * {#s-ptm6ns <arch} OAuth state is random, short-lived, bound
618
+ to the browser by a secure, HttpOnly, SameSite cookie, checked at the
619
+ callback, and then cleared; the authorization code is exchanged only once.
620
+ * {#s-0ds89f <arch} The viewer uses a restrictive Content
621
+ Security Policy, disallows framing, and does not load third-party scripts.
622
+ * {#s-xb07h5 <arch} The GitHub access token used by page scripts is held only in
623
+ JavaScript memory and is discarded on sign-out, page close, or expiration.
624
+ * {#s-hcs0wx <m-t4tzrb@6d2bfbe} After GitHub authorization, the service seals the access token
625
+ and any refresh token into a Secure, HttpOnly, SameSite cookie scoped to
626
+ `/auth`; its lifetime does not exceed the refresh-token lifetime, or the
627
+ access-token lifetime when no refresh token is issued.
628
+ * {#s-s2hz7w <arch} The service encrypts and authenticates the authentication
629
+ cookie payload with a key derived from `IDD_OAUTH_STATE_SECRET`; it does not
630
+ store GitHub user tokens in server-side session storage.
631
+ * {#s-1nncya <arch} On page load, the viewer requests its session from the same-origin
632
+ service, which returns a still-valid access token or refreshes an expired
633
+ access token with GitHub and rotates the cookie after refresh; an invalid
634
+ session cookie requires the user to sign in again.
635
+ * {#s-c2kkp3 <arch} Signing out clears the persistent authentication cookie through
636
+ the same-origin service.
637
+ * {#s-4zoo4x <arch} The viewer requests GitHub's `offline_access` OAuth scope to
638
+ receive refreshable user tokens; this scope does not grant additional
639
+ repository permissions.
640
+
641
+ ## Answer file writes
642
+
643
+ * {#s-ntcb9t <arch} The browser reads an IDD branch's data
644
+ files with the GitHub Contents API and writes updated files directly through
645
+ that API using the user's GitHub token.
646
+ * {#s-4exg46 <arch} A submission includes the Git blob SHA
647
+ that the browser read; GitHub rejects the write if the file changed since
648
+ that read, and the viewer reloads and reports the accepted answer as a
649
+ conflict instead of overwriting it.
650
+ * {#s-pc0ev7 <arch} The browser validates that the selected
651
+ option belongs to the question before attempting a write; the GitHub SHA
652
+ check remains authoritative when concurrent submissions race.
653
+ * {#s-k4g9ud <m-2wp6gd@585ee48} An answer submission with the same choice and
654
+ note as the already accepted answer is idempotent: it does not create a
655
+ conflict, and the accepted answer remains visible as answered. A submission
656
+ with a different choice or note is rejected and recorded as a conflict.
657
+ * {#s-sjssy5 <arch} A conflicting submission is preserved in
658
+ `idd/conflicts.json` only when it can be committed without replacing an
659
+ existing accepted answer; if that conflict file also changed concurrently,
660
+ the viewer reloads the latest repository state and retries safely.
661
+ * {#s-104mmm <m-umb15o@4ae4e2f,m-j48adi@77b2d25,m-hvgu3e@374ddc6} Revisiting an answered question and submitting a
662
+ different choice or note preserves the current answer and records the new
663
+ submission as a conflict. The conflict remains visible until the human
664
+ answers a clarification question; after that answer is recorded, the agent
665
+ marks the conflict resolved before carrying out the ruling.
666
+ * {#s-aos2i9 <arch} Every file displayed in the viewer is
667
+ parsed as JSON and rendered using text nodes; no repository content is
668
+ inserted as HTML.
669
+
670
+ ## Repository data
671
+
672
+ * {#s-rkulmb <m-7wyw60@f28d6e5} The GitHub repository is the durable
673
+ source of questionnaire and answer data; the IDD web application does not
674
+ keep a second durable copy of either.
675
+ * {#s-34f36d <arch} For a code branch named `<branch>`, its questionnaire
676
+ data is stored on the Git branch `idd-<branch>`; the target branch's IDD
677
+ branch is named `idd-<target>`.
678
+ * {#s-z4lb0p <arch} The stable identity of a code branch is the lowercase SHA-256
679
+ digest of the UTF-8 JSON serialization of `[String(repositoryId),
680
+ fullGitRef]`, where `fullGitRef` is `refs/heads/<branch>`.
681
+ * {#s-r2o7ne <arch,m-q2caxw@e07030c} The hosted viewer accepts question ids computed
682
+ either with the reserved X option in the lowercase SHA-256 digest of the UTF-8
683
+ JSON serialization of `[question.branchHash, title, body, options]`, with each
684
+ option represented as `[key, text, tag-or-empty-string]`, or by the legacy
685
+ formula that omits the final reserved X option. It supplies X for display
686
+ without rewriting legacy question records.
687
+ * {#s-ru06vn <arch} Questions with the same text created on different
688
+ code branches have different ids.
689
+ * {#s-0399cx <arch} Each IDD branch stores its active questions in
690
+ `idd/questions.json`, accepted answers in `idd/answers.json`, rejected
691
+ answer conflicts in `idd/conflicts.json`, question history in
692
+ `idd/history.json`, and agent status in `idd/status.json`.
693
+ * {#s-30veoz <arch} Each question record in `idd/questions.json` contains `id`,
694
+ its origin `branchHash`, `title`, `body`, `options`, and ISO 8601
695
+ `createdAt` fields; inherited questions retain the branch hash where each
696
+ was first created.
697
+ * {#s-lzuk4v <arch} Each accepted answer in `idd/answers.json` contains `choice`,
698
+ `note`, and ISO 8601 `time` fields, keyed by question id.
699
+ * {#s-kwn5lt <arch} Each conflict record in `idd/conflicts.json` contains `id`,
700
+ `questionId`, `choice`, `note`, `time`, and `submittedBy` string fields;
701
+ `id` uniquely identifies that rejected submission.
702
+ * {#s-hgnnfg <arch} Each history record in `idd/history.json` contains a
703
+ removed or superseded `questionId`, a full `question` snapshot,
704
+ its replacement `replacedBy` question id, and an ISO 8601 `time` field.
705
+ Its accepted answer remains keyed by `questionId` in `idd/answers.json`.
706
+ * {#s-omsgq8 <arch} `idd/status.json` is an object keyed by active agent session
707
+ id; each value has exactly a boolean `blocked` field and an ISO 8601
708
+ `updatedAt` field.
709
+ * {#s-0u0b06 <arch} If `idd/claims.json` exists, it is an object keyed by
710
+ `<kind>:<item-id>` where kind is `answer`, `thought` or `conflict` and the
711
+ item id is a lowercase 64-character hexadecimal id. Each value has exactly
712
+ a valid `sessionId` and an ISO 8601 `claimedAt` field. A claim may name only
713
+ an answer's question id, a submitted thought id, or a conflict id present in
714
+ the corresponding IDD file.
715
+ * {#s-w9knti <arch} An agent session updates its entry on the
716
+ matching IDD branch when its blocked state changes, sets `blocked` true
717
+ only when it cannot continue without a human answer, refreshes `updatedAt`
718
+ when it reports progress, and removes its entry when the session ends.
719
+ * {#s-d3a5x5 <m-7wyw60@f28d6e5} The browser serializes a submitted answer
720
+ as JSON and sends it directly to GitHub to be committed on that project's
721
+ IDD branch.
722
+ * {#s-7xztbp <m-4as0w8@cf65a99} To submit an answer, the browser uses a short-lived
723
+ GitHub App user access token; it can write only to repositories the app
724
+ installation and user both have permission to access.
725
+ * {#s-sc65id <arch} An answer is accepted only if no answer has already
726
+ been committed for that question id; a rejected submission leaves the
727
+ accepted answer unchanged, records the rejected answer as a conflict, and
728
+ shows the accepted answer to the submitter.
729
+ * {#s-6hexmx <m-awh12l@a1b5037} Repeating the same rejected answer from the same GitHub user for
730
+ the same question is idempotent: IDD does not append another conflict entry.
731
+ The viewer displays only one entry for repeated records with the same
732
+ question id, submitter, choice, and note.
733
+ * {#s-kemef5 <arch} An accepted answer records its question id,
734
+ choice, note, and timestamp; the GitHub commit identifies the user who
735
+ submitted it.
736
+ * {#s-zqz4wj <arch} A rejected answer conflict records the
737
+ question id, submitted answer, and timestamp; the GitHub commit identifies
738
+ the user who submitted it.
739
+ * {#s-ewykyi <arch} Agent status records whether the agent is
740
+ blocked waiting for a human answer and when that status was last updated.
741
+
742
+ ## Text and credentials
743
+
744
+ * {#s-e8zu22 <m-ol5xyr@2c772e6} Question titles, question bodies, option
745
+ text, submitted answers, and prior answers are displayed as text; the page
746
+ never interprets their contents as HTML.
747
+ * {#s-m5duw4 <arch} The page keeps an access token only in memory
748
+ while the user is signed in; it does not put the token in questionnaire
749
+ data, answer data, local storage, or a URL.
750
+ * {#s-0js03o <arch} The Cloud Run application holds the GitHub App
751
+ credential needed to exchange an authorization code, but it does not
752
+ receive questionnaire submissions or persist user access tokens in
753
+ server-side session storage.
754
+ * {#s-v5f187 <arch} The user installs the GitHub App on repositories to add them to
755
+ the viewer; the app's user token can only access repositories the user
756
+ and the installation can access.
757
+ * {#s-pot7wd <arch} The browser reads and commits questionnaire files through the
758
+ GitHub REST API, and the IDD application does not proxy those file contents.
759
+
760
+ ## Branch reconciliation
761
+
762
+ * {#s-3980su <arch} Before completing a code-branch merge, the agent
763
+ merges the source IDD branch into the target IDD branch and compares their
764
+ question and answer records to identify duplicate, overlapping, and obsolete
765
+ questions.
766
+ * {#s-ay10ju <arch} When related questions have answers that do not
767
+ establish one decision, the agent creates one clarifying question on the
768
+ target IDD branch, preserves the earlier records in its history, and waits
769
+ for that answer before implementing the decision and completing the merge.
770
+ * {#s-xsxrgn <arch} When questions are duplicates or an earlier
771
+ question has been made obsolete, the target IDD branch presents the
772
+ consolidated or superseding question and retains links to the earlier
773
+ question and answer records.
774
+ * {#s-8kd709 <arch} When IDD branches merge, the target's
775
+ `idd/page.json` keeps the target code branch's `branchHash`; each question
776
+ keeps the `branchHash` from the code branch where it was created unless the
777
+ agent replaces it with a new clarifying question.
778
+ * {#s-fyoism <arch} A code-branch merge cannot complete until its source IDD history
779
+ is an ancestor of the target IDD branch and the agent has recorded a review
780
+ for the current code and IDD commits.
781
+ * {#s-vwyasy <arch} The merge process keeps one active copy of
782
+ duplicate questions and records which earlier question ids it replaces.
783
+ * {#s-3wklcj <arch} The merge process does not require ConcordSTC.
784
+
785
+ ## Dependencies
786
+
787
+ * {#p-weocqk >specs/project-files.md} The project's question and answer
788
+ data.
789
+ * {#p-21xm5l >specs/questions-page.md} The text displayed by the
790
+ questionnaire.
791
+ * {#p-di8ysg >specs/idd-page.md} How the agent waits for an answer notification.
792
+ * {#p-yjtzny >specs/build.md} How to build and deploy the Cloud Run web application.
793
+